| | |
| | | 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)) { |
| | |
| | | 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; |
| | | } |
| | | } |
| | | } |