diff --git a/.env.development b/.env.development index 83c77d3..3073d66 100644 --- a/.env.development +++ b/.env.development @@ -5,6 +5,7 @@ VITE_USE_MOCK = true VITE_PUBLIC_PATH = / # Basic interface address SPA + #基础框架 VITE_GLOB_API_URL = http://192.168.10.163:9620 @@ -15,9 +16,19 @@ VITE_GLOB_UPLOAD_URL= http://60.213.14.14:6070 VITE_GLOB_INFO_IMAGE_URL=http://120.222.154.48:6050 + +# java +VITE_GLOB_COFFEE_API_URL = http://221.2.83.243:6050/coffee + # geoserver VITE_GLOB_GEOSERVER_BASE_URL = http://192.168.10.163:8080 +# 导航 +VITE_GLOBAL_NAVIGATION_BASE_URL = http://221.2.83.243:8091 + +# ANYRTC CALL +VITE_GLOB_ANYRTC_BASE_URL = https://ktdrw.wisestcity.com:6070 + # Interface prefix VITE_GLOB_API_URL_PREFIX= diff --git a/.env.linyefanghuo b/.env.linyefanghuo index a6c06f3..589eae6 100644 --- a/.env.linyefanghuo +++ b/.env.linyefanghuo @@ -25,6 +25,13 @@ VITE_GLOB_INFO_IMAGE_URL= http://221.2.83.243:6050/core # geoserver VITE_GLOB_GEOSERVER_BASE_URL = http://221.2.83.243:6050/ +# 导航 +VITE_GLOBAL_NAVIGATION_BASE_URL = http://221.2.83.243:8091 + +# 视频通话 +VITE_GLOB_ANYRTC_BASE_URL = https://ktdrw.wisestcity.com:6070 + + # File upload address, optional # It can be forwarded by nginx or write the actual address directly diff --git a/package.json b/package.json index d5ab0d0..34af3b0 100644 --- a/package.json +++ b/package.json @@ -168,7 +168,8 @@ "vuex": "^4.1.0", "xe-utils": "^3.5.14", "xlsx": "^0.18.5", - "@turf/helpers": "^7.2.0" + "@turf/helpers": "^7.2.0", + "proj4":"^2.19.10" }, "devDependencies": { "@amap/amap-jsapi-loader": "^1.0.1", diff --git a/public/components/Task/taskassign/methods-model.png b/public/components/Task/taskassign/methods-model.png new file mode 100644 index 0000000..104b465 Binary files /dev/null and b/public/components/Task/taskassign/methods-model.png differ diff --git a/src/assets/images/chart/tasks/LocationSearch.png b/src/assets/images/chart/tasks/LocationSearch.png new file mode 100644 index 0000000..8df36af Binary files /dev/null and b/src/assets/images/chart/tasks/LocationSearch.png differ diff --git a/src/packages/components/Tasks/Tasks/LocationSearch/index.vue b/src/packages/components/Tasks/Tasks/LocationSearch/index.vue index e1f3b0a..3c68d74 100644 --- a/src/packages/components/Tasks/Tasks/LocationSearch/index.vue +++ b/src/packages/components/Tasks/Tasks/LocationSearch/index.vue @@ -35,7 +35,7 @@ import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'; import { EventBus } from '@/utils/eventBus'; import { ElMessage } from 'element-plus' - + import { gcj02towgs84 } from 'coordtransform' import {getRedisUser,addOrUpdateRedisUser,getLockedClients,getTsgzProjectId,applyDroneControl} from '@/api/demo/airportMaintenance'; import { airPortStore } from '@/store/modules/airport'; import { useMessage } from '@/hooks/web/useMessage'; @@ -151,7 +151,10 @@ const flyToMap = (lngLat:string) =>{ let lngLatArr = lngLat.split(","); - window.globalMap.flyToPoint([Number(lngLatArr[0]),Number(lngLatArr[1])],{radius:200}); + + // 从gcj-02坐标系转换为wgs84坐标系 + let wgs84Coord = gcj02towgs84(lngLatArr[0],lngLatArr[1]); + window.globalMap.flyToPoint([Number(wgs84Coord[0]),Number(wgs84Coord[1])],{radius:200}); } diff --git a/src/packages/components/Tasks/Tasks/OnlineUsers/index.vue b/src/packages/components/Tasks/Tasks/OnlineUsers/index.vue index 401db79..7cc857d 100644 --- a/src/packages/components/Tasks/Tasks/OnlineUsers/index.vue +++ b/src/packages/components/Tasks/Tasks/OnlineUsers/index.vue @@ -97,7 +97,7 @@ import * as mars3d from "mars3d"; import * as Cesium from 'mars3d-cesium'; - var { VITE_GLOB_API_URL } = getAppEnvConfig(); + var { VITE_GLOB_API_URL, VITE_GLOB_ANYRTC_BASE_URL } = getAppEnvConfig(); const methodsShow = ref(false) @@ -268,11 +268,18 @@ getUserList(); + // 定时查询更新在线人员 + setInterval(function(){ + getUserList(); + },5000) + + + // 视频通话 const callUserShow = ref(false); const callUser = (user) => { - window.open(`http://localhost:9239/#/?userID=yishuixian&callUserID=${user.phone}`,"视频通话", "location=no,toolbar=no,menubar=no,scrollbars=yes,resizable=yes,width=640,height=460"); + window.open(`${VITE_GLOB_ANYRTC_BASE_URL}/#/?userID=System&callUserID=${user.phone}`,"视频通话", "location=no,toolbar=no,menubar=no,scrollbars=yes,resizable=yes,width=778,height=594"); } // 置顶用户 diff --git a/src/packages/components/Tasks/Tasks/TaskAssign/index.vue b/src/packages/components/Tasks/Tasks/TaskAssign/index.vue index 3a029c8..93f64ba 100644 --- a/src/packages/components/Tasks/Tasks/TaskAssign/index.vue +++ b/src/packages/components/Tasks/Tasks/TaskAssign/index.vue @@ -87,7 +87,6 @@
操作
-
@@ -748,6 +747,10 @@ label:"无人机核查", icon:"uav", value:"uav", + },{ + label:"三维模型", + icon:"model", + value:"model", },{ label:"直升机核查", icon:"helicopter", @@ -793,6 +796,10 @@ handlerResponseClue(item); break; + case "model": + handlerModel(item); + break; + } @@ -928,10 +935,6 @@ let data = res.data.result[0]; clueInfo.value = data; - console.log("clueInfo",clueInfo.value); - - - // 获取任务列表 handlerGetTaskList(); @@ -1707,6 +1710,10 @@ }) } + // 三维模型 + function handlerModel(item){ + changeButton("三维模型") + } const changeButton = (type) => { eventHandlerHook( chartEditStore.getComponentList, @@ -2727,11 +2734,10 @@ } .methods-container{ position:absolute; - padding:30px 4px 10px 10px; + padding:20px 4px 10px 10px; bottom: 74px; right: -160px; width:160px; - height:300px; background-image:url(@/assets/images/chart/tasks/taskassign/methods-container-bg.png); background-size: 100% 100%; display:none; diff --git a/src/packages/components/Tasks/Tasks/XgridsModelTools/index.vue b/src/packages/components/Tasks/Tasks/XgridsModelTools/index.vue index 9550a7b..7be8eba 100644 --- a/src/packages/components/Tasks/Tasks/XgridsModelTools/index.vue +++ b/src/packages/components/Tasks/Tasks/XgridsModelTools/index.vue @@ -6,17 +6,26 @@
-
+
-
+
{{item.meshPath}}
+ +
+

+ +

+ 暂无数据 +
@@ -45,7 +54,9 @@ import { listDronePort, saveHandFlyTask, endHandFlyTask, endAiInspection } from '@/api/situation'; import * as mars3d from "mars3d"; import * as Cesium from 'mars3d-cesium'; - import {SearchOutlined,CloseCircleFilled,FileOutlined} from '@ant-design/icons-vue'; + import proj4 from 'proj4'; + import {SearchOutlined,CloseCircleFilled,FileOutlined,DropboxOutlined} from '@ant-design/icons-vue'; + import StableWebSocket from './lib/StableWebSocket'; @@ -67,8 +78,6 @@ }); - - const { w, h, x, y } = toRefs(props.chartConfig.attr); const chartEditStore = useChartEditStore(); @@ -464,13 +473,11 @@ } - - // websocket连接 // 创建实例 const ws = new StableWebSocket({ - url: 'ws://221.2.83.243:6090', + url: 'ws://221.2.83.243:6050/wsapp/', reconnectInterval: 3000, // 重连间隔3秒 maxReconnectAttempts: 10, // 最多重连10次 heartbeatInterval: 30000, // 心跳间隔30秒 @@ -485,6 +492,10 @@ ws.onMessage((data) => { console.log('收到消息:', data); + if(data.type == 'map_update'){ + let modelList:Model[] = data.data.MeshList; + mapRender(modelList); + } }); ws.onError((error) => { @@ -507,38 +518,162 @@ // 手动重连 // ws.reconnect(); - +const currentModelList = ref([]) // 获取新的数组 判断有无新数据 追加 -function mergeModelsWithMap(newModels: Model[]) { - - if (!modelList.value) { - modelList.value = [...newModels]; - return; - } - - // 将现有模型转为 Map,以 meshPath 为 key - const existingMap = new Map( - modelList.value.map(model => [model.meshPath, model]) - ); - - // 合并新模型 - newModels.forEach(model => { - if (!existingMap.has(model.meshPath)) { - existingMap.set(model.meshPath, model); - } - }); - - // 转回数组 - modelList.value = Array.from(existingMap.values()); +function addNewModels(newArray: Model[]): Model[] { + // 找出 newArray 中比 originalArray 多的元素 + const addedModels = newArray.filter(newModel => { + // 检查 originalArray 中是否存在相同的 model + return !currentModelList.value?.some(originalModel => + // 根据 meshPath 判断是否相同(假设 meshPath 是唯一标识) + originalModel.meshPath === newModel.meshPath + ); + }); + + // 将多的元素添加到原数组 + currentModelList.value?.push(...addedModels); + + return addedModels; } +let graphicLayer:mars3d.layer.GraphicLayer; + // 叠加飞机中心点、轨迹、三维模型 -function mapRender ():void{ +function mapRender (modelListTemp:Model[]){ + let addedModels:Model[] = addNewModels(modelListTemp); + + console.log("addedModels",addedModels); + + + let modelCenter = localToCartesian(0,0,0); + + if(!graphicLayer){ + graphicLayer = new mars3d.layer.GraphicLayer(); + window.globalMap.addLayer(graphicLayer); + } + + + + // 加载三维模型 + addedModels.forEach((mesh,index)=>{ + + // 计算模型中心点(用于放置位置) + const centerX = (mesh.boxMinX + mesh.boxMaxX) / 2; + const centerY = (mesh.boxMinY + mesh.boxMaxY) / 2; + const centerZ = (mesh.boxMinZ + mesh.boxMaxZ) / 2; + + let coordinate = localToCartesian(centerX,centerY,centerZ); + + // 中心点 + const graphicCenter = new mars3d.graphic.BillboardEntity({ + position: [coordinate.lng,coordinate.lat,coordinate.alt], + style: { + image: "https://data.mars3d.cn/img/marker/lace-blue.png", + horizontalOrigin: Cesium.HorizontalOrigin.CENTER, + verticalOrigin: Cesium.VerticalOrigin.BOTTOM, + clampToGround:true, + label:{ + text:index, + pixelOffsetY:-45 + } + }, + attr: { remark: "点状数据position" } + }) + graphicLayer.addGraphic(graphicCenter) + + // return null; + + let url = mesh.meshPath.replace('D:/S1/Project/droneProject/Multiply/2026-01-17 133410/mesh/', 'http://221.2.83.243:6090/mesh/'); + + const graphic = new mars3d.graphic.ModelPrimitive({ + id:"mesh-"+index, + position:[modelCenter.lng,modelCenter.lat,0], + style: { + url: url, + scale: 1, + heading:90, + pitch:90, + roll:0, + clampToGround: true, + } + }) + + graphicLayer.addGraphic(graphic) + + window.globalMap.flyToGraphic(graphicCenter,{ + radius:300 + }); + + }) + + + } +function flyToModel(mesh){ + console.log("item",mesh); + + // 计算模型中心点(用于放置位置) + const centerX = (mesh.boxMinX + mesh.boxMaxX) / 2; + const centerY = (mesh.boxMinY + mesh.boxMaxY) / 2; + const centerZ = (mesh.boxMinZ + mesh.boxMaxZ) / 2; + + let coordinate = localToCartesian(centerX,centerY,centerZ); + + window.globalMap.flyToPoint([Number(coordinate.lng),Number(coordinate.lat)],{radius:200}); +} + +// 获取中心点坐标 +function localToCartesian(localX, localY, localZ) { + + // 局部坐标转UTM + const utmEasting = localX + 39618741.9701438756; + const utmNorthing = localY + 3908434.925520379; + const altitude = localZ + 142.45785522460938; + + // UTM转WGS84经纬度(需要proj4库) + // Zone 39N, WGS84 + const wgs84 = '+proj=utm +zone=39 +ellps=WGS84 +datum=WGS84 +units=m +no_defs'; + + const EPSG4527 = proj4.defs("EPSG:4527","+proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=39500000 +y_0=0 +ellps=GRS80 +units=m +no_defs +type=crs"); + + const EPSG4490 = proj4.defs("EPSG:4490","+proj=longlat +datum=WGS84 +no_defs +type=crs"); + + // const lonLat = proj4(wgs84, 'EPSG:4326', [utmEasting, utmNorthing]); + + const lonLat = proj4("EPSG:4527", "EPSG:4490", [utmEasting, utmNorthing]); + + // 返回Cesium笛卡尔坐标 + return { + lng:lonLat[0], // 经度 + lat:lonLat[1], // 纬度 + alt:altitude // 高程(椭球高) + }; +} + + +// 模拟websocket +function simulationWebsocket():void{ + let node = 0; + + let modelListTemp:Model[] = []; + + setInterval(function(){ + modelListTemp = modelList.value?.slice(0,node); + node ++; + // mapRender(modelListTemp); + },10000) +} + + + +setTimeout(function(){ + simulationWebsocket(); + +},10000)