420 lines
16 KiB
JavaScript
420 lines
16 KiB
JavaScript
import * as DT from 'dt-sdk'
|
||
import { viewer } from '@/components/dt-scene'
|
||
export default class UavTarget {
|
||
planLines = new DT.Cesium.AssociativeArray()
|
||
uavEntity = null
|
||
_options = {}
|
||
loaderPicture = {}
|
||
positions = []
|
||
startAltitude = 0
|
||
constructor(viewer, options) {
|
||
this.viewer = viewer
|
||
this._options = options
|
||
this.jobId = options.jobId
|
||
this.uavId = options.uavId
|
||
this.jobName = options.jobName
|
||
this.startAltitude = options.startAltitude
|
||
|
||
this.addPlanLine(options.airlineList)
|
||
this.addUav(options)
|
||
this.addUavLoader(options.payloadList)
|
||
}
|
||
addUav(info) {
|
||
let that = this
|
||
let position = DT.Cesium.Cartesian3.fromDegrees(info.startLon, info.startLat, info.startHeight)
|
||
if (info.trailList && info.trailList.length > 0) {
|
||
info.trailList.forEach(route => {
|
||
this.positions.push(DT.Cesium.Cartesian3.fromDegrees(route.lon, route.lat, route.height))
|
||
})
|
||
} else {
|
||
this.positions.push(position.clone())
|
||
this.positions.push(position.clone())
|
||
}
|
||
let currentPosition = this.positions[this.positions.length - 1].clone()
|
||
let id = `${this.jobId}~${this.uavId}-uav`
|
||
this.uavEntity = this.viewer.entities.add({
|
||
id,
|
||
position: currentPosition,
|
||
// label: {
|
||
// text: info.uavName,
|
||
// font: '14px sans-serif',
|
||
// fillColor: DT.Cesium.Color.WHITE,
|
||
// horizontalOrigin: DT.Cesium.HorizontalOrigin.LEFT,
|
||
// verticalOrigin: DT.Cesium.VerticalOrigin.CENTER,
|
||
// disableDepthTestDistance: 10000,
|
||
// pixelOffset: new DT.Cesium.Cartesian2(10, 0),
|
||
// showBackground: true,
|
||
// scaleByDistance: new DT.Cesium.NearFarScalar(0, 1, 1, 0.8),
|
||
// distanceDisplayCondition: new DT.Cesium.DistanceDisplayCondition(0, 20000),
|
||
// backgroundColor: DT.Cesium.Color.fromCssColorString('rgba(0,0,0,0.7)'),
|
||
// style: DT.Cesium.LabelStyle.FILL_AND_OUTLINE,
|
||
// },
|
||
// model: {
|
||
// uri: process.env.BASE_URL + 'model/uav.gltf',
|
||
// // scale: 1,
|
||
// minimumPixelSize: 32,
|
||
// maximumScale: 128,
|
||
// },
|
||
polyline: {
|
||
positions: new DT.Cesium.CallbackProperty(function () {
|
||
return that.positions
|
||
}, false),
|
||
width: 2,
|
||
zIndex: 6,
|
||
material: DT.Cesium.Color.CYAN,
|
||
depthFailMaterial: DT.Cesium.Color.CYAN,
|
||
arcType: DT.Cesium.ArcType.NONE
|
||
}
|
||
})
|
||
}
|
||
updateCurrentPosition(position) {
|
||
this.uavEntity.position = position.clone()
|
||
this.positions.push(position.clone())
|
||
}
|
||
addUavLoader(data) {
|
||
let loaderPicture = {}
|
||
data.forEach(loader => {
|
||
loaderPicture[loader.payloadId] = []
|
||
let key = 'imageList'
|
||
if (loader.imageHighList && loader.imageHighList.length > 0) {
|
||
key = 'imageHighList'
|
||
}
|
||
if (loader[key] && loader[key].length > 0) {
|
||
console.log('这是哈222', loader.imageList)
|
||
loader[key].forEach((image, imageIndex) => {
|
||
let obj = {
|
||
picture: null,
|
||
fileId: image.fileId,
|
||
markArr: []
|
||
}
|
||
// let cby_bg_data=[
|
||
// image.left1Lon, image.left1Lat,
|
||
// image.left2Lon, image.left2Lat,
|
||
// image.right2Lon, image.right2Lat,
|
||
// image.right1Lon, image.right1Lat,
|
||
// ]
|
||
// obj.picture = this.viewer.entities.add({
|
||
// id: `${this.jobId}~${this.uavId}~${loader.payloadId}~${image.fileId}-picture`,
|
||
// name: '背景',
|
||
// polygon: {
|
||
// // hierarchy: DT.Cesium.Cartesian3.fromDegreesArrayHeights(cby_bg_data),
|
||
// hierarchy: DT.Cesium.Cartesian3.fromDegreesArray(cby_bg_data),
|
||
// perPositionHeight: true,
|
||
// material: new DT.Cesium.ImageMaterialProperty({
|
||
// image: window.config.imagePath + image.relativePath,
|
||
// // image: process.env.BASE_URL + 'static/img/ttt.tif',
|
||
// // image: process.env.BASE_URL + 'static/img/pic.png',
|
||
// }),//new Cesium.Color(0.29, 0.85, 0.89, 0.5), //Cesium.Color.PALETURQUOISE.withAlpha(0.5),
|
||
// outline: true,
|
||
// outlineColor: DT.Cesium.Color.WHITE,
|
||
// outlineWidth: 2, //很多电脑当宽度>1时,没用
|
||
// }
|
||
// })
|
||
let minLon = Math.min(image.left1Lon, image.left2Lon, image.right1Lon, image.right2Lon)
|
||
let maxLon = Math.max(image.left1Lon, image.left2Lon, image.right1Lon, image.right2Lon)
|
||
let minLat = Math.min(image.left1Lat, image.left2Lat, image.right1Lat, image.right2Lat)
|
||
let maxLat = Math.max(image.left1Lat, image.left2Lat, image.right1Lat, image.right2Lat)
|
||
if (maxLat - minLat > 0 && maxLon - minLon > 0) {
|
||
let rectangle = DT.Cesium.Rectangle.fromDegrees(minLon, minLat, maxLon, maxLat)
|
||
let layer = new DT.Cesium.SingleTileImageryProvider({
|
||
url: window.config.imagePath + image.relativePath,
|
||
rectangle
|
||
})
|
||
let addLayer = this.viewer.cesiumViewer.imageryLayers.addImageryProvider(layer)
|
||
// 设置分屏显示
|
||
addLayer.splitDirection = DT.Cesium.ImagerySplitDirection.LEFT
|
||
obj.picture = addLayer
|
||
if (image.itemList) {
|
||
image.itemList.forEach( (mark, markIndex) => {
|
||
let markId = `${this.jobId}~${this.uavId}~${loader.payloadId}~${image.fileId}~${mark.id}-mark${imageIndex}${markIndex}`
|
||
let markPosition = DT.Cesium.Cartesian3.fromDegrees(mark.left1Lon, mark.left1Lat, 1)
|
||
let markArr = [
|
||
mark.left1Lon, mark.left1Lat, 1,
|
||
mark.left2Lon, mark.left2Lat, 1,
|
||
mark.right2Lon, mark.right2Lat, 1,
|
||
mark.right1Lon, mark.right1Lat, 1,
|
||
mark.left1Lon, mark.left1Lat, 1,
|
||
]
|
||
let markLine = this.viewer.entities.add({
|
||
id: markId,
|
||
show: true,
|
||
position: markPosition,
|
||
label: {
|
||
text: window.detectType[mark.type],
|
||
font: '16px sans-serif',
|
||
fillColor: DT.Cesium.Color.RED,
|
||
horizontalOrigin: DT.Cesium.HorizontalOrigin.LEFT,
|
||
verticalOrigin: DT.Cesium.VerticalOrigin.BOTTOM,
|
||
disableDepthTestDistance: 10000,
|
||
showBackground: false,
|
||
backgroundColor: DT.Cesium.Color.BLACK,
|
||
style: DT.Cesium.LabelStyle.FILL_AND_OUTLINE,
|
||
},
|
||
polyline: {
|
||
positions: DT.Cesium.Cartesian3.fromDegreesArrayHeights(markArr),
|
||
// positions: DT.Cesium.Cartesian3.fromDegreesArray(markArr),
|
||
width: 1,
|
||
material: DT.Cesium.Color.RED,
|
||
depthFailMaterial: DT.Cesium.Color.RED,
|
||
zIndex: 3,
|
||
}
|
||
})
|
||
obj.markArr.push(markLine)
|
||
})
|
||
}
|
||
loaderPicture[loader.payloadId].push(obj)
|
||
}
|
||
|
||
})
|
||
}
|
||
})
|
||
this.loaderPicture = loaderPicture
|
||
}
|
||
appendLoaderPicture(image) {
|
||
// this.removePicture()
|
||
// this.removePictureItem(image.payloadId, image.airlineId)
|
||
if (!this.loaderPicture) {
|
||
this.loaderPicture = {}
|
||
}
|
||
if (!this.loaderPicture[image.payloadId]) {
|
||
this.loaderPicture[image.payloadId] = []
|
||
}
|
||
let obj = {
|
||
picture: null,
|
||
fileId: image.fileId,
|
||
airlineId: image.airlineId,
|
||
markArr: []
|
||
}
|
||
let length = this.loaderPicture[image.payloadId].length
|
||
// obj.picture = this.viewer.entities.add({
|
||
// id: `${this.jobId}~${this.uavId}~${image.payloadId}~${image.fileId}-picture`,
|
||
// name: '背景',
|
||
// polygon: {
|
||
// // hierarchy: DT.Cesium.Cartesian3.fromDegreesArrayHeights(cby_bg_data),
|
||
// hierarchy: DT.Cesium.Cartesian3.fromDegreesArray(cby_bg_data),
|
||
// perPositionHeight: true,
|
||
// material: new DT.Cesium.ImageMaterialProperty({
|
||
// image: window.config.imagePath + image.relativePath,
|
||
// // image: process.env.BASE_URL + 'static/img/ttt.tif',
|
||
// // image: process.env.BASE_URL + 'static/img/pic.png',
|
||
// }),//new Cesium.Color(0.29, 0.85, 0.89, 0.5), //Cesium.Color.PALETURQUOISE.withAlpha(0.5),
|
||
// outline: true,
|
||
// outlineColor: DT.Cesium.Color.WHITE,
|
||
// outlineWidth: 2, //很多电脑当宽度>1时,没用
|
||
// }
|
||
// })
|
||
let minLon = Math.min(image.left1Lon, image.left2Lon, image.right1Lon, image.right2Lon)
|
||
let maxLon = Math.max(image.left1Lon, image.left2Lon, image.right1Lon, image.right2Lon)
|
||
let minLat = Math.min(image.left1Lat, image.left2Lat, image.right1Lat, image.right2Lat)
|
||
let maxLat = Math.max(image.left1Lat, image.left2Lat, image.right1Lat, image.right2Lat)
|
||
if (maxLat - minLat > 0 && maxLon - minLon > 0) {
|
||
let rectangle = DT.Cesium.Rectangle.fromDegrees(minLon, minLat, maxLon, maxLat)
|
||
let layer = new DT.Cesium.SingleTileImageryProvider({
|
||
url: window.config.imagePath + image.relativePath,
|
||
rectangle
|
||
})
|
||
|
||
// console.log('添加的图片', obj.picture)
|
||
if (image.itemList) {
|
||
image.itemList.forEach( (mark, markIndex) => {
|
||
let markId = `${this.jobId}~${this.uavId}~${image.payloadId}~${image.fileId}~${mark.id}-mark${length}${markIndex}`
|
||
let markPosition = DT.Cesium.Cartesian3.fromDegrees(mark.left1Lon, mark.left1Lat, 1)
|
||
let markArr = [
|
||
mark.left1Lon, mark.left1Lat, 1,
|
||
mark.left2Lon, mark.left2Lat, 1,
|
||
mark.right2Lon, mark.right2Lat, 1,
|
||
mark.right1Lon, mark.right1Lat, 1,
|
||
mark.left1Lon, mark.left1Lat, 1,
|
||
]
|
||
let markLine = this.viewer.entities.add({
|
||
id: markId,
|
||
show: true,
|
||
position: markPosition,
|
||
label: {
|
||
text: window.detectType[mark.type],
|
||
font: '16px sans-serif',
|
||
fillColor: DT.Cesium.Color.RED,
|
||
horizontalOrigin: DT.Cesium.HorizontalOrigin.LEFT,
|
||
verticalOrigin: DT.Cesium.VerticalOrigin.BOTTOM,
|
||
disableDepthTestDistance: 10000,
|
||
showBackground: false,
|
||
backgroundColor: DT.Cesium.Color.BLACK,
|
||
style: DT.Cesium.LabelStyle.FILL_AND_OUTLINE,
|
||
scaleByDistance: new DT.Cesium.NearFarScalar(0, 1, 1, 0.8),
|
||
distanceDisplayCondition: new DT.Cesium.DistanceDisplayCondition(0, 10000),
|
||
},
|
||
polyline: {
|
||
positions: DT.Cesium.Cartesian3.fromDegreesArrayHeights(markArr),
|
||
// positions: DT.Cesium.Cartesian3.fromDegreesArray(markArr),
|
||
width: 1,
|
||
material: DT.Cesium.Color.RED,
|
||
depthFailMaterial: DT.Cesium.Color.RED,
|
||
zIndex: 3,
|
||
}
|
||
})
|
||
obj.markArr.push(markLine)
|
||
})
|
||
}
|
||
console.log('删除旧的')
|
||
layer.readyPromise.then(res => {
|
||
console.log('回调执行')
|
||
let addLayer = this.viewer.cesiumViewer.imageryLayers.addImageryProvider(layer)
|
||
// 设置分屏显示
|
||
addLayer.splitDirection = DT.Cesium.ImagerySplitDirection.LEFT
|
||
obj.picture = addLayer
|
||
setTimeout(() => {
|
||
this.removePictureItem(image.payloadId, image.airlineId)
|
||
this.loaderPicture[image.payloadId].push(obj)
|
||
}, 500)
|
||
|
||
})
|
||
// this.removePictureItem(image.payloadId, image.airlineId)
|
||
// this.loaderPicture[image.payloadId].push(obj)
|
||
console.log('push新的')
|
||
}
|
||
|
||
}
|
||
toggleAllLoaderVisible(visible) {
|
||
for (let key in this.loaderPicture) {
|
||
this.loaderPicture[key].forEach(item => {
|
||
item.picture.show = visible
|
||
item.markArr.forEach(item => {
|
||
item.show = visible
|
||
})
|
||
})
|
||
|
||
}
|
||
}
|
||
toggleLoaderPictureVisible(payloadId,fileId) {
|
||
console.log('切换显隐', payloadId, fileId)
|
||
if (this.loaderPicture[payloadId]) {
|
||
let find = this.loaderPicture[payloadId].find(item => item.fileId + '' === fileId + '')
|
||
console.log('找到图片了吗', find)
|
||
if (find) {
|
||
let status = !find.picture.show
|
||
console.log('显示状态', status)
|
||
find.picture.show = status
|
||
find.markArr.forEach(mark => {
|
||
mark.show = status
|
||
})
|
||
}
|
||
}
|
||
}
|
||
toggleLoaderPictureActive(payloadId,fileId, active, visible = true) {
|
||
if (this.loaderPicture[payloadId]) {
|
||
let find = this.loaderPicture[payloadId].find(item => item.fileId + '' === fileId + '')
|
||
if (find) {
|
||
if (active) {
|
||
find.picture.polygon.outlineColor = DT.Cesium.Color.RED
|
||
find.picture.show = true
|
||
find.markArr.forEach(mark => {
|
||
mark.show = true
|
||
})
|
||
} else {
|
||
find.picture.polygon.outlineColor = DT.Cesium.Color.WHITE
|
||
find.picture.show = visible
|
||
find.markArr.forEach(mark => {
|
||
mark.show = visible
|
||
})
|
||
}
|
||
}
|
||
}
|
||
}
|
||
addPlanLine(data) {
|
||
if (data.length > 0) {
|
||
data.forEach((item, index) => {
|
||
let height = Math.max(item.endHeight - 1, 1)
|
||
item.positions = [item.startLon, item.startLat, item.startHeight + this.startAltitude, item.endLon, item.endLat, item.endHeight + this.startAltitude]
|
||
let positions = DT.Cesium.Cartesian3.fromDegreesArrayHeights(item.positions)
|
||
let id = `${this.jobId}~${this.uavId}~${item.id}-planLine-${index}`
|
||
let line = this.viewer.entities.add({
|
||
id,
|
||
position: positions[0],
|
||
label: {
|
||
text: `规划航线${index + 1}起点`,
|
||
disableDepthTestDistance: 10000,
|
||
font: '14px sans-serif',
|
||
fillColor: DT.Cesium.Color.RED,
|
||
horizontalOrigin: DT.Cesium.HorizontalOrigin.LEFT,
|
||
pixelOffset: new DT.Cesium.Cartesian2(10, -15),
|
||
showBackground: true,
|
||
scaleByDistance: new DT.Cesium.NearFarScalar(0, 1, 1, 0.8),
|
||
distanceDisplayCondition: new DT.Cesium.DistanceDisplayCondition(0, 10000),
|
||
backgroundColor: DT.Cesium.Color.fromCssColorString('rgba(255,255,255,0.6)')
|
||
},
|
||
polyline: {
|
||
show: true,
|
||
positions,
|
||
width: 2,
|
||
zIndex: 0,
|
||
material: DT.Cesium.Color.RED,
|
||
depthFailMaterial: DT.Cesium.Color.RED,
|
||
arcType: DT.Cesium.ArcType.NONE
|
||
}
|
||
})
|
||
this.planLines.set(id, line)
|
||
})
|
||
}
|
||
}
|
||
removePicture() {
|
||
for (let key in this.loaderPicture) {
|
||
this.loaderPicture[key].forEach((item, index) => {
|
||
if (item.picture) {
|
||
// this.viewer.entities.remove(item.picture)
|
||
this.viewer.cesiumViewer.imageryLayers.remove(item.picture)
|
||
}
|
||
item.markArr.forEach(mark => {
|
||
this.viewer.entities.remove(mark)
|
||
})
|
||
})
|
||
}
|
||
this.loaderPicture = {}
|
||
}
|
||
removePictureItem(payloadId, airlineId) {
|
||
if (this.loaderPicture && this.loaderPicture[payloadId]) {
|
||
let findIndex = -1
|
||
this.loaderPicture[payloadId].forEach((item, index) => {
|
||
if (item.airlineId === airlineId) {
|
||
if (item.picture) {
|
||
this.viewer.cesiumViewer.imageryLayers.remove(item.picture)
|
||
item.markArr.forEach(mark => {
|
||
this.viewer.entities.remove(mark)
|
||
})
|
||
}
|
||
findIndex = index
|
||
}
|
||
})
|
||
if (findIndex > -1) {
|
||
this.loaderPicture[payloadId].splice(findIndex, 1)
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
removeAll() {
|
||
if (this.uavEntity) {
|
||
this.viewer.entities.remove(this.uavEntity)
|
||
this.uavEntity = null
|
||
}
|
||
for (let key in this.loaderPicture) {
|
||
this.loaderPicture[key].forEach((item, index) => {
|
||
if (item.picture) {
|
||
// this.viewer.entities.remove(item.picture)
|
||
this.viewer.cesiumViewer.imageryLayers.remove(item.picture)
|
||
}
|
||
item.markArr.forEach(mark => {
|
||
this.viewer.entities.remove(mark)
|
||
})
|
||
})
|
||
}
|
||
this.loaderPicture = null
|
||
this.planLines.values.forEach(item => {
|
||
this.viewer.entities.remove(item)
|
||
})
|
||
this.planLines.removeAll()
|
||
}
|
||
destroy() {
|
||
this.removeAll()
|
||
}
|
||
}
|