feature: 实现与QT端websocket的交互,初步实现三维伴飞

devzpx
zhaipx 2 days ago
parent 666dc130e2
commit 4a67166430

@ -67,6 +67,7 @@ export default class MeasureDistance {
clampToGround: true,
},
})
this.analyseGraphs.push(line)
}
//通视分析仅支持选择两个点
if(useStaticStore().analysisVars.analysisType===2&&profilePts.length===2){
@ -97,7 +98,6 @@ export default class MeasureDistance {
let endEntity = this._createPointEntity(position, count.toString())
this.viewer.entities.add(endEntity)
this.analyseGraphs.push(endEntity)
this.analyseGraphs.push(line)
this.unRegisterEvents()
useStaticStore().analysisVars.profilePts = profilePts
}, Cesium.ScreenSpaceEventType.RIGHT_CLICK);

@ -1,7 +1,7 @@
import {Airline, AirlinePoint, UavDynamicInfo} from "@/types/entityoptions.ts";
/**
* websocket
* websocket
* @param websocketDataCC
* @return UavDynamicInfo
*/
@ -30,6 +30,26 @@ function dataProcess(websocketDataCC:any): UavDynamicInfo|null {
return data.lon==0? null: data
}
/**
* QT websocket
* @param websocketDataQT
* @return UavDynamicInfo
*/
function dataProcess_fromQT(websocketDataQT:any): UavDynamicInfo|null {
let data:UavDynamicInfo = {
alt: 0, groundSpeed: 0, heading: 0, lat: 0, lon: 0, uavId: "", uavType: ""
}
data.uavId = websocketDataQT.uavId
data.uavType = websocketDataQT.uavType
data.heading = websocketDataQT.HeadAngle
data.lon = websocketDataQT.lon
data.lat = websocketDataQT.lat
data.alt = websocketDataQT.height
data.groundSpeed = websocketDataQT.groundSpeed //km/h
return data.lon==0? null: data
}
function getAirline(data: any): Airline | null {
let line: Airline = {totalDistance: 0, PtNum: 0, name: "", isClose: false, points: []}
line.PtNum = data.PtNum
@ -53,4 +73,4 @@ function getUavTypeStr(type: number) : string{
default: return 'test'
}
}
export {dataProcess,getAirline}
export {dataProcess_fromQT,getAirline}

@ -8,7 +8,7 @@ import {nextTick, ref, watch} from "vue";
import {
drawEchartsProfileAnalyse,
drawEchartsVisibility, elevationProfile,
profileAnalyse
profileAnalyse, visibilityAnalyse2
} from "@/utils/map/SpatialAnalysis.ts";
import {useStaticStore} from "@/store/staticOptions";
import {useMessage} from "naive-ui";
@ -23,8 +23,9 @@ let formParams = ref({
interval: 100,
startClearance: 40, //
endClearance: 10, //
curve: true
})
let isVisible = ref(false)
//
const handleCloseProfile = ()=>{
//
@ -53,12 +54,15 @@ function executeTopographicAnalyse(polyline:Cartesian3[]) {
let res = profileAnalyse(window.viewer, polyline,formParams.value.interval)
// 线
let eyeRes = elevationProfile(window.viewer,polyline[0],polyline[1],-1)
eyeRes.elevationArray[0] += Number(formParams.value.startClearance)
eyeRes.elevationArray[1] += Number(formParams.value.endClearance)
//
showResultModal.value = true
nextTick(()=>{
drawEchartsVisibility(res.distanceArray, res.elevationArray, eyeRes.elevationArray[0],eyeRes.elevationArray[1])
drawEchartsVisibility(res.distanceArray, res.elevationArray,
eyeRes.elevationArray[0]+Number(formParams.value.startClearance),
eyeRes.elevationArray[1]+Number(formParams.value.endClearance))
isVisible.value = visibilityAnalyse2(res,true, Number(formParams.value.startClearance),Number(formParams.value.endClearance))
})
}
@ -121,6 +125,11 @@ const afterCoordInput = ()=> {
preset="card" draggable :mask-closable="false" :on-after-leave="handleCloseProfile"
:title="store.analysisVars.analysisType==2? '通视分析结果':'剖面分析结果'">
<template v-slot:default>
<n-row justify-content="center" :class="isVisible? 'ResGreen':'ResRed'"
v-show="store.analysisVars.analysisType==2">
<span style="font-size: larger;font-weight: bolder">
{{isVisible? '通视' : '不通视'}}</span>
</n-row>
<div id="profileEChart"></div>
</template>
</n-modal>
@ -154,6 +163,10 @@ const afterCoordInput = ()=> {
</template>
</n-input>
</n-form-item>
<n-form-item label="考虑地球曲率" path="numberParam" v-show="store.analysisVars.analysisType==2">
<n-switch round v-model:value="formParams.curve">
</n-switch>
</n-form-item>
</n-form>
</n-space>
<n-row justify-content="space-around">
@ -193,4 +206,10 @@ const afterCoordInput = ()=> {
position: relative;
margin-top: -2rem;
}
.ResGreen{
color: #26c926;
}
.ResRed{
color: #FF0000;
}
</style>

@ -11,8 +11,8 @@ import {DrawPolygon} from '@vicons/fa'
import {useMessage} from 'naive-ui'
import {ref} from "vue";
import {useStaticStore} from "@/store/staticOptions.js";
import {login, requestAirline} from "@/assets/js/request.js";
import {dataProcess, getAirline} from "@/assets/js/websocketProtocol.ts";
import {requestAirline} from "@/assets/js/request.js";
import {dataProcess_fromQT, getAirline} from "@/assets/js/websocketProtocol.ts";
import SpatialAnalysis from "@/components/SpatialAnalysis.vue";
import LayerManager from "@/components/map/LayerManager.vue";
@ -143,22 +143,15 @@ function measureArea() {
* @returns {Promise<void>}
*/
async function connectWebSocket() {
await login(store.temp.userName, store.temp.password).then(rsp => {
let resData = JSON.parse(rsp.data.data)
console.log(resData)
sessionStorage.setItem('token',resData.jwtToken)
}).catch(err => {
console.log(err)
sessionStorage.setItem('token','err')
})
if(sessionStorage.getItem('token') === 'err') return
store.webskt.ws = new WebSocket('ws://'+store.webskt.ws_config.address+':'+store.webskt.ws_config.port);
store.webskt.ws.onopen = function(event){
console.log("Connection open ...");
store.webskt.ws.send("hello QT!")
}
store.webskt.ws = new WebSocket('ws://123.57.54.1:8048/htfp/websocket/uavGlobal/sysUser003', sessionStorage.getItem('token'))
// store.server.ws = new WebSocket('ws://'+store.server.ws_config.address+':'+store.server.ws_config.port);
store.webskt.ws.onmessage = (event) => {
//....
let data = dataProcess(JSON.parse(event.data))
let data = dataProcess_fromQT(JSON.parse(event.data))
console.log(data);
//
if (!hasPlane.value && data != null) {

@ -46,7 +46,7 @@ export const useStaticStore = defineStore('staticOptions',{
isOpen: false,
ws_config: {
address: '127.0.0.1',
port: 8000,
port: 9090,
},
},
models: {

@ -106,7 +106,9 @@ export function visibilityAnalyse(viewer: Viewer, viewpoint:Cartesian3, target:C
for (let i = 1; i <= breakNum; i++) {
let breakP = Cartesian3.lerp(viewpoint, target, i/breakNum, new Cartesian3())
let breakPH = getElevation(viewer, breakP) //断点海拔
let breakPDis = getDistance(viewpoint,breakP)*1000 //断点与视点的距离
if(breakPH == -9999.2024) return false
let breakPDis = Math.floor(getDistance(viewpoint,breakP)*1000) //断点与视点的距离
// 计算断点与视点的斜率
let breakPK = (breakPH-viewpointH)/breakPDis
if(breakPK>visibleK){
@ -121,6 +123,37 @@ export function visibilityAnalyse(viewer: Viewer, viewpoint:Cartesian3, target:C
return true
}
/**
* <br>
* truefalse
* @param profile
* @param curvature
* @param startExtraH m
* @param endExtraH m
*/
export function visibilityAnalyse2(profile: ProfileResult, curvature:boolean, startExtraH:number,endExtraH:number)
{
// 计算起点、终点的高度(海拔+挂高m
let startH = profile.elevationArray[0] + startExtraH
let endH = profile.elevationArray.at(-1) + endExtraH
// 计算首尾点斜率
let visibleK = (endH - startH)/profile.distanceArray.at(-1)
// 逐个计算断点与视点的斜率
for (let i = 1; i < profile.elevationArray.length ; i++) {
let breakPK = (profile.elevationArray[i] - startH) / profile.distanceArray[i]
if(breakPK > visibleK)
return false
}
if(curvature){
let coefficient: number = 3.57 //考虑大气折射 4.12 公司文件给出 2.898
let Rmax = coefficient * (Math.sqrt(startExtraH) + Math.sqrt(endExtraH))
if (Rmax < profile.distanceArray.at(-1)/1000.0)
return false
}
return true
}
/**
* 线
* @param xData x
@ -319,11 +352,7 @@ export const drawEchartsAirlineDetect = (xData:number[],yData:number[],yData2:nu
* @param endHeight 线
*/
export const drawEchartsVisibility = (xData:number[], yData:number[],startHeight:number, endHeight:number) => {
console.group()
console.log(0, startHeight)
console.log(xData.at(-1), endHeight)
console.groupEnd()
console.log(xData)
let myChart = echarts.init(document.getElementById('profileEChart')) //Echarts-UnitTest
// 绘制图表
myChart.setOption({

Loading…
Cancel
Save