Prechádzať zdrojové kódy

fix: 坐标解析报错

lxf 1 týždeň pred
rodič
commit
803e77ea12

+ 24 - 10
src/utils/util.js

@@ -40,18 +40,32 @@ export const pointToFormat = (pointString) => {
 };
 
 export const newAreaFeature = (data)=>{
-    let geom = new WKT().readGeometry(data["geom"])
-    let feature = new Feature({
-        geometry: geom
-    });
-    feature.set("nodeType","area");
-    feature.setId(data.id)
-    for(let key in data){
-        if(key != "geom"){
-            feature.set(key,data[key])
+    // 验证 geom 字段是否有效
+    if (!data || !data["geom"] || typeof data["geom"] !== 'string' || data["geom"].trim().length === 0) {
+        console.warn('newAreaFeature: 无效的 geom 数据', data);
+        return null;
+    }
+    try {
+        let geom = new WKT().readGeometry(data["geom"]);
+        if (!geom) {
+            console.warn('newAreaFeature: WKT 解析返回空几何', data);
+            return null;
+        }
+        let feature = new Feature({
+            geometry: geom
+        });
+        feature.set("nodeType","area");
+        feature.setId(data.id)
+        for(let key in data){
+            if(key != "geom"){
+                feature.set(key,data[key])
+            }
         }
+        return feature;
+    } catch (error) {
+        console.warn('newAreaFeature: WKT 解析失败', error, data);
+        return null;
     }
-    return feature;
 }
 
 export function formatToTwoDecimalPlaces(value) {

+ 7 - 2
src/views/warningHome/map/boundaryLayer.js

@@ -30,10 +30,15 @@ class BoundaryLayer {
         if (this.boundaryLayer) {
             this.boundaryLayer.source.clear();
         }
-        if (arr.length > 0) {
+        if (arr && arr.length > 0) {
             for (let item of arr) {
+                if (!item || !item.geom) {
+                    continue; // 跳过无效数据
+                }
                 let feature = newAreaFeature(item);
-                this.boundaryLayer.addFeature(feature);
+                if (feature) {
+                    this.boundaryLayer.addFeature(feature);
+                }
             }
             // 适配地图显示范围到当前边界范围
             // setTimeout(() => {

+ 21 - 6
src/views/warningHome/map/waterLayer.js

@@ -88,10 +88,15 @@ class WaterLayer {
         if (this.waterLayer) {
             this.waterLayer.source.clear();
         }
-        if (arr.length > 0) {
+        if (arr && arr.length > 0) {
             for (let item of arr) {
+                if (!item || !item.geom) {
+                    continue; // 跳过无效数据
+                }
                 let feature = newAreaFeature(item);
-                this.waterLayer.addFeature(feature);
+                if (feature) {
+                    this.waterLayer.addFeature(feature);
+                }
             }
         }
         // this.fitView();
@@ -101,10 +106,15 @@ class WaterLayer {
         if (this.riverLayer) {
             this.riverLayer.source.clear();
         }
-        if (arr.length > 0) {
+        if (arr && arr.length > 0) {
             for (let item of arr) {
+                if (!item || !item.geom) {
+                    continue; // 跳过无效数据
+                }
                 let feature = newAreaFeature(item);
-                this.riverLayer.addFeature(feature);
+                if (feature) {
+                    this.riverLayer.addFeature(feature);
+                }
             }
         }
     }
@@ -112,10 +122,15 @@ class WaterLayer {
         if (this.canalLayer) {
             this.canalLayer.source.clear();
         }
-        if (arr.length > 0) {
+        if (arr && arr.length > 0) {
             for (let item of arr) {
+                if (!item || !item.geom) {
+                    continue; // 跳过无效数据
+                }
                 let feature = newAreaFeature(item);
-                this.canalLayer.addFeature(feature);
+                if (feature) {
+                    this.canalLayer.addFeature(feature);
+                }
             }
         }
     }

+ 14 - 1
src/views/warningHome/warningMap.js

@@ -18,7 +18,20 @@ class HomeMap {
 
   initMap(location, target) {
     let level = 9;
-    let coordinate = util.wktCastGeom(location).getFirstCoordinate();
+    // 验证 location 是否为有效的 WKT 字符串
+    let coordinate = [113.8, 23.1]; // 默认坐标(东莞附近)
+    if (location && typeof location === 'string' && location.trim().length > 0) {
+      try {
+        const geom = util.wktCastGeom(location);
+        if (geom) {
+          coordinate = geom.getFirstCoordinate();
+        }
+      } catch (error) {
+        console.warn('解析 location WKT 失败,使用默认坐标:', error, location);
+      }
+    } else {
+      console.warn('location 为空或无效,使用默认坐标');
+    }
     this.kmap = new KMap.Map(target, level, coordinate[0], coordinate[1], null, 7, 22);
     // 开启地图点击事件监听,使点位点击可以触发弹窗
     this.addMapListen();