航点航线

main
徐景良 3 weeks ago
parent f16c74f139
commit 5790b31fb4

@ -120,7 +120,7 @@
"mapbox-gl-draw-snap-mode": "^0.2.0",
"mapbox-gl-utils": "^0.44.0",
"mars3d": "file:packages/mars3d",
"mars3d-cesium": "^1.113.0",
"mars3d-cesium": "^1.130.0",
"mars3d-space": "^3.7.0",
"min-dash": "^4.2.1",
"mockjs": "^1.1.0",

@ -0,0 +1,125 @@
<template>
<div class="params-container">
<!-- 选择相机 -->
<div class="params-item">
<div class="params-label">相机选择</div>
<div class="params-value">
<div v-for="(item,index) in cameraType"
:key="index"
:class="item.checked ? 'checkbox-item-active' : 'checkbox-item'"
@click="checkCamera(item)"
>
{{ item.name }}
</div>
</div>
</div>
</div>
</template>
<script lang="ts" setup>
import {ref,defineProps,defineComponent,defineOptions} from 'vue';
const props = defineProps(["params"])
defineComponent({
name: 'actionComponents'
})
let cameras = props.params.payloadLensIndex?.split(",");
const cameraType = ref([
{
name:"可见光",
value:"visable",
checked:false,
},{
name:"红外照片",
value:"ir",
checked:false
}
])
cameras?.forEach((item,index)=>{
cameraType.value.forEach((camera,idx)=>{
if(item == camera.value){
cameraType.value[idx].checked = true;
}
})
})
const checkCamera = (item) => {
item.checked = !item.checked
const result = cameraType.value
.filter(item => item.checked)
.map(item => item.value)
.join(",");
props.params.payloadLensIndex = result;
}
</script>
<style scoped>
.params-container{
display:flex;
flex-direction: column;
gap:20px;
}
.params-item{
width:100%;
display: flex;
gap:20px;
}
.params-item .params-label{
line-height:30px;
}
.params-item .params-value{
flex:1;
display:flex;
gap:10px;
}
.checkbox-item {
line-height:30px;
border-radius: 15px;
background:#3C3C3C;
padding:0px 12px;
cursor:pointer;
}
.checkbox-item-active{
line-height:30px;
border-radius: 15px;
background:#3A57E8;
padding:0px 12px;
cursor:pointer;
}
::v-deep .ant-input{
background:#3c3c3c!important ;
border:none!important;
border-top-left-radius: 3px !important;
border-bottom-left-radius: 3px !important;
color:#fff!important;
}
::v-deep .ant-input::placeholder{
color:rgba(255, 255, 255, 0.533)!important;
}
::v-deep .ant-input-number{
color:#fff!important;
background:#3c3c3c!important;
border:0px !important;
}
::v-deep .ant-input-number-input{
color:#fff!important;
border:0px !important;
}
</style>

@ -1,61 +1,127 @@
<template>
<div class="params-container">
<!-- 选择相机 -->
<div class="params-item">
<div class="params-label">视频名称</div>
<div class="params-label">相机选择</div>
<div class="params-value">
<a-input v-model:value="props.params.orientedFilePath"></a-input>
<div v-for="(item,index) in cameraType"
:key="index"
:class="item.checked ? 'checkbox-item-active' : 'checkbox-item'"
@click="checkCamera(item)"
>
{{ item.name }}
</div>
</div>
</div>
</div>
</template>
<script lang="ts" setup>
import {defineProps,defineComponent,defineOptions} from 'vue';
import {ref,defineProps,defineComponent,defineOptions} from 'vue';
const props = defineProps(["params"])
defineComponent({
name: 'startRecord'
name: 'actionComponents'
})
let cameras = props.params.payloadLensIndex?.split(",");
const cameraType = ref([
{
name:"可见光",
value:"visable",
checked:false,
},{
name:"红外照片",
value:"ir",
checked:false
}
])
cameras?.forEach((item,index)=>{
cameraType.value.forEach((camera,idx)=>{
if(item == camera.value){
cameraType.value[idx].checked = true;
}
})
})
const checkCamera = (item) => {
item.checked = !item.checked
const result = cameraType.value
.filter(item => item.checked)
.map(item => item.value)
.join(",");
props.params.payloadLensIndex = result;
}
</script>
<style scoped>
.params-container{
display:flex;
flex-direction: column;
gap:20px;
}
.params-item{
width:100%;
display: flex;
gap:20px;
width:100%;
display: flex;
gap:20px;
}
.params-item .params-label{
line-height:30px;
line-height:30px;
}
.params-item .params-value{
flex:1;
flex:1;
display:flex;
gap:10px;
}
.checkbox-item {
line-height:30px;
border-radius: 15px;
background:#3C3C3C;
padding:0px 12px;
cursor:pointer;
}
.checkbox-item-active{
line-height:30px;
border-radius: 15px;
background:#3A57E8;
padding:0px 12px;
cursor:pointer;
}
::v-deep .ant-input{
background:#3c3c3c!important ;
border:none!important;
border-top-left-radius: 3px !important;
border-bottom-left-radius: 3px !important;
color:#fff!important;
background:#3c3c3c!important ;
border:none!important;
border-top-left-radius: 3px !important;
border-bottom-left-radius: 3px !important;
color:#fff!important;
}
::v-deep .ant-input::placeholder{
color:rgba(255, 255, 255, 0.533)!important;
color:rgba(255, 255, 255, 0.533)!important;
}
::v-deep .ant-input-number{
color:#fff!important;
background:#3c3c3c!important;
border:0px !important;
color:#fff!important;
background:#3c3c3c!important;
border:0px !important;
}
::v-deep .ant-input-number-input{
color:#fff!important;
border:0px !important;
color:#fff!important;
border:0px !important;
}
</style>

@ -1,25 +1,20 @@
<template>
<div class="params-container">
<div class="params-item">
<div class="params-label">照片名称</div>
<div class="params-value">
<a-input v-model:value="props.params.orientedFilePath"></a-input>
</div>
</div>
<div class="params-item">
<div class="params-label">相机选择</div>
<div class="params-value">
<div v-for="(item,index) in cameraType"
:key="index"
:class="item.checked ? 'checkbox-item-active' : 'checkbox-item'"
@click="item.checked = !item.checked"
>
{{ item.name }}
</div>
</div>
</div>
<!-- 选择相机 -->
<div class="params-item">
<div class="params-label">相机选择</div>
<div class="params-value">
<div v-for="(item,index) in cameraType"
:key="index"
:class="item.checked ? 'checkbox-item-active' : 'checkbox-item'"
@click="checkCamera(item)"
>
{{ item.name }}
</div>
</div>
</div>
</div>
</template>
@ -33,18 +28,39 @@ defineComponent({
name: 'actionComponents'
})
let cameras = props.params.payloadLensIndex?.split(",");
const cameraType = ref([
{
name:"可见光",
value:"visable",
checked:true,
checked:false,
},{
name:"红外照片",
value:"ir",
checked:true
checked:false
}
])
cameras?.forEach((item,index)=>{
cameraType.value.forEach((camera,idx)=>{
if(item == camera.value){
cameraType.value[idx].checked = true;
}
})
})
const checkCamera = (item) => {
item.checked = !item.checked
const result = cameraType.value
.filter(item => item.checked)
.map(item => item.value)
.join(",");
props.params.payloadLensIndex = result;
}
</script>

@ -2,17 +2,17 @@
<div class="params-item">
<div class="params-label">焦距倍数</div>
<div class="params-value">
<a-slider v-model:value="props.params.focalLength" :min="1" :max="112" :step="1" />
<a-slider v-model:value="blurLength" :min="1" :max="112" :step="1" @change="zoomChange" />
</div>
<div class="params-value-text">
X {{ props.params.focalLength }}
X {{ blurLength }}
</div>
</div>
</template>
<script lang="ts" setup>
import {defineProps,defineComponent,defineOptions} from 'vue';
import {defineProps,defineComponent,defineOptions,ref} from 'vue';
const props = defineProps(["params"])
@ -21,6 +21,13 @@ defineComponent({
name: 'zoom'
})
const blurLength = ref(1);
blurLength.value = props.params.focalLength / 24;
const zoomChange = ()=> {
props.params.focalLength = blurLength.value * 24;
}
</script>

@ -550,6 +550,7 @@ const saveAirLine = ()=>{
//
handlerWaylineWpml();
// return null;
let handlerResult = handlerPointInfo();
@ -565,18 +566,13 @@ const saveAirLine = ()=>{
});
// wpml template json
let templateJson = {kml:{Document:props.templateKmlConfig}}
let templateJson = {kml:{Document:JSON.parse(JSON.stringify(props.templateKmlConfig))}}
let templateWpmlJson = handlerPrefixWpml(templateJson);
let templateXmlStr = builder.build(templateWpmlJson);
let templateXmlStrTemp = templateXmlStr.replace(/<\/?\d+>/g, "")
let templateXml = templateXmlStrTemp.replace("<kml>",`<?xml version="1.0" encoding="UTF-8"?><kml xmlns="http://www.opengis.net/kml/2.2" xmlns:wpml="http://www.dji.com/wpmz/1.0.6">`)
// wpml wayline json
// delete props.waylineWpmlConfig.missionConfig.takeOffRefPoint
// delete props.waylineWpmlConfig.missionConfig.takeOffRefPointAGLHeight
// delete props.waylineWpmlConfig.missionConfig.autoRerouteInfo
let waylineJosn = {kml:{Document:props.waylineWpmlConfig}}
let waylineJosn = {kml:{Document:JSON.parse(JSON.stringify(props.waylineWpmlConfig))}}
let waylienWpmlJson = handlerPrefixWpml(waylineJosn);
let waylineXmlStr = builder.build(waylienWpmlJson);
let waylineXmlStrTemp = waylineXmlStr.replace(/<\/?\d+>/g, "")
@ -636,13 +632,18 @@ const handlerStatistics = () => {
//
const handelrAirPoint = () => {
props.waylineWpmlConfig.Folder.Placemark = [];
props.templateKmlConfig.Folder.Placemark = [];
props.airPoints?.forEach((item,index)=>{
let point = {
"Point": {
"coordinates": item.lng+","+item.lat
},
"index": index,
"executeHeight": 172.948304450636,
"executeHeight": item.alt,
"waypointSpeed": props.templateKmlConfig.Folder.autoFlightSpeed,
"waypointHeadingParam": {
"waypointHeadingMode": "followWayline",
@ -686,15 +687,16 @@ const handelrAirPoint = () => {
props.templateKmlConfig.Folder.Placemark.push(point);
})
console.log("props.waylineWpmlConfig.Folder.Placemark",props.waylineWpmlConfig.Folder.Placemark);
}
// wpml:
// wpml:
const handlerPrefixWpml = (obj) => {
for (const key in obj) {
if (typeof obj[key] === 'object' && obj[key] !== null && !Array.isArray(obj[key])) { //
handlerPrefixWpml(obj[key]); //

@ -25,6 +25,7 @@
:max="180"
:step="0.0001"
string-mode
@change="positionChange"
/>
</div>
</div>
@ -42,6 +43,7 @@
:max="90"
:step="0.0001"
string-mode
@change="positionChange"
/>
</div>
</div>
@ -58,6 +60,7 @@
:min="0"
:step="1"
string-mode
@change="positionChange"
/>
</div>
</div>
@ -66,54 +69,6 @@
</div>
<div class="config-item" v-if="false">
<div class="item-title">
<div class="label">
飞行器偏航角
</div>
<div>
{{ props.currentAirPoint.aircraftHorizontalAngle }} °
</div>
</div>
<div class="item-content">
<a-slider v-model:value="props.currentAirPoint.aircraftHorizontalAngle" :min="-180" :max="180" :step="0.01" />
</div>
</div>
<div class="config-item" v-if="false">
<div class="item-title">
<div class="label">
云台俯仰角
</div>
<div class="">
{{ props.currentAirPoint.cameraVerticalAngle }} °
</div>
</div>
<div class="item-content">
<a-slider v-model:value="props.currentAirPoint.cameraVerticalAngle" :min="-180" :max="180" :step="0.01" />
</div>
</div>
<div class="config-item" v-if="false">
<div class="config-info">
<div class="item-title">
<div class="label">
相机焦距
</div>
<div class="">
× {{ props.currentAirPoint.cameraFocalLength }}
</div>
</div>
<div class="item-content">
<a-slider v-model:value="props.currentAirPoint.cameraFocalLength" :min="1" :max="56" />
</div>
</div>
<div class="config-delete">
<DeleteOutlined />
</div>
</div>
<div class="body">
<div class="config-item" v-for="(item,index) in props.currentAirPoint.actions" :key="index">
<div class="config-info">
@ -155,6 +110,7 @@ import zoom from '../actionComponents/zoom.vue'
import orientedShoot from '../actionComponents/orientedShoot.vue'
import startRecord from '../actionComponents/startRecord.vue'
import takePhoto from '../actionComponents/takePhoto.vue'
import panoShot from '../actionComponents/panoShot.vue'
const componentMap = {
hover: hover,
@ -164,15 +120,20 @@ const componentMap = {
orientedShoot:orientedShoot,
startRecord:startRecord,
takePhoto:takePhoto,
panoShot:panoShot,
};
const props = defineProps(['currentAirPoint','airPoints'])
const emits = defineEmits(["paramChagne"])
const emits = defineEmits(["paramChagne","positionChange","pointChange"])
const paramChagne = (info) => {
emits("paramChagne",info);
}
const positionChange = () => {
emits("positionChange");
}
watch(
()=>props.currentAirPoint,
(newVal,oldVal)=>{
@ -199,8 +160,8 @@ const deleteAction = (index) => {
}
//
const changeCurrentAirPoint = (id,index) => {
const changeCurrentAirPoint = (id,type) => {
emits("pointChange",id,type);
}
</script>

@ -64,7 +64,7 @@
</a-tooltip>
</div>
<div class="content">
<a-input type="number" style="width:100px;" placeholder="" v-model:value="calculatParam.gsd" @change="onGsdChange"></a-input>
<a-input type="number" style="width:100px;" placeholder="" v-model:value="calculatParam.gsd" @blur="onGsdChange"></a-input>
</div>
<div class="unit"> cm/pixel</div>
</div>
@ -105,7 +105,7 @@
<div class="label">航线高度</div>
<div class="content">
<!-- -->
<a-input type="number" style="width:100px;" placeholder="" v-model:value="calculatParam.height" @change="onHeightChange"></a-input>
<a-input type="number" style="width:100px;" placeholder="" :min="10" :max="120" v-model:value="calculatParam.height" @blur="onHeightChange"></a-input>
</div>
<div class="unit"> m</div>
</div>
@ -123,7 +123,7 @@
<div class="label">旁向重叠率</div>
<div class="content">
<!-- -->
<a-input type="number" style="width:100px;" placeholder="" v-model:value="calculatParam.overlapY" @change="onOverlayYChange"></a-input>
<a-input type="number" style="width:100px;" placeholder="" v-model:value="calculatParam.overlapY" @blur="onOverlayYChange"></a-input>
</div>
<div class="unit"> %</div>
</div>
@ -141,7 +141,7 @@
<div class="label">主航线角度</div>
<div class="content">
<!-- calculatParam.overlapAngle -->
<a-input type="number" style="width:100px;" placeholder="" v-model:value="calculatParam.overlapAngle"></a-input>
<a-input type="number" style="width:100px;" placeholder="" v-model:value="calculatParam.overlapAngle" ></a-input>
</div>
<div class="unit"> °</div>
</div>
@ -330,9 +330,9 @@ watch(
)
//
//
if(props.editModel == 'edit'){
// gsd
calculatParam.value.gsd = calculateGsd(props.templateKmlConfig.Folder.Placemark.height,uavModel['m4td']);
calculatParam.value.overlapAngle = props.templateKmlConfig.Folder.Placemark.direction;
@ -1029,6 +1029,8 @@ const handlerStatistics = () => {
// 线
const handelrAirPoint = () => {
props.waylineWpmlConfig.Folder.Placemark = [];
props.airPoints.forEach((item,index)=>{
let point = null;

@ -33,7 +33,7 @@
</div>
</a-form-item> -->
<!-- <a-form-item ref="workspaceId" label="选择项目" name="workspaceId">
<a-form-item ref="workspaceId" label="选择项目" name="workspaceId">
<div class="">
<a-select
v-model:value="submitForm.workspaceId"
@ -46,7 +46,7 @@
</a-select>
</div>
</a-form-item> -->
</a-form-item>
<a-form-item ref="name" label="选择航线" name="name">
@ -110,7 +110,7 @@
<!-- 单次定时 -->
<a-form-item v-if="submitForm.taskType == 1" label="设置时间">
<a-date-picker v-model:value="onceTime" valueFormat="YYYY-M-D HH:mm:ss" style="width:100%;" show-time placeholder="选择时间" @change="onOnceTimeChange" />
<a-date-picker v-model:value="onceTime" :showNow="false" valueFormat="YYYY-M-D HH:mm:ss" style="width:100%;" show-time placeholder="选择时间" @change="onOnceTimeChange" />
</a-form-item>
<!-- 重复定时 -->

@ -45,6 +45,8 @@
:currentAirPoint="currentAirPoint"
:airPoints="airPoints"
@paramChagne="paramChagne"
@pointChange="pointChange"
@positionChange="positionChange"
></airPointConfig>
</div>
@ -59,7 +61,7 @@
import * as mars3d from 'mars3d';
import { EventBus } from '@/utils/eventBus';
import { airPortStore } from '@/store/modules/airport';
import { airPointActions } from '../waylineConfig/actionConfig'
import 'mars3d-space';
import * as Cesium from 'mars3d-cesium';
@ -232,7 +234,12 @@
() => props.editMode,
(newVal,oldVal)=>{
if(newVal == 'edit' ){
handlerEditPolygonAirLine();
// 线
if(props.airLineForm.airLineType == 'waypoint'){
handlerEditWaypointAirLine();
}else if(props.airLineForm.airLineType == 'mapping2d'){
handlerEditPolygonAirLine();
}
}
}
)
@ -386,6 +393,7 @@ const generatePreviewPoint = (placemark)=>{
const checkPoint = (e) => {
currentAirPoint.value = e;
airPointConfigShow.value = true;
handlerDrawCamera(currentAirPoint.value);
};
///////////////////////////////////////////////////////////////////////////
@ -731,7 +739,12 @@ const initMap = () => {
//
if(props.editMode == 'edit' ){
handlerEditPolygonAirLine();
// 线
if(props.airLineForm.airLineType == 'waypoint'){
handlerEditWaypointAirLine();
}else if(props.airLineForm.airLineType == 'mapping2d'){
handlerEditPolygonAirLine();
}
}
emits('mapOnLoad',map)
@ -1370,7 +1383,7 @@ const handlerLoadtextLabelGraphicLayer = (info) => {
}
// 线
// 线
const handlerEditPolygonAirLine =async () => {
//
@ -1591,7 +1604,7 @@ const handlerDrawPoint = (e) => {
}
// 线
let position = mars3d.LngLatPoint.fromCartesian(e.position);
let uuid = buildUUID();
let uuid = airPoints.value.length+1;
// 线
let globalHeight = props.templateKmlConfig.Folder.globalHeight;
@ -1858,20 +1871,17 @@ const paramChagne = (info) => {
console.log("info1232",info);
//
if(info.value == 'rotateYaw'){ //
if(info.value == 'rotateYaw'){ //
//
currentAirPoint.value.aircraftHorizontalAngle = info.config.actionActuatorFuncParam.aircraftHeading;
//
handlerDrawCamera(currentAirPoint.value);
//
updateAirPoint(currentAirPoint.value);
}
if(info.value == "gimbalRotate"){ //
//
currentAirPoint.value.cameraVerticalAngle = info.config.actionActuatorFuncParam.gimbalPitchRotateAngle
//
@ -1879,6 +1889,42 @@ const paramChagne = (info) => {
}
if(info.value == 'position'){ //
}
}
//
const positionChange = () => {
//
updateAirPoint(currentAirPoint.value);
//
handlerDrawCamera(currentAirPoint.value);
}
//
const pointChange = (id,type) => {
if(type == "next"){
if(id == airPoints.value.length){
currentAirPoint.value = airPoints.value[0];
}else{
currentAirPoint.value = airPoints.value[id];
}
}else if(type == "last"){
if(id == 1){
currentAirPoint.value = airPoints.value[airPoints.value.length - 1];
}else{
currentAirPoint.value = airPoints.value[id - 2];
}
}
//
handlerDrawCamera(currentAirPoint.value);
}
//
@ -1925,6 +1971,139 @@ const deleteAirPoint = (e) => {
handlerDrawLine();
};
// 线
const handlerEditWaypointAirLine =async () => {
//
let takeoffArray = props.templateKmlConfig.missionConfig.takeOffRefPoint.split(",");
takeOffPointPosition.value = [parseFloat(takeoffArray[1]),parseFloat(takeoffArray[0]),parseFloat(takeoffArray[2])]
polygonAirForm.value.startingPoint = [parseFloat(takeoffArray[1]),parseFloat(takeoffArray[0]),parseFloat(takeoffArray[2])];
takeOffPointGraphicLayer ? takeOffPointGraphicLayer.clear() : null;
let startFlyGraphic = new mars3d.graphic.BillboardEntity({
position:takeOffPointPosition.value,
style: {
image: '/map/start.png',
horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
label: {
text: '参考起飞点',
font_size: 16,
color: '#ffffff',
outline: true,
outlineColor: '#000000',
pixelOffsetY: -50,
},
clampToGround: true,
},
})
takeOffPointGraphicLayer.addGraphic(startFlyGraphic);
//
if(props.waylineWpmlConfig.Folder.Placemark.length > 0){
props.waylineWpmlConfig.Folder.Placemark?.forEach((item, index) => {
let coordinate = item.Point.coordinates.split(',');
//
let airPointInfo = {
id: item.index+1,
lng: coordinate[0],
lat: coordinate[1],
alt: item.executeHeight,
aircraftHorizontalAngle: 0,
cameraHorizontalAngle: 0,
cameraVerticalAngle: 0,
focalLength: 24,
actions:[]
};
//
item.actionGroup.action?.forEach((action,idx)=>{
let actionConfig = JSON.parse(JSON.stringify(airPointActions[action.actionActuatorFunc]))
actionConfig.config = JSON.parse(JSON.stringify(action));
console.log("123",action);
//
if(action.actionActuatorFunc == 'rotateYaw'){
airPointInfo.aircraftHorizontalAngle = action.actionActuatorFuncParam.aircraftHeading
}
if(action.actionActuatorFunc == 'gimbalRotate'){
airPointInfo.cameraVerticalAngle = action.actionActuatorFuncParam.gimbalPitchRotateAngle
}
airPointInfo.actions.push(actionConfig);
})
airPoints.value?.push(airPointInfo);
//
displayWaypointAirLine(airPointInfo);
});
// 线
handlerDrawLine();
}
}
// 线
const displayWaypointAirLine = (position)=>{
console.log("position123",position);
// 线
let uuid = buildUUID();
// 线
//
let uavAngleGraphic = new mars3d.graphic.ModelEntity({
id:position.id,
name: "航向",
position: [position.lng, position.lat, position.alt],
style: {
url: "/map/uav-angle.gltf",
scale: 0.1,
heading: position.aircraftHorizontalAngle + 90,
distanceDisplayCondition: true,
distanceDisplayCondition_near: 0,
distanceDisplayPoint: {
color: "#00ff00",
pixelSize: 8
}
}
})
graphicLayer.addGraphic(uavAngleGraphic)
//
let stickGraphic = new mars3d.graphic.PointEntity({
id: 'stick' + position.id,
position: [position.lng, position.lat],
style: {
color: '#f5f5f5',
pixelSize: 8,
outline: true,
outlineColor: '#f5f5f5',
outlineWidth: 1,
clampToGround: true,
},
});
stickGroundPointLayer.addGraphic(stickGraphic);
// 线
let lineGraphic = new mars3d.graphic.PolylineEntity({
id: 'line' + position.id,
positions: [
[position.lng, position.lat,position.alt],
[position.lng, position.lat, 0],
],
style: {
color: '#f5f5f5',
width: 1,
},
});
lineGroundPointLayer.addGraphic(lineGraphic);
}
let stickGraphicLayer: mars3d.layer.GraphicLayer;
//
@ -2593,7 +2772,7 @@ function addRectSensor(route) {
///////////////////////////////////////////////////////////////////////
const addAction = (action) => {
console.log('action123',action);
//
currentAirPoint.value.actions.push(JSON.parse(JSON.stringify(action)));

@ -240,7 +240,7 @@
},{
label:"执行中",
status:1,
color:'#F6B50A'
color:'#409EFF'
},{
label:"执行失败",
status:2,
@ -366,6 +366,8 @@
position:relative;
top:2px;
cursor:pointer;
font-size:12px;
border-radius: 2px;
}
.ari-line .state-no{

@ -30,8 +30,6 @@ export const calculateHeight = (gsd,uavModel) => {
// 输入高度计算gsd
export const calculateGsd = (height,uavModel) => {
let gsd = 0;
gsd = (uavModel['pixelLength'] * height) / uavModel['focalLength'] ;

@ -21,8 +21,10 @@ export default defineApplicationConfig({
//...
target: 'esnext',
commonjsOptions: {
include: /node_modules|lib/, //这里记得把lib目录加进来否则生产打包会报错
include: [
/node_modules|lib/,
/node_modules|packages/
] //这里记得把lib目录加进来否则生产打包会报错
},
},
server: {

Loading…
Cancel
Save