feat:基于最大斜率的两点间通视算法实现

devzpx
zhaipx 10 months ago
parent 7e9096eab9
commit 2da9f05c19

@ -4,7 +4,7 @@
创建人Zhaipeixiu 创建人Zhaipeixiu
--> -->
<script setup lang="ts"> <script setup lang="ts">
import {onMounted, ref} from 'vue' import {ref} from 'vue'
import * as echarts from 'echarts' import * as echarts from 'echarts'
const emit = defineEmits(['confirmDia']) const emit = defineEmits(['confirmDia'])
let showDia = ref<boolean>(false) let showDia = ref<boolean>(false)
@ -22,12 +22,12 @@ const confirmDia = (): void => {
} }
/** /**
* 绘制折线图 * 绘制折线图航线碰撞检测
* @param xData x数组 * @param xData x数组
* @param yData y数组以面积线绘制 * @param yData y数组以面积线绘制
* @param yData2 y数组以折线绘制 * @param yData2 y数组以折线绘制
*/ */
const drawChart = (xData:number[],yData:number[],yData2:number[]) => { const drawChart_AirlineDetect = (xData:number[],yData:number[],yData2:number[]) => {
let myChart = echarts.init(document.getElementById('profileChart')) let myChart = echarts.init(document.getElementById('profileChart'))
// //
myChart.setOption({ myChart.setOption({
@ -119,13 +119,106 @@ const drawChart = (xData:number[],yData:number[],yData2:number[]) => {
] ]
}); });
} }
/**
* 绘制折线图地形剖面
* @param xData x数组
* @param yData y数组以面积线绘制
*/
const drawChart_TerrainProfile = (xData:number[],yData:number[]) => {
let myChart = echarts.init(document.getElementById('profileChart'))
//
myChart.setOption({
legend:{
show: true,
type: 'plain',
top: '7%',
data:[
{
name: 'groundLine',
itemStyle: 'inherit',
lineStyle: 'inherit',
},
{
name: 'airLine',
itemStyle: 'inherit',
lineStyle: 'inherit',
}]
},
tooltip: {
show: true,
trigger: 'axis',
axisPointer: {
type: 'cross'
},
formatter:'地表高度: {c0}'
},
xAxis: {
data: xData,
name: '距离',
nameTextStyle: {
fontWeight:'bolder',
fontSize: 14
},
nameLocation: 'end',
axisLine:{
onZero: false,
show: true, // 线
symbol: ['none', 'arrow'],
symbolSize: [7, 10]
},
axisLabel: {
formatter: '{value} m',
margin: 5,
},
axisTick: {
show: true, //
inside: true, //
alignWithLabel: true,
lineStyle: {
color: '#000000', //线
type: 'solid', //线线solid线dashed线dotted
},
}
},
yAxis: {
type: 'value',
name: '高度',
nameTextStyle: {
fontWeight:'bolder',
fontSize: 14
},
nameLocation: 'end',
position: 'left',
axisLabel: {
formatter: '{value} m'
},
axisLine: {
show: true,
symbol: ['none', 'arrow'],
symbolSize: [7, 10]
}
},
series: [
{
name:'groundLine',
type: 'line',
data: yData,
areaStyle: {
color: '#37a5fb',
opacity: 0.5
}
}
]
});
}
// vue3使 <script setup> // vue3使 <script setup>
// 访使 <script setup> 西 defineExpose // 访使 <script setup> 西 defineExpose
defineExpose({ defineExpose({
openDia, openDia,
closeDia, closeDia,
drawChart, drawChart_AirlineDetect,
drawChart_TerrainProfile
}) })

@ -59,3 +59,44 @@ export function profileAnalyse(viewer: Viewer, polyline:Cartesian3[],interval: n
} }
return result return result
} }
/**
* <br>
* truefalseundefined
* @param viewer
* @param viewpoint
* @param target
* @param h 1m
* @param breakNum 100
*/
export function visibilityAnalyse(viewer: Viewer, viewpoint:Cartesian3, target:Cartesian3,
h= 1, breakNum = 100) {
// 获取视点高度和目标点高度
let viewpointH = getElevation(viewer, viewpoint) + h
let targetH = getElevation(viewer, target)
if (viewpointH === -9999.2024 + h ) {
console.log("无法获取视点海拔高度!")
return undefined
}
if (targetH === -9999.2024 ) {
console.log("无法获取目标点海拔高度!")
return undefined
}
// 计算首尾点距离 m
let totalLen = getDistance(viewpoint, target) * 1000
// 计算首尾点斜率
let visibleK = (targetH - viewpointH)/totalLen
// 逐个计算断点与视点的斜率
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 //断点与视点的距离
// 计算断点与视点的斜率
let breakPK = (breakPH-viewpointH)/breakPDis
if(breakPK>visibleK){
return false
}
}
return true
}

@ -142,7 +142,7 @@ function getPolygonArea(vertexs: Cartesian3[]) {
} }
/** /**
* * m -9999.2024
* @param viewer Viewer * @param viewer Viewer
* @param pos Cartographic|Cartesian3|[lon,lat] * @param pos Cartographic|Cartesian3|[lon,lat]
*/ */
@ -150,14 +150,14 @@ export function getElevation(viewer: Viewer, pos: Cartographic|Cartesian3|number
let cartographic = undefined let cartographic = undefined
if(pos instanceof Array){ if(pos instanceof Array){
cartographic = Cartographic.fromDegrees(Angle.degree2rad(pos[0]), Angle.degree2rad(pos[1])) cartographic = Cartographic.fromDegrees(Angle.degree2rad(pos[0]), Angle.degree2rad(pos[1]))
return viewer.scene.globe.getHeight(cartographic)??-99.2024 return viewer.scene.globe.getHeight(cartographic)??-9999.2024
} }
else if(pos instanceof Cartesian3){ else if(pos instanceof Cartesian3){
cartographic = Cartographic.fromCartesian(pos) cartographic = Cartographic.fromCartesian(pos)
return viewer.scene.globe.getHeight(cartographic)??-99.2024 return viewer.scene.globe.getHeight(cartographic)??-9999.2024
} }
else{ else{
return viewer.scene.globe.getHeight(pos)??-99.2024 return viewer.scene.globe.getHeight(pos)??-9999.2024
} }
} }

Loading…
Cancel
Save