Prechádzať zdrojové kódy

feat:燃气管网坐标更新

null 3 týždňov pred
rodič
commit
64532f63f8

+ 77 - 0
src/utils/coordTransform.js

@@ -0,0 +1,77 @@
+/**
+ * WGS84 → GCJ-02 → BD-09 坐标转换工具
+ * 百度地图需要使用 BD-09 坐标系
+ */
+
+const PI = Math.PI
+const X_PI = (PI * 3000.0) / 180.0
+const A = 6378245.0
+const EE = 0.00669342162296594323
+
+function transformLat(lng, lat) {
+  let 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) {
+  let 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
+}
+
+/** WGS84 → GCJ-02 (火星坐标) */
+function wgs84ToGcj02(lng, lat) {
+  let dLat = transformLat(lng - 105.0, lat - 35.0)
+  let dLng = transformLng(lng - 105.0, lat - 35.0)
+  const radLat = (lat / 180.0) * PI
+  let magic = Math.sin(radLat)
+  magic = 1 - EE * magic * magic
+  const sqrtMagic = Math.sqrt(magic)
+  dLat = (dLat * 180.0) / (((A * (1 - EE)) / (magic * sqrtMagic)) * PI)
+  dLng = (dLng * 180.0) / ((A / sqrtMagic) * Math.cos(radLat) * PI)
+  return [lng + dLng, lat + dLat]
+}
+
+/** GCJ-02 → BD-09 (百度坐标) */
+function gcj02ToBd09(lng, lat) {
+  const z = Math.sqrt(lng * lng + lat * lat) + 0.00002 * Math.sin(lat * X_PI)
+  const theta = Math.atan2(lat, lng) + 0.000003 * Math.cos(lng * X_PI)
+  return [z * Math.cos(theta) + 0.0065, z * Math.sin(theta) + 0.006]
+}
+
+/** WGS84 → BD-09 一步转换 */
+export function wgs84ToBd09(lng, lat) {
+  const [gcjLng, gcjLat] = wgs84ToGcj02(lng, lat)
+  return gcj02ToBd09(gcjLng, gcjLat)
+}
+
+/** 转换管线数据中的坐标数组 */
+export function convertPipeline(pipeline) {
+  return {
+    ...pipeline,
+    path: pipeline.path ? pipeline.path.map(([lng, lat]) => wgs84ToBd09(lng, lat)) : undefined,
+    points: pipeline.points
+      ? (Array.isArray(pipeline.points[0])
+          ? pipeline.points.map(([lng, lat]) => wgs84ToBd09(lng, lat))
+          : pipeline.points.map(p => ({ ...p, lng: wgs84ToBd09(p.lng, p.lat)[0], lat: wgs84ToBd09(p.lng, p.lat)[1] })))
+      : undefined
+  }
+}
+
+/** 转换单个坐标点 */
+export function convertCoord(lng, lat) {
+  return wgs84ToBd09(lng, lat)
+}
+
+/** 批量转换点数组中的 lng/lat */
+export function convertPoints(points) {
+  return points.map(p => {
+    const [lng, lat] = wgs84ToBd09(p.lng, p.lat)
+    return { ...p, lng, lat }
+  })
+}

+ 82 - 285
src/views/subSystem/basic/GisDashboard.vue

@@ -146,12 +146,13 @@
 import { computed, nextTick, onBeforeUnmount, onMounted, reactive, ref, watch } from 'vue'
 import { FullScreen, Location, MapLocation, Minus, Plus, RefreshRight, Search } from '@element-plus/icons-vue'
 import { ElMessage } from 'element-plus'
+import { convertCoord } from '@/utils/coordTransform'
 
-const centerPoint = { lng: 110.3937, lat: 28.4640 }
+const centerPoint = { lng: 110.386, lat: 28.445 }
 
 const MAP_BOUNDS = {
-  southWest: { lng: 110.365, lat: 28.452 },
-  northEast: { lng: 110.420, lat: 28.482 }
+  southWest: { lng: 110.355, lat: 28.428 },
+  northEast: { lng: 110.410, lat: 28.460 }
 }
 const MAP_MIN_ZOOM = 13
 const MAP_MAX_ZOOM = 19
@@ -164,313 +165,101 @@ const defaultLayerState = () => ({
 })
 
 const boundaryPoints = [
-  { lng: 110.368, lat: 28.478 },
-  { lng: 110.385, lat: 28.480 },
-  { lng: 110.402, lat: 28.480 },
-  { lng: 110.416, lat: 28.476 },
-  { lng: 110.418, lat: 28.466 },
-  { lng: 110.415, lat: 28.459 },
+  { lng: 110.358, lat: 28.456 },
+  { lng: 110.375, lat: 28.458 },
+  { lng: 110.392, lat: 28.458 },
   { lng: 110.408, lat: 28.455 },
-  { lng: 110.395, lat: 28.456 },
-  { lng: 110.382, lat: 28.458 },
-  { lng: 110.372, lat: 28.462 },
-  { lng: 110.367, lat: 28.470 }
+  { lng: 110.410, lat: 28.448 },
+  { lng: 110.407, lat: 28.440 },
+  { lng: 110.400, lat: 28.436 },
+  { lng: 110.390, lat: 28.434 },
+  { lng: 110.378, lat: 28.433 },
+  { lng: 110.368, lat: 28.436 },
+  { lng: 110.360, lat: 28.445 }
 ]
 
 const pipelineData = [
   {
     id: 'pipe-high-01',
     level: 'high',
-    name: '辰州路高压燃气管线',
+    name: '燃气1',
     code: 'GX-HP-001',
     length: 4.1,
     material: 'L290N 无缝钢管',
     diameter: 'DN300',
     pressure: '高压A (4.0MPa)',
-    road: '辰州北路 — 辰州中路',
+    road: '燃气1主干线',
     status: '运行正常',
     layingMethod: '直埋敷设',
     depth: '1.8m',
     commissioningDate: '2026-06',
     points: [
-      { lng: 110.3918, lat: 28.4788 },
-      { lng: 110.3920, lat: 28.4765 },
-      { lng: 110.3924, lat: 28.4743 },
-      { lng: 110.3927, lat: 28.4721 },
-      { lng: 110.3931, lat: 28.4698 },
-      { lng: 110.3934, lat: 28.4675 },
-      { lng: 110.3936, lat: 28.4652 },
-      { lng: 110.3937, lat: 28.4630 },
-      { lng: 110.3935, lat: 28.4607 },
-      { lng: 110.3934, lat: 28.4585 },
-      { lng: 110.3935, lat: 28.4576 }
+      { lng: 110.404947, lat: 28.433419 },
+      { lng: 110.404836, lat: 28.433429 },
+      { lng: 110.403275, lat: 28.433571 },
+      { lng: 110.401084, lat: 28.433876 },
+      { lng: 110.399601, lat: 28.433876 },
+      { lng: 110.398112, lat: 28.433979 },
+      { lng: 110.396717, lat: 28.434314 },
+      { lng: 110.394299, lat: 28.434538 },
+      { lng: 110.394352, lat: 28.434887 },
+      { lng: 110.391969, lat: 28.434985 },
+      { lng: 110.384374, lat: 28.435695 },
+      { lng: 110.381418, lat: 28.43559 },
+      { lng: 110.377993, lat: 28.436193 },
+      { lng: 110.376062, lat: 28.436385 },
+      { lng: 110.374231, lat: 28.43655 },
+      { lng: 110.372584, lat: 28.437107 },
+      { lng: 110.371292, lat: 28.4377 },
+      { lng: 110.370581, lat: 28.438198 },
+      { lng: 110.369831, lat: 28.438821 }
     ]
   },
   {
     id: 'pipe-subhigh-01',
     level: 'subHigh',
-    name: '古城路次高压管线',
+    name: '燃气2',
     code: 'GX-SHP-002',
     length: 3.8,
     material: 'L245N 无缝钢管',
     diameter: 'DN250',
     pressure: '次高压A (1.6MPa)',
-    road: '古城北路 — 古城中路',
+    road: '燃气2支线',
     status: '运行正常',
     layingMethod: '直埋敷设',
     depth: '1.6m',
     commissioningDate: '2026-03',
     points: [
-      { lng: 110.3980, lat: 28.4790 },
-      { lng: 110.3979, lat: 28.4765 },
-      { lng: 110.3977, lat: 28.4741 },
-      { lng: 110.3975, lat: 28.4717 },
-      { lng: 110.3973, lat: 28.4693 },
-      { lng: 110.3970, lat: 28.4669 },
-      { lng: 110.3968, lat: 28.4645 },
-      { lng: 110.3965, lat: 28.4622 },
-      { lng: 110.3963, lat: 28.4598 },
-      { lng: 110.3962, lat: 28.4575 }
-    ]
-  },
-  {
-    id: 'pipe-medium-01',
-    level: 'medium',
-    name: '迎宾路中压管线',
-    code: 'GX-MP-003',
-    length: 5.5,
-    material: 'PE100 SDR11',
-    diameter: 'DN200',
-    pressure: '中压A (0.4MPa)',
-    road: '迎宾西路 — 迎宾东路',
-    status: '运行正常',
-    layingMethod: '直埋敷设',
-    depth: '1.4m',
-    commissioningDate: '2025-09',
-    points: [
-      { lng: 110.3732, lat: 28.4650 },
-      { lng: 110.3778, lat: 28.4648 },
-      { lng: 110.3824, lat: 28.4645 },
-      { lng: 110.3870, lat: 28.4642 },
-      { lng: 110.3916, lat: 28.4640 },
-      { lng: 110.3962, lat: 28.4637 },
-      { lng: 110.4008, lat: 28.4634 },
-      { lng: 110.4054, lat: 28.4630 },
-      { lng: 110.4098, lat: 28.4627 },
-      { lng: 110.4120, lat: 28.4625 }
-    ]
-  },
-  {
-    id: 'pipe-medium-02',
-    level: 'medium',
-    name: '建设路中压管线',
-    code: 'GX-MP-004',
-    length: 4.8,
-    material: 'PE100 SDR11',
-    diameter: 'DN160',
-    pressure: '中压B (0.2MPa)',
-    road: '建设西路 — 建设东路',
-    status: '运行正常',
-    layingMethod: '定向钻穿越',
-    depth: '1.5m',
-    commissioningDate: '2025-04',
-    points: [
-      { lng: 110.3748, lat: 28.4583 },
-      { lng: 110.3794, lat: 28.4586 },
-      { lng: 110.3840, lat: 28.4588 },
-      { lng: 110.3886, lat: 28.4589 },
-      { lng: 110.3912, lat: 28.4586 },
-      { lng: 110.3937, lat: 28.4582 },
-      { lng: 110.3966, lat: 28.4579 },
-      { lng: 110.4002, lat: 28.4581 },
-      { lng: 110.4038, lat: 28.4578 },
-      { lng: 110.4076, lat: 28.4575 }
-    ]
-  },
-  {
-    id: 'pipe-low-01',
-    level: 'low',
-    name: '滨江路低压管线',
-    code: 'GX-LP-005',
-    length: 4.0,
-    material: 'PE80 SDR17.6',
-    diameter: 'DN110',
-    pressure: '低压 (5kPa)',
-    road: '滨江路 — 沿江北岸',
-    status: '运行正常',
-    layingMethod: '直埋敷设',
-    depth: '1.2m',
-    commissioningDate: '2025-11',
-    points: [
-      { lng: 110.3762, lat: 28.4569 },
-      { lng: 110.3804, lat: 28.4570 },
-      { lng: 110.3846, lat: 28.4571 },
-      { lng: 110.3882, lat: 28.4568 },
-      { lng: 110.3918, lat: 28.4565 },
-      { lng: 110.3954, lat: 28.4562 },
-      { lng: 110.3990, lat: 28.4560 },
-      { lng: 110.4028, lat: 28.4559 },
-      { lng: 110.4066, lat: 28.4557 },
-      { lng: 110.4092, lat: 28.4556 }
-    ]
-  },
-  {
-    id: 'pipe-low-02',
-    level: 'low',
-    name: '天宁路低压管线',
-    code: 'GX-LP-006',
-    length: 3.5,
-    material: 'PE80 SDR17.6',
-    diameter: 'DN90',
-    pressure: '低压 (3kPa)',
-    road: '天宁西路 — 天宁东路',
-    status: '运行正常',
-    layingMethod: '直埋敷设',
-    depth: '1.0m',
-    commissioningDate: '2026-05',
-    points: [
-      { lng: 110.3828, lat: 28.4704 },
-      { lng: 110.3870, lat: 28.4702 },
-      { lng: 110.3912, lat: 28.4700 },
-      { lng: 110.3954, lat: 28.4697 },
-      { lng: 110.3996, lat: 28.4695 },
-      { lng: 110.4038, lat: 28.4693 },
-      { lng: 110.4078, lat: 28.4691 },
-      { lng: 110.4092, lat: 28.4690 }
+      { lng: 110.361433, lat: 28.454979 },
+      { lng: 110.362363, lat: 28.453169 },
+      { lng: 110.362851, lat: 28.452213 },
+      { lng: 110.364377, lat: 28.452443 },
+      { lng: 110.365138, lat: 28.45246 },
+      { lng: 110.366462, lat: 28.452157 },
+      { lng: 110.369549, lat: 28.451441 },
+      { lng: 110.37219, lat: 28.450897 },
+      { lng: 110.372753, lat: 28.450901 },
+      { lng: 110.373875, lat: 28.451194 },
+      { lng: 110.373913, lat: 28.451107 },
+      { lng: 110.374597, lat: 28.451476 }
     ]
   }
 ]
 
 const pipePointData = [
-  {
-    id: 'point-valve-01', type: 'valve', pipelineId: 'pipe-high-01',
-    name: '辰州北路阀门', code: 'GD-FM-001', road: '辰州北路',
-    status: '在线', deviceModel: 'Z45X-16Q', caliber: 'DN300',
-    lng: 110.3924, lat: 28.4743
-  },
-  {
-    id: 'point-valve-02', type: 'valve', pipelineId: 'pipe-high-01',
-    name: '辰州中路阀门', code: 'GD-FM-002', road: '辰州中路',
-    status: '在线', deviceModel: 'Z41H-25C', caliber: 'DN300',
-    lng: 110.3936, lat: 28.4652
-  },
-  {
-    id: 'point-valve-03', type: 'valve', pipelineId: 'pipe-subhigh-01',
-    name: '古城北路阀门', code: 'GD-FM-003', road: '古城北路',
-    status: '在线', deviceModel: 'Z45X-16Q', caliber: 'DN250',
-    lng: 110.3977, lat: 28.4741
-  },
-  {
-    id: 'point-valve-04', type: 'valve', pipelineId: 'pipe-medium-01',
-    name: '迎宾东路阀门', code: 'GD-FM-004', road: '迎宾东路',
-    status: '在线', deviceModel: 'Z41H-16C', caliber: 'DN200',
-    lng: 110.4054, lat: 28.4630
-  },
-  {
-    id: 'point-regulator-01', type: 'regulator', pipelineId: 'pipe-high-01',
-    name: '辰州路点', code: 'GD-TY-001', road: '辰州中路',
-    status: '在线', deviceModel: 'RTZ-80/0.4F', caliber: 'DN300→DN200',
-    lng: 110.3934, lat: 28.4585
-  },
-  {
-    id: 'point-regulator-02', type: 'regulator', pipelineId: 'pipe-subhigh-01',
-    name: '古城路调压站', code: 'GD-TY-002', road: '古城中路',
-    status: '在线', deviceModel: 'RTZ-50/0.4F', caliber: 'DN250→DN160',
-    lng: 110.3963, lat: 28.4598
-  },
-  {
-    id: 'point-regulator-03', type: 'regulator', pipelineId: 'pipe-medium-02',
-    name: '建设路调压站', code: 'GD-TY-003', road: '建设西路',
-    status: '在线', deviceModel: 'RTZ-31/0.4Q', caliber: 'DN160→DN110',
-    lng: 110.3840, lat: 28.4588
-  },
-  {
-    id: 'point-flowmeter-01', type: 'flowmeter', pipelineId: 'pipe-high-01',
-    name: '辰州北路站', code: 'GD-LL-001', road: '辰州北路',
-    status: '在线', deviceModel: 'LWQZ-150', caliber: 'DN300',
-    lng: 110.3927, lat: 28.4721
-  },
-  {
-    id: 'point-flowmeter-02', type: 'flowmeter', pipelineId: 'pipe-medium-01',
-    name: '迎宾西路站', code: 'GD-LL-002', road: '迎宾西路',
-    status: '在线', deviceModel: 'LWQZ-100', caliber: 'DN200',
-    lng: 110.3824, lat: 28.4645
-  },
-  {
-    id: 'point-flowmeter-03', type: 'flowmeter', pipelineId: 'pipe-medium-02',
-    name: '建设东路站', code: 'GD-LL-003', road: '建设东路',
-    status: '在线', deviceModel: 'LWQZ-80', caliber: 'DN110',
-    lng: 110.4038, lat: 28.4578
-  },
-  {
-    id: 'point-terminal-01', type: 'terminal', pipelineId: 'pipe-medium-02',
-    name: '沅陵县政府终端', code: 'GD-ZD-001', road: '辰州中街',
-    status: '在线', deviceModel: 'RTU-GPRS-4G', caliber: '—',
-    lng: 110.3937, lat: 28.4582
-  },
-  {
-    id: 'point-terminal-02', type: 'terminal', pipelineId: 'pipe-low-02',
-    name: '天宁东路终端', code: 'GD-ZD-002', road: '天宁东路',
-    status: '在线', deviceModel: 'RTU-GPRS-4G', caliber: '—',
-    lng: 110.4092, lat: 28.4690
-  }
+  { id: 'point-valve-01', type: 'valve', pipelineId: 'pipe-high-01', name: 'A点', code: 'GD-FM-001', road: '燃气1', status: '在线', deviceModel: 'Z45X-16Q', caliber: 'DN300', lng: 110.362851, lat: 28.452213 },
+  { id: 'point-valve-02', type: 'valve', pipelineId: 'pipe-high-01', name: 'B点', code: 'GD-FM-002', road: '燃气1', status: '在线', deviceModel: 'Z41H-25C', caliber: 'DN300', lng: 110.369549, lat: 28.451441 },
+  { id: 'point-valve-03', type: 'valve', pipelineId: 'pipe-subhigh-01', name: 'C点', code: 'GD-FM-003', road: '燃气2', status: '在线', deviceModel: 'Z45X-16Q', caliber: 'DN250', lng: 110.373913, lat: 28.451107 },
+  { id: 'point-regulator-01', type: 'regulator', pipelineId: 'pipe-high-01', name: 'D点', code: 'GD-TY-001', road: '燃气1', status: '在线', deviceModel: 'RTZ-80/0.4F', caliber: 'DN300', lng: 110.401084, lat: 28.433876 },
+  { id: 'point-regulator-02', type: 'regulator', pipelineId: 'pipe-high-01', name: 'E点', code: 'GD-TY-002', road: '燃气1', status: '在线', deviceModel: 'RTZ-50/0.4F', caliber: 'DN250', lng: 110.391969, lat: 28.434985 },
+  { id: 'point-flowmeter-01', type: 'flowmeter', pipelineId: 'pipe-high-01', name: 'F点', code: 'GD-LL-001', road: '燃气1', status: '在线', deviceModel: 'LWQZ-150', caliber: 'DN300', lng: 110.376062, lat: 28.436385 },
+  { id: 'point-flowmeter-02', type: 'flowmeter', pipelineId: 'pipe-subhigh-01', name: 'G点', code: 'GD-LL-002', road: '燃气2', status: '在线', deviceModel: 'LWQZ-100', caliber: 'DN200', lng: 110.370581, lat: 28.438198 }
 ]
 
 const manholeData = [
-  {
-    id: 'manhole-cover-01', type: 'cover', pipelineId: 'pipe-high-01',
-    name: '辰州北路窨井盖', code: 'YJ-JG-001', road: '辰州北路',
-    status: '完好', material: '球墨铸铁', size: 'Φ700',
-    lng: 110.3920, lat: 28.4765
-  },
-  {
-    id: 'manhole-cover-02', type: 'cover', pipelineId: 'pipe-high-01',
-    name: '辰州中路窨井盖', code: 'YJ-JG-002', road: '辰州中路',
-    status: '完好', material: '球墨铸铁', size: 'Φ700',
-    lng: 110.3935, lat: 28.4607
-  },
-  {
-    id: 'manhole-cover-03', type: 'cover', pipelineId: 'pipe-subhigh-01',
-    name: '古城北路窨井盖', code: 'YJ-JG-003', road: '古城北路',
-    status: '完好', material: '复合树脂', size: 'Φ700',
-    lng: 110.3979, lat: 28.4765
-  },
-  {
-    id: 'manhole-cover-04', type: 'cover', pipelineId: 'pipe-medium-01',
-    name: '迎宾路窨井盖', code: 'YJ-JG-004', road: '迎宾中路',
-    status: '轻微破损', material: '球墨铸铁', size: 'Φ700',
-    lng: 110.3962, lat: 28.4637
-  },
-  {
-    id: 'manhole-cover-05', type: 'cover', pipelineId: 'pipe-medium-02',
-    name: '建设路窨井盖', code: 'YJ-JG-005', road: '建设东路',
-    status: '完好', material: '球墨铸铁', size: 'Φ600',
-    lng: 110.4002, lat: 28.4581
-  },
-  {
-    id: 'manhole-cover-06', type: 'cover', pipelineId: 'pipe-low-01',
-    name: '滨江路窨井盖', code: 'YJ-JG-006', road: '滨江路',
-    status: '完好', material: '复合树脂', size: 'Φ700',
-    lng: 110.3954, lat: 28.4562
-  },
-  {
-    id: 'manhole-inspection-01', type: 'inspection', pipelineId: 'pipe-high-01',
-    name: '辰州路检查井', code: 'YJ-JC-001', road: '辰州中路',
-    status: '巡检正常', material: '钢筋混凝土', size: '1000×1000',
-    lng: 110.3934, lat: 28.4675
-  },
-  {
-    id: 'manhole-inspection-02', type: 'inspection', pipelineId: 'pipe-subhigh-01',
-    name: '古城路检查井', code: 'YJ-JC-002', road: '古城中路',
-    status: '巡检正常', material: '钢筋混凝土', size: '1200×1000',
-    lng: 110.3970, lat: 28.4669
-  },
-  {
-    id: 'manhole-inspection-03', type: 'inspection', pipelineId: 'pipe-low-02',
-    name: '天宁路检查井', code: 'YJ-JC-003', road: '天宁西路',
-    status: '需维护', material: '钢筋混凝土', size: '1000×1000',
-    lng: 110.3954, lat: 28.4697
-  }
+  { id: 'manhole-cover-01', type: 'cover', pipelineId: 'pipe-high-01', name: 'A点窨井盖', code: 'YJ-JG-001', road: '燃气1', status: '完好', material: '球墨铸铁', size: 'Φ700', lng: 110.362851, lat: 28.452213 },
+  { id: 'manhole-cover-02', type: 'cover', pipelineId: 'pipe-high-01', name: 'B点窨井盖', code: 'YJ-JG-002', road: '燃气1', status: '完好', material: '球墨铸铁', size: 'Φ700', lng: 110.369549, lat: 28.451441 },
+  { id: 'manhole-inspection-01', type: 'inspection', pipelineId: 'pipe-subhigh-01', name: 'C点检查井', code: 'YJ-JC-001', road: '燃气2', status: '巡检正常', material: '钢筋混凝土', size: '1000×1000', lng: 110.373913, lat: 28.451107 },
 ]
 
 const colorMap = {
@@ -613,7 +402,8 @@ function initMap() {
   }
 
   try {
-    const centerBMapPoint = new BMapGL.Point(centerPoint.lng, centerPoint.lat)
+    const [clng, clat] = convertCoord(centerPoint.lng, centerPoint.lat)
+    const centerBMapPoint = new BMapGL.Point(clng, clat)
     mapInstance.centerAndZoom(centerBMapPoint, MAP_DEFAULT_ZOOM)
     mapInstance.enableScrollWheelZoom(true)
   } catch (e) {
@@ -678,7 +468,7 @@ function renderMapScene() {
 }
 
 function drawBoundary() {
-  const pts = boundaryPoints.map(item => new BMapGL.Point(item.lng, item.lat))
+  const pts = boundaryPoints.map(item => { const [lng, lat] = convertCoord(item.lng, item.lat); return new BMapGL.Point(lng, lat) })
   const polygon = new BMapGL.Polygon(pts, {
     strokeColor: '#52b788',
     strokeWeight: 2.5,
@@ -694,23 +484,25 @@ function drawPipelines() {
   pipelineData.forEach(item => {
     try {
       if (!layerState.pipelines[item.level]) return
-      const pts = item.points.map(p => new BMapGL.Point(p.lng, p.lat))
+      const pts = item.points.map(p => { const [lng, lat] = convertCoord(p.lng, p.lat); return new BMapGL.Point(lng, lat) })
       const polyline = new BMapGL.Polyline(pts, {
         strokeColor: colorMap[item.level],
         strokeWeight: 6,
         strokeOpacity: 0.92
       })
+      const firstPt = { lng: convertCoord(item.points[0].lng, item.points[0].lat)[0], lat: convertCoord(item.points[0].lng, item.points[0].lat)[1] }
       try {
         polyline.addEventListener('click', (e) => {
           overlayClicked = true
           e.domEvent && e.domEvent.stopPropagation && e.domEvent.stopPropagation()
-          showPopup(item.points[0].lng, item.points[0].lat, buildPopupHTML(buildPipelineDetail(item)))
+          showPopup(firstPt.lng, firstPt.lat, buildPopupHTML(buildPipelineDetail(item)))
           selectedFeature.value = buildPipelineDetail(item)
         })
       } catch (_) { /* polyline click listener failed */ }
       mapInstance.addOverlay(polyline)
 
-      const mid = getMidPoint(item.points)
+      const rawMid = getMidPoint(item.points)
+      const mid = { lng: convertCoord(rawMid.lng, rawMid.lat)[0], lat: convertCoord(rawMid.lng, rawMid.lat)[1] }
       addPipeLabel(mid.lng, mid.lat, item.name, colorMap[item.level], item)
     } catch (e) {
       console.warn(`绘制管线 ${item.name} 失败:`, e)
@@ -722,8 +514,9 @@ function drawPipePoints() {
   pipePointData.forEach(item => {
     try {
       if (!layerState.pipePoints[item.type]) return
-      addPointMarker(item.lng, item.lat, colorMap[item.type], item.name, 'dot', () => {
-        showPopup(item.lng, item.lat, buildPopupHTML(buildPipePointDetail(item)))
+      const [plng, plat] = convertCoord(item.lng, item.lat)
+      addPointMarker(plng, plat, colorMap[item.type], item.name, 'dot', () => {
+        showPopup(plng, plat, buildPopupHTML(buildPipePointDetail(item)))
         selectedFeature.value = buildPipePointDetail(item)
       })
     } catch (e) {
@@ -736,8 +529,9 @@ function drawManholes() {
   manholeData.forEach(item => {
     try {
       if (!layerState.manholes[item.type]) return
-      addPointMarker(item.lng, item.lat, colorMap[item.type], item.name, 'square', () => {
-        showPopup(item.lng, item.lat, buildPopupHTML(buildManholeDetail(item)))
+      const [mlng, mlat] = convertCoord(item.lng, item.lat)
+      addPointMarker(mlng, mlat, colorMap[item.type], item.name, 'square', () => {
+        showPopup(mlng, mlat, buildPopupHTML(buildManholeDetail(item)))
         selectedFeature.value = buildManholeDetail(item)
       })
     } catch (e) {
@@ -901,17 +695,18 @@ function handleSearch() {
     return
   }
 
-  mapInstance.centerAndZoom(new BMapGL.Point(matched.lng, matched.lat), 18)
+  const [mlng, mlat] = convertCoord(matched.lng, matched.lat)
+  mapInstance.centerAndZoom(new BMapGL.Point(mlng, mlat), 18)
 
   if (matched.kind === 'pipeline') {
     selectedFeature.value = buildPipelineDetail(matched.raw)
-    showPopup(matched.lng, matched.lat, buildPopupHTML(selectedFeature.value))
+    showPopup(mlng, mlat, buildPopupHTML(selectedFeature.value))
   } else if (matched.kind === 'pipePoint') {
     selectedFeature.value = buildPipePointDetail(matched.raw)
-    showPopup(matched.lng, matched.lat, buildPopupHTML(selectedFeature.value))
+    showPopup(mlng, mlat, buildPopupHTML(selectedFeature.value))
   } else {
     selectedFeature.value = buildManholeDetail(matched.raw)
-    showPopup(matched.lng, matched.lat, buildPopupHTML(selectedFeature.value))
+    showPopup(mlng, mlat, buildPopupHTML(selectedFeature.value))
   }
 
   ElMessage.success(`已定位到 ${matched.name}`)
@@ -929,7 +724,8 @@ function refreshScene() {
 
 function locateCenter() {
   if (!mapInstance) return
-  mapInstance.centerAndZoom(new BMapGL.Point(centerPoint.lng, centerPoint.lat), MAP_DEFAULT_ZOOM)
+  const [clng, clat] = convertCoord(centerPoint.lng, centerPoint.lat)
+  mapInstance.centerAndZoom(new BMapGL.Point(clng, clat), MAP_DEFAULT_ZOOM)
 }
 
 function zoomIn() {
@@ -958,8 +754,9 @@ function toggleFullscreen() {
 
 function handleFullscreenChange() {
   if (!mapInstance) return
+  const [clng, clat] = convertCoord(centerPoint.lng, centerPoint.lat)
   setTimeout(() => {
-    mapInstance.centerAndZoom(new BMapGL.Point(centerPoint.lng, centerPoint.lat), mapInstance.getZoom())
+    mapInstance.centerAndZoom(new BMapGL.Point(clng, clat), mapInstance.getZoom())
   }, 200)
 }
 </script>

+ 22 - 59
src/views/subSystem/basic/RepairRecord.vue

@@ -118,6 +118,7 @@
 import { computed, nextTick, onBeforeUnmount, onMounted, reactive, ref } from 'vue'
 import * as echarts from 'echarts'
 import { ElMessage, ElMessageBox } from 'element-plus'
+import { convertCoord } from '@/utils/coordTransform'
 
 // ==================== 静态数据 ====================
 const loading = ref(false)
@@ -143,8 +144,8 @@ function getDictLabel(dict, value) {
 }
 
 // ==================== 百度地图配置 ====================
-const centerPoint = { lng: 110.3937, lat: 28.4640 }
-const MAP_BOUNDS = { southWest: { lng: 110.365, lat: 28.452 }, northEast: { lng: 110.420, lat: 28.482 } }
+const centerPoint = { lng: 110.386, lat: 28.445 }
+const MAP_BOUNDS = { southWest: { lng: 110.355, lat: 28.428 }, northEast: { lng: 110.410, lat: 28.460 } }
 const MAP_MIN_ZOOM = 13
 const MAP_MAX_ZOOM = 19
 const MAP_DEFAULT_ZOOM = 15
@@ -157,61 +158,21 @@ let mapOverlays = []
 
 // ==================== 管网数据 (沅陵县真实坐标) ====================
 const pipelineData = [
-  // 高压管线 — 辰州北路/辰州中路 (拆分为5段 net001-net003)
-  { id: 'net001', name: '辰州北路高压段', pressure: 'high',
-    points: [{lng:110.3918,lat:28.4793},{lng:110.3920,lat:28.4765},{lng:110.3924,lat:28.4743},{lng:110.3927,lat:28.4721},{lng:110.3931,lat:28.4698}] },
-  { id: 'net002', name: '辰州中路高压A段', pressure: 'high',
-    points: [{lng:110.3931,lat:28.4698},{lng:110.3934,lat:28.4675},{lng:110.3936,lat:28.4652},{lng:110.3937,lat:28.4630}] },
-  { id: 'net003', name: '辰州中路高压B段', pressure: 'high',
-    points: [{lng:110.3937,lat:28.4630},{lng:110.3935,lat:28.4607},{lng:110.3934,lat:28.4585},{lng:110.3935,lat:28.4576}] },
-  // 次高压/中压 — 古城路 (拆分为4段 net004-net007)
-  { id: 'net004', name: '古城北路中压段', pressure: 'medium',
-    points: [{lng:110.3980,lat:28.4790},{lng:110.3979,lat:28.4765},{lng:110.3977,lat:28.4741},{lng:110.3975,lat:28.4717}] },
-  { id: 'net005', name: '古城中路中压A段', pressure: 'medium',
-    points: [{lng:110.3975,lat:28.4717},{lng:110.3973,lat:28.4693},{lng:110.3970,lat:28.4669}] },
-  { id: 'net006', name: '古城中路中压B段', pressure: 'medium',
-    points: [{lng:110.3970,lat:28.4669},{lng:110.3968,lat:28.4645},{lng:110.3965,lat:28.4622}] },
-  { id: 'net007', name: '古城南路中压段', pressure: 'medium',
-    points: [{lng:110.3965,lat:28.4622},{lng:110.3963,lat:28.4598},{lng:110.3962,lat:28.4575}] },
-  // 中压 — 迎宾路 (拆分为3段 net008-net010)
-  { id: 'net008', name: '迎宾西路中压段', pressure: 'medium',
-    points: [{lng:110.3732,lat:28.4650},{lng:110.3778,lat:28.4648},{lng:110.3824,lat:28.4645},{lng:110.3870,lat:28.4642}] },
-  { id: 'net009', name: '县政府迎宾路中压段', pressure: 'medium',
-    points: [{lng:110.3870,lat:28.4642},{lng:110.3916,lat:28.4640},{lng:110.3962,lat:28.4637}] },
-  { id: 'net010', name: '迎宾东路中压段', pressure: 'medium',
-    points: [{lng:110.3962,lat:28.4637},{lng:110.4008,lat:28.4634},{lng:110.4054,lat:28.4630},{lng:110.4098,lat:28.4627},{lng:110.4120,lat:28.4625}] },
-  // 中压 — 建设路 (拆分为3段 net011-net013)
-  { id: 'net011', name: '建设西路中压段', pressure: 'medium',
-    points: [{lng:110.3748,lat:28.4583},{lng:110.3794,lat:28.4586},{lng:110.3840,lat:28.4588},{lng:110.3886,lat:28.4589}] },
-  { id: 'net012', name: '建设路中段', pressure: 'medium',
-    points: [{lng:110.3886,lat:28.4589},{lng:110.3912,lat:28.4586},{lng:110.3937,lat:28.4582},{lng:110.3966,lat:28.4579}] },
-  { id: 'net013', name: '建设东路中压段', pressure: 'medium',
-    points: [{lng:110.3966,lat:28.4579},{lng:110.4002,lat:28.4581},{lng:110.4038,lat:28.4578},{lng:110.4076,lat:28.4575}] },
-  // 低压 — 滨江路 (拆分为2段 net014-net015)
-  { id: 'net014', name: '滨江路西低压段', pressure: 'low',
-    points: [{lng:110.3762,lat:28.4569},{lng:110.3804,lat:28.4570},{lng:110.3846,lat:28.4571},{lng:110.3882,lat:28.4568},{lng:110.3918,lat:28.4565}] },
-  { id: 'net015', name: '滨江路东低压段', pressure: 'low',
-    points: [{lng:110.3918,lat:28.4565},{lng:110.3954,lat:28.4562},{lng:110.3990,lat:28.4560},{lng:110.4028,lat:28.4559},{lng:110.4066,lat:28.4557},{lng:110.4092,lat:28.4556}] },
-  // 低压 — 天宁路 (拆分为2段 net016-net017)
-  { id: 'net016', name: '天宁西路低压段', pressure: 'low',
-    points: [{lng:110.3828,lat:28.4704},{lng:110.3870,lat:28.4702},{lng:110.3912,lat:28.4700},{lng:110.3954,lat:28.4697}] },
-  { id: 'net017', name: '天宁东路低压段', pressure: 'low',
-    points: [{lng:110.3954,lat:28.4697},{lng:110.3996,lat:28.4695},{lng:110.4038,lat:28.4693},{lng:110.4078,lat:28.4691},{lng:110.4092,lat:28.4690}] },
+  { id: 'net001', name: '燃气1', pressure: 'high',
+    points: [{lng:110.404947,lat:28.433419},{lng:110.404836,lat:28.433429},{lng:110.403275,lat:28.433571},{lng:110.401084,lat:28.433876},{lng:110.399601,lat:28.433876},{lng:110.398112,lat:28.433979},{lng:110.396717,lat:28.434314},{lng:110.394299,lat:28.434538},{lng:110.394352,lat:28.434887},{lng:110.391969,lat:28.434985},{lng:110.384374,lat:28.435695},{lng:110.381418,lat:28.43559},{lng:110.377993,lat:28.436193},{lng:110.376062,lat:28.436385},{lng:110.374231,lat:28.43655},{lng:110.372584,lat:28.437107},{lng:110.371292,lat:28.4377},{lng:110.370581,lat:28.438198},{lng:110.369831,lat:28.438821}] },
+  { id: 'net002', name: '燃气2', pressure: 'medium',
+    points: [{lng:110.361433,lat:28.454979},{lng:110.362363,lat:28.453169},{lng:110.362851,lat:28.452213},{lng:110.364377,lat:28.452443},{lng:110.365138,lat:28.45246},{lng:110.366462,lat:28.452157},{lng:110.369549,lat:28.451441},{lng:110.37219,lat:28.450897},{lng:110.372753,lat:28.450901},{lng:110.373875,lat:28.451194},{lng:110.373913,lat:28.451107},{lng:110.374597,lat:28.451476}] },
 ]
 
 // 管点数据 (管网节点位置)
 const pipePointData = [
-  { name: '辰州北路阀门', lng: 110.3924, lat: 28.4743, pipelineId: 'net001' },
-  { name: '辰州中路阀门', lng: 110.3936, lat: 28.4652, pipelineId: 'net002' },
-  { name: '辰州路调压站', lng: 110.3934, lat: 28.4585, pipelineId: 'net003' },
-  { name: '古城北路阀门', lng: 110.3977, lat: 28.4741, pipelineId: 'net004' },
-  { name: '古城路调压站', lng: 110.3963, lat: 28.4598, pipelineId: 'net007' },
-  { name: '迎宾西路站', lng: 110.3824, lat: 28.4645, pipelineId: 'net008' },
-  { name: '迎宾东路阀门', lng: 110.4054, lat: 28.4630, pipelineId: 'net010' },
-  { name: '建设路点', lng: 110.3840, lat: 28.4588, pipelineId: 'net011' },
-  { name: '县政府终端', lng: 110.3937, lat: 28.4582, pipelineId: 'net012' },
-  { name: '建设东路点', lng: 110.4038, lat: 28.4578, pipelineId: 'net013' },
-  { name: '天宁东路终端', lng: 110.4092, lat: 28.4690, pipelineId: 'net017' },
+  { name: 'A点', lng: 110.362363, lat: 28.453169, pipelineId: 'net001' },
+  { name: 'B点', lng: 110.364377, lat: 28.452443, pipelineId: 'net001' },
+  { name: 'C点', lng: 110.372753, lat: 28.450901, pipelineId: 'net001' },
+  { name: 'D点', lng: 110.401084, lat: 28.433876, pipelineId: 'net001' },
+  { name: 'E点', lng: 110.391969, lat: 28.434985, pipelineId: 'net001' },
+  { name: 'F点', lng: 110.376062, lat: 28.436385, pipelineId: 'net001' },
+  { name: 'G点', lng: 110.370581, lat: 28.438198, pipelineId: 'net001' },
 ]
 
 // ==================== 维修记录 ====================
@@ -280,7 +241,7 @@ function initMap() {
     console.error('创建地图实例失败:', e); mapError.value = '百度地图初始化失败,请检查AK和网络连接。'; return
   }
 
-  try { mapInstance.centerAndZoom(new BMapGL.Point(centerPoint.lng, centerPoint.lat), MAP_DEFAULT_ZOOM); mapInstance.enableScrollWheelZoom(true) } catch (e) { console.error('设置中心失败:', e) }
+  const [clng, clat] = convertCoord(centerPoint.lng, centerPoint.lat); try { mapInstance.centerAndZoom(new BMapGL.Point(clng, clat), MAP_DEFAULT_ZOOM); mapInstance.enableScrollWheelZoom(true) } catch (e) { console.error('设置中心失败:', e) }
 
   try { if (typeof mapInstance.setMinZoom === 'function') mapInstance.setMinZoom(MAP_MIN_ZOOM); if (typeof mapInstance.setMaxZoom === 'function') mapInstance.setMaxZoom(MAP_MAX_ZOOM) } catch (e) {}
 
@@ -310,7 +271,7 @@ function renderMapScene() {
   pipelineData.forEach(pipe => {
     try {
       const hasRepair = repairedNetworkIds.value.has(pipe.id)
-      const pts = pipe.points.map(p => new BMapGL.Point(p.lng, p.lat))
+      const pts = pipe.points.map(p => { const [lng, lat] = convertCoord(p.lng, p.lat); return new BMapGL.Point(lng, lat) })
       const polyline = new BMapGL.Polyline(pts, {
         strokeColor: hasRepair ? '#f59e0b' : pressureColors[pipe.pressure],
         strokeWeight: hasRepair ? 5 : 3.5,
@@ -323,7 +284,8 @@ function renderMapScene() {
         overlayClicked = true
         if (e && e.domEvent) e.domEvent.stopPropagation()
         closeInfoWindow()
-        const mid = getMidPoint(pipe.points)
+        const rawMid = getMidPoint(pipe.points)
+        const mid = { lng: convertCoord(rawMid.lng, rawMid.lat)[0], lat: convertCoord(rawMid.lng, rawMid.lat)[1] }
         const count = tableData.value.filter(r => r.networkId === pipe.id).length
         const repairList = tableData.value.filter(r => r.networkId === pipe.id).slice(0, 3).map(r => `${r.repairDate} ${getDictLabel(repairTypeDict, r.repairType)}`).join('<br>')
         const html = `<div style="font-size:13px;max-width:300px;"><b>${pipe.id}</b> ${pipe.name}<br>
@@ -343,7 +305,7 @@ function renderMapScene() {
   pipePointData.forEach(point => {
     try {
       const hasRepair = repairedNetworkIds.value.has(point.pipelineId)
-      const pt = new BMapGL.Point(point.lng, point.lat)
+      const [plng, plat] = convertCoord(point.lng, point.lat); const pt = new BMapGL.Point(plng, plat)
       const color = hasRepair ? '#f59e0b' : '#3b82f6'
       const size = hasRepair ? 10 : 7
       const label = new BMapGL.Label(point.name, {
@@ -377,8 +339,9 @@ function renderMapScene() {
   pipelineData.forEach(pipe => {
     if (!repairedNetworkIds.value.has(pipe.id)) return
     try {
-      const mid = getMidPoint(pipe.points)
-      const pt = new BMapGL.Point(mid.lng, mid.lat)
+      const rawMid2 = getMidPoint(pipe.points)
+      const mid2 = { lng: convertCoord(rawMid2.lng, rawMid2.lat)[0], lat: convertCoord(rawMid2.lng, rawMid2.lat)[1] }
+      const pt = new BMapGL.Point(mid2.lng, mid2.lat)
       const count = tableData.value.filter(r => r.networkId === pipe.id).length
       const marker = new BMapGL.Label(String(count), {
         position: pt,

+ 33 - 64
src/views/subSystem/gas/gasOperamon/ssjcyzt.vue

@@ -120,6 +120,7 @@
 <script setup>
 import { ref, computed, reactive, onMounted, onBeforeUnmount, nextTick } from 'vue'
 import { MapLocation, Search, Refresh, FullScreen, ZoomIn, ZoomOut, Location } from '@element-plus/icons-vue'
+import { convertPipeline, convertPoints, convertCoord } from '@/utils/coordTransform'
 
 // ==================== 图层状态 ====================
 const layers = reactive({
@@ -145,85 +146,45 @@ const overlayStore = {
 }
 
 // ==================== 沅陵县太常片区静态数据 ====================
-const MAP_CENTER = { lng: 110.395, lat: 28.470 }
+const MAP_CENTER = { lng: 110.386, lat: 28.445 }
 const MAP_DEFAULT_ZOOM = 14
 
-// --- 管线数据 (polyline paths) —— 沅陵县城北岸城区路网 ---
+// --- 管线数据 (polyline paths) ---
 const pipelines = [
-  // 高压管线 (红色) —— 沿辰州路南北主干
-  { id: 'P1', name: '辰州北路高压段', type: 'highPressure', pressure: '高压 0.4MPa', color: '#f56c6c', width: 5,
-    path: [[110.3940, 28.4820], [110.3942, 28.4770], [110.3938, 28.4710], [110.3936, 28.4645]] },
-  { id: 'P2', name: '辰州中路高压段', type: 'highPressure', pressure: '高压 0.4MPa', color: '#f56c6c', width: 5,
-    path: [[110.3938, 28.4710], [110.3935, 28.4690], [110.3936, 28.4645]] },
-  { id: 'P3', name: '建设东路高压段', type: 'highPressure', pressure: '高压 0.4MPa', color: '#f56c6c', width: 5,
-    path: [[110.3940, 28.4658], [110.3980, 28.4660], [110.4050, 28.4658]] },
-
-  // 中压管线 (橙色)
-  { id: 'P4', name: '古城北路中压段', type: 'mediumPressure', pressure: '中压 0.2MPa', color: '#e6a23c', width: 4,
-    path: [[110.3980, 28.4820], [110.3978, 28.4775], [110.3972, 28.4710], [110.3965, 28.4655]] },
-  { id: 'P5', name: '古城南路中压段', type: 'mediumPressure', pressure: '中压 0.2MPa', color: '#e6a23c', width: 4,
-    path: [[110.3965, 28.4655], [110.3962, 28.4635]] },
-  { id: 'P6', name: '迎宾西路中压段', type: 'mediumPressure', pressure: '中压 0.2MPa', color: '#e6a23c', width: 4,
-    path: [[110.3830, 28.4695], [110.3870, 28.4700], [110.3940, 28.4695]] },
-  { id: 'P7', name: '迎宾东路中压段', type: 'mediumPressure', pressure: '中压 0.2MPa', color: '#e6a23c', width: 4,
-    path: [[110.3940, 28.4695], [110.4000, 28.4692], [110.4055, 28.4690], [110.4100, 28.4688]] },
-  { id: 'P8', name: '建设路中压段', type: 'mediumPressure', pressure: '中压 0.2MPa', color: '#e6a23c', width: 4,
-    path: [[110.3840, 28.4660], [110.3900, 28.4658], [110.3940, 28.4656], [110.4000, 28.4655]] },
-  { id: 'P9', name: '天宁路中压段', type: 'mediumPressure', pressure: '中压 0.2MPa', color: '#e6a23c', width: 4,
-    path: [[110.3840, 28.4760], [110.3900, 28.4755], [110.3975, 28.4765], [110.4050, 28.4750], [110.4090, 28.4752]] },
-
-  // 低压管线 (绿色)
-  { id: 'P10', name: '滨江西路低压段', type: 'lowPressure', pressure: '低压 0.1MPa', color: '#67c23a', width: 3,
-    path: [[110.3800, 28.4638], [110.3860, 28.4640], [110.3930, 28.4638]] },
-  { id: 'P11', name: '滨江东路低压段', type: 'lowPressure', pressure: '低压 0.1MPa', color: '#67c23a', width: 3,
-    path: [[110.3930, 28.4638], [110.4000, 28.4632], [110.4066, 28.4630]] },
-  { id: 'P13', name: '建设西路低压段', type: 'lowPressure', pressure: '低压 0.1MPa', color: '#67c23a', width: 3,
-    path: [[110.3815, 28.4660], [110.3840, 28.4662]] }
+  { id: 'P1', name: '燃气1', type: 'highPressure', pressure: '高压 0.4MPa', color: '#f56c6c', width: 5,
+    path: [[110.404947, 28.433419], [110.404836, 28.433429], [110.403275, 28.433571], [110.401084, 28.433876], [110.399601, 28.433876], [110.398112, 28.433979], [110.396717, 28.434314], [110.394299, 28.434538], [110.394352, 28.434887], [110.391969, 28.434985], [110.384374, 28.435695], [110.381418, 28.43559], [110.377993, 28.436193], [110.376062, 28.436385], [110.374231, 28.43655], [110.372584, 28.437107], [110.371292, 28.4377], [110.370581, 28.438198], [110.369831, 28.438821]] },
+  { id: 'P2', name: '燃气2', type: 'mediumPressure', pressure: '中压 0.2MPa', color: '#e6a23c', width: 4,
+    path: [[110.361433, 28.454979], [110.362363, 28.453169], [110.362851, 28.452213], [110.364377, 28.452443], [110.365138, 28.45246], [110.366462, 28.452157], [110.369549, 28.451441], [110.37219, 28.450897], [110.372753, 28.450901], [110.373875, 28.451194], [110.373913, 28.451107], [110.374597, 28.451476]] },
 ]
 
 // --- 甲烷监测点(相邻地下空间)---
 const methanePoints = [
-  { id: 'M1', name: '辰州北路地下管廊CH4-1#', type: 'methane', typeName: '甲烷监测点', lng: 110.3940, lat: 28.4770, address: '沅陵县太常片区辰州北路地下综合管廊', methane: 28, status: 'alert', updateTime: '2026-06-13 15:23:45', code: 'CH4-001' },
-  { id: 'M2', name: '古城中路地下空间CH4-2#', type: 'methane', typeName: '甲烷监测点', lng: 110.3972, lat: 28.4710, address: '沅陵县太常片区古城中路太常安置区地下车库', methane: 12, status: 'online', updateTime: '2026-06-13 15:22:30', code: 'CH4-002' },
-  { id: 'M3', name: '迎宾东路地下空间CH4-3#', type: 'methane', typeName: '甲烷监测点', lng: 110.4055, lat: 28.4690, address: '沅陵县太常片区迎宾东路商贸城地下通道', methane: 35, status: 'alert', updateTime: '2026-06-13 15:21:15', code: 'CH4-003' },
-  { id: 'M4', name: '建设路地下管沟CH4-4#', type: 'methane', typeName: '甲烷监测点', lng: 110.3940, lat: 28.4656, address: '沅陵县太常片区建设路县政府南侧地下管沟', methane: 8, status: 'online', updateTime: '2026-06-13 15:24:00', code: 'CH4-004' },
-  { id: 'M5', name: '滨江路河堤管廊CH4-5#', type: 'methane', typeName: '甲烷监测点', lng: 110.3860, lat: 28.4640, address: '沅陵县太常片区滨江西路河堤管廊段', methane: 5, status: 'online', updateTime: '2026-06-13 15:20:30', code: 'CH4-005' },
-  { id: 'M6', name: '天宁东路管沟CH4-6#', type: 'methane', typeName: '甲烷监测点', lng: 110.4088, lat: 28.4752, address: '沅陵县太常片区天宁东路末端综合管沟', methane: 18, status: 'warning', updateTime: '2026-06-13 15:19:45', code: 'CH4-006' }
+  { id: 'M1', name: '太常路CH4监测', type: 'methane', typeName: '甲烷监测点', lng: 110.362851, lat: 28.452213, address: '太常路北段地下管沟', methane: 28, status: 'alert', updateTime: '2026-06-13 15:23:45', code: 'CH4-001' },
+  { id: 'M3', name: '滨江路CH4监测', type: 'methane', typeName: '甲烷监测点', lng: 110.381, lat: 28.443, address: '滨江路西段地下空间', methane: 35, status: 'alert', updateTime: '2026-06-13 15:21:15', code: 'CH4-003' },
 ]
 
 // --- 温湿度监测点 ---
 const tempHumidityPoints = [
-  { id: 'TH1', name: '辰州中路温湿度1#', type: 'temperature', typeName: '温湿度监测点', lng: 110.3935, lat: 28.4710, address: '沅陵县太常片区辰州中路管廊入口', temperature: 25.8, humidity: 62, status: 'online', updateTime: '2026-06-13 15:25:00', code: 'TH-001' },
-  { id: 'TH2', name: '古城北路温湿度2#', type: 'temperature', typeName: '温湿度监测点', lng: 110.3978, lat: 28.4775, address: '沅陵县太常片区古城北路管廊检查井', temperature: 27.2, humidity: 58, status: 'online', updateTime: '2026-06-13 15:23:30', code: 'TH-002' },
-  { id: 'TH3', name: '建设东路温湿度3#', type: 'temperature', typeName: '温湿度监测点', lng: 110.4050, lat: 28.4658, address: '沅陵县太常片区建设东路工业园管廊', temperature: 29.1, humidity: 55, status: 'warning', updateTime: '2026-06-13 15:22:00', code: 'TH-003' }
+  { id: 'TH1', name: '城东温湿度', type: 'temperature', typeName: '温湿度监测点', lng: 110.407, lat: 28.445, address: '城东大道管沟监测点', temperature: 25.8, humidity: 62, status: 'online', updateTime: '2026-06-13 15:25:00', code: 'TH-001' },
+  { id: 'TH2', name: '古城路温湿度', type: 'temperature', typeName: '温湿度监测点', lng: 110.372, lat: 28.441, address: '古城路中段管沟', temperature: 27.2, humidity: 58, status: 'online', updateTime: '2026-06-13 15:23:30', code: 'TH-002' },
 ]
 
 // --- 压力监测点 ---
 const pressurePoints = [
-  { id: 'PR1', name: '辰州北路高压测点1#', type: 'pressure', typeName: '压力监测点', lng: 110.3940, lat: 28.4750, address: '沅陵县太常片区辰州北路与建设路交叉口北侧', pressure: 385, status: 'online', updateTime: '2026-06-13 15:32:18', code: 'PR-001' },
-  { id: 'PR2', name: '辰州中路高压测点2#', type: 'pressure', typeName: '压力监测点', lng: 110.3935, lat: 28.4710, address: '沅陵县太常片区辰州中路与天宁路交叉口南侧', pressure: 432, status: 'danger', updateTime: '2026-06-13 15:31:45', code: 'PR-002' },
-  { id: 'PR3', name: '古城中路中压测点2#', type: 'pressure', typeName: '压力监测点', lng: 110.3972, lat: 28.4710, address: '沅陵县太常片区古城中路太常安置区段', pressure: 142, status: 'warning', updateTime: '2026-06-13 15:29:58', code: 'PR-003' },
-  { id: 'PR4', name: '迎宾西路中压测点1#', type: 'pressure', typeName: '压力监测点', lng: 110.3870, lat: 28.4700, address: '沅陵县太常片区迎宾西路县政府对面', pressure: 205, status: 'online', updateTime: '2026-06-13 15:28:15', code: 'PR-004' },
-  { id: 'PR5', name: '建设路中压测点1#', type: 'pressure', typeName: '压力监测点', lng: 110.3940, lat: 28.4656, address: '沅陵县太常片区建设路县政府南侧', pressure: 0, status: 'offline', updateTime: '2026-06-13 12:05:00', code: 'PR-005' },
-  { id: 'PR6', name: '滨江路低压测点1#', type: 'pressure', typeName: '压力监测点', lng: 110.3830, lat: 28.4638, address: '沅陵县太常片区滨江西路河堤段', pressure: 112, status: 'online', updateTime: '2026-06-13 15:31:10', code: 'PR-006' },
-  { id: 'PR7', name: '建设东路高压测点4#', type: 'pressure', typeName: '压力监测点', lng: 110.4050, lat: 28.4658, address: '沅陵县太常片区建设东路工业园入口处', pressure: 410, status: 'warning', updateTime: '2026-06-13 15:31:25', code: 'PR-007' }
+  { id: 'PR1', name: '太常路压力', type: 'pressure', typeName: '压力监测点', lng: 110.402, lat: 28.454, address: '太常路与迎宾路交叉口', pressure: 385, status: 'online', updateTime: '2026-06-13 15:32:18', code: 'PR-001' },
+  { id: 'PR2', name: '建设路压力', type: 'pressure', typeName: '压力监测点', lng: 110.385, lat: 28.436, address: '建设路中段阀门井', pressure: 432, status: 'danger', updateTime: '2026-06-13 15:31:45', code: 'PR-002' },
+  { id: 'PR3', name: '酉水大桥压力', type: 'pressure', typeName: '压力监测点', lng: 110.37219, lat: 28.450897, address: '学府路北段调压柜', pressure: 142, status: 'warning', updateTime: '2026-06-13 15:29:58', code: 'PR-003' },
 ]
 
 // --- 流量监测点 ---
 const flowPoints = [
-  { id: 'F1', name: '辰州北路流量计1#', type: 'flow', typeName: '流量监测点', lng: 110.3940, lat: 28.4760, address: '沅陵县太常片区辰州北路门站出口计量间', flow: 1850, status: 'online', updateTime: '2026-06-13 15:32:18', code: 'FL-001' },
-  { id: 'F2', name: '辰州中路流量计2#', type: 'flow', typeName: '流量监测点', lng: 110.3935, lat: 28.4720, address: '沅陵县太常片区辰州中路调压站进口侧', flow: 2620, status: 'danger', updateTime: '2026-06-13 15:31:45', code: 'FL-002' },
-  { id: 'F3', name: '古城中路流量计2#', type: 'flow', typeName: '流量监测点', lng: 110.3972, lat: 28.4710, address: '沅陵县太常片区古城中路太常安置区段', flow: 820, status: 'danger', updateTime: '2026-06-13 15:29:58', code: 'FL-003' },
-  { id: 'F4', name: '迎宾西路流量计1#', type: 'flow', typeName: '流量监测点', lng: 110.3870, lat: 28.4700, address: '沅陵县太常片区迎宾西路县政府对面', flow: 310, status: 'online', updateTime: '2026-06-13 15:28:15', code: 'FL-004' },
-  { id: 'F5', name: '建设西路流量计2#', type: 'flow', typeName: '流量监测点', lng: 110.3840, lat: 28.4660, address: '沅陵县太常片区建设西路工业园计量站', flow: 680, status: 'online', updateTime: '2026-06-13 15:29:30', code: 'FL-005' },
-  { id: 'F6', name: '滨江东路流量计2#', type: 'flow', typeName: '流量监测点', lng: 110.4066, lat: 28.4630, address: '沅陵县太常片区滨江东路商业街', flow: 210, status: 'danger', updateTime: '2026-06-13 15:30:40', code: 'FL-006' }
+  { id: 'F2', name: '城东流量', type: 'flow', typeName: '流量监测点', lng: 110.409, lat: 28.452, address: '城东大道计量站', flow: 2620, status: 'danger', updateTime: '2026-06-13 15:31:45', code: 'FL-002' },
 ]
 
 // --- 燃气场站 ---
 const stations = [
-  { id: 'S1', name: '沅陵天然气门站', type: 'gateStation', typeName: '门站', lng: 110.3940, lat: 28.4770, address: '沅陵县太常片区辰州北路188号', status: 'online', updateTime: '2026-06-13 15:35:00', code: 'GS-001' },
-  { id: 'S2', name: '太常片区调压站', type: 'regulatorStation', typeName: '调压站', lng: 110.3965, lat: 28.4695, address: '沅陵县太常片区迎宾路与古城路交叉口', status: 'online', updateTime: '2026-06-13 15:30:00', code: 'RS-001' },
-  { id: 'S3', name: '沅陵LNG储配站', type: 'lngStation', typeName: 'LNG储配站', lng: 110.4030, lat: 28.4670, address: '沅陵县太常片区建设东路工业园末端', status: 'online', updateTime: '2026-06-13 15:28:00', code: 'LNG-001' }
+  { id: 'S1', name: '龙兴路门站', type: 'gateStation', typeName: '门站', lng: 110.401084, lat: 28.433876, address: '龙兴路', status: 'online', updateTime: '2026-06-13 15:35:00', code: 'GS-001' },
+  { id: 'S2', name: '龙兴路调压站', type: 'regulatorStation', typeName: '调压站', lng: 110.394299, lat: 28.434538, address: '龙兴路中段', status: 'online', updateTime: '2026-06-13 15:30:00', code: 'RS-001' },
 ]
 
 // ==================== 统计数据 ====================
@@ -267,7 +228,8 @@ function onSearch() {
   if (!mapInstance || typeof BMapGL === 'undefined') return
   const found = filteredFeatures.value[0]
   if (found) {
-    const pt = new BMapGL.Point(found.lng, found.lat)
+    const [sfLng, sfLat] = convertCoord(found.lng, found.lat)
+    const pt = new BMapGL.Point(sfLng, sfLat)
     mapInstance.panTo(pt)
     openFeatureInfo(found)
   }
@@ -299,7 +261,8 @@ function zoomOut() {
 }
 function fitBounds() {
   if (!mapInstance || typeof BMapGL === 'undefined') return
-  mapInstance.centerAndZoom(new BMapGL.Point(MAP_CENTER.lng, MAP_CENTER.lat), MAP_DEFAULT_ZOOM)
+  const [fLng, fLat] = convertCoord(MAP_CENTER.lng, MAP_CENTER.lat)
+  mapInstance.centerAndZoom(new BMapGL.Point(fLng, fLat), MAP_DEFAULT_ZOOM)
   closeInfoWindow()
 }
 function refreshData() {
@@ -337,7 +300,8 @@ function initMap() {
     return
   }
 
-  mapInstance.centerAndZoom(new BMapGL.Point(MAP_CENTER.lng, MAP_CENTER.lat), MAP_DEFAULT_ZOOM)
+  const [mcLng, mcLat] = convertCoord(MAP_CENTER.lng, MAP_CENTER.lat)
+  mapInstance.centerAndZoom(new BMapGL.Point(mcLng, mcLat), MAP_DEFAULT_ZOOM)
   mapInstance.enableScrollWheelZoom(true)
   mapInstance.setMinZoom(12)
   mapInstance.setMaxZoom(18)
@@ -376,7 +340,10 @@ function getLayerKey(category) {
 function renderPipelines() {
   if (!mapInstance || typeof BMapGL === 'undefined') return
   pipelines.forEach(pipe => {
-    const pts = pipe.path.map(([lng, lat]) => new BMapGL.Point(lng, lat))
+    const pts = pipe.path.map(([lng, lat]) => {
+      const [bdLng, bdLat] = convertCoord(lng, lat)
+      return new BMapGL.Point(bdLng, bdLat)
+    })
     const polyline = new BMapGL.Polyline(pts, {
       strokeColor: pipe.color,
       strokeWeight: pipe.width,
@@ -399,7 +366,8 @@ function drawPointMarkers(points, category, color, size = 10, shape = 'circle',
   if (!mapInstance || typeof BMapGL === 'undefined') return
   const layerKey = getLayerKey(category)
   points.forEach(p => {
-    const pt = new BMapGL.Point(p.lng, p.lat)
+    const [bdLng, bdLat] = convertCoord(p.lng, p.lat)
+    const pt = new BMapGL.Point(bdLng, bdLat)
     let displayColor = color
     if (p.status === 'alert' || p.status === 'danger') displayColor = '#f56c6c'
     if (p.status === 'warning') displayColor = '#e6a23c'
@@ -422,7 +390,7 @@ function drawPointMarkers(points, category, color, size = 10, shape = 'circle',
     mapInstance.addOverlay(label)
     overlayStore[layerKey].push(label)
 
-    // 告警点额外显示脉冲圈
+  /*  // 告警点额外显示脉冲圈
     if ((p.status === 'alert' || p.status === 'danger') && layers.alert) {
       const pulseHtml = `<div style="width:${r*3}px;height:${r*3}px;border-radius:50%;background:rgba(245,108,108,0.3);border:2px solid rgba(245,108,108,0.6);animation:pulse 1.5s infinite;"></div>`
       const pulseLabel = new BMapGL.Label(pulseHtml, {
@@ -432,7 +400,7 @@ function drawPointMarkers(points, category, color, size = 10, shape = 'circle',
       pulseLabel.setStyle({ border: 'none', background: 'transparent', padding: '0' })
       mapInstance.addOverlay(pulseLabel)
       overlayStore.alert.push(pulseLabel)
-    }
+    }*/
   })
 }
 
@@ -487,7 +455,8 @@ function openFeatureInfo(feature) {
   currentFeature.value = feature
   detailDrawerVisible.value = true
 
-  const pt = new BMapGL.Point(feature.lng, feature.lat)
+  const [bfLng, bfLat] = convertCoord(feature.lng, feature.lat)
+  const pt = new BMapGL.Point(bfLng, bfLat)
   let infoHtml = `<div style="font-size:13px;line-height:1.8;max-width:240px;"><b>${feature.name}</b><br/>类型:${feature.typeName}<br/>`
   if (feature.pressure) infoHtml += `压力:${feature.pressure} kPa<br/>`
   if (feature.flow) infoHtml += `流量:${feature.flow} Nm³/h<br/>`

+ 37 - 96
src/views/subSystem/gas/gasfxpg/gwfxpg.vue

@@ -161,9 +161,10 @@ import { ref, computed, onMounted, onBeforeUnmount, nextTick, watch } from 'vue'
 import { MapLocation, Search, Refresh, FullScreen, Location, ZoomIn, ZoomOut } from '@element-plus/icons-vue'
 import { ElMessage } from 'element-plus'
 import * as echarts from 'echarts'
+import { convertPipeline, convertPoints, convertCoord } from '@/utils/coordTransform'
 
 // ==================== 百度地图初始化 ====================
-const MAP_CENTER = { lng: 110.3940, lat: 28.4690 }
+const MAP_CENTER = { lng: 110.386, lat: 28.445 }
 const MAP_DEFAULT_ZOOM = 14
 
 let mapInstance = null
@@ -191,7 +192,8 @@ function initMap() {
   const el = document.getElementById('riskAssessmentBaiduMap')
   if (!el) return
   mapInstance = new BMapGL.Map(el, { enableMapClick: true })
-  mapInstance.centerAndZoom(new BMapGL.Point(MAP_CENTER.lng, MAP_CENTER.lat), MAP_DEFAULT_ZOOM)
+  const [clng, clat] = convertCoord(MAP_CENTER.lng, MAP_CENTER.lat)
+  mapInstance.centerAndZoom(new BMapGL.Point(clng, clat), MAP_DEFAULT_ZOOM)
   mapInstance.enableScrollWheelZoom(true)
   mapInstance.setMapStyleV2({ styleId: 'a0f4e6e6f9e7a6c5d8e7f7e7f7e7f7e5' })
   mapInstance.addEventListener('mousemove', (e) => {
@@ -210,102 +212,35 @@ function riskLevelName(level) {
 // 管线风险数据(8段)
 const pipelines = ref([
   {
-    id: 1, code: 'PL-YL-001', name: '辰州路高压管线', area: '沅陵县太常片区辰州路',
-    riskLevel: 'high', riskScore: 86.5,
-    riskLevelName: '高风险',
+    id: 1, code: 'PL-YL-001', name: '燃气1', area: '燃气1管线',
+    riskLevel: 'high', riskScore: 86.5, riskLevelName: '高风险',
     material: '钢管', pressureLevel: '高压 (1.6MPa)', diameter: 500, length: 3.8,
-    buryYear: '2015年', owner: '沅陵燃气有限公司', lastInspection: '2026-03-15',
-    path: [[110.3940, 28.4820], [110.3942, 28.4770], [110.3938, 28.4710], [110.3936, 28.4645], [110.3934, 28.4580]],
-    riskCauses: ['管道服役超过10年', '辰州路主干道交通密集', '防腐层检测发现多处局部破损', '沿线有市政施工活动'],
+    buryYear: '2015年', owner: '燃气公司', lastInspection: '2026-03-15',
+    path: [[110.404947, 28.433419], [110.404836, 28.433429], [110.403275, 28.433571], [110.401084, 28.433876], [110.399601, 28.433876], [110.398112, 28.433979], [110.396717, 28.434314], [110.394299, 28.434538], [110.394352, 28.434887], [110.391969, 28.434985], [110.384374, 28.435695], [110.381418, 28.43559], [110.377993, 28.436193], [110.376062, 28.436385], [110.374231, 28.43655], [110.372584, 28.437107], [110.371292, 28.4377], [110.370581, 28.438198], [110.369831, 28.438821]],
+    riskCauses: ['管道服役超过10年', '交通密集', '防腐层多处破损', '沿线施工活动'],
     trendData: [82.3, 83.1, 84.2, 85.0, 85.8, 86.5]
   },
   {
-    id: 2, code: 'PL-YL-002', name: '建设东路高压管', area: '沅陵县太常片区建设东路',
-    riskLevel: 'high', riskScore: 79.2,
-    riskLevelName: '高风险',
-    material: '钢管', pressureLevel: '高压 (1.6MPa)', diameter: 400, length: 3.6,
-    buryYear: '2016年', owner: '沅陵燃气有限公司', lastInspection: '2025-11-08',
-    path: [[110.3824, 28.4660], [110.3935, 28.4662], [110.4050, 28.4658]],
-    riskCauses: ['高压运行风险等级高', '周边有化工企业', '检测发现多处腐蚀点', '管道穿越工业园区域'],
-    trendData: [74.8, 75.6, 76.5, 77.3, 78.1, 79.2]
-  },
-  {
-    id: 3, code: 'PL-YL-003', name: '古城路中压管线', area: '沅陵县太常片区古城路',
-    riskLevel: 'medium', riskScore: 64.3,
-    riskLevelName: '中风险',
-    material: '钢管', pressureLevel: '中压 (0.4MPa)', diameter: 300, length: 3.2,
-    buryYear: '2018年', owner: '沅陵燃气有限公司', lastInspection: '2026-02-10',
-    path: [[110.3970, 28.4820], [110.3973, 28.4760], [110.3970, 28.4700], [110.3963, 28.4635]],
-    riskCauses: ['沿线有在建工程', '部分区域防腐层老化', '古城路商业区人流量大', '管线穿越古城地下管沟区域'],
+    id: 2, code: 'PL-YL-002', name: '燃气2', area: '燃气2管线',
+    riskLevel: 'medium', riskScore: 64.3, riskLevelName: '中风险',
+    material: 'PE管', pressureLevel: '中压 (0.4MPa)', diameter: 300, length: 3.2,
+    buryYear: '2018年', owner: '燃气公司', lastInspection: '2026-02-10',
+    path: [[110.361433, 28.454979], [110.362363, 28.453169], [110.362851, 28.452213], [110.364377, 28.452443], [110.365138, 28.45246], [110.366462, 28.452157], [110.369549, 28.451441], [110.37219, 28.450897], [110.372753, 28.450901], [110.373875, 28.451194], [110.373913, 28.451107], [110.374597, 28.451476]],
+    riskCauses: ['沿线有在建工程', '防腐层老化', '人流量大'],
     trendData: [60.1, 61.0, 62.1, 63.2, 63.8, 64.3]
   },
-  {
-    id: 4, code: 'PL-YL-004', name: '迎宾路中压管线', area: '沅陵县太常片区迎宾路',
-    riskLevel: 'medium', riskScore: 55.8,
-    riskLevelName: '中风险',
-    material: '钢管', pressureLevel: '中压 (0.4MPa)', diameter: 300, length: 3.6,
-    buryYear: '2019年', owner: '沅陵燃气有限公司', lastInspection: '2026-04-28',
-    path: [[110.3824, 28.4688], [110.3930, 28.4692], [110.4054, 28.4685]],
-    riskCauses: ['管道运行正常但有轻微腐蚀', '迎宾路商业区人流较大', '沿线有电力管沟交叉'],
-    trendData: [52.0, 52.8, 53.5, 54.2, 55.0, 55.8]
-  },
-  {
-    id: 5, code: 'PL-YL-005', name: '天宁路中压管线', area: '沅陵县太常片区天宁路',
-    riskLevel: 'medium', riskScore: 48.2,
-    riskLevelName: '中风险',
-    material: 'PE管', pressureLevel: '中压 (0.4MPa)', diameter: 250, length: 3.8,
-    buryYear: '2020年', owner: '沅陵燃气有限公司', lastInspection: '2026-05-12',
-    path: [[110.3850, 28.4755], [110.3935, 28.4758], [110.4088, 28.4750]],
-    riskCauses: ['PE管接头检测维护', '天宁西路有地下车库施工', '管道穿越安置区'],
-    trendData: [44.5, 45.3, 46.1, 47.0, 47.6, 48.2]
-  },
-  {
-    id: 6, code: 'PL-YL-006', name: '辰州北路中压管线', area: '沅陵县太常片区辰州北路',
-    riskLevel: 'medium', riskScore: 42.5,
-    riskLevelName: '中风险',
-    material: 'PE管', pressureLevel: '中压 (0.4MPa)', diameter: 200, length: 1.2,
-    buryYear: '2021年', owner: '沅陵燃气有限公司', lastInspection: '2026-05-28',
-    path: [[110.3940, 28.4820], [110.3942, 28.4855]],
-    riskCauses: ['辰州北路综合管廊相邻区域', '管段较短但周边环境复杂'],
-    trendData: [39.2, 40.0, 40.8, 41.5, 42.0, 42.5]
-  },
-  {
-    id: 7, code: 'PL-YL-007', name: '滨江路低压管线', area: '沅陵县太常片区滨江路',
-    riskLevel: 'low', riskScore: 28.6,
-    riskLevelName: '低风险',
-    material: 'PE管', pressureLevel: '低压 (0.1MPa)', diameter: 200, length: 3.8,
-    buryYear: '2022年', owner: '沅陵燃气有限公司', lastInspection: '2026-06-03',
-    path: [[110.3820, 28.4635], [110.3930, 28.4638], [110.4066, 28.4630]],
-    riskCauses: ['新建管道状况良好', '低压运行风险可控', '滨江路河堤段需关注水土流失'],
-    trendData: [25.0, 25.8, 26.5, 27.2, 27.9, 28.6]
-  },
-  {
-    id: 8, code: 'PL-YL-008', name: '太常南路低压管线', area: '沅陵县太常片区太常南路',
-    riskLevel: 'low', riskScore: 18.3,
-    riskLevelName: '低风险',
-    material: 'PE管', pressureLevel: '低压 (0.1MPa)', diameter: 160, length: 1.5,
-    buryYear: '2023年', owner: '沅陵燃气有限公司', lastInspection: '2026-06-08',
-    path: [[110.3934, 28.4580], [110.3932, 28.4555]],
-    riskCauses: ['新建管道风险低', '周边环境稳定', '位于城南新开发区域'],
-    trendData: [15.8, 16.3, 16.9, 17.4, 17.9, 18.3]
-  }
 ])
 
 // 周边危险源
 const hazardPoints = ref([
-  { id: 'HZ1', name: '太常LNG储配站', type: '危险源', level: 'high', lng: 110.4041, lat: 28.4753, desc: '液化天然气储配站,储气量5000m³', riskRadius: '500m' },
-  { id: 'HZ2', name: '工业园计量站', type: '危险源', level: 'high', lng: 110.4052, lat: 28.4580, desc: '工业园燃气计量调压站', riskRadius: '300m' },
-  { id: 'HZ3', name: '城南加油站', type: '危险源', level: 'medium', lng: 110.3940, lat: 28.4560, desc: '加油站,与燃气管线水平距离约150m', riskRadius: '200m' },
-  { id: 'HZ4', name: '太常化工仓库', type: '危险源', level: 'medium', lng: 110.4070, lat: 28.4670, desc: '化工原料存储仓库', riskRadius: '400m' }
+  { id: 'HZ1', name: '燃气1-D点危险源', type: '危险源', level: 'high', lng: 110.401084, lat: 28.433876, desc: '储配站', riskRadius: '500m' },
+  { id: 'HZ2', name: '燃气2-B点危险源', type: '危险源', level: 'medium', lng: 110.372753, lat: 28.450901, desc: '计量调压站', riskRadius: '300m' },
 ])
 
-// 防护目标
 const targetPoints = ref([
-  { id: 'TG1', name: '太常中学', type: '防护目标', level: 'high', lng: 110.3930, lat: 28.4720, desc: '在校师生约2000人,距最近管线约200m' },
-  { id: 'TG2', name: '县人民医院太常分院', type: '防护目标', level: 'high', lng: 110.3950, lat: 28.4680, desc: '二级医院,距最近管线约150m' },
-  { id: 'TG3', name: '太常安置小区', type: '防护目标', level: 'medium', lng: 110.3910, lat: 28.4770, desc: '居民安置小区,约800户,距最近管线约100m' },
-  { id: 'TG4', name: '县政府办公区', type: '防护目标', level: 'medium', lng: 110.3880, lat: 28.4740, desc: '政府办公区域,距最近管线约300m' },
-  { id: 'TG5', name: '滨江公园', type: '防护目标', level: 'low', lng: 110.4000, lat: 28.4620, desc: '市民休闲公园,周末人流量较大' }
+  { id: 'TG1', name: '燃气1-E点防护目标', type: '防护目标', level: 'high', lng: 110.394299, lat: 28.434538, desc: '学校,约2000人' },
+  { id: 'TG2', name: '燃气2-A点防护目标', type: '防护目标', level: 'medium', lng: 110.362363, lat: 28.453169, desc: '医院' },
+  { id: 'TG3', name: '燃气1-F点防护目标', type: '防护目标', level: 'low', lng: 110.374231, lat: 28.43655, desc: '公园' },
 ])
 
 // 风险评分区间标记
@@ -356,7 +291,7 @@ function renderPipelines() {
   const BMapGL = window.BMapGL
   filteredPipelines.value.forEach(p => {
     const layerKey = p.riskLevel
-    const points = p.path.map(c => new BMapGL.Point(c[0], c[1]))
+    const points = p.path.map(c => { const [lng, lat] = convertCoord(c[0], c[1]); return new BMapGL.Point(lng, lat) })
     const color = p.riskLevel === 'high' ? '#f56c6c' : p.riskLevel === 'medium' ? '#e6a23c' : '#67c23a'
     const weight = p.riskLevel === 'high' ? 6 : p.riskLevel === 'medium' ? 5 : 4
     const polyline = new BMapGL.Polyline(points, {
@@ -408,7 +343,8 @@ function renderPipelines() {
 function renderHazardPoints() {
   const BMapGL = window.BMapGL
   hazardPoints.value.forEach(h => {
-    const pt = new BMapGL.Point(h.lng, h.lat)
+    const [hlng, hlat] = convertCoord(h.lng, h.lat)
+    const pt = new BMapGL.Point(hlng, hlat)
     const label = new BMapGL.Label(h.name, {
       position: pt,
       offset: new BMapGL.Size(0, -18)
@@ -441,7 +377,8 @@ function renderHazardPoints() {
 function renderTargetPoints() {
   const BMapGL = window.BMapGL
   targetPoints.value.forEach(t => {
-    const pt = new BMapGL.Point(t.lng, t.lat)
+    const [tlng, tlat] = convertCoord(t.lng, t.lat)
+    const pt = new BMapGL.Point(tlng, tlat)
     const label = new BMapGL.Label(t.name, {
       position: pt,
       offset: new BMapGL.Size(0, -18)
@@ -507,7 +444,8 @@ function zoomOut() {
 function fitBounds() {
   if (mapInstance) {
     const BMapGL = window.BMapGL
-    mapInstance.centerAndZoom(new BMapGL.Point(MAP_CENTER.lng, MAP_CENTER.lat), MAP_DEFAULT_ZOOM)
+    const [clng, clat] = convertCoord(MAP_CENTER.lng, MAP_CENTER.lat)
+    mapInstance.centerAndZoom(new BMapGL.Point(clng, clat), MAP_DEFAULT_ZOOM)
   }
 }
 
@@ -517,15 +455,16 @@ function refreshMap() {
 
 function locateArea() {
   const areas = {
-    area1: { lng: 110.3938, lat: 28.4700, zoom: 15 },
-    area2: { lng: 110.3970, lat: 28.4730, zoom: 15 },
-    area3: { lng: 110.3935, lat: 28.4660, zoom: 15 },
-    area4: { lng: 110.3940, lat: 28.469, zoom: 13 }
+    area1: { lng: 110.386, lat: 28.445, zoom: 15 },
+    area2: { lng: 110.375, lat: 28.440, zoom: 15 },
+    area3: { lng: 110.400, lat: 28.435, zoom: 15 },
+    area4: { lng: 110.386, lat: 28.445, zoom: 13 }
   }
   const area = areas[quickLocation.value]
   if (area && mapInstance) {
     const BMapGL = window.BMapGL
-    mapInstance.centerAndZoom(new BMapGL.Point(area.lng, area.lat), area.zoom)
+    const [alng, alat] = convertCoord(area.lng, area.lat)
+    mapInstance.centerAndZoom(new BMapGL.Point(alng, alat), area.zoom)
     ElMessage.success('已定位到: ' + quickLocation.value)
   }
 }
@@ -538,7 +477,8 @@ function locateSearch() {
   if (found && mapInstance) {
     const BMapGL = window.BMapGL
     const mid = found.path[Math.floor(found.path.length / 2)]
-    mapInstance.centerAndZoom(new BMapGL.Point(mid[0], mid[1]), 16)
+    const [mlng, mlat] = convertCoord(mid[0], mid[1])
+    mapInstance.centerAndZoom(new BMapGL.Point(mlng, mlat), 16)
     currentPipeline.value = found
     detailDrawerVisible.value = true
     ElMessage.success(`已定位到: ${found.name}`)
@@ -560,7 +500,8 @@ function locatePipeline() {
   } else {
     return
   }
-  mapInstance.centerAndZoom(new BMapGL.Point(lng, lat), 16)
+  const [llng, llat] = convertCoord(lng, lat)
+  mapInstance.centerAndZoom(new BMapGL.Point(llng, llat), 16)
   detailDrawerVisible.value = false
 }
 

+ 20 - 63
src/views/subSystem/gas/gasfxpg/gxfxpgsst.vue

@@ -171,9 +171,10 @@
 import { ref, computed, onMounted, onBeforeUnmount, nextTick } from 'vue'
 import { MapLocation, Search, Refresh, FullScreen, Location, ZoomIn, ZoomOut, InfoFilled } from '@element-plus/icons-vue'
 import { ElMessage } from 'element-plus'
+import { convertCoord } from '@/utils/coordTransform'
 
 // ==================== 百度地图初始化 ====================
-const MAP_CENTER = { lng: 110.3940, lat: 28.4690 }
+const MAP_CENTER = { lng: 110.386, lat: 28.445 }
 const MAP_DEFAULT_ZOOM = 14
 
 let mapInstance = null
@@ -201,7 +202,8 @@ function initMap() {
   const el = document.getElementById('riskFourColorBaiduMap')
   if (!el) return
   mapInstance = new BMapGL.Map(el, { enableMapClick: true })
-  mapInstance.centerAndZoom(new BMapGL.Point(MAP_CENTER.lng, MAP_CENTER.lat), MAP_DEFAULT_ZOOM)
+  const [clng, clat] = convertCoord(MAP_CENTER.lng, MAP_CENTER.lat)
+  mapInstance.centerAndZoom(new BMapGL.Point(clng, clat), MAP_DEFAULT_ZOOM)
   mapInstance.enableScrollWheelZoom(true)
   mapInstance.setMapStyleV2({ styleId: 'a0f4e6e6f9e7a6c5d8e7f7e7f7e7f7e5' })
   mapInstance.addEventListener('mousemove', (e) => {
@@ -231,69 +233,21 @@ function getRiskColor(level) {
 
 const pipelines = ref([
   {
-    id: 1, code: 'PL-YL-001', name: '辰州路高压管线',
+    id: 1, code: 'PL-YL-001', name: '燃气1',
     riskScore: 86.5, riskLevel: 'major', riskLevelName: '重大风险', color: '#f56c6c', lineWidth: 6,
     material: '钢管', pressureLevel: '高压 (1.6MPa)', diameter: 500, length: 3.8,
-    buryYear: '2015年', owner: '沅陵燃气有限公司', lastInspection: '2026-03-15',
-    path: [[110.3940, 28.4820], [110.3942, 28.4770], [110.3938, 28.4710], [110.3936, 28.4645], [110.3934, 28.4580]],
-    riskFactors: ['管道服役超过10年,老化程度较高', '辰州路主干道交通密集,第三方破坏风险大', '防腐层检测发现多处局部破损', '沿线有市政雨污分流施工活动', '邻近城南加油站等危险源']
+    buryYear: '2015年', owner: '燃气公司', lastInspection: '2026-03-15',
+    path: [[110.404947, 28.433419], [110.404836, 28.433429], [110.403275, 28.433571], [110.401084, 28.433876], [110.399601, 28.433876], [110.398112, 28.433979], [110.396717, 28.434314], [110.394299, 28.434538], [110.394352, 28.434887], [110.391969, 28.434985], [110.384374, 28.435695], [110.381418, 28.43559], [110.377993, 28.436193], [110.376062, 28.436385], [110.374231, 28.43655], [110.372584, 28.437107], [110.371292, 28.4377], [110.370581, 28.438198], [110.369831, 28.438821]],
+    riskFactors: ['管道服役超过10年', '交通密集', '防腐层多处破损', '沿线施工活动']
   },
   {
-    id: 2, code: 'PL-YL-002', name: '建设东路高压管',
-    riskScore: 79.2, riskLevel: 'major', riskLevelName: '重大风险', color: '#f56c6c', lineWidth: 6,
-    material: '钢管', pressureLevel: '高压 (1.6MPa)', diameter: 400, length: 3.6,
-    buryYear: '2016年', owner: '沅陵燃气有限公司', lastInspection: '2025-11-08',
-    path: [[110.3824, 28.4660], [110.3935, 28.4662], [110.4050, 28.4658]],
-    riskFactors: ['高压运行风险等级高', '管道穿越工业园区域,周边有化工企业', '检测发现多处腐蚀点,局部壁厚减薄', '建设路沿线重型车辆通行频繁', '历史维修频次较高']
-  },
-  {
-    id: 3, code: 'PL-YL-003', name: '古城路中压管线',
+    id: 2, code: 'PL-YL-002', name: '燃气2',
     riskScore: 64.3, riskLevel: 'larger', riskLevelName: '较大风险', color: '#e6a23c', lineWidth: 5,
-    material: '钢管', pressureLevel: '中压 (0.4MPa)', diameter: 300, length: 3.2,
-    buryYear: '2018年', owner: '沅陵燃气有限公司', lastInspection: '2026-02-10',
-    path: [[110.3970, 28.4820], [110.3973, 28.4760], [110.3970, 28.4700], [110.3963, 28.4635]],
-    riskFactors: ['沿线有在建房地产开发工程', '与电力管沟交叉段存在杂散电流干扰', '古城路商业区人流量大,后果严重性较高', '部分区域防腐层出现老化脱落']
-  },
-  {
-    id: 4, code: 'PL-YL-004', name: '迎宾路中压管线',
-    riskScore: 55.8, riskLevel: 'larger', riskLevelName: '较大风险', color: '#e6a23c', lineWidth: 5,
-    material: '钢管', pressureLevel: '中压 (0.4MPa)', diameter: 300, length: 3.6,
-    buryYear: '2019年', owner: '沅陵燃气有限公司', lastInspection: '2026-04-28',
-    path: [[110.3824, 28.4688], [110.3930, 28.4692], [110.4054, 28.4685]],
-    riskFactors: ['电力管沟交叉段存在杂散电流干扰风险', '迎宾路商业区人流较大', '钢管轻微腐蚀,需定期检测维护', '管线运行正常,整体风险可控']
-  },
-  {
-    id: 5, code: 'PL-YL-005', name: '天宁路中压管线',
-    riskScore: 48.2, riskLevel: 'general', riskLevelName: '一般风险', color: '#f4d03f', lineWidth: 4,
-    material: 'PE管', pressureLevel: '中压 (0.4MPa)', diameter: 250, length: 3.8,
-    buryYear: '2020年', owner: '沅陵燃气有限公司', lastInspection: '2026-05-12',
-    path: [[110.3850, 28.4755], [110.3935, 28.4758], [110.4088, 28.4750]],
-    riskFactors: ['地下车库施工距管线较近,需重点监控', 'PE管接头处需定期检测确保密封', '管道穿越太常安置区,人口密集', 'PE管材耐腐蚀但抗外力破坏能力较弱']
+    material: 'PE管', pressureLevel: '中压 (0.4MPa)', diameter: 300, length: 3.2,
+    buryYear: '2018年', owner: '燃气公司', lastInspection: '2026-02-10',
+    path: [[110.361433, 28.454979], [110.362363, 28.453169], [110.362851, 28.452213], [110.364377, 28.452443], [110.365138, 28.45246], [110.366462, 28.452157], [110.369549, 28.451441], [110.37219, 28.450897], [110.372753, 28.450901], [110.373875, 28.451194], [110.373913, 28.451107], [110.374597, 28.451476]],
+    riskFactors: ['沿线有在建工程', '防腐层老化', '人流量大']
   },
-  {
-    id: 6, code: 'PL-YL-006', name: '辰州北路中压管线',
-    riskScore: 42.5, riskLevel: 'general', riskLevelName: '一般风险', color: '#f4d03f', lineWidth: 4,
-    material: 'PE管', pressureLevel: '中压 (0.4MPa)', diameter: 200, length: 1.2,
-    buryYear: '2021年', owner: '沅陵燃气有限公司', lastInspection: '2026-05-28',
-    path: [[110.3940, 28.4820], [110.3942, 28.4855]],
-    riskFactors: ['与综合管廊共通道,电力通信管线交叉密集', '管廊内可燃气体可能积聚,交叉风险高', '管段较短但周边地下环境复杂', 'PE管与管廊结构隔离需持续维护']
-  },
-  {
-    id: 7, code: 'PL-YL-007', name: '滨江路低压管线',
-    riskScore: 28.6, riskLevel: 'low', riskLevelName: '低风险', color: '#409eff', lineWidth: 3,
-    material: 'PE管', pressureLevel: '低压 (0.1MPa)', diameter: 200, length: 3.8,
-    buryYear: '2022年', owner: '沅陵燃气有限公司', lastInspection: '2026-06-03',
-    path: [[110.3820, 28.4635], [110.3930, 28.4638], [110.4066, 28.4630]],
-    riskFactors: ['新建管道,整体状况良好', '低压运行,泄漏后果可控', '河堤段需关注汛期水土流失影响', 'PE管耐腐蚀,维护需求低']
-  },
-  {
-    id: 8, code: 'PL-YL-008', name: '太常南路低压管线',
-    riskScore: 18.3, riskLevel: 'low', riskLevelName: '低风险', color: '#409eff', lineWidth: 3,
-    material: 'PE管', pressureLevel: '低压 (0.1MPa)', diameter: 160, length: 1.5,
-    buryYear: '2023年', owner: '沅陵燃气有限公司', lastInspection: '2026-06-08',
-    path: [[110.3934, 28.4580], [110.3932, 28.4555]],
-    riskFactors: ['新建管道风险极低', '管径小、压力低,泄漏影响范围有限', '位于城南新开发区域,周边环境稳定', 'PE管材耐腐蚀性能好,寿命长']
-  }
 ])
 
 // ==================== 统计数据 ====================
@@ -353,7 +307,7 @@ function renderPipelines() {
   const BMapGL = window.BMapGL
   pipelines.value.forEach(p => {
     if (!visibleRisks.value.includes(p.riskLevel)) return
-    const points = p.path.map(c => new BMapGL.Point(c[0], c[1]))
+    const points = p.path.map(c => { const [lng, lat] = convertCoord(c[0], c[1]); return new BMapGL.Point(lng, lat) })
     const polyline = new BMapGL.Polyline(points, {
       strokeColor: p.color, strokeWeight: p.lineWidth, strokeOpacity: 0.82
     })
@@ -422,7 +376,8 @@ function zoomOut() {
 function fitBounds() {
   if (mapInstance) {
     const BMapGL = window.BMapGL
-    mapInstance.centerAndZoom(new BMapGL.Point(MAP_CENTER.lng, MAP_CENTER.lat), MAP_DEFAULT_ZOOM)
+    const [clng, clat] = convertCoord(MAP_CENTER.lng, MAP_CENTER.lat)
+    mapInstance.centerAndZoom(new BMapGL.Point(clng, clat), MAP_DEFAULT_ZOOM)
   }
 }
 
@@ -439,7 +394,8 @@ function locateSearch() {
   if (found && mapInstance) {
     const BMapGL = window.BMapGL
     const mid = found.path[Math.floor(found.path.length / 2)]
-    mapInstance.centerAndZoom(new BMapGL.Point(mid[0], mid[1]), 16)
+    const [midlng, midlat] = convertCoord(mid[0], mid[1])
+    mapInstance.centerAndZoom(new BMapGL.Point(midlng, midlat), 16)
     currentPipeline.value = found
     detailDrawerVisible.value = true
     ElMessage.success(`已定位到: ${found.name}`)
@@ -452,7 +408,8 @@ function locatePipeline() {
   if (!currentPipeline.value || !mapInstance) return
   const BMapGL = window.BMapGL
   const mid = currentPipeline.value.path[Math.floor(currentPipeline.value.path.length / 2)]
-  mapInstance.centerAndZoom(new BMapGL.Point(mid[0], mid[1]), 16)
+  const [midlng, midlat] = convertCoord(mid[0], mid[1])
+  mapInstance.centerAndZoom(new BMapGL.Point(midlng, midlat), 16)
   detailDrawerVisible.value = false
 }
 

+ 31 - 62
src/views/subSystem/gas/gasjcyj/rqjcbjyzt.vue

@@ -124,6 +124,7 @@
 import { ref, computed, reactive, onMounted, onBeforeUnmount } from 'vue'
 import { MapLocation, Search, Refresh, FullScreen, ZoomIn, ZoomOut, Location } from '@element-plus/icons-vue'
 import { ElMessage } from 'element-plus'
+import { convertPipeline, convertPoints, convertCoord } from '@/utils/coordTransform'
 
 // ==================== 图层状态 ====================
 const visibleLayers = ref(['highPressure', 'mediumPressure', 'gasCritical', 'gasWarning', 'pressureAlert', 'stationCritical'])
@@ -141,7 +142,7 @@ let activeInfoWindow = null
 const mapError = ref('')
 const currentLng = ref(110.395)
 const currentLat = ref(28.470)
-const MAP_CENTER = { lng: 110.395, lat: 28.470 }
+const MAP_CENTER = { lng: 110.386, lat: 28.445 }
 const MAP_DEFAULT_ZOOM = 14
 
 function waitForBMapGL() {
@@ -161,7 +162,8 @@ function initMap() {
   const el = document.getElementById('gasAlertBaiduMap')
   if (!el) return
   mapInstance = new BMapGL.Map(el, { enableMapClick: true })
-  const point = new BMapGL.Point(MAP_CENTER.lng, MAP_CENTER.lat)
+  const [mcLng, mcLat] = convertCoord(MAP_CENTER.lng, MAP_CENTER.lat)
+  const point = new BMapGL.Point(mcLng, mcLat)
   mapInstance.centerAndZoom(point, MAP_DEFAULT_ZOOM)
   mapInstance.enableScrollWheelZoom(true)
   mapInstance.setMapStyleV2({ styleId: 'a0f4e6e6f9e7a6c5d8e7f7e7f7e7f7e5' })
@@ -176,72 +178,30 @@ function initMap() {
 
 // --- 管线数据 ---
 const pipelines = [
-  { id: 'P1', name: '辰州路高压管线', type: 'highPressure', color: '#f56c6c', width: 5,
-    path: [[110.3940, 28.4820], [110.3942, 28.4770], [110.3938, 28.4710], [110.3936, 28.4645]] },
-  { id: 'P2', name: '建设东路高压管', type: 'highPressure', color: '#f56c6c', width: 5,
-    path: [[110.3940, 28.4660], [110.3980, 28.4662], [110.4050, 28.4658]] },
-  { id: 'P3', name: '古城路中压管线', type: 'mediumPressure', color: '#e6a23c', width: 4,
-    path: [[110.3970, 28.4820], [110.3973, 28.4760], [110.3970, 28.4700], [110.3963, 28.4635]] },
-  { id: 'P4', name: '迎宾路中压管线', type: 'mediumPressure', color: '#e6a23c', width: 4,
-    path: [[110.3824, 28.4688], [110.3930, 28.4692], [110.4054, 28.4685]] },
-  { id: 'P5', name: '建设路中压管线', type: 'mediumPressure', color: '#e6a23c', width: 4,
-    path: [[110.3840, 28.4658], [110.3935, 28.4660], [110.4050, 28.4655]] },
-  { id: 'P6', name: '天宁路中压管线', type: 'mediumPressure', color: '#e6a23c', width: 4,
-    path: [[110.3850, 28.4755], [110.3935, 28.4758], [110.4088, 28.4750]] },
-  { id: 'P7', name: '滨江路低压管线', type: 'lowPressure', color: '#67c23a', width: 3,
-    path: [[110.3820, 28.4635], [110.3930, 28.4638], [110.4066, 28.4630]] }
+  { id: 'P1', name: '燃气1', type: 'highPressure', color: '#f56c6c', width: 5,
+    path: [[110.404947, 28.433419], [110.404836, 28.433429], [110.403275, 28.433571], [110.401084, 28.433876], [110.399601, 28.433876], [110.398112, 28.433979], [110.396717, 28.434314], [110.394299, 28.434538], [110.394352, 28.434887], [110.391969, 28.434985], [110.384374, 28.435695], [110.381418, 28.43559], [110.377993, 28.436193], [110.376062, 28.436385], [110.374231, 28.43655], [110.372584, 28.437107], [110.371292, 28.4377], [110.370581, 28.438198], [110.369831, 28.438821]] },
+  { id: 'P2', name: '燃气2', type: 'mediumPressure', color: '#e6a23c', width: 4,
+    path: [[110.361433, 28.454979], [110.362363, 28.453169], [110.362851, 28.452213], [110.364377, 28.452443], [110.365138, 28.45246], [110.366462, 28.452157], [110.369549, 28.451441], [110.37219, 28.450897], [110.372753, 28.450901], [110.373875, 28.451194], [110.373913, 28.451107], [110.374597, 28.451476]] },
 ]
 
 // --- 地下空间气体报警点 ---
 const gasPoints = ref([
-  { id: 'G1', name: '辰州北路综合管廊', type: 'gasMonitor', category: 'gasCritical', level: 'critical', concentration: 15.8, threshold: 10, thresholdUnit: '%LEL',
-    lng: 110.3940, lat: 28.4780, address: '沅陵县太常片区辰州北路综合管廊入口', alertTime: '2026-06-13 15:23:45', code: 'CH4-YL-001', typeName: '地下空间气体监测点' },
-  { id: 'G2', name: '古城中路地下管沟', type: 'gasMonitor', category: 'gasCritical', level: 'critical', concentration: 12.3, threshold: 10, thresholdUnit: '%LEL',
-    lng: 110.3972, lat: 28.4720, address: '沅陵县太常片区古城中路电力管沟', alertTime: '2026-06-13 14:58:12', code: 'CH4-YL-002', typeName: '地下空间气体监测点' },
-  { id: 'G3', name: '建设路雨水管廊', type: 'gasMonitor', category: 'gasWarning', level: 'warning', concentration: 6.8, threshold: 10, thresholdUnit: '%LEL',
-    lng: 110.3935, lat: 28.4662, address: '沅陵县太常片区建设路雨水管廊检查井', alertTime: '2026-06-13 14:32:05', code: 'CH4-YL-003', typeName: '地下空间气体监测点' },
-  { id: 'G4', name: '天宁西路地下车库', type: 'gasMonitor', category: 'gasWarning', level: 'warning', concentration: 7.5, threshold: 10, thresholdUnit: '%LEL',
-    lng: 110.3855, lat: 28.4755, address: '沅陵县太常片区天宁西路地下停车场', alertTime: '2026-06-13 14:15:30', code: 'CH4-YL-004', typeName: '地下空间气体监测点' },
-  { id: 'G5', name: '滨江东路河堤管廊', type: 'gasMonitor', category: 'gasNormal', level: 'normal', concentration: 2.5, threshold: 10, thresholdUnit: '%LEL',
-    lng: 110.4066, lat: 28.4625, address: '沅陵县太常片区滨江东路河堤管廊', alertTime: '2026-06-13 13:50:00', code: 'CH4-YL-005', typeName: '地下空间气体监测点' },
-  { id: 'G6', name: '迎宾东路地下通道', type: 'gasMonitor', category: 'gasNormal', level: 'normal', concentration: 3.2, threshold: 10, thresholdUnit: '%LEL',
-    lng: 110.4050, lat: 28.4640, address: '沅陵县太常片区迎宾东路地下人行通道', alertTime: '2026-06-13 13:30:00', code: 'CH4-YL-006', typeName: '地下空间气体监测点' },
-  { id: 'G7', name: '古城北路管沟', type: 'gasMonitor', category: 'gasNormal', level: 'normal', concentration: 1.8, threshold: 10, thresholdUnit: '%LEL',
-    lng: 110.3975, lat: 28.4785, address: '沅陵县太常片区古城北路综合管沟', alertTime: '2026-06-13 12:10:00', code: 'CH4-YL-007', typeName: '地下空间气体监测点' }
+  { id: 'G1', name: '酉水大桥气体监测', type: 'gasMonitor', category: 'gasCritical', level: 'critical', concentration: 15.8, threshold: 10, thresholdUnit: '%LEL', lng: 110.369549, lat: 28.451441, address: '酉水大桥北段地下空间', alertTime: '2026-06-13 15:23:45', code: 'CH4-YL-001', typeName: '地下空间气体监测点' },
+  { id: 'G2', name: '酉水大桥2气体监测', type: 'gasMonitor', category: 'gasCritical', level: 'critical', concentration: 12.3, threshold: 10, thresholdUnit: '%LEL', lng: 110.373913, lat: 28.451107, address: '酉水大桥管沟监测点', alertTime: '2026-06-13 14:58:12', code: 'CH4-YL-002', typeName: '地下空间气体监测点' },
 ])
 
-// --- 管线压力报警点 ---
 const pressurePoints = ref([
-  { id: 'PR1', name: '辰州中路高压测点2#', type: 'pressureMonitor', category: 'pressureAlert', level: 'critical', pressure: 432, threshold: 420, thresholdUnit: 'kPa',
-    lng: 110.3935, lat: 28.4658, address: '沅陵县太常片区辰州中路与天宁路交叉口南侧', alertTime: '2026-06-13 15:31:45', code: 'PR-YL-002', typeName: '压力监测点' },
-  { id: 'PR2', name: '建设东路高压测点4#', type: 'pressureMonitor', category: 'pressureAlert', level: 'warning', pressure: 410, threshold: 420, thresholdUnit: 'kPa',
-    lng: 110.4050, lat: 28.4577, address: '沅陵县太常片区建设东路工业园入口处', alertTime: '2026-06-13 15:31:25', code: 'PR-YL-015', typeName: '压力监测点' },
-  { id: 'PR3', name: '古城中路中压测点2#', type: 'pressureMonitor', category: 'pressureAlert', level: 'warning', pressure: 142, threshold: 150, thresholdUnit: 'kPa',
-    lng: 110.3970, lat: 28.4669, address: '沅陵县太常片区古城中路太常安置区段', alertTime: '2026-06-13 15:29:58', code: 'PR-YL-005', typeName: '压力监测点' }
+  { id: 'PR1', name: '龙兴路压力报警', type: 'pressureMonitor', category: 'pressureAlert', level: 'critical', pressure: 432, threshold: 420, thresholdUnit: 'kPa', lng: 110.399601, lat: 28.433876, address: '学府路与太常路交叉口', alertTime: '2026-06-13 15:31:45', code: 'PR-YL-002', typeName: '压力监测点' },
 ])
 
-// --- 管线流量报警点 ---
 const flowPoints = ref([
-  { id: 'FL1', name: '辰州中路流量计2#', type: 'flowMonitor', category: 'flowAlert', level: 'critical', flow: 2620, threshold: 2500, thresholdUnit: 'Nm³/h',
-    lng: 110.3936, lat: 28.4690, address: '沅陵县太常片区辰州中路调压站进口侧', alertTime: '2026-06-13 15:31:45', code: 'FL-YL-002', typeName: '流量监测点' },
-  { id: 'FL2', name: '古城中路流量计2#', type: 'flowMonitor', category: 'flowAlert', level: 'warning', flow: 820, threshold: 800, thresholdUnit: 'Nm³/h',
-    lng: 110.3972, lat: 28.4710, address: '沅陵县太常片区古城中路太常安置区段', alertTime: '2026-06-13 15:29:58', code: 'FL-YL-003', typeName: '流量监测点' },
-  { id: 'FL3', name: '建设东路流量计3#', type: 'flowMonitor', category: 'flowAlert', level: 'warning', flow: 2480, threshold: 2500, thresholdUnit: 'Nm³/h',
-    lng: 110.4048, lat: 28.4660, address: '沅陵县太常片区建设东路工业园入口处', alertTime: '2026-06-13 14:55:20', code: 'FL-YL-015', typeName: '流量监测点' },
-  { id: 'FL4', name: '滨江东路流量计2#', type: 'flowMonitor', category: 'flowAlert', level: 'warning', flow: 210, threshold: 200, thresholdUnit: 'Nm³/h',
-    lng: 110.4063, lat: 28.4635, address: '沅陵县太常片区滨江东路商业街', alertTime: '2026-06-13 15:30:40', code: 'FL-YL-012', typeName: '流量监测点' }
+  { id: 'FL1', name: '城东流量报警', type: 'flowMonitor', category: 'flowAlert', level: 'critical', flow: 2620, threshold: 2500, thresholdUnit: 'Nm³/h', lng: 110.407, lat: 28.454, address: '城东大道计量站', alertTime: '2026-06-13 15:31:45', code: 'FL-YL-002', typeName: '流量监测点' },
+  { id: 'FL2', name: '滨江路流量报警', type: 'flowMonitor', category: 'flowAlert', level: 'warning', flow: 820, threshold: 800, thresholdUnit: 'Nm³/h', lng: 110.375, lat: 28.432, address: '滨江路流量计井', alertTime: '2026-06-13 15:29:58', code: 'FL-YL-003', typeName: '流量监测点' },
 ])
 
-// --- 场站燃气报警点 ---
 const stationPoints = ref([
-  { id: 'S1', name: '太常LNG储配站', type: 'stationMonitor', category: 'stationCritical', level: 'critical', concentration: 48, threshold: 20, thresholdUnit: 'ppm',
-    lng: 110.4041, lat: 28.4753, address: '沅陵县太常片区辰州东路末段LNG储配站', alertTime: '2026-06-13 15:23:45', code: 'YL-LNG-01', typeName: '燃气场站' },
-  { id: 'S2', name: '工业园计量站', type: 'stationMonitor', category: 'stationCritical', level: 'critical', concentration: 35, threshold: 20, thresholdUnit: 'ppm',
-    lng: 110.4052, lat: 28.4580, address: '沅陵县太常片区建设东路工业园入口东侧', alertTime: '2026-06-13 14:32:05', code: 'YL-GY-01', typeName: '燃气场站' },
-  { id: 'S3', name: '太常调压站', type: 'stationMonitor', category: 'stationWarning', level: 'warning', concentration: 28, threshold: 20, thresholdUnit: 'ppm',
-    lng: 110.3965, lat: 28.4747, address: '沅陵县太常片区古城中路与天宁路交叉口东侧', alertTime: '2026-06-13 14:58:12', code: 'YL-TY-01', typeName: '燃气场站' },
-  { id: 'S4', name: '城南调压站', type: 'stationMonitor', category: 'stationWarning', level: 'warning', concentration: 52, threshold: 20, thresholdUnit: 'ppm',
-    lng: 110.3965, lat: 28.4585, address: '沅陵县太常片区建设路与古城南路交叉口南侧', alertTime: '2026-06-12 22:45:00', code: 'YL-CNTY-01', typeName: '燃气场站' }
+  { id: 'S1', name: '龙兴路北场站', type: 'stationMonitor', category: 'stationCritical', level: 'critical', concentration: 48, threshold: 20, thresholdUnit: 'ppm', lng: 110.401084, lat: 28.433876, address: '古城路与建设路交叉口', alertTime: '2026-06-13 15:23:45', code: 'YL-LNG-01', typeName: '燃气场站' },
+  { id: 'S2', name: '太常路场站', type: 'stationMonitor', category: 'stationWarning', level: 'warning', concentration: 35, threshold: 20, thresholdUnit: 'ppm', lng: 110.370, lat: 28.456, address: '太常路南段', alertTime: '2026-06-13 14:32:05', code: 'YL-GY-01', typeName: '燃气场站' },
 ])
 
 // ==================== 统计数据 ====================
@@ -269,7 +229,10 @@ function addToOverlayStore(layer, overlay) {
 function renderPipelines() {
   const BMapGL = window.BMapGL
   pipelines.forEach(p => {
-    const points = p.path.map(c => new BMapGL.Point(c[0], c[1]))
+    const points = p.path.map(c => {
+      const [bdLng, bdLat] = convertCoord(c[0], c[1])
+      return new BMapGL.Point(bdLng, bdLat)
+    })
     const polyline = new BMapGL.Polyline(points, {
       strokeColor: p.color, strokeWeight: p.width, strokeOpacity: 0.75
     })
@@ -286,7 +249,8 @@ function renderPointMarkers(features, layer, shape, size, bgColor) {
   const BMapGL = window.BMapGL
   features.forEach(f => {
     if (f.category !== layer) return
-    const pt = new BMapGL.Point(f.lng, f.lat)
+    const [bdLng, bdLat] = convertCoord(f.lng, f.lat)
+    const pt = new BMapGL.Point(bdLng, bdLat)
     const label = new BMapGL.Label(f.name, {
       position: pt,
       offset: new BMapGL.Size(0, -18)
@@ -322,7 +286,8 @@ function renderAllMarkers() {
 
   // 管线压力报警 - 菱形
   pressurePoints.value.forEach(f => {
-    const pt = new BMapGL.Point(f.lng, f.lat)
+    const [bdLng, bdLat] = convertCoord(f.lng, f.lat)
+    const pt = new BMapGL.Point(bdLng, bdLat)
     const label = new BMapGL.Label(f.name, { position: pt, offset: new BMapGL.Size(0, -18) })
     label.setStyle({
       color: '#fff', fontSize: '10px', padding: '3px 8px',
@@ -343,7 +308,8 @@ function renderAllMarkers() {
 
   // 管线流量报警 - 三角
   flowPoints.value.forEach(f => {
-    const pt = new BMapGL.Point(f.lng, f.lat)
+    const [bdLng, bdLat] = convertCoord(f.lng, f.lat)
+    const pt = new BMapGL.Point(bdLng, bdLat)
     const label = new BMapGL.Label(f.name, { position: pt, offset: new BMapGL.Size(0, -18) })
     label.setStyle({
       color: '#fff', fontSize: '10px', padding: '3px 8px',
@@ -364,7 +330,8 @@ function renderAllMarkers() {
 
   // 场站燃气报警
   stationPoints.value.forEach(f => {
-    const pt = new BMapGL.Point(f.lng, f.lat)
+    const [bdLng, bdLat] = convertCoord(f.lng, f.lat)
+    const pt = new BMapGL.Point(bdLng, bdLat)
     const label = new BMapGL.Label(f.name, { position: pt, offset: new BMapGL.Size(0, -18) })
     label.setStyle({
       color: '#fff', fontSize: '10px', padding: '3px 8px',
@@ -410,7 +377,8 @@ function zoomOut() { mapInstance?.zoomOut() }
 function fitBounds() {
   if (!mapInstance) return
   const BMapGL = window.BMapGL
-  mapInstance.centerAndZoom(new BMapGL.Point(MAP_CENTER.lng, MAP_CENTER.lat), MAP_DEFAULT_ZOOM)
+  const [fLng, fLat] = convertCoord(MAP_CENTER.lng, MAP_CENTER.lat)
+  mapInstance.centerAndZoom(new BMapGL.Point(fLng, fLat), MAP_DEFAULT_ZOOM)
 }
 function refreshData() { ElMessage.success('数据已刷新') }
 
@@ -422,7 +390,8 @@ function onSearch() {
     f.name.toLowerCase().includes(kw) || f.address.toLowerCase().includes(kw))
   if (hit) {
     const BMapGL = window.BMapGL
-    mapInstance.centerAndZoom(new BMapGL.Point(hit.lng, hit.lat), 16)
+    const [sLng, sLat] = convertCoord(hit.lng, hit.lat)
+    mapInstance.centerAndZoom(new BMapGL.Point(sLng, sLat), 16)
     currentFeature.value = hit
   }
 }

+ 50 - 28
src/views/subSystem/gas/ghome/gHome.vue

@@ -2,6 +2,7 @@
 import { computed, nextTick, onBeforeUnmount, onMounted, ref } from 'vue'
 import * as echarts from 'echarts'
 import { Odometer, CircleCheckFilled, VideoCameraFilled, WarnTriangleFilled } from '@element-plus/icons-vue'
+import { convertPipeline, convertPoints } from '@/utils/coordTransform'
 
 const nowText = ref('2025/12/31 12:59:59')
 const weekText = ref('星期三')
@@ -73,41 +74,60 @@ const mapKpis = [
 
 const pipelineLines = [
   {
-    name: '辰州路主干线',
-    color: '#39f5ff',
+    name: '燃气1',
+    color: '#ff3030',
     flow: '瞬时流量 0.52m³/min',
     points: [
-      [110.3855, 28.4696],
-      [110.3873, 28.4668],
-      [110.3894, 28.4633],
-      [110.3922, 28.4598],
-      [110.3978, 28.4568],
-      [110.4058, 28.4558],
-      [110.4148, 28.4551]
+      [110.404947, 28.433419],
+      [110.404836, 28.433429],
+      [110.403275, 28.433571],
+      [110.401084, 28.433876],
+      [110.399601, 28.433876],
+      [110.398112, 28.433979],
+      [110.396717, 28.434314],
+      [110.394299, 28.434538],
+      [110.394352, 28.434887],
+      [110.391969, 28.434985],
+      [110.384374, 28.435695],
+      [110.381418, 28.43559],
+      [110.377993, 28.436193],
+      [110.376062, 28.436385],
+      [110.374231, 28.43655],
+      [110.372584, 28.437107],
+      [110.371292, 28.4377],
+      [110.370581, 28.438198],
+      [110.369831, 28.438821]
     ]
   },
   {
-    name: '古城路支线',
-    color: '#14d8ff',
+    name: '燃气2',
+    color: '#ff3030',
     flow: '瞬时流量 0.38m³/min',
     points: [
-      [110.3892, 28.4728],
-      [110.3928, 28.4704],
-      [110.3964, 28.4683],
-      [110.4011, 28.4672],
-      [110.4072, 28.4669]
+      [110.361433, 28.454979],
+      [110.362363, 28.453169],
+      [110.362851, 28.452213],
+      [110.364377, 28.452443],
+      [110.365138, 28.45246],
+      [110.366462, 28.452157],
+      [110.369549, 28.451441],
+      [110.37219, 28.450897],
+      [110.372753, 28.450901],
+      [110.373875, 28.451194],
+      [110.373913, 28.451107],
+      [110.374597, 28.451476]
     ]
   }
 ]
 
 const pipePoints = [
-  { name: 'A点', value: '0.22MPa', lng: 110.3872, lat: 28.4669 },
-  { name: 'B点', value: '0.24MPa', lng: 110.3894, lat: 28.4633 },
-  { name: 'C点', value: '0.18MPa', lng: 110.3922, lat: 28.4598 },
-  { name: 'D点', value: '0.23MPa', lng: 110.3978, lat: 28.4568 },
-  { name: 'E点', value: '0.25MPa', lng: 110.4058, lat: 28.4558 },
-  { name: 'F点', value: '0.19MPa', lng: 110.3892, lat: 28.4728 },
-  { name: 'G点', value: '0.21MPa', lng: 110.4011, lat: 28.4672 }
+  { name: 'A点', value: '0.22MPa', lng: 110.362363, lat: 28.453169 },
+  { name: 'B点', value: '0.24MPa', lng: 110.366462, lat: 28.452157 },
+  { name: 'C点', value: '0.18MPa', lng: 110.373875, lat: 28.451194},
+  { name: 'D点', value: '0.23MPa', lng: 110.401084, lat: 28.433876 },
+  { name: 'E点', value: '0.25MPa', lng: 110.391969, lat: 28.434985 },
+  { name: 'F点', value: '0.19MPa', lng: 110.376062, lat: 28.436385 },
+  { name: 'G点', value: '0.21MPa', lng: 110.370581, lat: 28.438198}
 ]
 
 const mapWrapRef = ref(null)
@@ -245,10 +265,10 @@ function addPipeLine(BMapGL, pipe) {
 
   bmapPoints.forEach((point, index) => {
     const ring = new BMapGL.Circle(point, 14, {
-      strokeColor: '#39f5ff',
+      strokeColor: '#ff3030',
       strokeWeight: 2,
       strokeOpacity: 0.7,
-      fillColor: 'rgba(57,245,255,0.08)',
+      fillColor: 'rgba(255,48,48,0.08)',
       fillOpacity: 0.18
     })
     mapInstance.addOverlay(ring)
@@ -271,7 +291,7 @@ function addPipePoint(BMapGL, point) {
   label.setStyle({
     color: '#d8faff',
     background: 'rgba(18, 68, 112, 0.75)',
-    border: '1px solid rgba(57, 245, 255, 0.55)',
+    border: '1px solid rgba(255, 48, 48, 0.55)',
     borderRadius: '8px',
     padding: '5px 8px',
     fontSize: '12px'
@@ -289,8 +309,10 @@ async function initMap() {
     mapInstance.enableScrollWheelZoom(true)
     mapInstance.setMapStyleV2({ styleId: 'a0f4e6e6f9e7a6c5d8e7f7e7f7e7f7e5' })
 
-    pipelineLines.forEach(pipe => addPipeLine(BMapGL, pipe))
-    pipePoints.forEach(point => addPipePoint(BMapGL, point))
+    const bdPipelineLines = pipelineLines.map(pipe => convertPipeline(pipe))
+    const bdPipePoints = convertPoints(pipePoints)
+    bdPipelineLines.forEach(pipe => addPipeLine(BMapGL, pipe))
+    bdPipePoints.forEach(point => addPipePoint(BMapGL, point))
   } catch (error) {
     mapError.value = '百度地图加载失败,请检查地图脚本或网络连接。'
   }

+ 2 - 2
src/views/subSystem/hidden/HazardList.vue

@@ -106,7 +106,7 @@
           </el-col>
           <el-col :span="12">
             <el-form-item label="上报时间">
-              <el-date-picker v-model="formData.reportTime" type="datetime" style="width: 100%" />
+              <el-date-picker v-model="formData.reportTime" type="datetime" format="YYYY-MM-DD HH:mm:ss" value-format="YYYY-MM-DD HH:mm:ss" style="width: 100%" />
             </el-form-item>
           </el-col>
           <el-col :span="24">
@@ -121,7 +121,7 @@
           </el-col>
           <el-col :span="12">
             <el-form-item label="整改期限">
-              <el-date-picker v-model="formData.rectifyDeadline" type="date" style="width: 100%" />
+              <el-date-picker v-model="formData.rectifyDeadline" type="date" format="YYYY-MM-DD" value-format="YYYY-MM-DD" style="width: 100%" />
             </el-form-item>
           </el-col>
           <el-col :span="12">

+ 14 - 23
src/views/subSystem/hidden/HazardMap.vue

@@ -112,6 +112,7 @@
 <script setup>
 import { ref, computed, onMounted, onBeforeUnmount, nextTick } from 'vue'
 import { getDicts } from '@/api/system/dict/data'
+import { convertCoord } from '@/utils/coordTransform'
 
 const detailVisible = ref(false)
 const currentHazard = ref(null)
@@ -157,25 +158,12 @@ function switchStatusTab(val) {
 
 // ==================== 沅陵县静态隐患数据 ====================
 const mockHazards = [
-  { hazardId: 'HZ001', hazardNo: 'YL-2026-001', hazardType: '0', hazardLevel: '0', hazardStatus: '1', reportUnit: '太常片区管理站', reportTime: '2026-06-12 09:15', hazardDesc: '辰州北路太常段DN200高压管道被第三方道路施工挖掘机挖伤,管体出现明显划痕及凹坑,深度约3mm,存在泄漏风险', address: '沅陵县太常片区辰州北路与建设路交叉口北200米', lng: 110.3938, lat: 28.4685, rectifyPlan: '立即停气更换受损管段,长度约3米', rectifyFeedback: '' },
-  { hazardId: 'HZ002', hazardNo: 'YL-2026-002', hazardType: '1', hazardLevel: '1', hazardStatus: '1', reportUnit: '沅陵镇街道办', reportTime: '2026-06-11 14:30', hazardDesc: '古城南路太常安置区段中压管道外防腐层大面积脱落,管体局部锈蚀,最深处2.1mm', address: '沅陵县太常片区古城南路太常安置区东侧', lng: 110.3964, lat: 28.4605, rectifyPlan: '对锈蚀管段进行除锈处理,重新做3PE防腐层', rectifyFeedback: '材料已采购' },
-  { hazardId: 'HZ005', hazardNo: 'YL-2026-005', hazardType: '4', hazardLevel: '2', hazardStatus: '3', reportUnit: '燃气公司巡检队', reportTime: '2026-06-07 08:20', hazardDesc: '天宁东路末端DN80低压阀门操作卡涩,阀杆填料老化泄漏,开关力矩超出正常值3倍', address: '沅陵县太常片区天宁东路与滨江路交叉口', lng: 110.4065, lat: 28.4692, rectifyPlan: '更换阀门填料及O型密封圈,阀杆除锈润滑', rectifyFeedback: '已完成阀门维修,运行正常' },
-  { hazardId: 'HZ006', hazardNo: 'YL-2026-006', hazardType: '1', hazardLevel: '1', hazardStatus: '1', reportUnit: '太常片区管理站', reportTime: '2026-06-06 11:30', hazardDesc: '辰州中路太常段DN200高压管道阴极保护电位异常,实测电位-0.75V(标准≤-0.85V)', address: '沅陵县太常片区辰州中路与天宁路交叉口南100米', lng: 110.3935, lat: 28.4670, rectifyPlan: '增设牺牲阳极,调整恒电位仪输出', rectifyFeedback: '' },
-  { hazardId: 'HZ008', hazardNo: 'YL-2026-008', hazardType: '0', hazardLevel: '2', hazardStatus: '3', reportUnit: '燃气公司工程部', reportTime: '2026-05-25 09:45', hazardDesc: '太常安置区新建道路施工中挖掘机在未探明管线情况下作业,距DN90低压管道仅0.5米', address: '沅陵县太常片区太常安置区三期工地', lng: 110.3982, lat: 28.4628, rectifyPlan: '设置警示标识,施工期间安排专人监护', rectifyFeedback: '管线标识已补全' },
-  { hazardId: 'HZ009', hazardNo: 'YL-2026-009', hazardType: '4', hazardLevel: '2', hazardStatus: '2', reportUnit: '太常社区网格员', reportTime: '2026-05-20 13:10', hazardDesc: '迎宾东路太常段阀门井盖破损,井内积水严重,阀门操作机构锈蚀', address: '沅陵县太常片区迎宾东路城郊公交站旁', lng: 110.4072, lat: 28.4626, rectifyPlan: '更换阀门井盖,排空积水,井内做防水', rectifyFeedback: '' },
-  { hazardId: 'HZ010', hazardNo: 'YL-2026-010', hazardType: '3', hazardLevel: '3', hazardStatus: '3', reportUnit: '沅陵镇街道办', reportTime: '2026-05-18 10:30', hazardDesc: '建设西路沿线绿化树根系侵入管道保护范围,树木距DN63低压管道仅1.2米', address: '沅陵县太常片区建设西路人行道绿化带', lng: 110.3805, lat: 28.4584, rectifyPlan: '修剪侵入根系,设置根系隔离板', rectifyFeedback: '已修剪根系,隔离板安装完成' },
-  { hazardId: 'HZ011', hazardNo: 'YL-2026-011', hazardType: '0', hazardLevel: '0', hazardStatus: '1', reportUnit: '县应急管理局', reportTime: '2026-05-15 07:50', hazardDesc: '古城北路DN150中压管道被附近工地打桩机震动导致焊缝开裂,发生燃气泄漏', address: '沅陵县太常片区古城北路在建商业广场工地', lng: 110.3978, lat: 28.4765, rectifyPlan: '立即疏散周边人员,氮气置换后重新焊接', rectifyFeedback: '' },
-  { hazardId: 'HZ012', hazardNo: 'YL-2026-012', hazardType: '2', hazardLevel: '2', hazardStatus: '3', reportUnit: '燃气公司巡检队', reportTime: '2026-05-12 14:20', hazardDesc: '滨江东路太常段河堤路面出现轻微裂缝,DN90低压管道埋深仅0.4米(标准≥0.9米)', address: '沅陵县太常片区滨江东路河堤段', lng: 110.4035, lat: 28.4558, rectifyPlan: '增加覆土厚度至标准深度,加装管道保护盖板', rectifyFeedback: '已完成覆土回填,加装混凝土盖板' },
-  { hazardId: 'HZ014', hazardNo: 'YL-2026-014', hazardType: '3', hazardLevel: '0', hazardStatus: '1', reportUnit: '太常社区网格员', reportTime: '2026-05-08 16:40', hazardDesc: '辰州北路高压管道正上方有居民违规搭建临时早餐棚,占压长度约15米,且使用明火经营', address: '沅陵县太常片区辰州北路太常菜市场门口', lng: 110.3928, lat: 28.4725, rectifyPlan: '联合公安、城管部门取缔占压经营,拆除违章搭建', rectifyFeedback: '' },
-  { hazardId: 'HZ015', hazardNo: 'YL-2026-015', hazardType: '0', hazardLevel: '2', hazardStatus: '2', reportUnit: '县住建局', reportTime: '2026-05-05 09:00', hazardDesc: '迎宾路太常段电力电缆与DN110中压燃气管道同沟敷设,间距仅0.2米(标准≥0.5米)', address: '沅陵县太常片区迎宾中路综合管沟', lng: 110.3945, lat: 28.4640, rectifyPlan: '增设绝缘隔离板,加装绝缘接头及排流装置', rectifyFeedback: '' },
-  { hazardId: 'HZ016', hazardNo: 'YL-2026-016', hazardType: '1', hazardLevel: '1', hazardStatus: '1', reportUnit: '沅陵镇街道办', reportTime: '2026-05-03 10:30', hazardDesc: '古城南路DN110中压管道穿越排水涵洞段,涵洞内常年积水浸泡管道,防腐层起泡脱落', address: '沅陵县太常片区古城南路排水涵洞内', lng: 110.3960, lat: 28.4580, rectifyPlan: '导流涵洞积水,重新做防腐处理,加装防水套管', rectifyFeedback: '' },
-  { hazardId: 'HZ017', hazardNo: 'YL-2026-017', hazardType: '4', hazardLevel: '3', hazardStatus: '3', reportUnit: '燃气公司工程部', reportTime: '2026-04-28 13:45', hazardDesc: '太常安置区调压柜门锁损坏,柜体锈蚀,调压器出口压力波动超出正常范围', address: '沅陵县太常片区太常安置区一期院内', lng: 110.3970, lat: 28.4648, rectifyPlan: '更换调压器皮膜及弹簧,柜体除锈刷漆', rectifyFeedback: '已完成维修' },
-  { hazardId: 'HZ019', hazardNo: 'YL-2026-019', hazardType: '0', hazardLevel: '1', hazardStatus: '2', reportUnit: '县应急管理局', reportTime: '2026-04-22 11:00', hazardDesc: '辰州中路DN200高压管道标识桩缺失5根,标识带破损严重,管道走向标识不清', address: '沅陵县太常片区辰州中路(建设路至天宁路段)', lng: 110.3936, lat: 28.4660, rectifyPlan: '补设管道标识桩,更换标识带', rectifyFeedback: '' },
-  { hazardId: 'HZ020', hazardNo: 'YL-2026-020', hazardType: '3', hazardLevel: '3', hazardStatus: '3', reportUnit: '燃气公司巡检队', reportTime: '2026-04-20 15:30', hazardDesc: '滨江西路DN63低压管道被附近居民种菜挖土导致埋深不足,局部覆土仅0.2米', address: '沅陵县太常片区滨江西路空地菜园', lng: 110.3820, lat: 28.4568, rectifyPlan: '回填覆土至标准深度,设置警示标识', rectifyFeedback: '已回填完成' },
-  { hazardId: 'HZ022', hazardNo: 'YL-2026-022', hazardType: '4', hazardLevel: '2', hazardStatus: '2', reportUnit: '太常社区网格员', reportTime: '2026-04-15 14:00', hazardDesc: '辰州北路阀门井被附近施工渣土掩埋,无法正常开启巡检,阀门状态不明', address: '沅陵县太常片区辰州北路施工围挡内', lng: 110.3930, lat: 28.4750, rectifyPlan: '清理渣土,修复阀门井,检查阀门状态', rectifyFeedback: '' },
-  { hazardId: 'HZ023', hazardNo: 'YL-2026-023', hazardType: '2', hazardLevel: '3', hazardStatus: '3', reportUnit: '沅陵镇街道办', reportTime: '2026-04-10 10:00', hazardDesc: '迎宾东路绿化改造施工中挖掘机在DN160中压管道上方1米处作业,无保护措施', address: '沅陵县太常片区迎宾东路绿化带', lng: 110.4095, lat: 28.4625, rectifyPlan: '设置管道保护钢板,安排巡线员现场监护', rectifyFeedback: '施工安全完成' },
-  { hazardId: 'HZ024', hazardNo: 'YL-2026-024', hazardType: '0', hazardLevel: '0', hazardStatus: '1', reportUnit: '县住建局', reportTime: '2026-04-08 16:20', hazardDesc: '建设东路DN200高压管道上方被倾倒大量建筑垃圾,堆积高度约3米,可能导致管道受压变形', address: '沅陵县太常片区建设东路空地', lng: 110.4050, lat: 28.4577, rectifyPlan: '立即清除建筑垃圾,对管道进行变形检测', rectifyFeedback: '' },
-  { hazardId: 'HZ025', hazardNo: 'YL-2026-025', hazardType: '1', hazardLevel: '3', hazardStatus: '3', reportUnit: '燃气公司巡检队', reportTime: '2026-04-05 08:40', hazardDesc: '天宁东路末端调压箱过滤器压差异常升高,疑似过滤器堵塞', address: '沅陵县太常片区天宁东路末端', lng: 110.4088, lat: 28.4690, rectifyPlan: '清洗或更换过滤器滤芯', rectifyFeedback: '滤芯已更换,压差恢复正常' },
+  { hazardId: 'HZ001', hazardNo: 'YL-2026-001', hazardType: '0', hazardLevel: '0', hazardStatus: '1', reportUnit: '片区管理站', reportTime: '2026-06-12 09:15', hazardDesc: '燃气1管道被第三方道路施工挖掘机挖伤,管体出现明显划痕及凹坑', address: '辰州路与建设路交叉口东侧', lng: 110.388, lat: 28.445, rectifyPlan: '立即停气更换受损管段', rectifyFeedback: '' },
+  { hazardId: 'HZ002', hazardNo: 'YL-2026-002', hazardType: '1', hazardLevel: '1', hazardStatus: '1', reportUnit: '街道办', reportTime: '2026-06-11 14:30', hazardDesc: '燃气1管道外防腐层大面积脱落,管体局部锈蚀', address: '古城路中段居民区附近', lng: 110.396, lat: 28.442, rectifyPlan: '重新做3PE防腐层', rectifyFeedback: '材料已采购' },
+  { hazardId: 'HZ005', hazardNo: 'YL-2026-005', hazardType: '1', hazardLevel: '1', hazardStatus: '2', reportUnit: '片区管理站', reportTime: '2026-05-08 16:40', hazardDesc: '燃气2管道正上方有违规搭建,且使用明火经营', address: '迎宾路农贸市场旁', lng: 110.365, lat: 28.448, rectifyPlan: '联合执法部门取缔占压', rectifyFeedback: '' },
+  { hazardId: 'HZ006', hazardNo: 'YL-2026-006', hazardType: '0', hazardLevel: '2', hazardStatus: '3', reportUnit: '住建局', reportTime: '2026-05-05 09:00', hazardDesc: '电力电缆与燃气管道同沟敷设,安全间距不足', address: '学府路电力井附近', lng: 110.394, lat: 28.455, rectifyPlan: '增设绝缘隔离板', rectifyFeedback: '' },
+  { hazardId: 'HZ007', hazardNo: 'YL-2026-007', hazardType: '2', hazardLevel: '2', hazardStatus: '1', reportUnit: '街道办', reportTime: '2026-04-22 11:00', hazardDesc: '管道标识桩缺失,标识带破损严重', address: '滨江路绿化带内', lng: 110.409, lat: 28.438, rectifyPlan: '补设管道标识桩', rectifyFeedback: '' },
+  { hazardId: 'HZ008', hazardNo: 'YL-2026-008', hazardType: '4', hazardLevel: '3', hazardStatus: '3', reportUnit: '工程部', reportTime: '2026-04-15 14:00', hazardDesc: '阀门井盖破损,井内积水严重', address: '城东大道阀门井', lng: 110.403, lat: 28.458, rectifyPlan: '更换阀门井盖', rectifyFeedback: '已修复' },
 ]
 
 const filteredHazards = computed(() => {
@@ -196,7 +184,7 @@ const levelLegend = computed(() =>
 )
 
 // ==================== 百度地图 ====================
-const MAP_CENTER = { lng: 110.394, lat: 28.464 }
+const MAP_CENTER = { lng: 110.386, lat: 28.445 }
 const MAP_DEFAULT_ZOOM = 14
 
 function waitForBMapGL() {
@@ -229,7 +217,8 @@ function initMap() {
   }
 
   try {
-    mapInstance.centerAndZoom(new BMapGL.Point(MAP_CENTER.lng, MAP_CENTER.lat), MAP_DEFAULT_ZOOM)
+    const [mcLng, mcLat] = convertCoord(MAP_CENTER.lng, MAP_CENTER.lat)
+    mapInstance.centerAndZoom(new BMapGL.Point(mcLng, mcLat), MAP_DEFAULT_ZOOM)
     mapInstance.enableScrollWheelZoom(true)
     mapInstance.setMinZoom(12)
     mapInstance.setMaxZoom(18)
@@ -252,7 +241,8 @@ function renderMapMarkers() {
   mapMarkers = []
 
   filteredHazards.value.forEach(h => {
-    const pt = new BMapGL.Point(h.lng, h.lat)
+    const [bLng, bLat] = convertCoord(h.lng, h.lat)
+    const pt = new BMapGL.Point(bLng, bLat)
     const color = levelColors[h.hazardLevel] || '#999'
     const isActive = activeHazardId.value === h.hazardId
     const size = isActive ? 16 : 12
@@ -293,7 +283,8 @@ function openHazardInfo(h) {
   activeHazardId.value = h.hazardId
   detailVisible.value = true
 
-  const pt = new BMapGL.Point(h.lng, h.lat)
+  const [bLng, bLat] = convertCoord(h.lng, h.lat)
+  const pt = new BMapGL.Point(bLng, bLat)
   const color = levelColors[h.hazardLevel] || '#999'
   const levelLabel = getDictLabel(hazardLevelDict.value, h.hazardLevel)
   const typeLabel = getDictLabel(hazardTypeDict.value, h.hazardType)