From a647d56b8ae949378f866d89059ab8df95301002 Mon Sep 17 00:00:00 2001
From: sd <1504629600@qq.com>
Date: Tue, 3 Feb 2026 13:34:38 +0800
Subject: [PATCH] =?UTF-8?q?=E8=88=AA=E7=82=B9=E5=AE=9A=E4=BD=8D=EF=BC=8C?=
=?UTF-8?q?=E4=BB=A3=E7=A0=81=E5=88=86=E7=A6=BB?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
ruoyi-ui/src/views/cesiumMap/LocateDialog.vue | 257 ++++++++++++++++++++++
ruoyi-ui/src/views/cesiumMap/index.vue | 293 +++-----------------------
2 files changed, 291 insertions(+), 259 deletions(-)
create mode 100644 ruoyi-ui/src/views/cesiumMap/LocateDialog.vue
diff --git a/ruoyi-ui/src/views/cesiumMap/LocateDialog.vue b/ruoyi-ui/src/views/cesiumMap/LocateDialog.vue
new file mode 100644
index 0000000..63419b0
--- /dev/null
+++ b/ruoyi-ui/src/views/cesiumMap/LocateDialog.vue
@@ -0,0 +1,257 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ruoyi-ui/src/views/cesiumMap/index.vue b/ruoyi-ui/src/views/cesiumMap/index.vue
index 031f9f2..a84b523 100644
--- a/ruoyi-ui/src/views/cesiumMap/index.vue
+++ b/ruoyi-ui/src/views/cesiumMap/index.vue
@@ -35,6 +35,15 @@
@delete="deleteEntityFromContextMenu"
@update-property="updateEntityProperty"
/>
+
+
+
+
@@ -57,12 +66,10 @@ import DrawingToolbar from './DrawingToolbar.vue'
import MeasurementPanel from './MeasurementPanel.vue'
import HoverTooltip from './HoverTooltip.vue'
import ContextMenu from './ContextMenu.vue'
+import LocateDialog from './LocateDialog.vue'
import axios from 'axios'
import request from '@/utils/request'
import { getToken } from '@/utils/auth'
-import { listScenario } from '@/api/system/scenario'
-import { listRoutes } from '@/api/system/routes'
-import { listWaypoints } from '@/api/system/waypoints'
export default {
name: 'CesiumMap',
props: {
@@ -143,19 +150,15 @@ export default {
scaleBarText: '--',
scaleBarWidthPx: 80,
// 定位相关
- scenarioList: [],
- routeList: [],
- waypointList: [],
- selectedScenario: null,
- selectedRoute: null,
- selectedWaypoint: null
+ locateDialogVisible: false
}
},
components: {
DrawingToolbar,
MeasurementPanel,
HoverTooltip,
- ContextMenu
+ ContextMenu,
+ LocateDialog
},
mounted() {
console.log(this.drawDomClick,999999)
@@ -2716,256 +2719,28 @@ export default {
})
}
},
- async handleLocate() {
- const h = this.$createElement
-
- // 每次打开弹窗时重置所有状态
- this.scenarioList = []
- this.routeList = []
- this.waypointList = []
- this.selectedScenario = null
- this.selectedRoute = null
- this.selectedWaypoint = null
-
- try {
- const scenarioRes = await listScenario({})
- this.scenarioList = scenarioRes.rows || []
- } catch (error) {
- console.error('加载方案列表失败:', error)
- }
-
- const getSelectByClass = (className) => {
- return document.querySelector(`.${className}`)
- }
-
- const resetSelects = () => {
- const scenarioSelect = getSelectByClass('scenario-select')
- const routeSelect = getSelectByClass('route-select')
- const waypointSelect = getSelectByClass('waypoint-select')
-
- if (scenarioSelect) scenarioSelect.value = ''
- if (routeSelect) {
- routeSelect.disabled = true
- routeSelect.innerHTML = ''
- }
- if (waypointSelect) {
- waypointSelect.disabled = true
- waypointSelect.innerHTML = ''
- }
- }
-
- const handleScenarioChange = async (e) => {
- const value = parseInt(e.target.value)
- console.log('方案变化:', value)
- this.selectedScenario = value
- this.selectedRoute = null
- this.selectedWaypoint = null
- this.routeList = []
- this.waypointList = []
-
- const routeSelect = getSelectByClass('route-select')
- const waypointSelect = getSelectByClass('waypoint-select')
-
- if (routeSelect) {
- routeSelect.disabled = true
- routeSelect.innerHTML = ''
- }
-
- if (waypointSelect) {
- waypointSelect.disabled = true
- waypointSelect.innerHTML = ''
- }
-
- if (value) {
- try {
- const routeRes = await listRoutes({ scenarioId: value })
- this.routeList = routeRes.rows || []
- console.log('航线列表:', this.routeList)
-
- if (routeSelect) {
- routeSelect.disabled = false
- routeSelect.innerHTML = ''
- this.routeList.forEach(item => {
- const option = document.createElement('option')
- option.value = item.id
- option.textContent = item.callSign
- routeSelect.appendChild(option)
- })
- }
- } catch (error) {
- console.error('加载航线列表失败:', error)
- }
- }
- }
-
- const handleRouteChange = async (e) => {
- const value = parseInt(e.target.value)
- console.log('航线变化:', value)
- this.selectedRoute = value
- this.selectedWaypoint = null
- this.waypointList = []
-
- const waypointSelect = getSelectByClass('waypoint-select')
-
- if (waypointSelect) {
- waypointSelect.disabled = true
- waypointSelect.innerHTML = ''
- }
-
- if (value) {
- try {
- const waypointRes = await listWaypoints({ routeId: value })
- this.waypointList = waypointRes.rows || []
- console.log('航点列表:', this.waypointList)
-
- if (waypointSelect) {
- waypointSelect.disabled = false
- waypointSelect.innerHTML = ''
- this.waypointList.forEach(item => {
- const option = document.createElement('option')
- option.value = item.id
- option.textContent = `${item.name} (${item.lng}, ${item.lat})`
- waypointSelect.appendChild(option)
- })
- }
- } catch (error) {
- console.error('加载航点列表失败:', error)
- }
- }
- }
-
- const handleWaypointChange = (e) => {
- const value = parseInt(e.target.value)
- console.log('航点变化:', value)
- this.selectedWaypoint = value
- const waypoint = this.waypointList.find(w => w.id === value)
- if (waypoint) {
- const lngInput = document.querySelector('input[placeholder="例如 116.40"]')
- const latInput = document.querySelector('input[placeholder="例如 39.90"]')
- if (lngInput) lngInput.value = waypoint.lng
- if (latInput) latInput.value = waypoint.lat
- console.log('填充经纬度:', waypoint.lng, waypoint.lat)
- }
+ handleLocate() {
+ this.locateDialogVisible = true
+ },
+
+ handleLocateConfirm(location) {
+ const { lng, lat } = location
+ if (this.viewer) {
+ this.viewer.camera.flyTo({
+ destination: Cesium.Cartesian3.fromDegrees(lng, lat, 100000),
+ orientation: {
+ heading: Cesium.Math.toRadians(0.0),
+ pitch: Cesium.Math.toRadians(-90.0),
+ roll: 0.0
+ },
+ duration: 2
+ })
+ this.$message.success(`已定位到经度 ${lng.toFixed(4)},纬度 ${lat.toFixed(4)}`)
}
-
- this.$msgbox({
- title: '定位',
- message: h('div', {style: 'padding: 10px 0;'}, [
- h('div', {style: 'margin-bottom: 15px;'}, [
- h('label', {style: 'display: block; margin-bottom: 5px; color: #606266;'}, '方案:'),
- h('select', {
- attrs: {
- class: 'scenario-select',
- style: 'width: 100%; padding: 8px; border: 1px solid #dcdfe6; border-radius: 4px; box-sizing: border-box;'
- },
- on: {
- change: handleScenarioChange
- }
- }, [
- h('option', { attrs: { value: '' } }, '请选择方案'),
- ...this.scenarioList.map(item => h('option', { attrs: { value: item.id } }, item.name))
- ])
- ]),
- h('div', {style: 'margin-bottom: 15px;'}, [
- h('label', {style: 'display: block; margin-bottom: 5px; color: #606266;'}, '航线:'),
- h('select', {
- attrs: {
- class: 'route-select',
- disabled: true,
- style: 'width: 100%; padding: 8px; border: 1px solid #dcdfe6; border-radius: 4px; box-sizing: border-box;'
- },
- on: {
- change: handleRouteChange
- }
- }, [
- h('option', { attrs: { value: '' } }, '请选择航线')
- ])
- ]),
- h('div', {style: 'margin-bottom: 15px;'}, [
- h('label', {style: 'display: block; margin-bottom: 5px; color: #606266;'}, '航点:'),
- h('select', {
- attrs: {
- class: 'waypoint-select',
- disabled: true,
- style: 'width: 100%; padding: 8px; border: 1px solid #dcdfe6; border-radius: 4px; box-sizing: border-box;'
- },
- on: {
- change: handleWaypointChange
- }
- }, [
- h('option', { attrs: { value: '' } }, '请选择航点')
- ])
- ]),
- h('div', {style: 'margin-bottom: 15px;'}, [
- h('label', {style: 'display: block; margin-bottom: 5px; color: #606266;'}, '经度:'),
- h('input', {
- attrs: {
- type: 'number',
- placeholder: '例如 116.40',
- step: '0.000001',
- value: '116.3974'
- },
- style: 'width: 100%; padding: 8px; border: 1px solid #dcdfe6; border-radius: 4px; box-sizing: border-box;',
- ref: 'lngInput'
- })
- ]),
- h('div', null, [
- h('label', {style: 'display: block; margin-bottom: 5px; color: #606266;'}, '纬度:'),
- h('input', {
- attrs: {
- type: 'number',
- placeholder: '例如 39.90',
- step: '0.000001',
- value: '39.9093'
- },
- style: 'width: 100%; padding: 8px; border: 1px solid #dcdfe6; border-radius: 4px; box-sizing: border-box;',
- ref: 'latInput'
- })
- ])
- ]),
- showCancelButton: true,
- confirmButtonText: '确定',
- cancelButtonText: '取消',
- beforeClose: (action, instance, done) => {
- if (action === 'confirm') {
- const lngInput = instance.$el.querySelector('input[placeholder="例如 116.40"]')
- const latInput = instance.$el.querySelector('input[placeholder="例如 39.90"]')
- const lng = parseFloat(lngInput.value)
- const lat = parseFloat(latInput.value)
- if (!lng || !lat || isNaN(lng) || isNaN(lat)) {
- this.$message.error('请输入有效的经度和纬度!')
- return
- }
- if (lng < -180 || lng > 180 || lat < -90 || lat > 90) {
- this.$message.error('经纬度超出有效范围!')
- return
- }
- if (this.viewer) {
- this.viewer.camera.flyTo({
- destination: Cesium.Cartesian3.fromDegrees(lng, lat, 100000),
- orientation: {
- heading: Cesium.Math.toRadians(0.0),
- pitch: Cesium.Math.toRadians(-90.0),
- roll: 0.0
- },
- duration: 2
- })
- this.$message.success(`已定位到经度 ${lng.toFixed(4)},纬度 ${lat.toFixed(4)}`)
- }
- done()
- } else {
- this.$message.info('已取消定位')
- done()
- }
- }
- }).then(() => {
- // 弹窗关闭后重置所有选择状态
- resetSelects()
- }).catch(() => {
- this.$message.info('已取消定位')
- // 弹窗关闭后重置所有选择状态
- resetSelects()
- })
+ },
+
+ handleLocateCancel() {
+ this.$message.info('已取消定位')
},
updateSelectOptions(refName, dataList, labelField) {
const select = document.querySelector(`select[ref="${refName}"]`)