From 85b1dada73e8c6c0c82bd008f2e5da47d9af59e2 Mon Sep 17 00:00:00 2001
From: shuishen <1109946754@qq.com>
Date: Fri, 30 Jan 2026 14:26:25 +0800
Subject: [PATCH] feat:区域划分新增弹窗调整
---
applications/drone-command/src/views/areaManage/partition/FormDiaLog.vue | 62 ++++++++++++++++++++++++++----
1 files changed, 53 insertions(+), 9 deletions(-)
diff --git a/applications/drone-command/src/views/areaManage/partition/FormDiaLog.vue b/applications/drone-command/src/views/areaManage/partition/FormDiaLog.vue
index bf56383..5fc6010 100644
--- a/applications/drone-command/src/views/areaManage/partition/FormDiaLog.vue
+++ b/applications/drone-command/src/views/areaManage/partition/FormDiaLog.vue
@@ -234,7 +234,7 @@
import { fieldRules, geomAnalysis, getDictLabel } from '@ztzf/utils'
import CommonCesiumMap from '@/components/map-container/common-cesium-map.vue'
import { DrawManager, EditManager, buildEllipsePositions } from '@/utils/cesium/shapeTools'
-import { cartesian3Convert } from '@/utils/cesium/mapUtil'
+import { cartesian3Convert, getPointPositionsHeight } from '@/utils/cesium/mapUtil'
import * as Cesium from 'cesium'
import { AREA_TYPE_STYLE_MAP, BUFFER_LEVEL_STYLES, DEFAULT_AREA_STYLE } from '@ztzf/constants'
import { fwPoliceStationListApi } from '@/views/areaManage/precinctInfo/precinctInfoApi'
@@ -514,13 +514,25 @@
return { lng, lat }
}
-function createDeviceRangePrimitive (device) {
+async function resolveDeviceTerrainHeight (position) {
+ if (!viewer) return 0
+ try {
+ const results = await getPointPositionsHeight([{ lng: position.lng, lat: position.lat }], viewer)
+ const height = Number(results?.[0]?.ASL)
+ return Number.isFinite(height) ? height : 0
+ } catch (error) {
+ return 0
+ }
+}
+
+async function createDeviceRangePrimitive (device) {
if (!viewer) return null
if (!device) return null
const position = getDeviceLngLat(device)
if (!position) return null
const rangeMeters = normalizeDeviceRange(device.effectiveRangeKm)
- const center = Cesium.Cartesian3.fromDegrees(position.lng, position.lat, 0)
+ const centerHeight = await resolveDeviceTerrainHeight(position)
+ const center = Cesium.Cartesian3.fromDegrees(position.lng, position.lat, centerHeight)
const radii = new Cesium.Cartesian3(rangeMeters, rangeMeters, rangeMeters)
const geometry = new Cesium.EllipsoidGeometry({
radii,
@@ -544,16 +556,16 @@
})
}
-function renderDeviceRangeSingle (device) {
+async function renderDeviceRangeSingle (device) {
if (!viewer) return
clearDeviceRangePrimitives()
- const primitive = createDeviceRangePrimitive(device)
+ const primitive = await createDeviceRangePrimitive(device)
if (!primitive) return
deviceRangePrimitiveMap.set(String(device?.id ?? Date.now()), primitive)
viewer.scene.primitives.add(primitive)
}
-function renderDeviceRanges (rows) {
+async function renderDeviceRanges (rows) {
if (!viewer) return
const selectedRows = Array.isArray(rows) ? rows : []
const nextIds = new Set(selectedRows.map(row => String(row?.id)))
@@ -563,13 +575,39 @@
deviceRangePrimitiveMap.delete(id)
}
}
- selectedRows.forEach(row => {
+ const pendingRows = selectedRows.filter(row => {
const id = String(row?.id)
- if (!id || deviceRangePrimitiveMap.has(id)) return
- const primitive = createDeviceRangePrimitive(row)
+ return id && !deviceRangePrimitiveMap.has(id)
+ })
+ if (!pendingRows.length) return
+ const primitives = await Promise.all(
+ pendingRows.map(async row => {
+ const primitive = await createDeviceRangePrimitive(row)
+ return { row, primitive }
+ })
+ )
+ primitives.forEach(({ row, primitive }) => {
if (!primitive) return
+ const id = String(row?.id)
deviceRangePrimitiveMap.set(id, primitive)
viewer.scene.primitives.add(primitive)
+ })
+}
+
+async function flyToDevice (device) {
+ if (!viewer) return
+ const position = getDeviceLngLat(device)
+ if (!position) return
+ const height = await resolveDeviceTerrainHeight(position)
+ const destination = Cesium.Cartesian3.fromDegrees(position.lng, position.lat, height + device.effectiveRangeKm * 3)
+ viewer.camera.flyTo({
+ destination,
+ orientation: {
+ heading: viewer.camera.heading,
+ pitch: Cesium.Math.toRadians(-90),
+ roll: 0,
+ },
+ duration: 0.6,
})
}
@@ -1053,14 +1091,20 @@
const ids = rows.map(item => item.id)
formData.value.deviceIds = ids.join(',')
renderDeviceRanges(rows)
+ const target = rows[rows.length - 1]
+ if (target) {
+ void flyToDevice(target)
+ }
}
function handleDeviceRowClick (row) {
if (readonly.value) {
renderDeviceRangeSingle(row)
+ void flyToDevice(row)
return
}
renderDeviceRanges(selectedDeviceRows.value)
+ void flyToDevice(row)
}
// 同步选择状态
--
Gitblit v1.9.3