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 @@
@@ -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)