From aec00ecc093be803860c8675cbe1c4c776a7cb4e Mon Sep 17 00:00:00 2001
From: GuLiMmo <2820890765@qq.com>
Date: Tue, 19 Mar 2024 17:49:21 +0800
Subject: [PATCH] update: 新建航线、事件编辑、kmz文件问题修改
---
src/utils/cesium/use-kmz-tsa.ts | 326 +++++++++++++++++++++++++----------------------------
1 files changed, 154 insertions(+), 172 deletions(-)
diff --git a/src/utils/cesium/use-kmz-tsa.ts b/src/utils/cesium/use-kmz-tsa.ts
index 665aa36..d7ff54c 100644
--- a/src/utils/cesium/use-kmz-tsa.ts
+++ b/src/utils/cesium/use-kmz-tsa.ts
@@ -1,15 +1,8 @@
-import { ref, getCurrentInstance } from 'vue'
-import {
- analyzeKmzFile,
- getKmlParams,
- generateKmlFormat,
- XMLToJSON,
- JSONToXML
-} from '/@/utils/cesium/kmz'
+import { ref } from 'vue'
+import { analyzeKmzFile, XMLToJSON, JSONToXML } from '/@/utils/cesium/kmz'
+import _ from 'lodash'
import JSZIP from 'jszip'
import { saveAs } from 'file-saver'
-
-const JsZip = new JSZIP()
const fileAuthor = reactive({
name: '',
@@ -18,7 +11,7 @@
const kmlStr = ref('')
const kmzFile = ref<any>(null)
-const template = ref({
+const template = ref<any>({
author: '',
createTime: '',
updateTime: '',
@@ -91,7 +84,7 @@
],
},
})
-const waylines = ref({
+const waylines = ref<any>({
missionConfig: {
flyToWaylineMode: 'safely',
finishAction: 'goHome',
@@ -138,34 +131,6 @@
},
})
-// 点位参数
-const placemark: any = {
- Point: {
- coordinates: '',
- },
- index: 0,
- executeHeight: 80,
- height: 80,
- waypointSpeed: 10,
- waypointHeadingParam: {
- waypointHeadingMode: 'followWayline',
- waypointHeadingAngle: 0,
- waypointPoiPoint: '0.000000,0.000000,0.000000',
- waypointHeadingPathMode: 'followBadArc',
- waypointHeadingPoiIndex: 0,
- },
- waypointTurnParam: {
- waypointTurnMode: 'toPointAndStopWithDiscontinuityCurvature',
- waypointTurnDampingDist: 0.2,
- },
- useGlobalHeight: 1,
- useGlobalSpeed: 1,
- useGlobalHeadingParam: 1,
- useGlobalTurnParam: 1,
- useStraightLine: 1,
- actionGroup: {},
-}
-
const useKmzTsa = () => {
const init = async (fileUrl: string, fileContent?: string) => {
const fileRes = await analyzeKmzFile(fileUrl)
@@ -176,151 +141,168 @@
return false
}
kmlStr.value = kmzRes
+ const tplXmlJson = XMLToJSON(kmzRes)
+ template.value = tplXmlJson.Document
return kmzRes
}
- const create = () => {
- const nowTime = new Date().getTime()
- const str = `
- <?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.5">
- <Document>
- <wpml:author>17304076412</wpml:author>
- <wpml:createTime>${nowTime}</wpml:createTime>
- <wpml:updateTime>${nowTime}</wpml:updateTime>
- <wpml:missionConfig>
- </wpml:missionConfig>
- <Folder>
- </Folder>
- </Document>
- </kml>
- `
- kmlStr.value = str
- }
- const writePoint = (settingParmas: any = {}, place: string, pointNumber: number = 0) => {
- Object.keys(settingParmas).forEach((key: string) => {
- placemark[key] = settingParmas[key]
- })
- const Placemark = `<Placemark>${generateKmlFormat(placemark)}</Placemark>`
- const points: RegExpMatchArray = getKmlParams(kmlStr.value, false, {
- name: 'Placemark',
- findRegx: '([\\s\\S]*?)',
- mode: 'g',
- }) || ['']
- if (place === 'add') {
- const lastPoint = points[points.length - 1]
- const index = kmlStr.value.indexOf(lastPoint)
- const beforeStr = kmlStr.value.slice(0, index)
- const afterStr = kmlStr.value.slice(index + lastPoint.length)
- kmlStr.value = beforeStr + lastPoint + Placemark + afterStr
- }
- if (place === 'prev') {
- const currentPoint: string = points[pointNumber]
- const index = kmlStr.value.indexOf(currentPoint)
- const beforeStr = kmlStr.value.slice(0, index)
- const afterStr = kmlStr.value.slice(index + currentPoint.length)
- kmlStr.value = beforeStr + Placemark + currentPoint + afterStr
- // 更新点位序号
- const pointIndexList = getKmlParams(kmlStr.value, true, {
- name: 'index',
- findRegx: '([\\s\\S]*?)',
- mode: 'g',
- })
- pointIndexList?.forEach((pintIndex: string, index: number) => {
- kmlStr.value.replace(pintIndex, `<wpml:index>${index}</wpml:index>`)
- })
- }
- if (place === 'next') {
- const currentPoint: string = points[pointNumber + 1]
- const index = kmlStr.value.indexOf(currentPoint)
- const beforeStr = kmlStr.value.slice(0, index)
- const currentPointLength = currentPoint?.length || 0
- const afterStr = kmlStr.value.slice(index + currentPointLength)
- kmlStr.value = beforeStr + Placemark + currentPoint + afterStr
- // 更新点位序号
- const pointIndexList = getKmlParams(kmlStr.value, true, {
- name: 'index',
- findRegx: '([\\s\\S]*?)',
- mode: 'g',
- })
- pointIndexList?.forEach((pintIndex: string, index: number) => {
- kmlStr.value.replace(pintIndex, `<wpml:index>${index}</wpml:index>`)
- })
- }
- }
- const edit = (settingParmas: any = {}, keyName?: string, isKeyWpml: boolean = false) => {
- Object.keys(settingParmas).forEach((key: string) => {
- const regxVal: any = getKmlParams(kmlStr.value, true, {
- name: key,
- findRegx: '([\\s\\S]*?)',
- })
- const str = regxVal[1]
- if (str) {
- if (key === 'globalHeight') {
- const regxVal: any = getKmlParams(kmlStr.value, true, {
- name: 'height',
- findRegx: '([\\s\\S]*?)',
- mode: 'g',
- })
- const ellipsoidHeightRegx = getKmlParams(kmlStr.value, true, {
- name: 'ellipsoidHeight',
- findRegx: '([\\s\\S]*?)',
- mode: 'g',
- }) || ['']
- // 文件中的海拔高度
- const takeOffRefPointAGLHeightRegxStr = getKmlParams(kmlStr.value, true, {
- name: 'takeOffRefPointAGLHeight',
- findRegx: '([\\s\\S]*?)',
- }) || ['', '0']
- const posterHeight = Number(takeOffRefPointAGLHeightRegxStr[1])
- // 获取每个点是否使用全局高度
- const useGlobalHeightRegStr = getKmlParams(kmlStr.value, true, {
- name: 'useGlobalHeight',
- findRegx: '([\\s\\S]*?)',
- mode: 'g',
- }) || ['', '0']
- regxVal.forEach((heightStr: string, index: number) => {
- // 使用正则取值
- const getUseGlobalHeightValStr = getKmlParams(useGlobalHeightRegStr[index], true, {
- name: 'useGlobalHeight',
- findRegx: '([\\s\\S]*?)',
- }) || ['', '0']
- const isGlobalHeight = Boolean(Number(getUseGlobalHeightValStr[1]))
- if (isGlobalHeight) {
- // 替换height
- const rstr = generateKmlFormat({ height: settingParmas[key] })
- const rEllipsoidHeightStr = generateKmlFormat({ ellipsoidHeight: settingParmas[key] - posterHeight })
- kmlStr.value = kmlStr.value.replace(heightStr, rstr)
- kmlStr.value = kmlStr.value.replace(ellipsoidHeightRegx[index], rEllipsoidHeightStr)
- // 替换
- } else {
- const heightRegxVal: any = getKmlParams(heightStr, true, {
- name: 'height',
- findRegx: '([\\s\\S]*?)',
- })
- }
- })
- }
- const replaceStr = generateKmlFormat({ [key]: settingParmas[key] })
- kmlStr.value = kmlStr.value.replace(regxVal[0], replaceStr)
- } else {
- console.warn('没有找到对应的属性')
+ const create = async (waylineBasicInfo: { fileName: string; droneEnumValue: string; payloadEnumValue: string }) => {
+ try {
+ const { fileName, droneEnumValue, payloadEnumValue } = waylineBasicInfo
+ const author = window.localStorage.getItem('username') || ''
+ const createTime = new Date().getTime()
+ // 模板
+ const droneModel: { [key: string]: string } = {
+ 52: '0',
+ 53: '1',
+ 66: '0',
+ 67: '1',
+ 80: '0',
+ 81: '1',
+ } as const
+ const templateJson = {
+ author,
+ createTime,
+ updateTime: createTime,
+ missionConfig: {
+ flyToWaylineMode: 'safely',
+ finishAction: 'goHome',
+ exitOnRCLost: 'goContinue',
+ executeRCLostAction: 'goBack',
+ takeOffSecurityHeight: 20,
+ takeOffRefPoint: '0.000000,0.000000,0.000000',
+ takeOffRefPointAGLHeight: 0,
+ globalTransitionalSpeed: 15,
+ globalRTHHeight: 80,
+ droneInfo: {
+ droneEnumValue,
+ droneSubEnumValue: droneModel[payloadEnumValue],
+ },
+ payloadInfo: {
+ payloadEnumValue,
+ payloadSubEnumValue: droneModel[payloadEnumValue],
+ payloadPositionIndex: 0,
+ },
+ },
+ Folder: {
+ templateType: 'waypoint',
+ useGlobalTransitionalSpeed: 0,
+ templateId: 0,
+ waylineCoordinateSysParam: {
+ coordinateMode: 'WGS84',
+ heightMode: 'EGM96',
+ globalShootHeight: 50,
+ positioningType: 'GPS',
+ surfaceFollowModeEnable: 1,
+ surfaceRelativeHeight: 100,
+ },
+ autoFlightSpeed: 7,
+ gimbalPitchMode: 'usePointSetting',
+ globalWaypointHeadingParam: {
+ waypointHeadingMode: 'followWayline',
+ waypointHeadingAngle: 0,
+ waypointPoiPoint: '0.000000,0.000000,0.000000',
+ waypointHeadingPathMode: 'followBadArc',
+ },
+ globalWaypointTurnMode: 'toPointAndStopWithDiscontinuityCurvature',
+ globalUseStraightLine: 0,
+ Placemark: [],
+ },
}
+ template.value = templateJson
+ return true
+ } catch (error) {
+ return error
+ }
+ }
+ const save = () => {
+ const JsZip = new JSZIP()
+ const waylines = waylinesContext(template.value)
+ const templateXml = JSONToXML(template.value, '', true)
+ const waylinesWpml = JSONToXML(waylines, '', true)
+ JsZip.file('wpmz/template.kml', templateXml)
+ JsZip.file('wpmz/waylines.wpml', waylinesWpml)
+ JsZip.generateAsync({ type: 'blob' }).then((blob) => {
+ saveAs(blob, '新建航线.kmz')
})
}
- const save = () => {
- console.log('存在问题')
+ const generateXML = <T>(xmlJson: T) => {
+ return JSONToXML(xmlJson)
}
+
+ const waylinesContext = (templateJson: any) => {
+ const waylinesObj: { [key: string]: any } = {
+ missionConfig: {
+ flyToWaylineMode: null,
+ finishAction: null,
+ exitOnRCLost: null,
+ executeRCLostAction: null,
+ takeOffSecurityHeight: null,
+ globalTransitionalSpeed: null,
+ globalRTHHeight: null,
+ droneInfo: null,
+ payloadInfo: null,
+ },
+ Folder: {
+ templateId: null,
+ executeHeightMode: null,
+ waylineId: null,
+ autoFlightSpeed: null,
+ Placemark: null,
+ },
+ }
+ Object.keys(waylinesObj).forEach((key: string) => {
+ if (Object.prototype.toString.call(waylinesObj[key]) === '[object Object]') {
+ Object.keys(waylinesObj[key]).forEach((item) => {
+ waylinesObj[key][item] = templateJson[key][item]
+ if (item === 'executeHeightMode') {
+ waylinesObj[key][item] = templateJson[key].waylineCoordinateSysParam.heightMode
+ }
+ if (item === 'waylineId') {
+ waylinesObj[key][item] = templateJson[key].templateId
+ }
+ if (item === 'Placemark') {
+ const placemarks = _.cloneDeep(templateJson[key][item])
+ placemarks.forEach(
+ (placemark: {
+ executeHeight: { '#text': string }
+ ellipsoidHeight?: { [x: string]: string }
+ height?: { [x: string]: string }
+ }) => {
+ placemark.executeHeight = { '#text': placemark.ellipsoidHeight?.['#text'] || '' }
+ delete placemark.ellipsoidHeight
+ delete placemark.height
+ },
+ )
+ waylinesObj[key][item] = placemarks
+ }
+ })
+ } else {
+ waylinesObj[key] = templateJson[key]
+ }
+ })
+ return waylinesObj
+ }
+
+ // 将wpmz/template.kml解析传来json转换回去,重新复制以便于后续绘制
+ watch(
+ () => template.value,
+ (newobj) => {
+ const xmlString = JSONToXML(newobj)
+ kmlStr.value = xmlString
+ },
+ {
+ deep: true,
+ },
+ )
return {
init,
create,
- // write,
- writePoint,
- edit,
save,
+ generateXML,
}
}
-export { kmlStr, fileAuthor }
+export { kmlStr, fileAuthor, template, waylines }
export default useKmzTsa
--
Gitblit v1.9.3