From a41fe1fd72c328471f7e051245c86237bbc3e568 Mon Sep 17 00:00:00 2001
From: shuishen <1109946754@qq.com>
Date: Tue, 06 May 2025 15:01:20 +0800
Subject: [PATCH] 新建工单,地图坐标保存,坐标系转换处理; 详情中地图坐标系转换去除;

---
 src/views/tickets/ticket.vue                  |   65 +++++++++++++++------
 src/utils/coordinateTransformation.js         |  103 ++++++++++++++++++++++++++++++++++
 src/components/map-container/mapContainer.vue |    8 --
 3 files changed, 151 insertions(+), 25 deletions(-)

diff --git a/src/components/map-container/mapContainer.vue b/src/components/map-container/mapContainer.vue
index 5cae64e..73ff5fa 100644
--- a/src/components/map-container/mapContainer.vue
+++ b/src/components/map-container/mapContainer.vue
@@ -113,9 +113,7 @@
 
     if (!lng || !lat) return
 
-    let [newLng, newLat] = DC.CoordTransform.GCJ02ToWGS84(lng, lat)
-
-    let point = new DC.Point(new DC.Position(newLng, newLat))
+    let point = new DC.Point(new DC.Position(lng, lat))
     pointLayer.addOverlay(point)
 
     window.$viewer?.zoomTo(pointLayer)
@@ -133,9 +131,7 @@
     const positionStr = data.map(item => {
         const [lng, lat] = item
 
-        let [newLng, newLat] = DC.CoordTransform.GCJ02ToWGS84(lng, lat)
-
-        return `${newLng}, ${newLat}`
+        return `${lng}, ${lat}`
     }).join(';')
 
     let polyline = new DC.Polyline(positionStr)
diff --git a/src/utils/coordinateTransformation.js b/src/utils/coordinateTransformation.js
new file mode 100644
index 0000000..b451e3b
--- /dev/null
+++ b/src/utils/coordinateTransformation.js
@@ -0,0 +1,103 @@
+/*
+ * @Author: GuLiMmo 2820890765@qq.com
+ * @Date: 2024-06-12 13:51:57
+ * @LastEditors: GuLiMmo 2820890765@qq.com
+ * @LastEditTime: 2024-06-12 13:54:00
+ * @FilePath: /bigScreen/src/utils/coordinateTransformation.js
+ * @Description:
+ * Copyright (c) 2024 by GuLiMmo, All Rights Reserved.
+ */
+const PI = Math.PI;
+const a = 6378245.0;
+const ee = 0.00669342162296594323;
+
+export function wgs84ToGcj02(lng, lat) {
+    if (out_of_china(lng, lat)) {
+        return [lng, lat];
+    } else {
+        var dlat = transformlat(lng - 105.0, lat - 35.0);
+        var dlng = transformlng(lng - 105.0, lat - 35.0);
+        var radlat = (lat / 180.0) * PI;
+        var magic = Math.sin(radlat);
+        magic = 1 - ee * magic * magic;
+        var sqrtmagic = Math.sqrt(magic);
+        dlat = (dlat * 180.0) / (((a * (1 - ee)) / (magic * sqrtmagic)) * PI);
+        dlng = (dlng * 180.0) / ((a / sqrtmagic) * Math.cos(radlat) * PI);
+        var mglat = lat + dlat;
+        var mglng = lng + dlng;
+        return [mglng, mglat];
+    }
+}
+
+export function gcj02ToWgs84(lng, lat) {
+    if (out_of_china(lng, lat)) {
+        return [lng, lat];
+    } else {
+        var dlat = transformlat(lng - 105.0, lat - 35.0);
+        var dlng = transformlng(lng - 105.0, lat - 35.0);
+        var radlat = (lat / 180.0) * PI;
+        var magic = Math.sin(radlat);
+        magic = 1 - ee * magic * magic;
+        var sqrtmagic = Math.sqrt(magic);
+        dlat = (dlat * 180.0) / (((a * (1 - ee)) / (magic * sqrtmagic)) * PI);
+        dlng = (dlng * 180.0) / ((a / sqrtmagic) * Math.cos(radlat) * PI);
+        var mglat = lat + dlat;
+        var mglng = lng + dlng;
+        return [lng * 2 - mglng, lat * 2 - mglat];
+    }
+}
+
+function transformlat(lng, lat) {
+    var ret =
+        -100.0 +
+        2.0 * lng +
+        3.0 * lat +
+        0.2 * lat * lat +
+        0.1 * lng * lat +
+        0.2 * Math.sqrt(Math.abs(lng));
+    ret +=
+        ((20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) *
+            2.0) /
+        3.0;
+    ret +=
+        ((20.0 * Math.sin(lat * PI) + 40.0 * Math.sin((lat / 3.0) * PI)) *
+            2.0) /
+        3.0;
+    ret +=
+        ((160.0 * Math.sin((lat / 12.0) * PI) +
+            320 * Math.sin((lat * PI) / 30.0)) *
+            2.0) /
+        3.0;
+    return ret;
+}
+
+function transformlng(lng, lat) {
+    var ret =
+        300.0 +
+        lng +
+        2.0 * lat +
+        0.1 * lng * lng +
+        0.1 * lng * lat +
+        0.1 * Math.sqrt(Math.abs(lng));
+    ret +=
+        ((20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) *
+            2.0) /
+        3.0;
+    ret +=
+        ((20.0 * Math.sin(lng * PI) + 40.0 * Math.sin((lng / 3.0) * PI)) *
+            2.0) /
+        3.0;
+    ret +=
+        ((150.0 * Math.sin((lng / 12.0) * PI) +
+            300.0 * Math.sin((lng / 30.0) * PI)) *
+            2.0) /
+        3.0;
+    return ret;
+}
+
+// 判断是否在国内,不在国内则不做偏移
+function out_of_china(lng, lat) {
+    return (
+        lng < 72.004 || lng > 137.8347 || lat < 0.8293 || lat > 55.8271 || false
+    );
+}
diff --git a/src/views/tickets/ticket.vue b/src/views/tickets/ticket.vue
index dbcbffb..d93ca5c 100644
--- a/src/views/tickets/ticket.vue
+++ b/src/views/tickets/ticket.vue
@@ -463,6 +463,7 @@
 </template>
 
 <script>
+import { gcj02ToWgs84, wgs84ToGcj02 } from '@/utils/coordinateTransformation'
 import { getList, createTicket, getTicketInfo, flowEvent, getstatusCount, getStepInfo } from '@/api/tickets/ticket'
 import { export_json_to_excel } from '@/utils/exportExcel'
 import geoJson from '@/assets/geoJson.json'
@@ -1038,12 +1039,14 @@
           return
         }
 
+        let [lng, lat] = this.disposeLocation(true, this.form)
+
         const submitData = {
           eventName: this.form.name,
           content: this.form.content,
           workType: "1",
-          longitude: String(this.form.location[0]),
-          latitude: String(this.form.location[1]),
+          longitude: lng,
+          latitude: lat,
           address: this.form.address,
           workOrderTypeDictKey: this.form.type,
           aiType: Array.isArray(this.form.algorithm) ? this.form.algorithm : [this.form.algorithm], // 传数组
@@ -1099,13 +1102,16 @@
         if (!handlerValue || handlerValue === '未分配') {
           handlerValue = undefined
         }
+
+        let [lng, lat] = this.disposeLocation(true, this.form)
+
         const submitData = {
           id: this.form.id,
           eventName: this.form.name || undefined,
           content: this.form.content || undefined,
           workType: "1",
-          longitude: this.form.location?.[0] ? String(this.form.location[0]) : undefined,
-          latitude: this.form.location?.[1] ? String(this.form.location[1]) : undefined,
+          longitude: lng,
+          latitude: lat,
           address: this.form.address || undefined,
           workOrderTypeDictKey: this.form.type || undefined,
           aiType: this.form.algorithm && this.form.algorithm.length > 0
@@ -1873,13 +1879,19 @@
         photos: [],
       }
 
-      this.form.location = Array.isArray(row.location) && row.location.length >= 2
-        ? [
-          Number(row.location[0]),
-          Number(row.location[1]),
+      let curLocation = []
+
+      if (Array.isArray(row.location) && row.location.length >= 2) {
+        let [lng, lat] = this.disposeLocation(false, row)
+
+        curLocation = [
+          lng,
+          lat,
           row.location[2] || row.address || ''
         ]
-        : []
+      }
+
+      this.form.location = curLocation
       this.form.address = this.form.location[2] || ''
       // 设置地图中心点
       if (Array.isArray(this.form.location) && this.form.location.length >= 2) {
@@ -1907,16 +1919,6 @@
       })
 
       this.dialogVisible = true
-    },
-
-    // 添加数据监听以确保算法数据的响应性
-    watch: {
-      'form.algorithm': {
-        handler (newVal) {
-          console.log('算法值变化:', newVal)
-        },
-        deep: true
-      }
     },
 
     // 添加删除方法
@@ -2195,6 +2197,31 @@
       if (lastDot === -1) return url
       return url.slice(0, lastDot) + '_show' + url.slice(lastDot)
     },
+
+    /**
+     * 坐标转换方法处理
+     * @param goWgs84 是否由国测转换到84,默认false----由84转换到国测
+     */
+    disposeLocation (goWgs84 = false, data) {
+      let lng, lat
+      if (goWgs84) {
+        lng = data.location?.[0] ? String(data.location[0]) : undefined
+        lat = data.location?.[1] ? String(data.location[1]) : undefined
+
+        if (lng && lat) {
+          [lng, lat] = gcj02ToWgs84(Number(lng), Number(lat))
+        }
+      } else {
+        lng = Number(data.location[0])
+        lat = Number(data.location[1])
+
+        if (lng && lat) {
+          [lng, lat] = wgs84ToGcj02(Number(lng), Number(lat))
+        }
+      }
+
+      return [String(lng), String(lat)]
+    }
   },
 }
 </script>

--
Gitblit v1.9.3