增加无人机轨迹显示
This commit is contained in:
parent
4fdf6b0a5e
commit
d9bb2cee2b
@ -54,6 +54,7 @@ let sceneEntity = {}
|
|||||||
let taskListResource = []
|
let taskListResource = []
|
||||||
let orthoManager = null
|
let orthoManager = null
|
||||||
let socketPositionIndex = 0
|
let socketPositionIndex = 0
|
||||||
|
let uavTracks = {}
|
||||||
const lang = window.localStorage.getItem('locale') || 'zh_CN'
|
const lang = window.localStorage.getItem('locale') || 'zh_CN'
|
||||||
export default {
|
export default {
|
||||||
name: 'TwinSituation',
|
name: 'TwinSituation',
|
||||||
@ -481,6 +482,7 @@ export default {
|
|||||||
this.SET_SPLIT_VISIBLE(false)
|
this.SET_SPLIT_VISIBLE(false)
|
||||||
this.removePictureHandle()
|
this.removePictureHandle()
|
||||||
socketPositionIndex = 0
|
socketPositionIndex = 0
|
||||||
|
uavTracks = {}
|
||||||
if (orthoManager) {
|
if (orthoManager) {
|
||||||
orthoManager.clearAll()
|
orthoManager.clearAll()
|
||||||
orthoManager = null
|
orthoManager = null
|
||||||
@ -1099,6 +1101,7 @@ export default {
|
|||||||
let data = res.data.data
|
let data = res.data.data
|
||||||
let list = []
|
let list = []
|
||||||
socketPositionIndex = 0
|
socketPositionIndex = 0
|
||||||
|
uavTracks = {}
|
||||||
data.forEach(item => {
|
data.forEach(item => {
|
||||||
// item.check = item.status === 1 || item.status === 3
|
// item.check = item.status === 1 || item.status === 3
|
||||||
item.check = false
|
item.check = false
|
||||||
@ -1582,6 +1585,7 @@ export default {
|
|||||||
// }
|
// }
|
||||||
this.removeTaskTarget(info.id);
|
this.removeTaskTarget(info.id);
|
||||||
socketPositionIndex = 0
|
socketPositionIndex = 0
|
||||||
|
uavTracks = {}
|
||||||
if (orthoManager) {
|
if (orthoManager) {
|
||||||
orthoManager.clearAll()
|
orthoManager.clearAll()
|
||||||
orthoManager = null
|
orthoManager = null
|
||||||
@ -1614,7 +1618,9 @@ export default {
|
|||||||
viewer.entities.remove(item)
|
viewer.entities.remove(item)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
viewer.entities
|
||||||
socketPositionIndex = 0
|
socketPositionIndex = 0
|
||||||
|
uavTracks = {}
|
||||||
if (orthoManager) {
|
if (orthoManager) {
|
||||||
orthoManager.clearAll()
|
orthoManager.clearAll()
|
||||||
orthoManager = null
|
orthoManager = null
|
||||||
@ -2786,51 +2792,78 @@ export default {
|
|||||||
this.updateSceneUav(data)
|
this.updateSceneUav(data)
|
||||||
},
|
},
|
||||||
updateSceneUav(data) {
|
updateSceneUav(data) {
|
||||||
console.log(data, 44444);
|
// 1. 坐标转换(建议添加异常处理,避免非法坐标)
|
||||||
|
if (!data.longitude || !data.latitude) {
|
||||||
|
console.warn('无人机坐标不完整', data);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
let position = DT.Cesium.Cartesian3.fromDegrees(
|
||||||
|
Number(data.longitude),
|
||||||
|
Number(data.latitude),
|
||||||
|
Number(data.altitude) || 0 // 高度默认0,避免undefined
|
||||||
|
);
|
||||||
|
let uavId = 'uav-' + data.jobId;
|
||||||
|
|
||||||
let position = DT.Cesium.Cartesian3.fromDegrees(data.longitude, data.latitude, data.altitude)
|
// 2. 轨迹数组维护(过滤重复坐标,避免无长度轨迹)
|
||||||
let entity = viewer.entities.getById('uav-' + data.id)
|
if (uavTracks[uavId]) {
|
||||||
|
// 获取最后一个坐标,计算与新坐标的距离(小于1米则不添加)
|
||||||
|
const lastPos = uavTracks[uavId][uavTracks[uavId].length - 1];
|
||||||
|
const distance = lastPos ? DT.Cesium.Cartesian3.distance(lastPos, position) : 0;
|
||||||
|
// 只有距离大于1米时才添加新坐标,避免高频重复
|
||||||
|
if (distance > 1) {
|
||||||
|
uavTracks[uavId].push(position);
|
||||||
|
// 限制轨迹长度,避免数组过大(可选,比如最多保存1000个点)
|
||||||
|
if (uavTracks[uavId].length > 1000) {
|
||||||
|
uavTracks[uavId].shift();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
uavTracks[uavId] = [position];
|
||||||
|
}
|
||||||
|
// 3. 获取/创建无人机实体
|
||||||
|
let entity = viewer.entities.getById(uavId);
|
||||||
if (entity) {
|
if (entity) {
|
||||||
entity.position = position
|
entity.position = position;
|
||||||
|
// !关键:更新实体后主动触发Cesium重绘(部分版本需要)
|
||||||
|
viewer.scene.requestRender();
|
||||||
} else {
|
} else {
|
||||||
entity = viewer.entities.add({
|
entity = viewer.entities.add({
|
||||||
id: 'uav-' + data.id,
|
id: uavId,
|
||||||
position: position,
|
position: position,
|
||||||
label: {
|
label: {
|
||||||
text: '无人机',
|
text: '无人机',
|
||||||
font: '14px sans-serif',
|
font: '14px sans-serif',
|
||||||
fillColor: DT.Cesium.Color.WHITE,
|
fillColor: DT.Cesium.Color.RED,
|
||||||
horizontalOrigin: DT.Cesium.HorizontalOrigin.LEFT,
|
horizontalOrigin: DT.Cesium.HorizontalOrigin.LEFT,
|
||||||
verticalOrigin: DT.Cesium.VerticalOrigin.CENTER,
|
verticalOrigin: DT.Cesium.VerticalOrigin.CENTER,
|
||||||
disableDepthTestDistance: 100000,
|
disableDepthTestDistance: 100000,
|
||||||
pixelOffset: new DT.Cesium.Cartesian2(10, 0),
|
|
||||||
showBackground: true,
|
showBackground: true,
|
||||||
scaleByDistance: new DT.Cesium.NearFarScalar(0, 1, 1, 0.8),
|
scaleByDistance: new DT.Cesium.NearFarScalar(0, 1, 1, 0.8),
|
||||||
distanceDisplayCondition: new DT.Cesium.DistanceDisplayCondition(0, 20000),
|
distanceDisplayCondition: new DT.Cesium.DistanceDisplayCondition(0, 10000),
|
||||||
backgroundColor: DT.Cesium.Color.fromCssColorString('rgba(0,0,0,0.7)'),
|
backgroundColor: DT.Cesium.Color.fromCssColorString('rgba(255,255,255,0.6)'),
|
||||||
style: DT.Cesium.LabelStyle.FILL_AND_OUTLINE,
|
pixelOffset: new DT.Cesium.Cartesian2(10, -15),
|
||||||
},
|
},
|
||||||
model: {
|
model: {
|
||||||
uri: process.env.BASE_URL + 'model/uav.gltf',
|
uri: process.env.BASE_URL + 'model/uav.gltf',
|
||||||
minimumPixelSize: 64,
|
minimumPixelSize: 64,
|
||||||
maximumScale: 128,
|
maximumScale: 128,
|
||||||
},
|
},
|
||||||
// point: {
|
|
||||||
// pixelSize: 40,
|
|
||||||
// color: DT.Cesium.Color.RED,
|
|
||||||
// disableDepthTestDistance: 10000
|
|
||||||
// },
|
|
||||||
polyline: {
|
polyline: {
|
||||||
positions: new DT.Cesium.CallbackProperty(function () {
|
// 修复:绑定uavId到回调作用域,避免丢失
|
||||||
return this.positions
|
positions: new DT.Cesium.CallbackProperty(() => {
|
||||||
|
return uavTracks[uavId] || [];
|
||||||
}, false),
|
}, false),
|
||||||
width: 8,
|
width: 2, // 线宽加大,更容易观察
|
||||||
zIndex: 600,
|
zIndex: 600, // 提高层级,避免被其他元素覆盖
|
||||||
material: DT.Cesium.Color.BLACK,
|
material: DT.Cesium.Color.fromCssColorString('#1fe46b'), // 半透明,更易见
|
||||||
depthFailMaterial: DT.Cesium.Color.CYAN,
|
depthFailMaterial: DT.Cesium.Color.CYAN.withAlpha(0.8),
|
||||||
arcType: DT.Cesium.ArcType.NONE
|
arcType: DT.Cesium.ArcType.NONE, // 关键:添加直线轨迹配置
|
||||||
|
disableDepthTestDistance: Number.POSITIVE_INFINITY, // 永不被遮挡
|
||||||
|
distanceDisplayCondition: new DT.Cesium.DistanceDisplayCondition(0, 50000), // 扩大显示范围
|
||||||
|
clampToGround: false, // 不贴地,跟随无人机高度
|
||||||
|
show: true // 显式开启,避免默认隐藏
|
||||||
}
|
}
|
||||||
})
|
});
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
handleWebsocketWave(info) {
|
handleWebsocketWave(info) {
|
||||||
@ -3090,6 +3123,7 @@ export default {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
socketPositionIndex = 0
|
socketPositionIndex = 0
|
||||||
|
uavTracks = {}
|
||||||
if (orthoManager) {
|
if (orthoManager) {
|
||||||
orthoManager.clearAll()
|
orthoManager.clearAll()
|
||||||
orthoManager = null
|
orthoManager = null
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user