perf: 障碍物添加和航线绘制、websocket发送后端

devzpx
zhaipx 2 months ago
parent 6572ef649d
commit a8701993b3

@ -0,0 +1,168 @@
import {DataSource} from "cesium";
import * as Cesium from 'cesium'
export default class RouteManageViewer {
constructor(viewer, isClose, height) {
this.viewer = viewer
this.scene = viewer.scene
this.routeParams = {
isClose: isClose,
height: height,
}
this.positions = []
this.temPositions = [] // 鼠标移动时产生的临时点
this.vertexEntities = [] // 节点元素
this.lineEntity = undefined // 折线元素
this.lineEntitys = [] // 折线元素数组,每完成一次航线绘制,将折线元素加入此数组
}
// -------------------------------------------//
//开始绘制
start() {
this.handler = new Cesium.ScreenSpaceEventHandler(this.viewer.scene.canvas)
this.viewer.scene.globe.depthTestAgainstTerrain = true
//设置鼠标样式
this.viewer._element.style.cursor = 'crosshair';
this.viewer.enableCursorStyle = true;
this.temPositions = [];
this.positions = [];
return new Promise((resolve,reject) => {
//注册鼠标事件
//单击鼠标左键画点点击事件
this.handler.setInputAction(e => {
let position = this.viewer.scene.pickPosition(e.position);
if (!position) {
const ellipsoid = this.viewer.scene.globe.ellipsoid;
position = this.viewer.scene.camera.pickEllipsoid(e.position, ellipsoid);
}
//TODO: 海拔高度转Cartesain3 Z 值
if (position){
this.positions.push(position);
}
if (this.positions.length === 1) { //首次点击
this.createLineEntity();
}
this.createVertex();
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
this.handler.setInputAction(e => {
if (this.positions.length < 3) {
this.endDraw();
this.clearDisEntity()
reject("航线不得少于三个航点!")
}
else {
this.lineEntity.polyline = {
positions: this.routeParams.isClose? this.positions.concat(this.positions[0]) : this.positions,
width: 2,
material: Cesium.Color.YELLOW,
depthFailMaterial: Cesium.Color.YELLOW
}
this.endDraw();
resolve(this._Cartesian_degrees(this.positions))
}
}, Cesium.ScreenSpaceEventType.RIGHT_CLICK);
this.handler.setInputAction(e => {
let position = this.viewer.scene.pickPosition(e.endPosition);
if (!position) {
position = this.viewer.scene.camera.pickEllipsoid(e.startPosition, this.viewer.scene.globe.ellipsoid);
}
if (this.positions.length >= 1){
this.temPositions = this.positions.concat(position);
}
this.viewer.scene.requestRender()
}, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
})
}
//结束绘制
endDraw() {
this.unRegisterEvents();
this.viewer._element.style.cursor = 'default';
this.viewer.enableCursorStyle = true;
this.lineEntitys.push(this.lineEntity)
}
//清空绘制
clearDisEntity() {
//清除折线
this.lineEntitys.forEach(item => {
this.viewer.entities.remove(item);
});
//清除节点
this.vertexEntities.forEach(item => {
this.viewer.entities.remove(item);
});
this.positions = []
this.temPositions = [] // 鼠标移动时产生的临时点
this.vertexEntities = [] // 节点元素
this.lineEntity = undefined // 折线元素
this.lineEntitys = [] // 折线元素数组,每完成一次航线绘制,将折线元素加入此数组
}
//创建线对象
createLineEntity() {
this.lineEntity = this.viewer.entities.add({
polyline: {
positions: new Cesium.CallbackProperty(e => {
return this.temPositions;
}, false),
width: 2,
material: Cesium.Color.YELLOW,
clampToGround: true,
heightReference:Cesium.HeightReference.CLAMP_TO_GROUND,
},
})
this.viewer.scene.requestRender()
}
//创建线节点
createVertex() {
let vertexEntity = new Cesium.Entity({
id: "Route" + this.positions[this.positions.length - 1],
position: this.positions[this.positions.length - 1],
point: {
color: Cesium.Color.FUCHSIA,
pixelSize: 8,
outlineColor: Cesium.Color.WHITE,
outlineWidth: 2,
disableDepthTestDistance:99000000,
heightReference:Cesium.HeightReference.CLAMP_TO_GROUND,
},
});
this.vertexEntities.push(vertexEntity)
this.viewer.entities.add(vertexEntity)
}
//解除鼠标事件(测距)
unRegisterEvents() {
this.handler.removeInputAction(Cesium.ScreenSpaceEventType.RIGHT_CLICK);
this.handler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_CLICK);
this.handler.removeInputAction(Cesium.ScreenSpaceEventType.MOUSE_MOVE);
}
/**
* 笛卡尔坐标数组转为经纬度坐标数组
* @param cartesian3Arr 笛卡尔坐标数组
* @returns {*[]} 经纬度坐标数组
* @private
*/
_Cartesian_degrees(cartesian3Arr){
let coords = []
cartesian3Arr.forEach((item) => {
// 将 Cartesian3 转换为 Cartographic
let cartographic = Cesium.Cartographic.fromCartesian(item, Cesium.Ellipsoid.WGS84);
coords.push({
lon: Cesium.Math.toDegrees(cartographic.longitude),
lat: Cesium.Math.toDegrees(cartographic.latitude),
alt: this.routeParams.height
})
})
return coords
}
}

@ -2,9 +2,10 @@ import * as Cesium from 'cesium'
import {Cartesian3} from 'cesium'
import {useStaticStore} from "@/store/staticOptions.js";
import {useLayerStore} from "@/store/layerManagerStore.ts";
import {ByDirectionAndLen} from "@/utils/map/geocomputation.ts";
const store = useStaticStore()
let time = new Date()
export default class MeasureDistance {
export default class MeasureViewer {
constructor(viewer) {
this.viewer = viewer
this.scene = viewer.scene
@ -33,6 +34,8 @@ export default class MeasureDistance {
borderWidth: 1,
material: Cesium.Color.GREEN.withAlpha(0.5),
}
this.barirsCollection = [] //机场障碍物
}
profileAnalyse(){
@ -219,7 +222,7 @@ export default class MeasureDistance {
/**
* Cesium实体导出Geojson只导出实体中的 polyline polygon rectangle
* @param entity
* @param entity Cesium实体
* @return geojson Object
*/
entity2Geojson(entity){
@ -603,7 +606,6 @@ export default class MeasureDistance {
this.handler = new Cesium.ScreenSpaceEventHandler(this.viewer.scene.canvas)
this.viewer.scene.globe.depthTestAgainstTerrain = true
this.registerEvents(); //注册鼠标事件
this.isMeasure = true;
this.totalDistance = 0 // 总距离
//设置鼠标样式
@ -611,6 +613,8 @@ export default class MeasureDistance {
this.viewer.enableCursorStyle = true;
this.temPositions = [];
this.positions = [];
this.registerEvents(); //注册鼠标事件
}
//禁用测距
@ -643,7 +647,6 @@ export default class MeasureDistance {
this.totalDistance = 0 // 总距离
}
//创建线对象(测距)
createLineEntity() {
this.lineEntity = this.viewer.entities.add({
@ -654,6 +657,7 @@ export default class MeasureDistance {
width: 2,
material: Cesium.Color.YELLOW,
clampToGround: true,
heightReference:Cesium.HeightReference.CLAMP_TO_GROUND,
},
})
this.viewer.scene.requestRender()
@ -1095,4 +1099,29 @@ export default class MeasureDistance {
},
})
}
addEntitiesByDirectionAndLen(DatumPt, markers){
let datumCar = Cartesian3.fromDegrees(Number(DatumPt.lon),Number(DatumPt.lat))
console.group()
console.log(markers)
markers.forEach(marker => {
let pt = ByDirectionAndLen(datumCar,Number(marker.direction),Number(marker.distance))
let entity = new Cesium.Entity({
position: pt,
box: {
dimensions: new Cartesian3(20,30,Number(marker.alt)),
material: Cesium.Color.RED,
outline: true,
outlineColor: Cesium.Color.WHITE,
outlineWidth: 2,
disableDepthTestDistance:990000,
}
})
this.barirsCollection.push(entity)
this.viewer.entities.add(entity)
})
return datumCar
}
}

@ -0,0 +1,54 @@
import { defineAsyncComponent, render, createVNode } from "vue";
export class routeDialog {
constructor() {
this.component = defineAsyncComponent(
() => import("@/components/RouteOptions.vue"));
this.vnode = null;
this.node = null;
this.props = {
width: "40%",
height: "auto",
};
}
installRouteDialog() {
if (!this.vnode) {
const dialog = createVNode(this.component, this.props);
const container = document.createElement('div');
render(dialog, container);
this.vnode = dialog;
this.node = container.childNodes[0];
document.body.appendChild(this.node);
}
}
/**
*
* @returns {Promise<string>}
* @param points 经纬度坐标点数组
*/
show(points) {
// 发送信号,显示窗口
const event = new CustomEvent('route-dialog-show', { detail:
{ show: true, pts: points }
});
document.dispatchEvent(event);
return new Promise((resolve,reject) => {
document.addEventListener('route-dialog-confirm', event => {
if(event.detail==='cancel'){
reject('cancel')
}else{
resolve(event.detail);
}
});
})
}
}
const aDialog = new routeDialog();
/**
* 展示一个阻塞式对话框
* @returns {Promise<string>}
* @param point 经纬度坐标点数组
*/
export async function showRouteDialog(point) {
return aDialog.show(point);
}

@ -0,0 +1,131 @@
<script setup lang="ts">
import {FormItemRule, useMessage} from 'naive-ui'
import {ref} from "vue";
import {ByDirectionAndLen} from "@/utils/map/geocomputation.ts";
let showDialog = ref(false);
let message = useMessage()
let DatumPt = ref({
lon: undefined,
lat: undefined,
})
const markers = ref([
{
direction: undefined,
distance: undefined,
alt: undefined
}
])
let rule = {
lon: {
trigger: ['input', 'blur'],
required: true,
validator() {
if(DatumPt.value.lon == undefined) return new Error('不可为空')
let v = Number(DatumPt.value.lon)
if(!v) return new Error('请输入数字')
if(v>180 || v < -180) return new Error('范围有误')
return true
}
},
lat: {
trigger: ['input', 'blur'],
required: true,
validator() {
if(DatumPt.value.lat == undefined) return new Error('不可为空')
let v = Number(DatumPt.value.lat)
if(!v) return new Error('请输入数字')
if(v>90 || v < -90) return new Error('范围有误')
return true
}
},
}
function checkItems(){
if(markers.value.length <= 0){return false}
markers.value.forEach( item => {
if(Number(item.direction)>360 ||Number(item.direction)<0 ||Number(item.distance)<0){
message.error('数据输入有误,请检查')
return false
}
})
return true
}
function done() {
if(rule.lat.validator()===true && rule.lon.validator()===true){
if(checkItems()){
message.info('数据校验通过!')
window.measureViewer.addEntitiesByDirectionAndLen(DatumPt.value, markers.value);
console.log(markers.value)
showDialog.value = false
}
}
else{
message.error('数据校验不通过!')
}
}
function cancel() {
}
function onCreate() {
return {
direction: undefined,
distance: undefined
}
}
defineExpose({
openDlg: ()=>{
showDialog.value = true
}
})
</script>
<template>
<n-modal v-model:show="showDialog" style="width: 30rem;" preset="card"
draggable title="相对点障碍物" :mask-closable="false">
<template v-slot:default>
<n-flex>
<n-row style="margin-bottom: .2rem; justify-content: center;">
<n-ellipsis :tooltip="false">基准点经纬度</n-ellipsis>
<n-form-item :rule="rule.lon" size="small" style="display: block">
<n-input class="lonlat" v-model:value="DatumPt.lon" placeholder="经度"/>
</n-form-item>
<n-form-item :rule="rule.lat" size="small" style="display: block">
<n-input class="lonlat" v-model:value="DatumPt.lat" placeholder="纬度"/>
</n-form-item>
</n-row>
<n-dynamic-input v-model:value="markers" :on-create="onCreate">
<template #default="{ value}">
<n-input class="item-left" v-model:value="value.direction" placeholder="方位/正北为0顺时针"/>
<n-input class="item-right" v-model:value="value.distance" placeholder="距离/米"/>
<n-input class="item-right" v-model:value="value.alt" placeholder="高度/米"/>
</template>
</n-dynamic-input>
<n-row justify-content="center" style="margin-top:.5rem;">
<n-button type="primary" style="margin-right: .9rem" size="medium" @click="done"> </n-button>
<n-button type="warning" size="medium" @click="cancel"> </n-button>
</n-row>
</n-flex>
</template>
</n-modal>
</template>
<style scoped>
.lonlat{
width: 10rem;
margin-left: .5rem;
}
.item-right{
margin-left: .3rem;
width: 12rem
}
.item-left{
margin-left: .3rem;
}
</style>

@ -0,0 +1,79 @@
<!--
* @Author: zhaipx
* @Date: 2024-04-01 13:36:35
* @Description: 航线选项窗口
-->
<script setup lang="ts">
import {defineEmits, ref} from "vue";
let emit = defineEmits(['routeDraw','cancelDraw'])
let routeParams = ref({
code: 0,
isClose: false,
height: 0,
routePts: []
})
let routeCode = [
{
label: "任务航线1",
value: 1,
},{
label: "任务航线2",
value: 2,
},{
label: "任务航线3",
value: 3,
},{
label: "任务航线4",
value: 4,
}
]
const done = ()=>{
emit("routeDraw", routeParams.value)
}
const cancel = ()=>{
emit("cancelDraw")
}
</script>
<template>
<n-modal :mask-closable="false" preset="dialog" >
<template #header>
<div>航线参数设定</div>
</template>
<div>
<n-space>
<n-form ref="formRef" :model="routeParams"
label-placement="left"
label-width="auto"
require-mark-placement="right-hanging">
<n-form-item label="是否闭合">
<n-switch v-model:value="routeParams.isClose">
<template #checked>
</template>
<template #unchecked>
</template>
</n-switch>
</n-form-item>
<n-form-item label="航线名称">
<n-select v-model:value="routeParams.code" :options="routeCode" />
</n-form-item>
<n-form-item label="航线高度/m">
<n-input-number v-model:value="routeParams.height" placeholder=500 :step="100" />
</n-form-item>
</n-form>
</n-space>
<n-space justify="center">
<n-button @click="done" type="primary" size="small">确定</n-button>
<n-button @click="cancel" type="warning" size="small">取消</n-button>
</n-space>
</div>
</n-modal>
</template>
<style scoped>
</style>

@ -16,7 +16,8 @@ defineExpose({
let sidebar = document.querySelector('.LayerManagerSidebar');
if(sidebar?.classList.contains('open')){ //
sidebar?.classList.remove('open');
}else { //
}
else { //
sidebar?.classList.add('open');
}
},

@ -21,7 +21,7 @@ import {
} from '@/utils/map/TDTProvider'
import { initViewer, perfViewer, showNavigator } from '@/utils/map/sceneViewer'
import { flyToChina } from '@/utils/map/camera'
import MeasureDistance from "@/assets/js/measureDistance.js";
import MeasureViewer from "@/assets/js/measureViewer.js";
const viewerDivRef = ref<HTMLDivElement>()
let viewer: Viewer
@ -57,7 +57,7 @@ onMounted(() => {
// window
window.viewer = viewer
window.measureViewer = new MeasureDistance(viewer);
window.measureViewer = new MeasureViewer(viewer);
})

@ -18,12 +18,19 @@ import CollisionDetection from "./CollisionDetection.vue"
import {useLayerStore} from "@/store/layerManagerStore.ts";
import {Cartesian3} from "cesium";
import {ByDirectionAndLen, getDistance, getElevation} from "@/utils/map/geocomputation.ts";
import RouteManageViewer from "@/assets/js/RouteManageViewer.js";
import RouteOptions from "@/components/RouteOptions.vue";
import {useRouteStore} from "@/store/RouteStore";
import MarkerDialog from "@/components/MarkerDialog.vue";
import { useRouter, useRoute } from 'vue-router'
const router = useRouter()
const route = useRoute()
const emit = defineEmits(['resizeMap'])
const message = useMessage();
let SceneValue;
let showModal = ref(false);
let showRouteModal = ref(false);
let hasPlane = ref(false);
let showDetection = ref(false);
let store = useStaticStore();
@ -33,6 +40,8 @@ let detectDivHeight = ref(25)
const spatialAnalyse = ref(null)
const layerManager = ref(null)
const collisionDetection = ref(null)
const markerDialog = ref(null)
SceneValue = ref('untrace');
let frameCount = 0
let lastPos = undefined; //
@ -45,7 +54,6 @@ function handleSceneSelect(key){
window.viewer.trackedEntity = window.viewer.entities.getById(store.uav.ModelIDinMap);
}
}
let layerValue = ref('layer1');
let barIsOpen = ref(true);
function openCloseBar() {
//
@ -58,12 +66,19 @@ function openCloseBar() {
}
barIsOpen.value = !barIsOpen.value
}
function handleEditSelect(key) {
if(key === 'createLine') {
function handleEditSelect(key) {
if(key === 'createLine') { // 线
showRouteModal.value = true;
}
else if(key === 'marker') { //
markerDialog.value?.openDlg()
}
else{
// 线
// 线
router.push({
name: 'Test',
})
}
}
function handleAnalyseSelect(key) {
@ -124,7 +139,6 @@ async function handleFile() {
else if(file.name.toLowerCase().endsWith('geojson')||file.name.toLowerCase().endsWith('json')||file.name.toLowerCase().endsWith('topojson')) {
window.measureViewer.addJson(file)
}
}
/**
@ -234,6 +248,15 @@ async function connectWebSocket() {
};
}
/**
* 将航线信息发送给QT端每次发送一条航线
* @param route 航线Airline类型
*/
function sendRouteToQT(route){
if(store.webskt.ws?.readyState == WebSocket.OPEN){
store.webskt.ws.send(JSON.stringify(route))
}
}
//
function shutDownDetec() {
if(lStore.openDetect){
@ -258,6 +281,33 @@ function manageLayer(){
layerManager.value?.open_closeSidebar()
}
/**
* 绘制航线目前只绘制任务航线
* @param routeParams 航线属性
*/
function startDrawRoute(routeParams /*{code: number,isOpen: bool,height: number,routePts: []}*/) {
showRouteModal.value = false
let drawLine = new RouteManageViewer(window.viewer, routeParams.isClose, routeParams.height)
drawLine.start().then(result => {
console.log(result)
// result AirlinePoint
let AirlinePoints = []
result.forEach((pt,index) => {
let AirlinePoint = {lon:pt.lon, lat:pt.lat, alt:pt.alt, ch1:routeParams.isClose? 2:0, ch2:0x03, speed:0, nPt:index}
AirlinePoints.push(AirlinePoint)
})
AirlinePoints.at(-1).ch2 = 0x01;
// 线store
let aRoute = {
code: routeParams.code, PtNum: result.length, isClose: routeParams.isClose, name: "", points: AirlinePoints, totalDistance: 0
}
useRouteStore().route.push(aRoute)
// fixme: 线
}).catch(reject => {
message.error(reject)
})
}
</script>
<template>
@ -375,7 +425,6 @@ function manageLayer(){
</n-space>
<n-space justify="center">
<n-button @click="connectWebSocket" type="primary" size="small">开启通信</n-button>
<!-- <n-button @click=" sendMessage" type="primary" size="small">发消息</n-button>-->
<n-button @click="closeWS" type="warning" size="small">关闭通信</n-button>
</n-space>
</div>
@ -383,6 +432,8 @@ function manageLayer(){
<SpatialAnalysis ref="spatialAnalyse"></SpatialAnalysis>
<LayerManager ref="layerManager"></LayerManager>
<RouteOptions v-model:show="showRouteModal" @routeDraw="startDrawRoute" @cancelDraw="showRouteModal = false"/>
<MarkerDialog ref="markerDialog"></MarkerDialog>
</template>
<style>
@ -404,6 +455,7 @@ function manageLayer(){
position: absolute;
z-index: 2;
}
#detectionGraph{
position: absolute;
bottom: -25vh;

@ -3,7 +3,7 @@ import './style.css'
import App from './App.vue'
import { createPinia } from 'pinia'
import 'virtual:svg-icons-register'
import naive from "naive-ui";
import naive from "naive-ui"
import router from './router'
const pinia = createPinia()

@ -11,7 +11,12 @@ const router = createRouter({
{
path: '/test',
name: 'Test',
component: ()=>import('@/components/UnitTest.vue')
component: ()=>import('@/components/RouteOptions.vue')
},
{
path: '/test2',
name: 'Test2',
component: ()=>import('@/components/MarkerDialog.vue')
}
]
});

@ -0,0 +1,13 @@
import {defineStore} from "pinia";
import {Airline} from "@/types/entityoptions.ts";
export const useRouteStore = defineStore('RouteStore', {
state: ()=>{
return {
route: [] as Airline[] //地图中绘制的航线用于发送给后端QT
}
},
actions: {
}
})

@ -14,7 +14,8 @@ export const useStaticStore = defineStore('staticOptions',{
menuOptions:{
EditOptions: [
{label: '绘制航线', key: 'createLine'},
{label: '航线管理', key: 'manage'}
{label: '航线管理', key: 'manage'},
{label: '标记障碍物', key: 'marker'}
],
sceneOptions:[
{label: '第三视角跟随', value: 'fallow'},

@ -6,21 +6,17 @@
* @Description: Polyline
*/
import {
Viewer,
ScreenSpaceEventHandler,
CallbackProperty,
Cartesian2,
Cartesian3,
Color,
ScreenSpaceEventType,
Entity,
CallbackProperty,
PolylineDashMaterialProperty,
Cartesian2,
ScreenSpaceEventHandler,
ScreenSpaceEventType,
Viewer,
} from 'cesium'
import {
cartesian2ToCartesian3,
cartesian3ToWGS84,
} from '@/utils/map/coordinate'
// import { PointEntity, PolylineEntity } from '@/utils/map/geometry'
import {cartesian2ToCartesian3, cartesian3ToWGS84,} from '@/utils/map/coordinate'
import {PolylineEntity} from '../geometry/polylineEntity'
import {PointEntity} from '@/utils/map/geometry/pointEntity'
import EditGeometry from '@/utils/map/draw/editGeometry'
@ -28,7 +24,6 @@ import { getDistance } from '@/utils/map/geocomputation.ts'
import {Angle} from '@/utils/map/angle.ts'
import {TextLabel} from '@/utils/map/geometry/textLabel.ts'
import {EntityOptions} from '@/types/entityoptions.ts'
import {profileAnalyse} from "@/utils/map/SpatialAnalysis.ts";
export default class CreatePolyline {
viewer: Viewer
@ -45,7 +40,6 @@ export default class CreatePolyline {
pointNum: number = 0
bMove: boolean = false
bMeasure: boolean | undefined = false //是否处于测距模式
bProfile: boolean | undefined = false //是否处于测距模式
totalDistance: number = 0
bLongClick: boolean = false
clickTimeout: any
@ -54,7 +48,6 @@ export default class CreatePolyline {
// 存储第一次点击的信息
firstClickPosition: Cartesian2 | null = null
firstClickTime: number | null = null
// layer: CustomDataSource
defaultStyle: EntityOptions = {
// id: 'Polyline' + String(PolylineEntity.id),
// name: 'Polyline' + String(PolylineEntity.id + 1),
@ -63,10 +56,9 @@ export default class CreatePolyline {
color: Color.GREEN,
}
constructor(viewer: Viewer, bMeasure: boolean=false,bProfile: boolean=false,options?: EntityOptions) {
constructor(viewer: Viewer, bMeasure: boolean=false, options?: EntityOptions) {
this.viewer = viewer
this.bMeasure = bMeasure
this.bProfile = bProfile
this.handler = new ScreenSpaceEventHandler(this.viewer.scene.canvas)
this.polyline = null
this.trackingLine = null
@ -77,6 +69,7 @@ export default class CreatePolyline {
}
// 开始绘制
public start() {
console.log('Starting polyline')
// 左单击加点
this.handler.setInputAction(
this.leftClickCallBack,
@ -98,9 +91,6 @@ export default class CreatePolyline {
ScreenSpaceEventType.RIGHT_CLICK,
)
}
public end() {
this.handler.removeInputAction(ScreenSpaceEventType.LEFT_CLICK)
}
//左单击回调事件
private leftClickCallBack = (event: ScreenSpaceEventHandler.PositionedEvent) => {
@ -126,8 +116,7 @@ export default class CreatePolyline {
this.trackingLinePositions[0] = cartesian3
//垂直辅助线
const n = this.positions.length - 1
const ptArr = [oldPosition, cartesian3]
this.vDashLinePosition[n] = ptArr
this.vDashLinePosition[n] = [oldPosition, cartesian3]
this.viewer.entities.add(this.createTrackingLine(this.vDashLinePosition[n], Color.WHITE))
//添加地表控制点
const groundControlPoint = new PointEntity(this.vDashLinePosition[n][0])
@ -188,12 +177,6 @@ export default class CreatePolyline {
new TextLabel(this.viewer,this.positions[this.positions.length-1],
`总距离: ${this.totalDistance.toFixed(2)}km`)
}
if(this.bProfile){
// 计算剖面点高度
let profile = profileAnalyse(this.viewer,this.positions,100)
// TODO: 弹出地形剖面折线图
console.log(profile)
}
this.clearEvent()
//结束绘制进入编辑模式
this.polyline.removeControlPoints()

Loading…
Cancel
Save