| | |
| | | let viewInfoFrustum = null |
| | | |
| | | // 手机设备定位 |
| | | let me_latitude = 0; |
| | | let me_longitude = 0; |
| | | let me_latitude = 0;// 28.624647955787974; |
| | | let me_longitude = 0;//115.85635808986208; |
| | | let me_altitude = 0; |
| | | // 扫射定位 |
| | | let measure_target_longitude = 0; |
| | | let measure_target_latitude = 0; |
| | | let measure_target_longitude = 0;//115.85635872364763; |
| | | let measure_target_latitude = 0;//28.624648387113627; |
| | | let measure_target_altitude = 0; |
| | | |
| | | |
| | | async function initDock(data:any, sn:any, dockSn:any, workspaceId:any, ssLinePath:any, viewDroneInfo:any) { |
| | | // console.log('globalCesium查看是', globalCesium) |
| | | // 获取workspaceId |
| | | wId = workspaceId |
| | | // 给无人机参数赋值 |
| | |
| | | // 机场信息 |
| | | dockInfo = data.dockInfo[`${dockSn}`] |
| | | viewDroneInfo = viewDroneInfo |
| | | console.log('导致地图不显示原因1',viewDroneInfo.longitude) |
| | | // 当前飞行任务创建时间 |
| | | if (data.currentType === EDeviceTypeName.Aircraft && deviceInfo) { |
| | | const droneLngLat = { |
| | |
| | | if (store.currentAngle == 3) { |
| | | viewInfoFrustum?.clear() |
| | | } else { |
| | | // 暂时把视锥代码注释掉 |
| | | initCreateFrustum(deviceInfo, viewDroneInfo) |
| | | } |
| | | addFlyGltf( |
| | |
| | | } |
| | | } else { |
| | | if (deviceInfo.mode_code && [3, 4, 5, 9, 10].includes(deviceInfo.mode_code)) { |
| | | // 暂时把视锥代码注释掉 |
| | | initCreateFrustum(deviceInfo, viewDroneInfo) |
| | | addFlyGltf( |
| | | viewDroneInfo.longitude, |
| | |
| | | } |
| | | } |
| | | const imgRightBlue = new URL('@/assets/images/arrow-right-pink.png', import.meta.url).href |
| | | // 无人机路线轨迹,判断是否存在drone_route_remove |
| | | if (getEntityById('drone_route_remove')) { |
| | | window.cesiumViewer.entities.add({ |
| | | name: 'drone_route_remove', |
| | | id: 'drone_route_remove', |
| | | polyline: { |
| | | width: 7, |
| | | positions: previousPositions, |
| | | material: new ImageTrailMaterial({ |
| | | color: globalCesium.Color.ORANGE, |
| | | speed: 10, |
| | | image: imgRightBlue, |
| | | repeat: { x: 1, y: 0 }, |
| | | }), |
| | | clampToGround: false, |
| | | }, |
| | | }) |
| | | } |
| | | // 暂时把航线屏蔽 |
| | | // 无人机路线轨迹,判断是否存在drone_route_remove |
| | | // if (getEntityById('drone_route_remove')) { |
| | | // window.cesiumViewer.entities.add({ |
| | | // name: 'drone_route_remove', |
| | | // id: 'drone_route_remove', |
| | | // polyline: { |
| | | // width: 7, |
| | | // positions: previousPositions, |
| | | // material: new ImageTrailMaterial({ |
| | | // color: globalCesium.Color.ORANGE, |
| | | // speed: 10, |
| | | // image: imgRightBlue, |
| | | // repeat: { x: 1, y: 0 }, |
| | | // }), |
| | | // clampToGround: false, |
| | | // }, |
| | | // }) |
| | | // } |
| | | |
| | | if (data.deviceInfo[data.currentSn].mode_code && [3, 4, 5, 9, 10].includes(deviceInfo.mode_code)) { |
| | | if (switchSaving) return (switchSaving = false) |
| | | // console.log('5555', data.deviceInfo[data.currentSn].longitude) |
| | | const newPositions = globalCesium.Cartesian3.fromDegrees( |
| | | data.deviceInfo[data.currentSn].longitude, |
| | | data.deviceInfo[data.currentSn].latitude, |
| | | Math.floor(viewDroneInfo.elevation), |
| | | ) |
| | | //若刷新,恢复无人机之前的路线轨迹 |
| | | const dataIndexedDB = await IndexedDBService.getDataById(wId) |
| | | if (previousPositions.length == 0 && dataIndexedDB) { |
| | | previousPositions = previousPositions.concat(dataIndexedDB?.temporaryflightData) |
| | | } else { |
| | | previousPositions = previousPositions.concat(newPositions) |
| | | } |
| | | // 保存无人机当前执行的路线,防止刷新数据丢失 |
| | | if (!dataIndexedDB) { |
| | | await IndexedDBService.addData({ |
| | | id: wId, |
| | | temporaryflightData: previousPositions, |
| | | }) |
| | | } else { |
| | | await IndexedDBService.updateData(wId, {temporaryflightData: previousPositions}) |
| | | } |
| | | // 更新线段的位置 |
| | | const drone_route_remove = getEntityById('drone_route_remove') |
| | | if (!drone_route_remove) return |
| | | drone_route_remove.polyline.positions = previousPositions |
| | | drone_route_remove.polyline._material._repeat._value.x = Math.floor(previousPositions.length / 7) |
| | | } else if ([0, 14].includes(deviceInfo.mode_code)) { |
| | | previousPositions = [] |
| | | await IndexedDBService.deleteData(wId) |
| | | const drone_route_remove = getEntityById('drone_route_remove') |
| | | if (!drone_route_remove) return |
| | | drone_route_remove.polyline.positions = previousPositions |
| | | removeById('drone_route_remove') |
| | | viewInfoFrustum?.clear() |
| | | viewInfoFrustum = null |
| | | } |
| | | // if (data.deviceInfo[data.currentSn].mode_code && [3, 4, 5, 9, 10].includes(deviceInfo.mode_code)) { |
| | | // if (switchSaving) return (switchSaving = false) |
| | | // // console.log('5555', data.deviceInfo[data.currentSn].longitude) |
| | | // const newPositions = globalCesium.Cartesian3.fromDegrees( |
| | | // data.deviceInfo[data.currentSn].longitude, |
| | | // data.deviceInfo[data.currentSn].latitude, |
| | | // Math.floor(viewDroneInfo.elevation), |
| | | // ) |
| | | // //若刷新,恢复无人机之前的路线轨迹 |
| | | // const dataIndexedDB = await IndexedDBService.getDataById(wId) |
| | | // if (previousPositions.length == 0 && dataIndexedDB) { |
| | | // previousPositions = previousPositions.concat(dataIndexedDB?.temporaryflightData) |
| | | // } else { |
| | | // previousPositions = previousPositions.concat(newPositions) |
| | | // } |
| | | // // 保存无人机当前执行的路线,防止刷新数据丢失 |
| | | // if (!dataIndexedDB) { |
| | | // await IndexedDBService.addData({ |
| | | // id: wId, |
| | | // temporaryflightData: previousPositions, |
| | | // }) |
| | | // } else { |
| | | // await IndexedDBService.updateData(wId, {temporaryflightData: previousPositions}) |
| | | // } |
| | | // // 更新线段的位置 |
| | | // const drone_route_remove = getEntityById('drone_route_remove') |
| | | // if (!drone_route_remove) return |
| | | // drone_route_remove.polyline.positions = previousPositions |
| | | // drone_route_remove.polyline._material._repeat._value.x = Math.floor(previousPositions.length / 7) |
| | | // } else if ([0, 14].includes(deviceInfo.mode_code)) { |
| | | // previousPositions = [] |
| | | // await IndexedDBService.deleteData(wId) |
| | | // const drone_route_remove = getEntityById('drone_route_remove') |
| | | // if (!drone_route_remove) return |
| | | // drone_route_remove.polyline.positions = previousPositions |
| | | // removeById('drone_route_remove') |
| | | // viewInfoFrustum?.clear() |
| | | // viewInfoFrustum = null |
| | | // } |
| | | } |
| | | if (data.currentType === EDeviceTypeName.Dock && data.dockInfo[data.currentSn]) { |
| | | if (!deviceInfo?.basic_osd?.longitude || !deviceInfo?.basic_osd?.latitude) return |
| | | console.log('6666', deviceInfo?.basic_osd?.longitude) |
| | | if (snCode.includes(data.currentSn)) return |
| | | snCode.push(data.currentSn) |
| | | } |
| | |
| | | const imgLaser = new URL('@/assets/images/laser.png', import.meta.url).href |
| | | // 增加激光扫射点 |
| | | function addFlyLaser(payloads:any) { |
| | | console.log('激光扫射经度',payloads.measure_target_longitude) |
| | | console.log('激光扫射纬度',payloads.measure_target_latitude) |
| | | const startPosition = globalCesium.Cartesian3.fromDegrees( |
| | | me_longitude, me_latitude, 0 |
| | | ) |
| | |
| | | measure_target_latitude = payloads.measure_target_latitude; |
| | | measure_target_altitude = payloads.measure_target_altitude; |
| | | |
| | | if (laserEntity && laserEntity != null) { |
| | | laserEntity.position = new globalCesium.CallbackProperty(function () { |
| | | return position |
| | | }, false) |
| | | // laserEntity.orientation = new globalCesium.CallbackProperty(function () { |
| | | // return orientation |
| | | // }, false) |
| | | // if (laserEntity && laserEntity != null) { |
| | | // laserEntity.position = new globalCesium.CallbackProperty(function () { |
| | | // return position |
| | | // }, false) |
| | | // // laserEntity.orientation = new globalCesium.CallbackProperty(function () { |
| | | // // return orientation |
| | | // // }, false) |
| | | |
| | | laserEntity.show = true |
| | | // laserEntity.show = true |
| | | |
| | | window.cesiumViewer.scene.requestRender() |
| | | } else { |
| | | // window.cesiumViewer.scene.requestRender() |
| | | // } else { |
| | | removeById('laser_coordinate') |
| | | laserEntity = window.cesiumViewer.entities.add({ |
| | | position, |
| | | position: globalCesium.Cartesian3.fromDegrees(payloads.measure_target_longitude, payloads.measure_target_latitude, payloads.measure_target_altitude), |
| | | id: 'laser_coordinate', |
| | | billboard: { |
| | | image: imgLaser, |
| | | outlineWidth: 0, |
| | | width: 36, |
| | | height: 36, |
| | | width: 30, |
| | | height: 30, |
| | | scale: 1.0, |
| | | outlineWidth: 0, |
| | | } |
| | | }) |
| | | } |
| | | removeById('route_two_line') |
| | | twoLineEntity = window.cesiumViewer.entities.add({ |
| | | id: 'route_two_line', |
| | | polyline: { |
| | | positions: new globalCesium.CallbackProperty(() => [startPosition, position], false), |
| | | width: 5, |
| | | material: new globalCesium.PolylineDashMaterialProperty({ |
| | | color: globalCesium.Color.YELLOW, // 虚线颜色 |
| | | dashLength: 6.0, // 虚线段的长度 |
| | | }), |
| | | zIndex: 1, |
| | | clampToGround: false, |
| | | } |
| | | }) |
| | | // } |
| | | // 增加激光扫射信息 |
| | | laserEntity.label = new globalCesium.LabelGraphics({ |
| | | text: `目标海拔:${Math.ceil(payloads.measure_target_altitude)}m\n测距距离:${Math.round( |
| | | Math.ceil(payloads.measure_target_distance), |
| | | )}m`, |
| | | text: `H:${Math.ceil(payloads.measure_target_altitude)}m-L:${Math.round(Math.ceil(payloads.measure_target_distance),)}m`, |
| | | font: '13px monospace', |
| | | fillColor: globalCesium.Color.fromCssColorString('red'), // 文字颜色 |
| | | backgroundColor: globalCesium.Color.WHITE, // 背景颜色 |
| | | showBackground: true, |
| | | horizontalOrigin: globalCesium.HorizontalOrigin.CENTER, |
| | | verticalOrigin: globalCesium.VerticalOrigin.BOTTOM, |
| | | disableDepthTestDistance: Number.POSITIVE_INFINITY, |
| | | pixelOffset: new globalCesium.Cartesian2(0, -40), |
| | | pixelOffset: new globalCesium.Cartesian2(0, -20), |
| | | show: true, |
| | | }) |
| | | console.log('起点',startPosition) |
| | | console.log('终点',position) |
| | | if (startPosition && position) { |
| | | removeById('route_two_line') |
| | | twoLineEntity = window.cesiumViewer.entities.add({ |
| | | id: 'route_two_line', |
| | | polyline: { |
| | | positions: new globalCesium.CallbackProperty(() => [startPosition, position], false), |
| | | width: 3, |
| | | material: globalCesium.Color.RED, |
| | | zIndex: -1, |
| | | clampToGround: false, |
| | | } |
| | | }) |
| | | } |
| | | } |
| | | |
| | | function addFlyGltf (lng:any, lat:any, alt:any, payloads:any, attitude_head:any, deviceInfo:any, dockInfo:any, ssLinePath:any) { |
| | |
| | | } |
| | | |
| | | // 创建无人机信息 |
| | | createDroneEntityLabel(droneEntity, deviceInfo, dockInfo, ssLinePath) |
| | | } |
| | | // 创建无人机信息 |
| | | async function createDroneEntityLabel (entity:any, deviceInfo:any, dockInfo:any, ssLinePath:any) { |
| | | deviceInfo = deviceInfo |
| | | if (currentTaskCreateTime === null) return |
| | | if (!deviceInfo?.longitude && !deviceInfo?.latitude) return |
| | | if (deviceInfo.mode_code !== 5) { |
| | | currentTaskCreateTime = null |
| | | return |
| | | } |
| | | const executingWayline = store.executingWayline |
| | | if (!executingWayline?.id) return |
| | | if (waylinePoints.length === 0) { |
| | | // 改成获取航线地址 |
| | | // const routeRes = await getRoutePlanningUrl( |
| | | // wId, |
| | | // executingWayline.id, |
| | | // ) |
| | | // const routeData = routeRes.data |
| | | // if (routeData.code !== 0) return this.$message.error('获取航线信息失败!') |
| | | waylinePoints = await getWaylineFilePoints(ssLinePath) |
| | | } |
| | | |
| | | const nextPoint = waylinePoints[currentWaypointIndex] |
| | | if (!nextPoint) return |
| | | // 两点之间的距离 |
| | | console.log('8888', deviceInfo.longitude) |
| | | const devicePosition = globalCesium.Cartesian3.fromDegrees( |
| | | Number(deviceInfo.longitude), |
| | | Number(deviceInfo.latitude), |
| | | 0, |
| | | ) |
| | | console.log('9999', nextPoint.longitude) |
| | | const targetPosition = globalCesium.Cartesian3.fromDegrees( |
| | | Number(nextPoint.longitude), |
| | | Number(nextPoint.latitude), |
| | | 0, |
| | | ) |
| | | // 距离下个点位的距离 |
| | | let distance = globalCesium.Cartesian3.distance( |
| | | devicePosition, |
| | | targetPosition, |
| | | ) |
| | | const dockPosition = { |
| | | longitude: dockInfo?.basic_osd?.longitude, |
| | | latitude: dockInfo?.basic_osd?.latitude, |
| | | } |
| | | |
| | | const distArr = waylinePoints.map((lnglat, index) => { |
| | | const { longitude, latitude } = lnglat |
| | | console.log('10000', longitude) |
| | | // 两点之间的距离 |
| | | let devicePosition = null |
| | | if (index === 0) { |
| | | devicePosition = globalCesium.Cartesian3.fromDegrees( |
| | | Number(dockPosition.longitude), |
| | | Number(dockPosition.latitude), |
| | | 0, |
| | | ) |
| | | } else { |
| | | console.log('110', prevPoint.longitude) |
| | | const prevPoint = waylinePoints[index - 1] |
| | | devicePosition = globalCesium.Cartesian3.fromDegrees( |
| | | Number(prevPoint.longitude), |
| | | Number(prevPoint.latitude), |
| | | 0, |
| | | ) |
| | | } |
| | | const targetPosition = globalCesium.Cartesian3.fromDegrees( |
| | | Number(longitude), |
| | | Number(latitude), |
| | | 0, |
| | | ) |
| | | let distance = globalCesium.Cartesian3.distance( |
| | | devicePosition, |
| | | targetPosition, |
| | | ) |
| | | return Math.round(distance) |
| | | }) |
| | | // 计算到达点位和之前点位的总距离 |
| | | let sum = null |
| | | if (distArr.length > 2) { |
| | | sum = distArr |
| | | .slice(0, currentWaypointIndex) |
| | | .reduce((accumulator, currentValue) => accumulator + currentValue, 0) |
| | | } else { |
| | | sum = distArr.reduce( |
| | | (accumulator, currentValue) => accumulator + currentValue, |
| | | 0, |
| | | ) |
| | | } |
| | | |
| | | if (sum == 0) { |
| | | sum = distArr[0] |
| | | } |
| | | |
| | | // 距离机场的位置 |
| | | const homeDistance = Math.floor(deviceInfo.home_distance) || 0 |
| | | // 速度 |
| | | let horizontalSpeed = deviceInfo.horizontal_speed || 0 |
| | | if (!droneSpeedArr.includes(horizontalSpeed) && horizontalSpeed > 1) { |
| | | droneSpeedArr.push(horizontalSpeed) |
| | | } |
| | | // 平均速度 |
| | | const averageSpeed = |
| | | droneSpeedArr.reduce((sum, current) => sum + current, 0) / |
| | | droneSpeedArr.length |
| | | // 已用时间 |
| | | let usedTime = Math.round((new Date().getTime() - currentTaskCreateTime) / 1000) - 30 |
| | | let throughDistance = usedTime * averageSpeed |
| | | |
| | | if (throughDistance < 0) { |
| | | throughDistance = 0 |
| | | usedTime = 0 |
| | | } |
| | | if (isNaN(throughDistance)) { |
| | | throughDistance = 0 |
| | | } |
| | | if (isNaN(usedTime)) { |
| | | usedTime = 0 |
| | | } |
| | | if (usedTime > 60) { |
| | | const minute = Math.floor(usedTime / 60) |
| | | const second = Math.round(usedTime % 60) |
| | | usedTime = `${minute}m${second}s` |
| | | } else { |
| | | usedTime = Math.round(usedTime) + 's' |
| | | } |
| | | |
| | | if (horizontalSpeed < 5) { |
| | | horizontalSpeed = 10 |
| | | } |
| | | // 预计到达下一个航点时间 |
| | | let arrivalTime = distance / horizontalSpeed |
| | | if (arrivalTime === Infinity || isNaN(arrivalTime)) { |
| | | arrivalTime = 0 |
| | | } |
| | | if (arrivalTime > 60) { |
| | | const minute = Math.floor(arrivalTime / 60) |
| | | const second = Math.round(arrivalTime % 60) |
| | | arrivalTime = `${minute}m${second}s` |
| | | } else { |
| | | arrivalTime = Math.round(arrivalTime) + 's' |
| | | } |
| | | entity.label = new globalCesium.LabelGraphics({ |
| | | text: `距离机场水平距离:${homeDistance}m\n距离下一个航点:${Math.round( |
| | | distance, |
| | | )}m\n预计到达下一航点时间:${arrivalTime}\n本次飞行时间:${usedTime}\n本次航线平面里程:${Math.round( |
| | | throughDistance, |
| | | )}m`, |
| | | font: '13px monospace', |
| | | showBackground: true, |
| | | horizontalOrigin: globalCesium.HorizontalOrigin.CENTER, |
| | | verticalOrigin: globalCesium.VerticalOrigin.BOTTOM, |
| | | disableDepthTestDistance: Number.POSITIVE_INFINITY, |
| | | pixelOffset: new globalCesium.Cartesian2(0, -40), |
| | | show: true, |
| | | }) |
| | | } |
| | | async function getWaylineFilePoints(fileUrl:any) { |
| | | const fileRes = await analyzeKmzFile(fileUrl); |
| | | const waylineContent = await fileRes['fileInfoObj']?.['wpmz/waylines.wpml']; |
| | | const xml = XMLToJSON(waylineContent); |
| | | const placemarkArr = xml?.Document?.Folder.Placemark; |
| | | const points = placemarkArr.map((placemark) => { |
| | | const lnglat = placemark.Point.coordinates?.['#text'].split(','); |
| | | return { |
| | | longitude: lnglat[0], |
| | | latitude: lnglat[1], |
| | | }; |
| | | }); |
| | | return points; |
| | | // createDroneEntityLabel(droneEntity, deviceInfo, dockInfo, ssLinePath) |
| | | } |
| | | |
| | | function setelCamera (lng, lat, alt, payloads, attitude_head) { |
| | |
| | | } |
| | | // 创建视锥 |
| | | function initCreateFrustum (deviceInfo:any, test:any) { |
| | | |
| | | if (!deviceInfo || !deviceInfo.longitude || !deviceInfo.latitude) return |
| | | // console.log('视锥传参1',deviceInfo) |
| | | // console.log('视锥传参2',test) |
| | | if (!deviceInfo || !deviceInfo.longitude || !deviceInfo.latitude || !test.longitude || !test.latitude) return |
| | | |
| | | const attitude_head = 180 + deviceInfo.attitude_head |
| | | |
| | |
| | | |
| | | // 获取手机定位和激光发射定位的高度和距离 |
| | | function getTwoHeightWidth(workspaceId:String) { |
| | | // 国内地图不会为0或者小于0 |
| | | console.log('自身定位经纬度1', me_latitude) |
| | | console.log('自身定位经纬度2', me_longitude) |
| | | console.log('激光扫过定位1', measure_target_latitude) |
| | | console.log('激光扫过定位2', measure_target_longitude) |
| | | if (me_latitude <= 0 || me_longitude <= 0 || measure_target_latitude <= 0 || measure_target_longitude <= 0) return |
| | | getTwoPointInfo(workspaceId,me_latitude,me_longitude,measure_target_latitude,measure_target_longitude).then((res:any) => { |
| | | const heightDifference = res.data.heightDifference |
| | | const distance = res.data.distance |
| | | // 增加激光扫射信息 |
| | | myAppEntity.label = new globalCesium.LabelGraphics({ |
| | | text: `高度:${Math.ceil(heightDifference)}m\n距离:${Math.round( |
| | | Math.ceil(distance), |
| | | )}m`, |
| | | text: `H:${Math.ceil(heightDifference)}m-L:${Math.round(Math.ceil(distance),)}m`, |
| | | font: '13px monospace', |
| | | fillColor: globalCesium.Color.fromCssColorString('red'), // 文字颜色 |
| | | backgroundColor: globalCesium.Color.WHITE, // 背景颜色 |
| | | showBackground: true, |
| | | horizontalOrigin: globalCesium.HorizontalOrigin.CENTER, |
| | | verticalOrigin: globalCesium.VerticalOrigin.BOTTOM, |
| | | disableDepthTestDistance: Number.POSITIVE_INFINITY, |
| | | pixelOffset: new globalCesium.Cartesian2(0, -40), |
| | | pixelOffset: new globalCesium.Cartesian2(0, -24), |
| | | show: true, |
| | | }) |
| | | }) |
| | |
| | | if (window.cesiumViewer == null) return |
| | | if (navigator.geolocation) { |
| | | navigator.geolocation.watchPosition((position) => { |
| | | console.log(me_longitude,position.coords.longitude) |
| | | console.log(me_latitude,position.coords.latitude) |
| | | if (me_longitude > 0 && me_longitude == position.coords.longitude && me_latitude > 0 && me_latitude == position.coords.latitude) return |
| | | me_longitude = position.coords.longitude; |
| | | me_latitude = position.coords.latitude; |
| | |
| | | width: 30, |
| | | height: 30, |
| | | scale: 1.0, |
| | | outlineWidth: 0, |
| | | } |
| | | }); |
| | | // 查看两条线直接距离和高度 |