| | |
| | | import { ref, getCurrentInstance } from 'vue' |
| | | import { ref } from 'vue' |
| | | import { |
| | | analyzeKmzFile, |
| | | getKmlParams, |
| | | generateKmlFormat, |
| | | XMLToJSON, |
| | | JSONToXML |
| | | } from '/@/utils/cesium/kmz' |
| | |
| | | const kmlStr = ref('') |
| | | const kmzFile = ref<any>(null) |
| | | |
| | | const template = ref({ |
| | | const template = ref<any>({ |
| | | author: '', |
| | | createTime: '', |
| | | updateTime: '', |
| | |
| | | ], |
| | | }, |
| | | }) |
| | | const waylines = ref({ |
| | | const waylines = ref<any>({ |
| | | missionConfig: { |
| | | flyToWaylineMode: 'safely', |
| | | finishAction: 'goHome', |
| | |
| | | }, |
| | | }) |
| | | |
| | | // 点位参数 |
| | | 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) |
| | |
| | | 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 save = () => { |
| | | console.log('存在问题') |
| | | } |
| | | |
| | | const generateXML = <T>(xmlJson: T) => { |
| | | return JSONToXML(xmlJson) |
| | | } |
| | | |
| | | // 将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 |