import { ref, getCurrentInstance } from 'vue'
|
import { analyzeKmzFile, getKmlParams, generateKmlFormat } from '/@/utils/cesium/kmz'
|
import JSZIP from 'jszip'
|
import { saveAs } from 'file-saver'
|
import { point } from '@turf/turf'
|
|
const JsZip = new JSZIP()
|
|
const fileAuthor = reactive({
|
name: '',
|
author: '',
|
})
|
const kmlStr = ref('')
|
const kmzFile = ref<any>(null)
|
|
// 点位参数
|
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)
|
kmzFile.value = fileRes.file
|
const kmzRes = await fileRes.content
|
if (fileContent) {
|
kmlStr.value = fileContent
|
return false
|
}
|
kmlStr.value = kmzRes
|
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 write = (settingParmas: any = {}, name: string) => {
|
// }
|
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 del = () => {}
|
|
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]*?)',
|
})
|
console.log(heightRegxVal)
|
}
|
})
|
}
|
const replaceStr = generateKmlFormat({ [key]: settingParmas[key] })
|
kmlStr.value = kmlStr.value.replace(regxVal[0], replaceStr)
|
} else {
|
console.warn('没有找到对应的属性')
|
}
|
})
|
}
|
|
const save = () => {
|
JsZip.file('wpmz/template.kml', kmlStr.value)
|
kmzFile.value.file('wpmz/template.kml', kmlStr.value)
|
JsZip.generateAsync({ type: 'blob' }).then((content) => {
|
saveAs(content, '新建航线-' + new Date().toLocaleString() + '.kmz')
|
})
|
}
|
|
return {
|
init,
|
create,
|
// write,
|
writePoint,
|
del,
|
edit,
|
save,
|
}
|
}
|
|
export { kmlStr, fileAuthor }
|
export default useKmzTsa
|