From e8ac6ba3ede4e4b9f05c06f685811e6090792833 Mon Sep 17 00:00:00 2001
From: 张含笑 <zhx18749296735@163.com>
Date: Wed, 29 Oct 2025 14:12:23 +0800
Subject: [PATCH] feat:提取坐标

---
 src/utils/geoParseUtil.js           |   80 ++++++++++++++++++++++++++++++++++++++++
 src/views/layerManagement/index.vue |   27 -------------
 2 files changed, 81 insertions(+), 26 deletions(-)

diff --git a/src/utils/geoParseUtil.js b/src/utils/geoParseUtil.js
new file mode 100644
index 0000000..5c62a0e
--- /dev/null
+++ b/src/utils/geoParseUtil.js
@@ -0,0 +1,80 @@
+// @/utils/geoParseUtil.js
+import _ from 'lodash'; // 若需要用到 lodash,需引入(当前解析逻辑暂未用到,可先注释)
+
+/**
+ * 单独的 WKT 解析函数(处理 POLYGON 和 LineString 类型)
+ * @param {string} wktStr - WKT 格式的地理数据字符串
+ * @param {number} altitude - 高度值
+ * @returns {Array} 转换后的坐标数组,格式:[{lng, lat, height}, ...]
+ */
+export const parseWktToPositions = (wktStr, altitude) => {
+  try {
+    // 步骤1:移除 WKT 开头的类型标识(如 POLYGON(...) → (...))
+    const content = wktStr.replace(/^(POLYGON|LineString)\(/i, '').replace(/\)$/, '');
+    // 步骤2:处理 POLYGON 的双层括号(如 ((x1 y1, x2 y2)) → x1 y1, x2 y2)
+    const coordStr = content.replace(/^\(\s*(.*?)\s*\)$/, '$1').trim();
+    if (!coordStr) return [];
+
+    // 步骤3:按逗号分割坐标对(如 "x1 y1, x2 y2" → ["x1 y1", "x2 y2"])
+    const coordPairs = coordStr.split(',').map(pair => pair.trim());
+    if (coordPairs.length < 2) {
+      console.warn('WKT 坐标点数量不足');
+      return [];
+    }
+
+    // 步骤4:转换为 {lng, lat, height} 格式(WKT 中坐标是 "lng lat" 顺序)
+    return coordPairs.map(pair => {
+      const [lng, lat] = pair.split(/\s+/).map(Number); // 按空格分割经纬度
+      return {
+        lng: lng,
+        lat: lat,
+        height: Number(altitude) || 0,
+      };
+    });
+  } catch (error) {
+    console.error('解析 WKT 格式失败:', error);
+    return [];
+  }
+};
+
+/**
+ * 统一的地理数据解析函数(兼容 GeoJSON 和 WKT 格式)
+ * @param {string} geoDataStr - 地理数据字符串(GeoJSON 或 WKT 格式)
+ * @param {number} altitude - 高度值
+ * @returns {Array} 转换后的坐标数组,格式:[{lng, lat, height}, ...]
+ */
+export const parseGeoDataToPositions = (geoDataStr, altitude) => {
+  try {
+    // 1. 先判断是否为 WKT 格式(以 POLYGON/LineString 开头,不含 { })
+    if (
+      (geoDataStr.startsWith('POLYGON') || geoDataStr.startsWith('LineString')) &&
+      !geoDataStr.includes('{')
+    ) {
+      return parseWktToPositions(geoDataStr, altitude);
+    } 
+    // 2. 否则按 GeoJSON 格式解析
+    else {
+      const geoData = JSON.parse(geoDataStr);
+      let coordinates = [];
+
+      if (geoData.type === 'Polygon') {
+        coordinates = geoData.coordinates[0] || [];
+      } else if (geoData.type === 'LineString') {
+        coordinates = geoData.coordinates || [];
+      } else {
+        console.warn(`不支持的 GeoJSON 类型:${geoData.type}`);
+        return [];
+      }
+
+      // 转换为 {lng, lat, height} 格式
+      return coordinates.map(([lng, lat]) => ({
+        lng: Number(lng),
+        lat: Number(lat),
+        height: Number(altitude) || 0,
+      }));
+    }
+  } catch (error) {
+    console.error('解析 geo_data 失败:', error);
+    return [];
+  }
+};
\ No newline at end of file
diff --git a/src/views/layerManagement/index.vue b/src/views/layerManagement/index.vue
index 0d02526..40bee91 100644
--- a/src/views/layerManagement/index.vue
+++ b/src/views/layerManagement/index.vue
@@ -26,6 +26,7 @@
 </template>
 
 <script setup>
+import { parseGeoDataToPositions } from '@/utils/geoParseUtil';
 import { flyVisual } from '@/utils/cesium/mapUtil';
 import rightEdit from '@/views/layerManagement/components/rightEdit.vue';
 import leftList from '@/views/layerManagement/components/leftList.vue';
@@ -67,34 +68,8 @@
   activeName.value = clickedTab.name;
 };
 
-// 解析 geo_data 并转换为坐标格式(兼容 Polygon 和 LineString)
-const parseGeoDataToPositions = (geoDataStr, altitude) => {
-  try {
-    const geoData = JSON.parse(geoDataStr);
-    let coordinates = [];
 
-    if (geoData.type === 'Polygon') {
-      // Polygon 坐标格式:[[[lng, lat], ...]] → 取第一个多边形的顶点
-      coordinates = geoData.coordinates[0] || [];
-    } else if (geoData.type === 'LineString') {
-      // LineString 坐标格式:[[lng, lat], ...] → 直接取顶点
-      coordinates = geoData.coordinates || [];
-    } else {
-      console.warn(`不支持的地理数据类型:${geoData.type}`);
-      return [];
-    }
 
-    // 转换为 {lng, lat, height} 格式
-    return coordinates.map(([lng, lat]) => ({
-      lng: Number(lng),
-      lat: Number(lat),
-      height: Number(altitude) || 0,
-    }));
-  } catch (error) {
-    console.error('解析 geo_data 失败:', error);
-    return [];
-  }
-};
 let tbJwdList = [];
 const selectDataList = ref([]);
 // 编辑区域

--
Gitblit v1.9.3