package org.sxkj.common.utils; import org.apache.commons.lang3.StringUtils; import org.geotools.geometry.jts.JTSFactoryFinder; import org.locationtech.jts.geom.Coordinate; import org.locationtech.jts.geom.Geometry; import org.locationtech.jts.geom.GeometryFactory; import org.locationtech.jts.geom.Point; import org.locationtech.jts.io.ParseException; import org.locationtech.jts.io.WKTReader; public class GeomUtils { private static final GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory(); private static final WKTReader wktReader = new WKTReader(geometryFactory); public static boolean isGeomInvalid(String geom) { if (StringUtils.isBlank(geom)) { return false; } String upper = geom.trim().toUpperCase(); return !upper.contains("POLYGON"); } /** * 验证并转换几何数据,确保其有效 * @param geom WKT格式的几何数据 * @return 有效的几何数据,或null如果转换失败 */ public static String validateAndFormatGeom(String geom) { if (StringUtils.isBlank(geom)) { return null; } try { // 解析WKT字符串 Geometry geometry = wktReader.read(geom); // 如果几何数据无效,尝试修复 if (!geometry.isValid()) { geometry = geometry.buffer(0); } // 确保几何数据有效 if (geometry.isValid()) { return geometry.toText(); } else { return null; } } catch (ParseException e) { // 解析失败 return null; } } /** * 从几何数据中提取中心点坐标 * * @param geom WKT格式的几何数据 * @return 中心点坐标数组,格式为 [经度, 纬度],如果提取失败返回null */ public static double[] extractCenterPoint(String geom) { if (StringUtils.isBlank(geom)) { return null; } try { // 解析WKT字符串 Geometry geometry = wktReader.read(geom); // 获取几何对象的中心点 Point centroid = geometry.getCentroid(); if (centroid == null) { return null; } Coordinate coordinate = centroid.getCoordinate(); if (coordinate == null) { return null; } // 返回 [经度, 纬度] return new double[]{coordinate.x, coordinate.y}; } catch (ParseException e) { return null; } } }