From 55fcb97a3d487f54353564f1e402e4d4b61feee9 Mon Sep 17 00:00:00 2001
From: GuLiMmo <2820890765@qq.com>
Date: Tue, 12 Mar 2024 17:54:05 +0800
Subject: [PATCH] update:kmz/json转换、kmz打包后无法解析等
---
src/utils/cesium/kmz.ts | 142 ++++++++++++++++++++++++++++++++++++++++------
1 files changed, 122 insertions(+), 20 deletions(-)
diff --git a/src/utils/cesium/kmz.ts b/src/utils/cesium/kmz.ts
index 47f3964..1c3440f 100644
--- a/src/utils/cesium/kmz.ts
+++ b/src/utils/cesium/kmz.ts
@@ -1,6 +1,10 @@
import axios from 'axios'
-import { mode } from 'crypto-js'
import JsZip from 'jszip'
+import toGeoJson from '@mapbox/togeojson'
+// import Xml2Json from 'xml2json'
+// const xmlJson = new Xml2Json()
+
+const noWmpl: string[] = ['Folder', 'Placemark', 'Point', 'coordinates']
/**
* @description: 读取kmz文件解析出kml文件
@@ -12,41 +16,139 @@
.get(filePath, { responseType: 'arraybuffer' })
.then((fileRes) => fileRes.data)
.then((kmzData) => JsZip.loadAsync(kmzData)) // 解压kmz文件
- .then((kmzZip) => {
- // 通过文件名找到 KML 文件
- const kmlFile = kmzZip.file(/\.kml$/i)[0]
- return kmlFile.async('text')
+ .then((zipFile) => {
+ const files: { [key: string]: Promise<string> } = {}
+ Object.keys(zipFile.files).forEach((key: string) => {
+ files[key] = zipFile.files[key].async('text')
+ })
+ return {
+ zip: zipFile,
+ fileInfoObj: files,
+ }
})
}
export const getKmlParams = (
source: string,
isWpml: boolean,
- params: { name: string; findRegx: string; mode?: string },
+ params: { name: string | undefined; findRegx: string; mode?: string },
) => {
let regx = null
if (isWpml) {
if (params.mode) {
- regx = new RegExp(
- `<wpml:${params.name}>${params.findRegx}<\\/wpml:${params.name}>`,
- params.mode,
- )
+ regx = new RegExp(`<wpml:${params.name}>${params.findRegx}<\\/wpml:${params.name}>`, params.mode)
} else {
- regx = new RegExp(
- `<wpml:${params.name}>${params.findRegx}<\\/wpml:${params.name}>`,
- )
+ regx = new RegExp(`<wpml:${params.name}>${params.findRegx}<\\/wpml:${params.name}>`)
}
} else {
if (params.mode) {
- regx = new RegExp(
- `<${params.name}>${params.findRegx}<\\/${params.name}>`,
- params.mode,
- )
+ regx = new RegExp(`<${params.name}>${params.findRegx}<\\/${params.name}>`, params.mode)
} else {
- regx = new RegExp(
- `<${params.name}>${params.findRegx}<\\/${params.name}>`,
- )
+ regx = new RegExp(`<${params.name}>${params.findRegx}<\\/${params.name}>`)
}
}
return source?.match(regx)
}
+
+export const generateKmlFormat = (settingParmas: any) => {
+ let paramGroup = ''
+ Object.keys(settingParmas).forEach((key: string) => {
+ if (Object.prototype.toString.call(settingParmas[key]) === '[object Object]') {
+ let parmaStr = ''
+ Object.keys(settingParmas[key]).forEach((v) => {
+ const xml = noWmpl.includes(key)
+ ? `<${v}>${settingParmas[key][v]}</${v}>`
+ : `<wpml:${v}>${settingParmas[key][v]}</wpml:${v}>`
+ parmaStr += xml
+ })
+ const xml = noWmpl.includes(key) ? `<${key}>${parmaStr}</${key}>` : `<wpml:${key}>${parmaStr}</wpml:${key}>`
+ paramGroup += xml
+ } else {
+ const xml = noWmpl.includes(key)
+ ? `<${key}>${settingParmas[key]}</${key}>`
+ : `<wpml:${key}>${settingParmas[key]}</wpml:${key}>`
+ paramGroup += xml
+ }
+ })
+ return paramGroup
+}
+
+export const insertChar = (str: string, index: number, char: string) => {
+ if (index > str.length) {
+ return str + char
+ } else if (index < 0) {
+ return char + str
+ } else {
+ return str.slice(0, index) + char + str.slice(index)
+ }
+}
+
+export const getTagNameFromXml = (xmlString: string): string | null => {
+ const parser = new DOMParser()
+ const xmlDoc = parser.parseFromString(xmlString, 'text/xml')
+ const element = xmlDoc.documentElement
+ if (element && element.tagName) {
+ return element.tagName // 返回的是类似 "WPML:USEGLOBALHEADINGPARAM" 的全大写形式
+ }
+ return null
+}
+
+// 将xml转为json
+const deepParse = (xmlDoc: Document, tagName: string) => {
+ const xmlObj: { [key: string]: any } = {}
+ const rootDom = xmlDoc.getElementsByTagName(tagName)[0]
+ for (let i = 0; i < rootDom.children.length; i++) {
+ const child = rootDom.children[i]
+ const childName = child.nodeName.replace('wpml:', '')
+ if (child.children.length > 0) {
+ xmlObj[childName] = deepParse(xmlDoc, child.nodeName)
+ } else {
+ if (xmlObj[childName] !== undefined) {
+ if (!Array.isArray(xmlObj[childName])) {
+ xmlObj[childName] = [xmlObj[childName]]
+ }
+ xmlObj[childName].push(child.textContent)
+ } else {
+ const value = child.textContent?.split('\n').join('').split(' ').join('')
+ xmlObj[childName.replace('wpml:', '')] = value
+ }
+ }
+ }
+ return xmlObj
+}
+export const XMLToJSON = (xmlStr: string, tagName: string) => {
+ const parser = new DOMParser()
+ const xmlDoc = parser.parseFromString(xmlStr, 'text/xml')
+ const xmlObj = deepParse(xmlDoc, tagName)
+ delete xmlObj.parsererror
+ return xmlObj
+}
+
+// json转xml
+export const JSONToXML = (JSONData = {}) => {
+ if (!JSONData) return ''
+ let res = ''
+ const JSONParse = (obj: { [x: string]: any }) => {
+ for (const key in obj) {
+ if (Array.isArray(obj[key])) {
+ obj[key].forEach((item: any, index: any) => {
+ let xmlTag = ''
+ if (noWmpl.includes(key)) {
+ xmlTag = `<${key} rowNum="${index}">${item}</${key}>`
+ } else {
+ xmlTag = `<wpml:${key} rowNum="${index}">${item}</wpml:${key}>`
+ }
+ res += xmlTag
+ })
+ } else if (typeof obj[key] === 'object') {
+ res += (noWmpl.includes(key) ? `<${key}>` : `<wpml:${key}>`)
+ JSONParse(obj[key])
+ res += (noWmpl.includes(key) ? `</${key}>` : `</wpml:${key}>`)
+ } else {
+ res += (noWmpl.includes(key) ? `<${key}>${obj[key] || ''}</${key}>` : `<wpml:${key}>${obj[key] || ''}</wpml:${key}>`)
+ }
+ }
+ }
+ JSONParse(JSONData)
+ return res
+}
--
Gitblit v1.9.3