main
徐景良 3 months ago
parent 9da15fbc9c
commit 50d545d920

Binary file not shown.

After

Width:  |  Height:  |  Size: 653 B

@ -7,6 +7,8 @@ enum Api{
AddTask = '/api/Manage/AddTask', AddTask = '/api/Manage/AddTask',
EditTask = '/api/Manage/EditTask', EditTask = '/api/Manage/EditTask',
DeleteTask = '/api/Manage/DeleteTask', DeleteTask = '/api/Manage/DeleteTask',
ExecuteFlyTask = '/api/Manage/ExecuteFlyTask',
PendingFlyTask = '/api/Manage/PendingFlyTask',
// 无人机 // 无人机
GetUavPageList = '/api/Manage/GetUavPageList', GetUavPageList = '/api/Manage/GetUavPageList',
@ -37,6 +39,15 @@ export function deleteTask(params){
return defHttp.post({ url: Api.DeleteTask+"?id="+params.id, params }); return defHttp.post({ url: Api.DeleteTask+"?id="+params.id, params });
} }
export function executeFlyTask(params){
return defHttp.post({ url: Api.ExecuteFlyTask+"?taskId="+params.id, params });
}
export function pendingFlyTask(params){
return defHttp.post({ url: Api.PendingFlyTask+"?taskId="+params.id, params });
}
// 无人机 // 无人机
export function getUavPageList(params) { export function getUavPageList(params) {
return defHttp.get({ url: Api.GetUavPageList, params }); return defHttp.get({ url: Api.GetUavPageList, params });

@ -23,7 +23,7 @@
import { ref, onMounted, defineEmits, defineProps } from 'vue'; import { ref, onMounted, defineEmits, defineProps } from 'vue';
import Icon from '@/components/Icon/Icon.vue'; import Icon from '@/components/Icon/Icon.vue';
import CloudQueryModal from './CloudQueryModal/index.vue'; import CloudQueryModal from './CloudQueryModal/index.vue';
import { useCloudQueryStore } from '@/store/modules/cloudquery'; // import { useCloudQueryStore } from '@/store/modules/cloudquery';
import { LoadCloudQueryById } from '@/api/demo/cloudQuery'; import { LoadCloudQueryById } from '@/api/demo/cloudQuery';
const useCloudQuery = useCloudQueryStore(); const useCloudQuery = useCloudQueryStore();

@ -335,7 +335,10 @@
import { getAppEnvConfig } from '@/utils/env'; import { getAppEnvConfig } from '@/utils/env';
import { message, Modal } from 'ant-design-vue'; import { message, Modal } from 'ant-design-vue';
import { useCloudQueryStore } from '@/store/modules/cloudquery'; // import { useCloudQueryStore } from '@/store/modules/cloudquery';
const useCloudQueryStore = function(){
return {};
}
// //
import { splitAndCalTubanArea,splitTubanBackYuan } from '@/api/sys/layerManagement'; import { splitAndCalTubanArea,splitTubanBackYuan } from '@/api/sys/layerManagement';
import { CalTubanAreaModel } from '@/api/sys/model/layerModel'; import { CalTubanAreaModel } from '@/api/sys/model/layerModel';

@ -46,7 +46,7 @@
import { Tooltip } from 'ant-design-vue'; import { Tooltip } from 'ant-design-vue';
import { useI18n } from '@/hooks/web/useI18n'; import { useI18n } from '@/hooks/web/useI18n';
import { CloudOutlined } from '@ant-design/icons-vue'; import { CloudOutlined } from '@ant-design/icons-vue';
import { useCloudQueryStore } from '@/store/modules/cloudquery'; // import { useCloudQueryStore } from '@/store/modules/cloudquery';
import { getAppEnvConfig } from '@/utils/env'; import { getAppEnvConfig } from '@/utils/env';
import { useMessage } from '@/hooks/web/useMessage'; import { useMessage } from '@/hooks/web/useMessage';
import axios from 'axios'; import axios from 'axios';

@ -78,7 +78,7 @@
</div> </div>
</div> </div>
<div class="ari-line" v-for="(item,index) in ariLineList" :key="index" <div class="ari-line" v-for="(item,index) in ariLineList" :key="index"
@click="checkAriLine(item)"
> >
<div class="title"> <div class="title">
<div style="flex:1;"> <div style="flex:1;">
@ -91,12 +91,15 @@
<MoreOutlined /> <MoreOutlined />
<template #overlay> <template #overlay>
<a-menu> <a-menu>
<a-menu-item> <a-menu-item @click="checkAriLine(item)" >
<a href="javascript:;">编辑</a> <a href="javascript:;">选择</a>
</a-menu-item> </a-menu-item>
<a-menu-item @click="deletePlan(item.id)"> <a-menu-item>
<a href="javascript:;">删除</a> <a href="javascript:;">编辑</a>
</a-menu-item> </a-menu-item>
<a-menu-item @click="deletePlan(item.id)">
<a href="javascript:;">删除</a>
</a-menu-item>
</a-menu> </a-menu>
</template> </template>
</a-dropdown> </a-dropdown>
@ -106,7 +109,12 @@
<img src="/public/iocn/uav.png" alt=""> <img src="/public/iocn/uav.png" alt="">
{{item.uavId}} {{item.uavId}}
</div> </div>
<div class="time">更新时间{{item.createTime}}</div> <div class="time">
<div>
更新时间{{item.createTime}}
</div>
</div>
</div> </div>
</div> </div>
</div> </div>
@ -446,6 +454,8 @@
.ari-line .time{ .ari-line .time{
font-size: 12px; font-size: 12px;
color:#ccc; color:#ccc;
display:flex;
line-height:24px;
} }
.import-airline{ .import-airline{

@ -1,17 +1,17 @@
<template> <template>
<div class="containner"> <div class="containner">
<div class="title"> <div class="title">
<LeftOutlined /> <LeftOutlined @click="backPage" />
<div>航点航线</div> <div>航点航线</div>
<SaveOutlined @click="saveAirLine"/> <SaveOutlined @click="saveAirLine"/>
<a-button type="primary" @click="areaOptionsShow = !areaOptionsShow"> <a-button type="primary" size="middle" @click="areaOptionsShow = !areaOptionsShow">
航线设置 航线设置
<DownOutlined /> <ControlOutlined />
</a-button> </a-button>
<div style="flex:1;"> <div style="flex:1;">
<a-input size="middle" placeholder="航线名称" /> <a-input size="middle" v-model:value="submitForm.airLineName" placeholder="航线名称" />
</div> </div>
</div> </div>
@ -200,19 +200,20 @@
</div> </div>
</div> </div>
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import {ref,defineEmits,defineProps} from 'vue' import {ref,defineEmits,defineProps} from 'vue'
import { SaveOutlined,LeftOutlined,AppstoreOutlined,DownOutlined} from '@ant-design/icons-vue'; import { SaveOutlined,LeftOutlined,AppstoreOutlined,DownOutlined,ControlOutlined} from '@ant-design/icons-vue';
import { XMLParser, XMLBuilder } from 'fast-xml-parser'; import { XMLParser, XMLBuilder } from 'fast-xml-parser';
import {uploadXmlFile} from '@/api/sys/workplan'; import {uploadXmlFile,addAirLine} from '@/api/sys/workplan';
import { Modal, message } from 'ant-design-vue';
import {missionConfigOptions,folderConfigOptions} from '../waylineConfig/index.ts'; import {missionConfigOptions,folderConfigOptions} from '../waylineConfig/index.ts';
const emits = defineEmits(["setFlyPoint","checkPoint"]) const emits = defineEmits(["setFlyPoint","checkPoint","exitDraw"])
const props = defineProps(["airPoints","airInfo","polygonAirForm"]) const props = defineProps(["airPoints","airInfo","polygonAirForm"])
@ -350,11 +351,11 @@ const handlerPointInfo = ()=>{
"executeHeight": item.alt, "executeHeight": item.alt,
"waypointSpeed": 10, "waypointSpeed": 10,
"waypointHeadingParam": { "waypointHeadingParam": {
"waypointHeadingMode": "followWayline", "waypointHeadingMode": "followWayline", //
"waypointHeadingAngle": 0, "waypointHeadingAngle": 0, // [-180, 180] wpml:waypointHeadingModesmoothTransition
"waypointPoiPoint": "0.000000,0.000000,0.000000", "waypointPoiPoint": "0.000000,0.000000,0.000000", // wpml:waypointHeadingModetowardPOI
"waypointHeadingAngleEnable": 0, "waypointHeadingAngleEnable": 0,
"waypointHeadingPathMode": "followBadArc", "waypointHeadingPathMode": "followBadArc", //
"waypointHeadingPoiIndex": 0 "waypointHeadingPoiIndex": 0
}, },
"waypointTurnParam": { "waypointTurnParam": {
@ -407,9 +408,9 @@ const handlerPointInfo = ()=>{
} }
] ]
}, },
"waypointGimbalHeadingParam": { "waypointGimbalHeadingParam": { //
"waypointGimbalPitchAngle": 0, "waypointGimbalPitchAngle": 0, // [-90, -30]
"waypointGimbalYawAngle": 0 "waypointGimbalYawAngle": 0 //
}, },
"isRisky": 0, "isRisky": 0,
"waypointWorkType": 0 "waypointWorkType": 0
@ -430,6 +431,11 @@ const waylinesJson = ref(
} }
) )
// 退
const backPage = ()=>{
emits("exitDraw")
}
// 线 // 线
const saveAirLine = ()=>{ const saveAirLine = ()=>{
@ -449,9 +455,8 @@ const saveAirLine = ()=>{
console.log("xmlString3",xmlString3); console.log("xmlString3",xmlString3);
alert(xmlString3);
return null;
return null;
handlerCreateFile(xmlString3); handlerCreateFile(xmlString3);
} }
@ -475,12 +480,31 @@ const handlerPrefixWpml = (obj) => {
} }
} }
obj[key] = newAttrs; obj[key] = newAttrs;
} }
} }
return obj; return obj;
} }
//
const submitForm = ref({
"id": "",
"airLineName": null,
"airLineType": "waypoint",
"uavId": "",
"flyToFirstPointMode": "",
"safeTakeoffAltitude": 0,
"safeTakeoffSpeed": 0,
"globalRouteSpeed": 0,
"taskCompletionAction": "",
"outOfControlOption": "",
"typeOfOutOfControlAction": "",
"globalWayPointType": "",
"ptzControlMode": "",
"aircraftYawAngleMode": "",
"wpml": ""
})
// xml // xml
const handlerCreateFile =async (content)=>{ const handlerCreateFile =async (content)=>{
@ -489,16 +513,29 @@ const handlerCreateFile =async (content)=>{
// FormData // FormData
const formData = new FormData(); const formData = new FormData();
console.log("blob",blob);
formData.append('xmlFile', blob); formData.append('xmlFile', blob);
let res = await uploadXmlFile(formData); let res = await uploadXmlFile(formData);
if(res){ if(res){
} submitForm.value.wpml = res.path;
let addAirLineRes =await addAirLine(submitForm.value);
if(addAirLineRes){
message.success("操作成功!");
backPage();
}else{
message.error("操作失败!");
}
}else{
message.error("操作失败!");
}
} }
@ -516,7 +553,7 @@ const handlerCreateFile =async (content)=>{
color:#ffffff; color:#ffffff;
display:flex; display:flex;
gap:12px; gap:12px;
line-height:24px; line-height:32px;
} }
.area-info{ .area-info{

@ -1,7 +1,7 @@
<template> <template>
<div class="containner"> <div class="containner">
<div class="title"> <div class="title">
<LeftOutlined /> <LeftOutlined @click="backPage" />
<div>面状航线</div> <div>面状航线</div>
<SaveOutlined/> <SaveOutlined/>
@ -32,7 +32,8 @@
</div> </div>
<div class="area-options"> <div class="area-options" >
<div class="item"> <div class="item">
<div class="label">参考起飞点</div> <div class="label">参考起飞点</div>
<div class="content"> <div class="content">
@ -42,76 +43,120 @@
</a-button> </a-button>
</div> </div>
</div> </div>
<div class="item flex-column"> <div class="item flex-column">
<div class="label">选择镜头</div> <div class="label">飞向首航点模式</div>
<div class="content"> <div class="content">
<a-radio-group button-style="solid" v-model:value="props.polygonAirForm.lensMode"> <div class="radio-box">
<a-radio-button :value="1">红外</a-radio-button> <div v-for="(item,index) in missionConfigOptions.flyToWaylineMode" :key="index"
<a-radio-button :value="2">可见光</a-radio-button> :class=" missionConfig.flyToWaylineMode == item.value ? 'radio-item-active':'radio-item'"
</a-radio-group> @click="missionConfig.flyToWaylineMode = item.value"
>
{{item.label}}
</div>
</div>
</div>
<div class="description">
<img src="/map/flyToWaylineMode.png" alt="">
</div> </div>
</div> </div>
<div class="item flex-column">
<div class="label">采集方式</div> <div class="item">
<div class="label">安全起飞高度</div>
<div class="content"> <div class="content">
<a-radio-group button-style="solid" v-model:value="props.polygonAirForm.gatherMode"> <a-input style="width:100px;" placeholder="" v-model:value="missionConfig.takeOffSecurityHeight"></a-input>
<a-radio-button :value="1">正射采集</a-radio-button>
<a-radio-button :value="2">倾斜采集</a-radio-button>
</a-radio-group>
</div> </div>
<div class="unit"> m</div>
</div> </div>
<div class="item"> <div class="item">
<div class="label">智能摆动拍摄</div> <div class="label">全局航线过渡速度</div>
<div class="content">
<a-input style="width:100px;" placeholder="" v-model:value="missionConfig.globalTransitionalSpeed"></a-input>
</div>
<div class="unit"> m/s</div>
</div> </div>
<div class="item flex-column">
<div class="label">航线高度模式</div> <div class="item">
<div class="label">全局返航高度</div>
<div class="content"> <div class="content">
<a-radio-group button-style="solid" v-model:value="props.polygonAirForm.heightMode"> <a-input style="width:100px;" placeholder="" v-model:value="missionConfig.droneInfo.droneEnumValue"></a-input>
<a-radio-button :value="1">海拔高度</a-radio-button>
<a-radio-button :value="2">相对起点高度</a-radio-button>
<a-radio-button :value="3">相对地形高度</a-radio-button>
</a-radio-group>
<div style="margin-top:12px;">
<a-input-number v-model:value="props.polygonAirForm.height" :min="1" :max="100000" />
</div>
</div> </div>
<div class="unit"> m</div>
</div>
<div class="item flex-column">
<div class="label">航线结束动作</div>
<div class="content">
<div class="radio-box">
<div v-for="(item,index) in missionConfigOptions.finishAction" :key="index"
:class=" missionConfig.finishAction == item.value ? 'radio-item-active':'radio-item'"
@click="missionConfig.finishAction = item.value"
>
{{item.label}}
</div>
</div>
</div>
</div> </div>
<div class="item">
<div class="label">全局航线速度</div> <div class="item flex-column">
<div class="label">失控是否继续执行航线</div>
<div class="content"> <div class="content">
<a-input-number style="width:160px" v-model:value="props.polygonAirForm.speed" :min="1" :max="20" /> <div class="radio-box">
<div v-for="(item,index) in missionConfigOptions.exitOnRCLost" :key="index"
:class=" missionConfig.exitOnRCLost == item.value ? 'radio-item-active':'radio-item'"
@click="missionConfig.exitOnRCLost = item.value"
>
{{item.label}}
</div>
</div>
</div> </div>
</div> </div>
<div class="item">
<div class="label"> 主航线角度</div> <div class="item flex-column" v-if="missionConfig.exitOnRCLost == 'executeLostAction'">
<div class="label">失控动作类型</div>
<div class="content"> <div class="content">
<a-input-number width="160px" v-model:value="props.polygonAirForm.angle" :min="0" :max="180" /> <div class="radio-box">
<div v-for="(item,index) in missionConfigOptions.executeRCLostAction" :key="index"
:class=" missionConfig.executeRCLostAction == item.value ? 'radio-item-active':'radio-item'"
@click="missionConfig.executeRCLostAction = item.value"
>
{{item.label}}
</div>
</div>
</div> </div>
</div> </div>
<div class="item">
<div class="label"> 高程优化</div> <div class="item flex-column">
<div class="label">高度模式</div>
<div class="content">
<div class="radio-box">
<div v-for="(item,index) in folderConfigOptions.executeHeightMode" :key="index"
:class=" folder.executeHeightMode == item.value ? 'radio-item-active':'radio-item'"
@click="folder.executeHeightMode = item.value"
>
{{item.label}}
</div>
</div>
</div>
<div class="description">
<img src="/map/executeHeightMode.png" alt="">
</div>
</div> </div>
<div class="item"> <div class="item">
<div class="label"> 完成动作</div> <div class="label">全局航线飞行速度</div>
<div class="content"> <div class="content">
<a-input style="width:100px;" placeholder="" v-model:value="folder.autoFlightSpeed"></a-input>
<a-select
ref="select"
style="width:160px;"
v-model:value="props.polygonAirForm.complete"
>
<a-select-option :value="1">自动返航</a-select-option>
<a-select-option :value="2">返回航线起始点悬停</a-select-option>
<a-select-option :value="3">退出航线模式</a-select-option>
<a-select-option :value="4">原地降落</a-select-option>
</a-select>
</div> </div>
<div class="unit"> m/s</div>
</div> </div>
</div> </div>
@ -120,7 +165,9 @@
<script lang="ts" setup> <script lang="ts" setup>
import {ref,defineEmits,defineProps} from 'vue' import {ref,defineEmits,defineProps} from 'vue'
import { SaveOutlined,LeftOutlined } from '@ant-design/icons-vue'; import { SaveOutlined,LeftOutlined } from '@ant-design/icons-vue';
const emits = defineEmits(["setFlyPoint"]) import {missionConfigOptions,folderConfigOptions} from '../waylineConfig/index.ts';
const emits = defineEmits(["setFlyPoint","exitDraw"])
const props = defineProps(["airInfo","polygonAirForm"]) const props = defineProps(["airInfo","polygonAirForm"])
@ -135,6 +182,46 @@ const setFlyPoint = ()=>{
emits("setFlyPoint"); emits("setFlyPoint");
} }
// 线
const missionConfig = ref(
{
"flyToWaylineMode": "safely",
"finishAction": "goHome",
"exitOnRCLost": "executeLostAction",
"executeRCLostAction": "goBack",
"takeOffSecurityHeight": 20,
"globalTransitionalSpeed": 15,
"globalRTHHeight": 100,
"droneInfo": {
"droneEnumValue": 100,
"droneSubEnumValue": 1
},
"waylineAvoidLimitAreaMode": 0,
"payloadInfo": {
"payloadEnumValue": 99,
"payloadSubEnumValue": 2,
"payloadPositionIndex": 0
}
}
)
//
const folder = ref({
"templateId": 0,
"executeHeightMode": "WGS84",
"waylineId": 0,
"distance": 410.047576904297,
"duration": 80.3239784240723,
"autoFlightSpeed": 10,
"Placemark": []
})
// 退
const backPage = ()=>{
emits("exitDraw")
}
</script> </script>
<style scoped> <style scoped>
.container{ .container{
@ -195,6 +282,32 @@ const setFlyPoint = ()=>{
gap:10px; gap:10px;
} }
.radio-box{
width:100%;
display: flex;
overflow: hidden;
border:0.5px solid #3B4154 ;
font-size:12px;
}
.radio-box .radio-item{
flex:1;
color:#8A92A6 ;
text-align: center;
background:#222738 ;
cursor:pointer;
}
.radio-box .radio-item-active{
flex:1;
color:#fff;
text-align: center;
background:#3A57E8 ;
cursor:pointer;
}
::v-deep .ant-radio-group { ::v-deep .ant-radio-group {
display: block; display: block;
width: 100%; width: 100%;

@ -3,12 +3,12 @@
<!-- 航点航线 --> <!-- 航点航线 -->
<div v-if="props.airRoute.airLineType == '航点航线'" class="air-container"> <div v-if="props.airRoute.airLineType == '航点航线'" class="air-container">
<airPoint :airPoints="airPoints" @setFlyPoint="setFlyPoint" :airInfo="lineInfo" :polygonAirForm="polygonAirForm" @checkPoint="checkPoint"></airPoint> <airPoint :airPoints="airPoints" @setFlyPoint="setFlyPoint" @exitDraw="exitDraw" :airInfo="lineInfo" :polygonAirForm="polygonAirForm" @checkPoint="checkPoint"></airPoint>
</div> </div>
<!-- 航面航线 --> <!-- 航面航线 -->
<div v-if="props.airRoute.airLineType == '面状航线'" class="airpolygon-container"> <div v-if="props.airRoute.airLineType == '面状航线'" class="airpolygon-container">
<airPolygon @setFlyPoint="setFlyPoint" :airInfo="airInfo" :polygonAirForm="polygonAirForm"></airPolygon> <airPolygon @setFlyPoint="setFlyPoint" :airInfo="airInfo" :polygonAirForm="polygonAirForm" @exitDraw="exitDraw"></airPolygon>
</div> </div>
<!-- 航点航线配置 --> <!-- 航点航线配置 -->
@ -19,7 +19,7 @@
</div> </div>
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import {ref,onMounted,defineProps,watch} from 'vue' import {ref,onMounted,defineProps,watch,defineEmits} from 'vue'
import { message } from 'ant-design-vue'; import { message } from 'ant-design-vue';
import { GeojsonToWkt } from '@/components/MapboxMaps/src/WktGeojsonTransform'; import { GeojsonToWkt } from '@/components/MapboxMaps/src/WktGeojsonTransform';
import {buildUUID} from '@/utils/uuid' import {buildUUID} from '@/utils/uuid'
@ -32,7 +32,7 @@ import * as turf from '@turf/turf'
import airPolygon from './airPolygon.vue' import airPolygon from './airPolygon.vue'
import airPointConfig from './airPointConfig.vue' import airPointConfig from './airPointConfig.vue'
const props = defineProps(["airRoute"]); const props = defineProps(["airRoute","flyToTherePosition"]);
watch( watch(
()=> props.airRoute, ()=> props.airRoute,
@ -41,6 +41,8 @@ watch(
} }
) )
const emits = defineEmits(["exitDraw","flyToThere"])
@ -74,6 +76,8 @@ const checkPoint = (e)=>{
let map: mars3d.Map; // let map: mars3d.Map; //
let graphicLayer:mars3d.layer.GraphicLayer; let graphicLayer:mars3d.layer.GraphicLayer;
let uavGraphicLayer:mars3d.layer.GraphicLayer;
// 线 // 线
let polygonGraphicLayer:mars3d.layer.GraphicLayer; let polygonGraphicLayer:mars3d.layer.GraphicLayer;
@ -81,6 +85,19 @@ let polygonLineGraphicLayer:mars3d.layer.GeoJsonLayer;
let graphic = null; let graphic = null;
const exitDraw = () => {
//
graphicLayer ? graphicLayer.clear() : null;
polygonGraphicLayer ? polygonGraphicLayer.clear() : null;
polygonLineGraphicLayer ? polygonLineGraphicLayer.clear() : null;
airPoints.value = [];
props.airRoute.airLineType = null;
airPointConfigShow.value = false;
emits("exitDraw");
}
// 线 // 线
const lineInfo = ref({ const lineInfo = ref({
count:0, count:0,
@ -346,7 +363,7 @@ const initMap = ()=>{
graphicLayer.bindContextMenu([ graphicLayer.bindContextMenu([
{ {
text: "删除航点", text: "删除",
icon: "fa fa-camera-retro", // font-class icon: "fa fa-camera-retro", // font-class
callback: (e) => { callback: (e) => {
deleteAirPoint(e); deleteAirPoint(e);
@ -375,6 +392,14 @@ const initMap = ()=>{
// //
const handlerBindMapMenus = ()=>{ const handlerBindMapMenus = ()=>{
const mapContextmenuItems = [ const mapContextmenuItems = [
{
text: "飞行到此处",
icon: "fa fa-camera-retro", // font-class
callback: (e) => {
flyToThere(e);
}
},
{ {
text: "添加航点", text: "添加航点",
icon: "fa fa-camera-retro", // font-class icon: "fa fa-camera-retro", // font-class
@ -443,8 +468,8 @@ const handlerDrawPoint = (e) => {
style: { style: {
angle1: 30, // 1 angle1: 30, // 1
angle2: 30, // 2 angle2: 30, // 2
length: 50, // length: 10, //
rayEllipsoid: true, rayEllipsoid: false,
color: "rgba(0,255,255,0.3)", color: "rgba(0,255,255,0.3)",
outline: true, outline: true,
topShow: true, topShow: true,
@ -452,12 +477,9 @@ const handlerDrawPoint = (e) => {
flat: true, flat: true,
cameraHpr: true, cameraHpr: true,
heading: 0, heading: 0,
pitch: 180, pitch: 90, // 0 - 360
roll: 0, // roll: 0,
clippingPlanes: [{
distance: 0, // 0
normal: new Cesium.Cartesian3(0, 0, -1) //
}]
} }
}) })
graphicLayer.addGraphic(rectSensor) graphicLayer.addGraphic(rectSensor)
@ -901,6 +923,66 @@ const deleteAirPoint = (e)=>{
// 线 // 线
handlerDrawLine() handlerDrawLine()
}
//
const flyToThere = (e) => {
if(!uavGraphicLayer){
uavGraphicLayer = new mars3d.layer.GraphicLayer({
isAutoEditing: true //
});
map.addLayer(uavGraphicLayer);
uavGraphicLayer.bindContextMenu([
])
}
let position = mars3d.LngLatPoint.fromCartesian(e.position);
emits("flyToThere",position)
let mark = graphicLayer.getGraphicById("flytothere");
if(mark){
graphicLayer.removeGraphic(mark);
}
//
const graphic = new mars3d.graphic.BillboardEntity({
id:"flytothere",
name: "标点",
position: [position._lng,position._lat,position._alt],
style: {
image: "/map/start-point.png",
scale: 0.5,
horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
label: {
text: "标点",
font_size: 14,
color: "#ffffff",
outline: true,
outlineColor: "#000000",
pixelOffsetY: -40
}
},
})
const pointEdit = new mars3d.thing.MatrixMove2({
position: graphic.position
})
map.addThing(pointEdit)
pointEdit.on(mars3d.EventType.change, (event) => {
graphic.position = event.position
})
uavGraphicLayer.addGraphic(graphic);
} }
</script> </script>

@ -1,7 +1,7 @@
<template> <template>
<div> <div>
<div style="width:100%;height: calc( 100vh - 80px);" > <div style="width:100%;height: calc( 100vh - 80px);" >
<Map :airRoute="airRoute"></Map> <Map :airRoute="airRoute" @exitDraw="exitDraw" @flyToThere="flyToThere"></Map>
</div> </div>
<!-- 工作计划列表 --> <!-- 工作计划列表 -->
@ -43,6 +43,15 @@ import AirPolygon from './components/airPolygon.vue';
const airRoute = ref({}) const airRoute = ref({})
const flyToTherePosition = ref({
lng:null,
lat:null,
alt:null,
})
const flyToThere = (e)=>{
console.log(e);
}
const planListShow = ref(true); const planListShow = ref(true);
const workPlanFormShow = ref(false); const workPlanFormShow = ref(false);
const ariLineShow = ref(false); const ariLineShow = ref(false);
@ -116,4 +125,12 @@ const successCreatePlan = ()=>{
aircraftShow.value = false; aircraftShow.value = false;
planListShow.value = true; planListShow.value = true;
} }
// 线退
const exitDraw = ()=>{
planListShow.value = false;
workPlanFormShow.value = true;
ariLineShow.value = true;
}
</script> </script>

@ -114,4 +114,31 @@ export const folderConfigOptions = {
value:"realTimeFollowSurface" value:"realTimeFollowSurface"
} }
] ]
}
// 飞行器信息
export const pointConfigOptions = {
waypointHeadingMode:[ // 飞行器偏航角模式
{
label:"沿航线方向",
value:"followWayline"
},{
label:"手动控制",
value:"manually"
},{
label:"锁定当前偏航角",
value:"smoothTransition"
},{
label:"自定义",
value:"smoothTransition",
},{
label:"朝向兴趣点",
value:"towardPOI",
}
],
waypointHeadingPathMode:[ // 飞行器偏航角转动方向
],
} }

@ -129,40 +129,40 @@
"actionTriggerType": "reachPoint" "actionTriggerType": "reachPoint"
}, },
"action": [ "action": [
{ {
"actionId": 0, "actionId": 0,
"actionActuatorFunc": "rotateYaw", "actionActuatorFunc": "rotateYaw",
"actionActuatorFuncParam": { "actionActuatorFuncParam": {
"aircraftHeading": 0, "aircraftHeading": 0,
"aircraftPathMode": "counterClockwise" "aircraftPathMode": "counterClockwise"
}
},
{
"actionId": 1,
"actionActuatorFunc": "gimbalRotate",
"actionActuatorFuncParam": {
"gimbalHeadingYawBase": "north",
"gimbalRotateMode": "absoluteAngle",
"gimbalPitchRotateEnable": 1,
"gimbalPitchRotateAngle": 0,
"gimbalRollRotateEnable": 0,
"gimbalRollRotateAngle": 0,
"gimbalYawRotateEnable": 0,
"gimbalYawRotateAngle": 0,
"gimbalRotateTimeEnable": 0,
"gimbalRotateTime": 0,
"payloadPositionIndex": 0
}
},
{
"actionId": 2,
"actionActuatorFunc": "zoom",
"actionActuatorFuncParam": {
"focalLength": 24,
"isUseFocalFactor": 0,
"payloadPositionIndex": 0
}
} }
},
{
"actionId": 1,
"actionActuatorFunc": "gimbalRotate",
"actionActuatorFuncParam": {
"gimbalHeadingYawBase": "north",
"gimbalRotateMode": "absoluteAngle",
"gimbalPitchRotateEnable": 1,
"gimbalPitchRotateAngle": 0,
"gimbalRollRotateEnable": 0,
"gimbalRollRotateAngle": 0,
"gimbalYawRotateEnable": 0,
"gimbalYawRotateAngle": 0,
"gimbalRotateTimeEnable": 0,
"gimbalRotateTime": 0,
"payloadPositionIndex": 0
}
},
{
"actionId": 2,
"actionActuatorFunc": "zoom",
"actionActuatorFuncParam": {
"focalLength": 24,
"isUseFocalFactor": 0,
"payloadPositionIndex": 0
}
}
] ]
}, },
"waypointGimbalHeadingParam": { "waypointGimbalHeadingParam": {

Loading…
Cancel
Save