merge
parent
c60602277d
commit
947d9707d0
|
|
@ -9,12 +9,14 @@
|
|||
<a-select
|
||||
ref="select"
|
||||
style="width: 185px"
|
||||
v-model:value="pageQuery.UavTypeId"
|
||||
placeholder="全部机型"
|
||||
@change="getAirList"
|
||||
>
|
||||
<a-select-option value="jack">全部机型</a-select-option>
|
||||
<a-select-option value="lucy">经纬 M30 系列</a-select-option>
|
||||
<a-select-option value="disabled">Mavic 3 行业系列</a-select-option>
|
||||
<a-select-option value="Yiminghe">Matrice 3D 系列</a-select-option>
|
||||
<a-select-option :value="null">全部机型</a-select-option>
|
||||
<a-select-option :value="2">经纬 M30 系列</a-select-option>
|
||||
<a-select-option :value="3">Mavic 3 行业系列</a-select-option>
|
||||
<a-select-option :value="4">Matrice 3D 系列</a-select-option>
|
||||
</a-select>
|
||||
</div>
|
||||
|
||||
|
|
@ -23,23 +25,25 @@
|
|||
ref="select"
|
||||
style="width: 185px"
|
||||
placeholder="时间排序"
|
||||
v-model:value="pageQuery.Ascending"
|
||||
@change="getAirList"
|
||||
>
|
||||
<a-select-option value="jack">时间倒序</a-select-option>
|
||||
<a-select-option value="lucy">时间正序</a-select-option>
|
||||
<a-select-option :value="true">时间正序</a-select-option>
|
||||
<a-select-option :value="false">时间倒序</a-select-option>
|
||||
</a-select>
|
||||
</div>
|
||||
|
||||
<div class="filter-buttons">
|
||||
<div class="filter-button">
|
||||
<div class="filter-buttons" >
|
||||
<div class="filter-button" @click="pageQuery.AirLineType = 'waypoint';getAirList();">
|
||||
<svg t="1749104723424" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="7226" width="24" height="24"><path d="M784 454.4c-28.8 0-54.4 12.8-70.4 35.2L326.4 352l188.8-134.4c12.8 6.4 25.6 12.8 41.6 12.8 48 0 86.4-38.4 86.4-86.4S608 64 560 64s-86.4 38.4-86.4 86.4c0 9.6 3.2 16 3.2 25.6l-179.2 128c-12.8-19.2-35.2-28.8-57.6-28.8-48 0-86.4 38.4-86.4 86.4S192 448 240 448c25.6 0 51.2-12.8 67.2-32l352 124.8L320 608c-12.8-32-41.6-57.6-80-57.6-48 0-86.4 38.4-86.4 86.4s38.4 86.4 86.4 86.4c35.2 0 64-19.2 76.8-51.2l396.8-83.2c16 22.4 41.6 38.4 70.4 38.4 48 0 86.4-38.4 86.4-86.4 0-48-38.4-86.4-86.4-86.4z m-224-342.4c19.2 0 35.2 16 35.2 35.2s-16 35.2-35.2 35.2c-19.2 0-35.2-16-35.2-35.2s16-35.2 35.2-35.2z m-320 284.8c-19.2 0-35.2-16-35.2-35.2s16-35.2 35.2-35.2 35.2 16 35.2 35.2-16 35.2-35.2 35.2z m0 275.2c-19.2 0-35.2-16-35.2-35.2s16-35.2 35.2-35.2 35.2 16 35.2 35.2S259.2 672 240 672z m544-92.8c-19.2 0-35.2-16-35.2-35.2 0-19.2 16-35.2 35.2-35.2 19.2 0 35.2 16 35.2 35.2 0 16-16 35.2-35.2 35.2z m-246.4 182.4l-150.4-51.2c-35.2-12.8-67.2 22.4-57.6 57.6l51.2 150.4c12.8 38.4 67.2 41.6 83.2 3.2l25.6-54.4 54.4-25.6c35.2-16 35.2-67.2-6.4-80z m-76.8 57.6c-9.6 3.2-19.2 12.8-22.4 22.4l-12.8 32-35.2-102.4 102.4 35.2-32 12.8z" p-id="7227" fill="#ffffff"></path></svg>
|
||||
</div>
|
||||
<div class="filter-button">
|
||||
<div class="filter-button" @click="pageQuery.AirLineType = 'mapping2d';getAirList();">
|
||||
<svg t="1749104746320" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="7498" width="24" height="24"><path d="M918.485333 261.930667L857.813333 208.64a20.992 20.992 0 0 0-27.008 0L770.133333 261.973333a15.36 15.36 0 0 0 0 23.68 20.48 20.48 0 0 0 13.482667 4.906667 20.48 20.48 0 0 0 13.525333-4.906667l15.36-13.482666v141.994666c0 15.402667 14.250667 27.904 31.786667 27.904 17.578667 0 31.829333-12.501333 31.829333-27.904V272.128l15.36 13.482667a20.48 20.48 0 0 0 13.482667 4.906666 20.48 20.48 0 0 0 13.525333-4.906666 15.36 15.36 0 0 0 0-23.68z m-277.461333 159.146666c0 15.445333 14.250667 27.946667 31.829333 27.946667s31.829333-12.501333 31.829334-27.946667V346.325333c0-31.786667-11.349333-61.952-31.914667-84.906666a115.328 115.328 0 0 0-85.632-38.698667c-32.426667 0-63.573333 14.08-85.632 38.698667a126.848 126.848 0 0 0-31.914667 84.906666v335.530667c0 36.693333-24.704 67.754667-53.888 67.754667-29.226667 0-53.930667-31.061333-53.930666-67.754667V355.498667l0.469333-7.68 0.042667-1.493334c0-31.786667-11.306667-61.952-31.914667-84.906666a115.328 115.328 0 0 0-85.632-38.698667c-32.384 0-63.573333 14.08-85.632 38.698667a126.848 126.848 0 0 0-31.914667 84.906666v138.496c0 15.402667 14.250667 27.904 31.829334 27.904s31.829333-12.501333 31.829333-27.904V346.325333c0-36.693333 24.704-67.754667 53.888-67.754666 29.013333 0 53.589333 30.634667 53.930667 67.072l-0.512 8.405333v327.808c0 31.786667 11.306667 61.952 31.914666 84.906667a115.328 115.328 0 0 0 85.632 38.698666c32.384 0 63.573333-14.08 85.632-38.698666a126.848 126.848 0 0 0 31.914667-84.906667V346.325333c0-36.693333 24.661333-67.754667 53.888-67.754666 29.226667 0 53.888 31.018667 53.888 67.754666V421.12z" p-id="7499" fill="#ffffff"></path><path d="M858.453333 786.432l72.106667-122.624a27.861333 27.861333 0 0 0 0-28.288l-72.106667-122.624a28.928 28.928 0 0 0-24.96-14.165333h-144.128a28.928 28.928 0 0 0-24.96 14.165333l-72.106666 122.624a27.861333 27.861333 0 0 0 0 28.288l72.106666 122.624c5.12 8.746667 14.634667 14.165333 24.96 14.165333h144.128a28.928 28.928 0 0 0 24.96-14.165333z m-152.32-231.04h110.805334l55.466666 94.293333-55.466666 94.293334H706.133333l-55.424-94.293334 55.466667-94.293333z" p-id="7500" fill="#ffffff"></path><path d="M703.786667 650.410667a57.173333 57.173333 0 0 0 57.642666 56.618666 57.173333 57.173333 0 0 0 57.642667-56.618666 57.173333 57.173333 0 0 0-57.642667-56.618667 57.173333 57.173333 0 0 0-57.642666 56.618667z m57.6 14.165333q1.408 0 2.816-0.298667 1.408-0.256 2.688-0.810666 1.322667-0.512 2.517333-1.28 1.194667-0.768 2.176-1.749334 1.024-1.024 1.792-2.133333 0.810667-1.194667 1.322667-2.474667 0.554667-1.28 0.853333-2.645333 0.256-1.365333 0.256-2.773333t-0.256-2.773334q-0.298667-1.365333-0.853333-2.645333-0.512-1.28-1.28-2.432-0.853333-1.194667-1.834667-2.133333-0.981333-1.024-2.176-1.792-1.194667-0.768-2.517333-1.28-1.28-0.554667-2.688-0.853334-1.408-0.256-2.816-0.256t-2.816 0.256q-1.365333 0.298667-2.688 0.853334-1.28 0.512-2.517334 1.28-1.152 0.768-2.133333 1.749333-1.024 0.981333-1.834667 2.133333-0.768 1.194667-1.322666 2.474667-0.554667 1.28-0.853334 2.645333-0.256 1.365333-0.256 2.773334t0.298667 2.773333q0.256 1.365333 0.810667 2.645333t1.322666 2.432q0.810667 1.152 1.792 2.133334 1.024 1.024 2.176 1.792 1.194667 0.768 2.517334 1.28 1.28 0.554667 2.688 0.853333 1.408 0.256 2.816 0.256z" p-id="7501" fill="#ffffff"></path><path d="M162.389333 510.464a43.690667 43.690667 0 1 1 0 87.381333 43.690667 43.690667 0 0 1 0-87.381333z m0-37.632c-44.8 0-81.322667 36.48-81.322666 81.322667 0 44.8 36.48 81.322667 81.322666 81.322666s81.322667-36.48 81.322667-81.322666-36.48-81.322667-81.322667-81.322667z" p-id="7502" fill="#ffffff"></path><path d="M234.112 554.154667q0-29.653333-21.034667-50.688t-50.688-21.034667q-29.653333 0-50.688 21.034667-20.992 21.034667-20.992 50.688t20.992 50.645333q21.034667 21.034667 50.688 21.034667t50.688-21.034667q21.034667-20.992 21.034667-50.645333z m19.2 0q0 37.589333-26.666667 64.256-26.624 26.666667-64.256 26.666666-37.589333 0-64.256-26.666666t-26.666666-64.256q0-37.632 26.666666-64.256 26.666667-26.666667 64.256-26.666667 37.632 0 64.256 26.666667 26.666667 26.624 26.666667 64.256z m-144.213333 0q0-22.101333 15.616-37.717334t37.674666-15.616q22.101333 0 37.717334 15.616t15.616 37.717334q0 22.058667-15.616 37.674666t-37.717334 15.616q-22.058667 0-37.674666-15.616t-15.616-37.674666z m19.2 0q0 14.08 9.984 24.106666 9.984 9.984 24.106666 9.984 14.122667 0 24.106667-9.984 9.984-9.984 9.984-24.106666 0-14.122667-9.984-24.106667-9.984-9.984-24.106667-9.984-14.08 0-24.106666 9.984-9.984 9.984-9.984 24.106667z" p-id="7503" fill="#ffffff"></path></svg>
|
||||
</div>
|
||||
<div class="filter-button">
|
||||
<svg t="1749104685102" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6766" width="24" height="24"><path d="M712.313523 0.469118v51.176544c-208.544417 0-446.600641 148.795802-446.600641 279.040107 0 41.197118 9.552955 70.367748 31.68681 107.342801l7.25001 11.600017 17.314731 27.422098 3.497064 5.714714c31.729457 53.820666 34.075049 100.007497-2.004415 164.959061-51.38978 92.458956-145.682562 173.914956-282.281288 244.965057l-18.039731 9.211778L0.234559 856.098288c137.920786-68.960393 230.507684-146.919329 278.485694-233.237099 26.867686-48.404481 25.502978-75.314814 2.644122-114.123694l-21.579443-34.20299-6.22648-10.107367c-26.611803-44.438299-39.022115-81.882471-39.022114-133.741369 0-162.059056 255.669485-324.629878 485.878638-330.088709L712.313523 0.469118z m49.470659 185.514973l22.901504 45.717712-18.892674 9.638249-16.845613 9.083837c-68.661863 38.126525-82.053059 63.288326-72.329516 121.757528 3.539711 21.110324 17.442672 42.775061 44.566241 71.092749l8.316188 8.529424 9.595602 9.425014 31.089751 29.852984c59.876557 57.744201 90.3266 98.514847 104.058973 153.231102 20.129441 80.645704 21.408854 148.326684 2.857357 203.000292l-3.966182 10.747074-47.508892-19.020616c18.039732-45.120653 18.039732-105.850152-1.066178-182.316438-10.022073-40.088293-33.307401-72.926575-80.219233-119.411936l-42.34859-40.813294-12.282371-12.154429a601.06851 601.06851 0 0 1-5.458831-5.62942c-33.648578-35.141227-52.498605-64.525093-58.128025-98.131023-14.926492-89.644246 14.07355-130.628129 114.592812-183.809088l21.067677-10.832368zM574.904502 797.970264v50.579484h-29.852984v-50.622131h29.852984z m0-136.513432v85.29424h-29.852984v-85.29424h29.852984z m-25.161801-139.882554c14.627962 30.492691 23.072092 58.767731 24.863271 87.511891l-29.852984 1.833826c-1.450002-24.479447-8.827954-49.172129-21.92062-76.466286z m-68.278039-119.028112l7.505893 14.286786 35.269168 58.213318-25.588272 15.352964-31.302986-51.517721a446.856524 446.856524 0 0 1-12.538253-22.858857l26.65445-13.47649zM458.264629 268.719504l25.75886 15.09708a192.082629 192.082629 0 0 0-15.99267 34.927991c-4.264712 12.836783-5.117654 24.820624-2.985298 37.955937l-29.426513 4.861772a106.191329 106.191329 0 0 1 4.136771-52.370663c4.776477-14.07355 11.002957-27.55004 18.50885-40.472117z m104.186914-99.282496l15.011786 25.844155a284.712174 284.712174 0 0 0-64.013327 49.641248l-21.707384-20.513265a314.351922 314.351922 0 0 1 70.708925-54.972138z m131.011953-51.261838l7.25001 29.000041a533.515472 533.515472 0 0 0-78.811878 26.014744l-11.642663-27.507393c25.588272-10.875016 53.436841-20.044146 83.161884-27.507392z" fill="#ffffff" p-id="6767"></path></svg>
|
||||
</div>
|
||||
<div class="filter-button" @click="showSearchInput = !showSearchInput">
|
||||
<div class="filter-button" @click="showSearchInput = !showSearchInput;getAirList();">
|
||||
<svg t="1750122415214" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4744" width="24" height="24"><path d="M670.528 760.96a384 384 0 1 1 90.496-90.496l180.224 180.288a64 64 0 0 1-90.496 90.496l-180.224-180.224zM448 704a256 256 0 1 0 0-512 256 256 0 0 0 0 512z" fill="#ffffff" p-id="4745"></path></svg>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -47,7 +51,8 @@
|
|||
|
||||
<div class="search-container" v-show="showSearchInput">
|
||||
<a-input-search
|
||||
v-model:value="pageQuery.key"
|
||||
v-model:value="pageQuery.AirLineName"
|
||||
@search="getAirList"
|
||||
placeholder="输入路线名称"
|
||||
/>
|
||||
</div>
|
||||
|
|
@ -109,7 +114,7 @@
|
|||
</div>
|
||||
<div class="type" >
|
||||
<img src="/public/iocn/uav.png" alt="">
|
||||
{{item.uavId}}Matrice 4TD
|
||||
Matrice 4TD
|
||||
</div>
|
||||
<div class="time">
|
||||
<div>
|
||||
|
|
@ -355,6 +360,10 @@
|
|||
const ariLineCount = ref(0);
|
||||
|
||||
const pageQuery = ref({
|
||||
Ascending:false,
|
||||
UavTypeId:null,
|
||||
AirLineType:null,
|
||||
AirLineName:null,
|
||||
page:1,
|
||||
limit:10,
|
||||
key:null,
|
||||
|
|
|
|||
|
|
@ -50,7 +50,7 @@
|
|||
<div class="item">
|
||||
<div class="label">GSD(地面采样距离)</div>
|
||||
<div class="content">
|
||||
<a-input style="width:100px;" placeholder="" v-model:value="calculatParam.gsd"></a-input>
|
||||
<a-input style="width:100px;" placeholder="" v-model:value="calculatParam.gsd" @change="onGsdChange"></a-input>
|
||||
</div>
|
||||
<div class="unit"> cm/pixel</div>
|
||||
</div>
|
||||
|
|
@ -58,7 +58,7 @@
|
|||
<div class="item">
|
||||
<div class="label">航线高度</div>
|
||||
<div class="content">
|
||||
<a-input style="width:100px;" placeholder="" v-model:value="calculatParam.height"></a-input>
|
||||
<a-input style="width:100px;" placeholder="" v-model:value="calculatParam.height" @change="onHeightChange"></a-input>
|
||||
</div>
|
||||
<div class="unit"> m</div>
|
||||
</div>
|
||||
|
|
@ -74,7 +74,7 @@
|
|||
<div class="item">
|
||||
<div class="label">旁向重叠率</div>
|
||||
<div class="content">
|
||||
<a-input style="width:100px;" placeholder="" v-model:value="calculatParam.overlapY"></a-input>
|
||||
<a-input style="width:100px;" placeholder="" v-model:value="calculatParam.overlapY" @change="onOverlayYChange"></a-input>
|
||||
</div>
|
||||
<div class="unit"> %</div>
|
||||
</div>
|
||||
|
|
@ -201,13 +201,20 @@
|
|||
</div>
|
||||
</template>
|
||||
<script lang="ts" setup>
|
||||
import {ref,defineEmits,defineProps} from 'vue'
|
||||
import {ref,defineEmits,defineProps,watch} from 'vue'
|
||||
import { SaveOutlined,LeftOutlined } from '@ant-design/icons-vue';
|
||||
import {missionConfigOptions,folderConfigOptions} from '../waylineConfig/index.ts';
|
||||
import {uploadXmlFile,addAirLine} from '@/api/sys/workplan';
|
||||
import { message } from 'ant-design-vue';
|
||||
import { XMLParser, XMLBuilder } from 'fast-xml-parser';
|
||||
const emits = defineEmits(["setFlyPoint","exitDraw"])
|
||||
|
||||
// 航线计算
|
||||
import {uavModel,calculateHeight,calculateGsd,calculateSpacing} from '../lib/calculateAirLine'
|
||||
|
||||
|
||||
|
||||
|
||||
const emits = defineEmits(["setFlyPoint","exitDraw","calculatParamChange"])
|
||||
|
||||
const props = defineProps(["airInfo","polygonAirForm","airPoints","airRoute"])
|
||||
|
||||
|
|
@ -224,13 +231,43 @@ const setFlyPoint = ()=>{
|
|||
|
||||
// 航线计算参数
|
||||
const calculatParam = ref({
|
||||
gsd:5,
|
||||
overlapY:80,
|
||||
overlapX:70,
|
||||
gsd:2,
|
||||
overlapY:70,
|
||||
overlapX:80,
|
||||
overlapAngle:0,
|
||||
height:120,
|
||||
height:0,
|
||||
spacing:0,
|
||||
})
|
||||
|
||||
watch(
|
||||
() => calculatParam.value,
|
||||
(newVal,oldVal) => {
|
||||
emits("calculatParamChange",newVal)
|
||||
},
|
||||
{deep:true}
|
||||
)
|
||||
|
||||
calculatParam.value.height = calculateHeight(calculatParam.value.gsd,uavModel['m4td']);
|
||||
|
||||
calculatParam.value.spacing = calculateSpacing(calculatParam.value.gsd,calculatParam.value.overlapY/100,uavModel['m4td'])
|
||||
|
||||
// gsd改变
|
||||
const onGsdChange = ()=>{
|
||||
calculatParam.value.height = calculateHeight(calculatParam.value.gsd,uavModel['m4td']);
|
||||
onOverlayYChange();
|
||||
}
|
||||
|
||||
// 飞行高度改变
|
||||
const onHeightChange = () => {
|
||||
calculatParam.value.gsd = calculateGsd(calculatParam.value.height,uavModel['m4td']);
|
||||
onOverlayYChange();
|
||||
}
|
||||
|
||||
// 旁像重叠率
|
||||
const onOverlayYChange = ()=>{
|
||||
calculatParam.value.spacing = calculateSpacing(calculatParam.value.gsd,calculatParam.value.overlapY/100,uavModel['m4td'])
|
||||
}
|
||||
|
||||
// 航线基本信息
|
||||
const missionConfig = ref(
|
||||
{
|
||||
|
|
@ -664,13 +701,18 @@ const backPage = ()=>{
|
|||
display: flex;
|
||||
overflow: hidden;
|
||||
border:0.5px solid #3B4154 ;
|
||||
font-size:12px;
|
||||
background:#050608;
|
||||
font-size:13px;
|
||||
border-radius: 19px;
|
||||
height:38px;
|
||||
line-height:38px;
|
||||
}
|
||||
|
||||
|
||||
.radio-box .radio-item{
|
||||
flex:1;
|
||||
color:#8A92A6 ;
|
||||
text-align: center;
|
||||
background:#222738 ;
|
||||
cursor:pointer;
|
||||
|
||||
}
|
||||
|
|
@ -680,6 +722,7 @@ const backPage = ()=>{
|
|||
color:#fff;
|
||||
text-align: center;
|
||||
background:#3A57E8 ;
|
||||
border-radius: 19px;
|
||||
cursor:pointer;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -94,10 +94,45 @@
|
|||
<a-button type="primary" @click="handlerSetTime">选择时间</a-button>
|
||||
</a-form-item>
|
||||
|
||||
<!-- 单次定时 -->
|
||||
<a-form-item v-if="submitForm.periodicFormula == 1" ref="accuracy" label="设置时间" name="accuracy">
|
||||
<a-date-picker style="width:100%;" show-time placeholder="选择时间" @change="onChange" @ok="onOk" />
|
||||
<a-date-picker v-model:value="onceTime" valueFormat="YYYY-MM-DD HH:mm:ss" style="width:100%;" show-time placeholder="选择时间" @change="onOnceTimeChange" />
|
||||
</a-form-item>
|
||||
|
||||
<!-- 重复定时 -->
|
||||
<div v-if="submitForm.periodicFormula == 2">
|
||||
<a-form-item ref="accuracy" label="选择日期" valueFormat="YYYY-M-D" name="accuracy">
|
||||
<a-range-picker v-model:value="repeatTime.date" style="width:100%;" @change="onRepeatDateChange" />
|
||||
</a-form-item>
|
||||
|
||||
<a-form-item ref="accuracy" label="选择时间" name="accuracy">
|
||||
<a-time-picker v-model:value="repeatTime.time" format="HH:mm:ss" valueFormat="H:m:s" style="width:100%;" @change="onRepeatTimeChange" />
|
||||
</a-form-item>
|
||||
|
||||
<a-form-item ref="accuracy" label="重复频率" name="accuracy">
|
||||
<div class="repeat-time">
|
||||
<div>每</div>
|
||||
<div>
|
||||
<a-input v-model:value="repeatTime.count"></a-input>
|
||||
</div>
|
||||
<div>
|
||||
<a-select
|
||||
ref="select"
|
||||
v-model:value="repeatTime.type"
|
||||
@change="handleRepeatTypeChange"
|
||||
>
|
||||
<a-select-option value="date">天</a-select-option>
|
||||
<a-select-option value="week">周</a-select-option>
|
||||
<!-- <a-select-option value="month">月</a-select-option> -->
|
||||
</a-select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="week-container" v-if="repeatTime.type == 'week'">
|
||||
<div v-for="(item,index) in weekdays" :class="item.checked ? 'week-item-active':'week-item'" @click="item.checked=!item.checked" >{{item.label}}</div>
|
||||
</div>
|
||||
</a-form-item>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
|
@ -196,6 +231,37 @@ const labelCol = { span: 24 };
|
|||
const wrapperCol = { span: 24 };
|
||||
const props = defineProps(["checkedAriLine","checkedDronePort","formData"]);
|
||||
|
||||
const weekdays = ref([
|
||||
{
|
||||
'label':'周日',
|
||||
'checked':false
|
||||
},{
|
||||
'label':'周一',
|
||||
'checked':false
|
||||
},{
|
||||
'label':'周二',
|
||||
'checked':false
|
||||
},{
|
||||
'label':'周三',
|
||||
'checked':false
|
||||
},{
|
||||
'label':'周四',
|
||||
'checked':false
|
||||
},{
|
||||
'label':'周五',
|
||||
'checked':false
|
||||
},{
|
||||
'label':'周六',
|
||||
'checked':false
|
||||
}
|
||||
])
|
||||
const onceTime = ref();
|
||||
const repeatTime = ref({
|
||||
date:null,
|
||||
time:null,
|
||||
count:1,
|
||||
type:'date'
|
||||
});
|
||||
const visible = ref(false);
|
||||
|
||||
const handleOk = ()=>{
|
||||
|
|
@ -409,6 +475,76 @@ const changeCron = ()=>{
|
|||
const togglePopover = (e)=> {
|
||||
|
||||
}
|
||||
|
||||
// 处理单次定时日期
|
||||
const onOnceTimeChange = (e) => {
|
||||
|
||||
let time = new Date(e);
|
||||
|
||||
console.log(time);
|
||||
|
||||
let secondTime = time.getSeconds();
|
||||
let minutisTime = time.getMinutes();
|
||||
let hourTime = time.getHours();
|
||||
|
||||
let dayTime =time.getDate();
|
||||
let monthTime = time.getMonth()+1;
|
||||
let yearTime = time.getFullYear();
|
||||
|
||||
let cronTime = secondTime+" "+minutisTime+" "+ hourTime+" "+ dayTime+" "+monthTime+" ? "+yearTime
|
||||
}
|
||||
|
||||
|
||||
// 选择日期
|
||||
const onRepeatDateChange = (e) =>{
|
||||
console.log(e);
|
||||
}
|
||||
|
||||
// 选择时间
|
||||
const onRepeatTimeChange = (e) => {
|
||||
console.log("123",e);
|
||||
}
|
||||
|
||||
// 重复定时
|
||||
const handleRepeatTypeChange = (e)=>{
|
||||
|
||||
// 获取时间
|
||||
let timeArray = repeatTime.value?.time?.split(":");
|
||||
|
||||
let startDate = new Date(repeatTime.value?.date[0]).getDate();
|
||||
let endDate = new Date(repeatTime.value?.date[1]).getDate();
|
||||
let month = new Date(repeatTime.value?.date[0]).getMonth()+1;
|
||||
|
||||
let cronTime = "";
|
||||
|
||||
|
||||
switch(e){
|
||||
case 'date':
|
||||
cronTime = timeArray[2]+" "+timeArray[1]+" "+timeArray[0]+" "+ startDate +"-"+ endDate +" "+month+" ? "+" * "
|
||||
break;
|
||||
case 'week':
|
||||
|
||||
let weekday = "";
|
||||
weekdays.value?.forEach((item,index)=>{
|
||||
if(item.checked){
|
||||
weekday += index+","
|
||||
}
|
||||
})
|
||||
|
||||
weekday = weekday.slice(0, -1);
|
||||
|
||||
cronTime = timeArray[2]+" "+timeArray[1]+" "+timeArray[0]+" "+ startDate +"-"+ endDate +" "+month+" "+weekday+" "+" * "
|
||||
break;
|
||||
|
||||
case 'month':
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
submitForm.value.executeTime = cronTime;
|
||||
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
|
|
@ -477,6 +613,35 @@ const togglePopover = (e)=> {
|
|||
cursor: pointer;
|
||||
}
|
||||
|
||||
.repeat-time{
|
||||
display:flex;
|
||||
color:#fff;
|
||||
gap:12px;
|
||||
line-height: 32px;
|
||||
}
|
||||
|
||||
.week-container{
|
||||
width:100%;
|
||||
display:flex;
|
||||
color:#fff;
|
||||
gap:8px;
|
||||
padding:12px 0px;
|
||||
}
|
||||
.week-item{
|
||||
padding:3px 5px;
|
||||
background:#050608;
|
||||
border-radius: 4px;
|
||||
font-size:12px;
|
||||
cursor:pointer;
|
||||
}
|
||||
|
||||
.week-item-active{
|
||||
padding:3px 5px;
|
||||
background:#3A57E8;
|
||||
border-radius: 4px;
|
||||
font-size:12px;
|
||||
cursor:pointer;
|
||||
}
|
||||
.radio-box{
|
||||
width:100%;
|
||||
display: flex;
|
||||
|
|
@ -532,8 +697,9 @@ const togglePopover = (e)=> {
|
|||
::v-deep .ant-select-selector{
|
||||
border:none!important;
|
||||
color:#fff!important;
|
||||
background:#3F4150!important ;
|
||||
background:#050608 !important;
|
||||
border-radius: 3px!important;
|
||||
border-radius: 15px!important;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -21,6 +21,7 @@
|
|||
:airInfo="airInfo"
|
||||
:polygonAirForm="polygonAirForm"
|
||||
:airRoute="props.airRoute"
|
||||
@calculatParamChange="calculatParamChange"
|
||||
@exitDraw="exitDraw"
|
||||
></airPolygon>
|
||||
</div>
|
||||
|
|
@ -57,6 +58,7 @@
|
|||
'uavTrack',
|
||||
'homeAirport'
|
||||
]);
|
||||
|
||||
watch(
|
||||
() => props.uavTrack,
|
||||
(val) => {
|
||||
|
|
@ -90,22 +92,18 @@
|
|||
() => props.airRoute,
|
||||
(newVal, oldVal) => {},
|
||||
);
|
||||
|
||||
watch(
|
||||
() => props.wayline,
|
||||
(newVal, oldVal) => {
|
||||
generatePreviewPoint(newVal?.Folder?.Placemark);
|
||||
},
|
||||
);
|
||||
|
||||
|
||||
watch(
|
||||
watch(
|
||||
()=>props.wayline,
|
||||
(newVal,oldVal)=>{
|
||||
generatePreviewPoint(newVal?.Folder?.Placemark);
|
||||
}
|
||||
)
|
||||
|
||||
)
|
||||
|
||||
// 航线预览:生成点
|
||||
const generatePreviewPoint = (placemark)=>{
|
||||
|
|
@ -662,6 +660,9 @@ const loadChangGuangLayer = ()=>{
|
|||
polygonAirForm.value.startingPoint = graphic.toJSON().position;
|
||||
};
|
||||
|
||||
// 全局区域
|
||||
const polygonGeoJson = ref();
|
||||
|
||||
// 绘制面状
|
||||
const handlerDrawPolygon = async () => {
|
||||
if (polygonGraphicLayer == null) {
|
||||
|
|
@ -697,24 +698,48 @@ const loadChangGuangLayer = ()=>{
|
|||
|
||||
coordinates.push(coordinates[0]);
|
||||
|
||||
polygonGeoJson.value = coordinates;
|
||||
|
||||
let polygon = turf.polygon([coordinates]);
|
||||
let lines = generateScanLines(polygon, 0.003, 0);
|
||||
let lines = generateScanLines(polygon, 0.005, 0);
|
||||
|
||||
// 绘制区域转存wkt
|
||||
let wkt = GeojsonToWkt(polygon.geometry);
|
||||
// let wkt = GeojsonToWkt(polygon.geometry);
|
||||
|
||||
CalculateAreaInfo(polygon, lines);
|
||||
|
||||
console.log('lines', lines);
|
||||
|
||||
// 绘制面航线
|
||||
handlerDrawPolygonLine(lines);
|
||||
};
|
||||
|
||||
// 绘制面航线
|
||||
const handlerDrawPolygonLine = (lines) => {
|
||||
|
||||
let nodeGraphic = polygonGraphicLayer.getGraphicById("polygon-node-1");
|
||||
|
||||
if(nodeGraphic){
|
||||
nodeGraphic.setOptions({
|
||||
id: 'polygon-node-1',
|
||||
name: '航点',
|
||||
position: lines.geometry.coordinates[0],
|
||||
style: {
|
||||
image: '/map/node.png',
|
||||
scale: 1,
|
||||
horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
|
||||
verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
|
||||
label: {
|
||||
text: '',
|
||||
font_size: 14,
|
||||
color: '#ffffff',
|
||||
outline: true,
|
||||
outlineColor: '#000000',
|
||||
pixelOffsetY: -35,
|
||||
},
|
||||
},
|
||||
})
|
||||
}else{
|
||||
const graphic = new mars3d.graphic.BillboardEntity({
|
||||
id: '节点',
|
||||
id: 'polygon-node-1',
|
||||
name: '航点',
|
||||
position: lines.geometry.coordinates[0],
|
||||
style: {
|
||||
|
|
@ -734,6 +759,8 @@ const loadChangGuangLayer = ()=>{
|
|||
});
|
||||
|
||||
polygonGraphicLayer.addGraphic(graphic);
|
||||
}
|
||||
|
||||
|
||||
// 添加起飞点
|
||||
lines.geometry.coordinates.unshift([
|
||||
|
|
@ -785,6 +812,7 @@ const loadChangGuangLayer = ()=>{
|
|||
|
||||
// 计算面航线
|
||||
function generateScanLines(polygon, spacing, angle = 0) {
|
||||
|
||||
if (!turf.booleanValid(polygon)) throw new Error('无效的多边形');
|
||||
spacing = Math.abs(spacing);
|
||||
|
||||
|
|
@ -1725,6 +1753,27 @@ const loadChangGuangLayer = ()=>{
|
|||
}
|
||||
};
|
||||
|
||||
|
||||
// 参数改变
|
||||
const calculatParamChange = (params) => {
|
||||
console.log("params",params);
|
||||
|
||||
let spceing = parseFloat(params.spacing) / 10000;
|
||||
|
||||
console.log("spceing",spceing);
|
||||
|
||||
if(polygonGeoJson.value){
|
||||
let polygon = turf.polygon([polygonGeoJson.value]);
|
||||
let lines = generateScanLines(polygon, spceing, 0);
|
||||
|
||||
// 计算面积 长度
|
||||
CalculateAreaInfo(polygon, lines);
|
||||
|
||||
// 绘制面航线
|
||||
handlerDrawPolygonLine(lines);
|
||||
}
|
||||
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
|
|
|
|||
|
|
@ -12,18 +12,21 @@
|
|||
<div>
|
||||
<a-select
|
||||
ref="select"
|
||||
style="width: 100px"
|
||||
style="width:130px;"
|
||||
v-model:value="pageQuery.status"
|
||||
placeholder="计划状态"
|
||||
@change="getTaskList"
|
||||
>
|
||||
<a-select-option value="jack">全部</a-select-option>
|
||||
<a-select-option value="lucy">进行中</a-select-option>
|
||||
<a-select-option value="disabled">已完结</a-select-option>
|
||||
<a-select-option :value="null">全部</a-select-option>
|
||||
|
||||
<a-select-option v-for="(item,index) in planStatusOptions" :key="index" :value="item.status">{{item.label}}</a-select-option>
|
||||
</a-select>
|
||||
</div>
|
||||
|
||||
<div class="filter-buttons">
|
||||
<a-input-search v-model:value="pageQuery.key"
|
||||
@keyup.enter="getTaskList"
|
||||
@search="getTaskList"
|
||||
placeholder="输入计划名称"
|
||||
/>
|
||||
</div>
|
||||
|
|
@ -35,32 +38,38 @@
|
|||
<div class="routers-list">
|
||||
<div class="ari-line" v-for="(item,index) in ariLineList" :key="index" @click="checkAriLine(item)">
|
||||
<div class="title">
|
||||
<div :class="item.status == 0 ? 'state-no' : 'state' ">
|
||||
{{item.status == 0 ? '未开始' : '进行中'}}
|
||||
|
||||
<div v-for="(opt,idx) in planStatusOptions" :key="idx" v-show="item.status == opt.status" class="state" :style="{'border-color':opt.color,'color':opt.color}">
|
||||
{{ opt.label }}
|
||||
</div>
|
||||
|
||||
<div style="flex:1;">
|
||||
{{item.taskName}}
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<a-dropdown>
|
||||
<MoreOutlined />
|
||||
<template #overlay>
|
||||
<a-menu>
|
||||
<a-menu-item @click="toDoPlan(item.id)">
|
||||
<!-- <a-menu-item @click="toDoPlan(item.id)">
|
||||
<a href="javascript:;" >执行</a>
|
||||
</a-menu-item>
|
||||
<a-menu-item @click="createWorkPlan(item)">
|
||||
</a-menu-item> -->
|
||||
|
||||
<a-menu-item @click="createWorkPlan(item)" v-if="item.status == 0">
|
||||
<a href="javascript:;">编辑</a>
|
||||
</a-menu-item>
|
||||
<a-menu-item @click="deletePlan(item.id)">
|
||||
|
||||
<a-menu-item @click="deletePlan(item.id)" v-if="item.status != 2 && item.status != 5">
|
||||
<a href="javascript:;">删除</a>
|
||||
</a-menu-item>
|
||||
|
||||
</a-menu>
|
||||
</template>
|
||||
</a-dropdown>
|
||||
</div>
|
||||
</div>
|
||||
<div class="username"><UserOutlined /> {{item.createId}}</div>
|
||||
<div class="username"><UserOutlined /> {{item.createUserName ? createUserName : '超级管理员'}}</div>
|
||||
<div class="time">更新时间:{{item.createTime}}</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -77,6 +86,7 @@
|
|||
import {ref,defineEmits,defineProps,createVNode,watch} from 'vue'
|
||||
import { Modal, message } from 'ant-design-vue';
|
||||
import { getTaskPageList, deleteTask,executeFlyTask,pendingFlyTask } from '@/api/sys/workplan';
|
||||
import { statusOptions } from '@/components/illegalmining/util';
|
||||
|
||||
const emit = defineEmits(["planDetail","createWorkPlan"])
|
||||
|
||||
|
|
@ -99,6 +109,7 @@
|
|||
const pageQuery = ref({
|
||||
page:0,
|
||||
limit:10,
|
||||
status:null,
|
||||
key:null
|
||||
})
|
||||
|
||||
|
|
@ -208,6 +219,26 @@
|
|||
}
|
||||
|
||||
|
||||
// 任务状态
|
||||
const planStatusOptions = ref([
|
||||
{
|
||||
label:"待执行",
|
||||
status:0,
|
||||
color:'#F6B50A'
|
||||
},{
|
||||
label:"执行中",
|
||||
status:1,
|
||||
color:'#F6B50A'
|
||||
},{
|
||||
label:"执行失败",
|
||||
status:2,
|
||||
color:'#F6B50A'
|
||||
},{
|
||||
label:"成功",
|
||||
status:5,
|
||||
color:'#08ed08'
|
||||
}
|
||||
])
|
||||
|
||||
</script>
|
||||
<style scoped>
|
||||
|
|
@ -234,8 +265,9 @@
|
|||
border-radius: 2px;
|
||||
}
|
||||
.filter-container{
|
||||
padding:20px 15px;
|
||||
padding:20px 20px;
|
||||
display:flex;
|
||||
gap:8px;
|
||||
}
|
||||
.search-container{
|
||||
width: calc( 100% - 30px);
|
||||
|
|
@ -244,10 +276,7 @@
|
|||
border:1px solid #3a57e890;
|
||||
}
|
||||
.filter-buttons{
|
||||
display:flex;
|
||||
gap:8px;
|
||||
text-align: center;
|
||||
|
||||
}
|
||||
.filter-button{
|
||||
width:32px;
|
||||
|
|
@ -406,6 +435,7 @@
|
|||
}
|
||||
|
||||
::v-deep .ant-input{
|
||||
height:32px!important;
|
||||
background:#3F4150!important ;
|
||||
border:none!important;
|
||||
border-top-left-radius: 3px !important;
|
||||
|
|
@ -450,6 +480,7 @@
|
|||
::v-deep .ant-input-search-button{
|
||||
border-top-right-radius: 15px!important;
|
||||
border-bottom-right-radius: 15px!important;
|
||||
height:32px!important;
|
||||
}
|
||||
::v-deep .ant-input::placeholder{
|
||||
color:rgba(255, 255, 255, 0.533)!important;
|
||||
|
|
|
|||
|
|
@ -0,0 +1,31 @@
|
|||
// 相机参数
|
||||
export const uavModel = {
|
||||
"m4td":{
|
||||
"focalLength":6.83,
|
||||
"sensorLength":9.85,
|
||||
"imageWidth":4032,
|
||||
"imageHeight":0,
|
||||
}
|
||||
}
|
||||
|
||||
// 输入gsd计算高度
|
||||
export const calculateHeight = (gsd,uavModel) => {
|
||||
let height = 0;
|
||||
height = ( (gsd / 100) * (uavModel['focalLength'] / 1000) * uavModel['imageWidth'] ) / ( uavModel['sensorLength'] / 1000 );
|
||||
return height.toFixed(2);
|
||||
|
||||
}
|
||||
|
||||
// 输入高度计算gsd
|
||||
export const calculateGsd = (height,uavModel) => {
|
||||
let gsd = 0;
|
||||
gsd = ( (height*1000) * uavModel['sensorLength'] ) / (uavModel['focalLength'] * uavModel['imageWidth']) / 10;
|
||||
return gsd.toFixed(2);
|
||||
}
|
||||
|
||||
// 计算航线间距
|
||||
export const calculateSpacing = (gsd,overlap,uavModel) => {
|
||||
let groundResolution = gsd / 100;
|
||||
let lineSpacing = groundResolution * uavModel['imageWidth'] * (1 - overlap);
|
||||
return lineSpacing.toFixed(2);
|
||||
}
|
||||
Loading…
Reference in New Issue