From f3104f14213028277c883e19301b820ae724bd70 Mon Sep 17 00:00:00 2001
From: linwei <872216696@qq.com>
Date: Fri, 05 Jun 2026 10:18:08 +0800
Subject: [PATCH] feat(utils): 添加几何数据处理和区域编码转换功能
---
drone-common/src/main/java/org/sxkj/common/utils/GeomUtils.java | 75 +++++++++++++++++++++++++++++++++++++
1 files changed, 74 insertions(+), 1 deletions(-)
diff --git a/drone-common/src/main/java/org/sxkj/common/utils/GeomUtils.java b/drone-common/src/main/java/org/sxkj/common/utils/GeomUtils.java
index b8222dd..6cb200e 100644
--- a/drone-common/src/main/java/org/sxkj/common/utils/GeomUtils.java
+++ b/drone-common/src/main/java/org/sxkj/common/utils/GeomUtils.java
@@ -1,9 +1,18 @@
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)) {
@@ -12,4 +21,68 @@
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;
+ }
+ }
}
--
Gitblit v1.9.3