xsh_1997 1 개월 전
부모
커밋
b5953f8741
2개의 변경된 파일46개의 추가작업 그리고 17개의 파일을 삭제
  1. 19 17
      ruoyi-screen/src/components/GisMap.vue
  2. 27 0
      ruoyi-screen/src/utils/gisTownshipBoundary.js

+ 19 - 17
ruoyi-screen/src/components/GisMap.vue

@@ -13,10 +13,8 @@ import {
13 13
   syncWmtsLayerVisibility
14 14
 } from '@/utils/gisLoader'
15 15
 import {
16
-  GIS_POI_SEARCH_MODE,
17
-  getGisPoiSearchMode,
18 16
   parsePoiLngLat,
19
-  searchPois
17
+  searchNearbyPois
20 18
 } from '@/utils/gisPoiSearch'
21 19
 import {
22 20
   addTownshipBoundaryLayers,
@@ -24,6 +22,7 @@ import {
24 22
   buildTownshipInfo,
25 23
   flyToTownship,
26 24
   getTownshipLabelPoints,
25
+  getTownshipPoiSearchCenter,
27 26
   removeTownshipBoundaryLayers
28 27
 } from '@/utils/gisTownshipBoundary'
29 28
 import { getTownshipLivestockStats } from '@/constants/townshipLivestock'
@@ -49,7 +48,7 @@ const props = defineProps({
49 48
     type: Boolean,
50 49
     default: false
51 50
   },
52
-  /** 是否在地图加载后展示周边 POI Marker */
51
+  /** 点击乡镇后是否展示该乡镇中心点周边 POI(默认不加载,点击后才查) */
53 52
   showPoiMarkers: {
54 53
     type: Boolean,
55 54
     default: true
@@ -95,6 +94,8 @@ let lastWheelAround = null
95 94
 let poiMarkers = []
96 95
 let townshipMarkers = []
97 96
 let unbindTownshipClick = null
97
+/** 当前 POI 查询中心,仅点击乡镇后赋值 */
98
+let poiSearchCenter = null
98 99
 
99 100
 function logClickCoordinate(lngLat) {
100 101
   if (!lngLat) {
@@ -176,10 +177,14 @@ function bindTownshipDrillDown() {
176 177
     })
177 178
     emit('township-click', info)
178 179
 
179
-    if (props.showPoiMarkers && getGisPoiSearchMode() === GIS_POI_SEARCH_MODE.NEARBY) {
180
-      map.once('moveend', () => {
181
-        renderPoiMarkers()
182
-      })
180
+    if (props.showPoiMarkers) {
181
+      const searchCenter = getTownshipPoiSearchCenter(feature)
182
+      if (searchCenter) {
183
+        poiSearchCenter = searchCenter
184
+        map.once('moveend', () => {
185
+          renderPoiMarkers()
186
+        })
187
+      }
183 188
     }
184 189
   })
185 190
 }
@@ -280,15 +285,15 @@ function createPoiMarkerElement(name) {
280 285
 }
281 286
 
282 287
 async function renderPoiMarkers() {
283
-  if (!props.showPoiMarkers || !map || !cmmapglRef) {
288
+  if (!props.showPoiMarkers || !map || !cmmapglRef || !poiSearchCenter) {
284 289
     return
285 290
   }
286 291
   clearPoiMarkers()
287 292
 
288 293
   let pois = []
289 294
   try {
290
-    pois = await searchPois({
291
-      center: resolveCenter()
295
+    pois = await searchNearbyPois({
296
+      center: poiSearchCenter
292 297
     })
293 298
   } catch {
294 299
     return
@@ -330,6 +335,7 @@ function destroyMap() {
330 335
   wheelDeltaAccum = 0
331 336
   lastWheelAround = null
332 337
   clampingZoom = false
338
+  poiSearchCenter = null
333 339
   clearPoiMarkers()
334 340
   teardownTownshipBoundary()
335 341
   if (map) {
@@ -571,7 +577,6 @@ async function initMap() {
571 577
       syncWmtsLayerVisibility(map)
572 578
       resizeMap()
573 579
       renderTownshipBoundary()
574
-      renderPoiMarkers()
575 580
       emit('ready', map)
576 581
     })
577 582
     // 瓦片/遥测等非致命错误不向页面报错
@@ -589,9 +594,6 @@ watch(
589 594
       center: resolveCenter(),
590 595
       zoom: resolveZoom()
591 596
     })
592
-    if (props.showPoiMarkers && getGisPoiSearchMode() === GIS_POI_SEARCH_MODE.NEARBY) {
593
-      renderPoiMarkers()
594
-    }
595 597
   },
596 598
   { deep: true }
597 599
 )
@@ -600,9 +602,9 @@ watch(
600 602
   () => props.showPoiMarkers,
601 603
   (show) => {
602 604
     if (!map || !cmmapglRef) return
603
-    if (show) {
605
+    if (show && poiSearchCenter) {
604 606
       renderPoiMarkers()
605
-    } else {
607
+    } else if (!show) {
606 608
       clearPoiMarkers()
607 609
     }
608 610
   }

+ 27 - 0
ruoyi-screen/src/utils/gisTownshipBoundary.js

@@ -43,6 +43,33 @@ function getTownshipDrillCenter(feature) {
43 43
   return null
44 44
 }
45 45
 
46
+/** POI 周边搜索中心:拉西镇用手动坐标,其余乡镇用 json 的 center/centroid */
47
+export function getTownshipPoiSearchCenter(feature) {
48
+  if (!feature) {
49
+    return null
50
+  }
51
+  const name = String(feature.properties?.name || '')
52
+  const override = TOWNSHIP_DRILL_CENTER_OVERRIDES[name]
53
+  if (Array.isArray(override) && override.length >= 2) {
54
+    const lng = Number(override[0])
55
+    const lat = Number(override[1])
56
+    if (Number.isFinite(lng) && Number.isFinite(lat)) {
57
+      return [lng, lat]
58
+    }
59
+  }
60
+
61
+  const center = feature.properties?.centroid || feature.properties?.center
62
+  if (Array.isArray(center) && center.length >= 2) {
63
+    const lng = Number(center[0])
64
+    const lat = Number(center[1])
65
+    if (Number.isFinite(lng) && Number.isFinite(lat)) {
66
+      return [lng, lat]
67
+    }
68
+  }
69
+
70
+  return null
71
+}
72
+
46 73
 export function getTownshipGeoJson() {
47 74
   return townshipGeoJson
48 75
 }