import axios from 'axios'
|
import JsZip from 'jszip'
|
|
const noWmpl = ['Folder', 'Placemark', 'Point', 'coordinates']
|
|
/**
|
* @description: 读取kmz文件解析出kml文件
|
* @param {string} filePath 文件地址
|
* @return {*}
|
*/
|
export const analyzeKmzFile = filePath => {
|
return (
|
axios({
|
url: filePath,
|
method: 'get',
|
responseType: 'arraybuffer',
|
authorization: false,
|
})
|
// .get(filePath, { responseType: 'arraybuffer' },)
|
.then(fileRes => fileRes.data)
|
.then(kmzData => JsZip.loadAsync(kmzData)) // 解压kmz文件
|
.then(zipFile => {
|
const files = {}
|
Object.keys(zipFile.files).forEach(key => {
|
files[key] = zipFile.files[key].async('text')
|
})
|
return {
|
zip: zipFile,
|
fileInfoObj: files,
|
}
|
})
|
)
|
}
|
|
export const getKmlParams = (source, isWpml, params) => {
|
let regx = null
|
if (isWpml) {
|
if (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}>`)
|
}
|
} else {
|
if (params.mode) {
|
regx = new RegExp(`<${params.name}>${params.findRegx}<\\/${params.name}>`, params.mode)
|
} else {
|
regx = new RegExp(`<${params.name}>${params.findRegx}<\\/${params.name}>`)
|
}
|
}
|
return source?.match(regx)
|
}
|
|
export const generateKmlFormat = settingParmas => {
|
let paramGroup = ''
|
Object.keys(settingParmas).forEach(key => {
|
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
|
}
|
|
/**
|
* @description: JSON转XML
|
* @param {any} obj 要转换的对象
|
* @param {string} rootName xml根节点名称
|
* @return {*} string
|
*/
|
export const JSONToXML = (obj, rootName, isEnd) => {
|
let xml = ''
|
|
const buildXml = (obj, rootName) => {
|
let xml = ''
|
if (Array.isArray(obj)) {
|
obj.forEach(item => {
|
const str = !noWmpl.includes(rootName) && isEnd ? 'wpml:' : ''
|
xml += `<${str}${rootName}>${buildXml(item)}</${str}${rootName}>`
|
})
|
} else if (typeof obj === 'object') {
|
Object.keys(obj).forEach(key => {
|
if (key === '#text') {
|
xml += obj[key]
|
} else {
|
const str = !noWmpl.includes(key) && isEnd ? 'wpml:' : ''
|
if (key === 'Placemark') {
|
xml += `${buildXml(obj[key], key)}`
|
} else if (key === 'action') {
|
if (Array.isArray(obj[key])) {
|
xml += `${buildXml(obj[key], key)}`
|
} else {
|
xml += `<${str}${key}>${buildXml(obj[key], key)}</${str}${key}>`
|
}
|
} else {
|
xml += `<${str}${key}>${buildXml(obj[key], key)}</${str}${key}>`
|
}
|
}
|
})
|
} else {
|
xml += obj
|
}
|
return xml
|
}
|
|
const header = isEnd ? '<?xml version="1.0" encoding="UTF-8"?>' : ''
|
xml += `${header}
|
<kml xmlns="http://www.opengis.net/kml/2.2" xmlns:wpml="http://www.dji.com/wpmz/1.0.5">
|
<Document>
|
${buildXml(obj, rootName)}
|
</Document>
|
</kml>`
|
return xml
|
}
|
|
export const getTagNameFromXml = xmlString => {
|
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 = xml => {
|
let obj = {}
|
// 如果是文档节点,遍历其子节点
|
if (xml.nodeType === 1) {
|
// element node
|
// 处理子节点
|
if (xml.childNodes.length > 0) {
|
for (let i = 0; i < xml.childNodes.length; i++) {
|
const item = xml.childNodes[i]
|
const nodeName = item.nodeName.replace('wpml:', '')
|
|
// 检查是否是文本节点
|
if (item.nodeType === 3) {
|
// text node
|
// 处理文本节点的内容
|
if (item.nodeValue.trim() !== '') {
|
obj[nodeName] = item.nodeValue.trim()
|
}
|
} else if (item.nodeType === 1) {
|
// element node
|
// 递归调用处理子节点
|
if (obj[nodeName] === undefined) {
|
const nodeValue = deepParse(item)
|
if (nodeValue[nodeName] === undefined) {
|
obj[nodeName] = nodeValue
|
} else {
|
obj[nodeName] = nodeValue[nodeName]
|
}
|
} else {
|
if (!obj[nodeName].push) {
|
const old = obj[nodeName]
|
obj[nodeName] = []
|
obj[nodeName].push(old)
|
}
|
const nodeValue = deepParse(item)
|
if (nodeValue[nodeName] === undefined) {
|
obj[nodeName].push(nodeValue)
|
}
|
}
|
}
|
}
|
}
|
} else if (xml.nodeType === 3) {
|
// text node
|
// 处理文本节点的内容
|
obj = xml.nodeValue.trim()
|
}
|
return obj
|
}
|
|
/**
|
* @description: XML转JSON
|
* @param {string} xmlStr xml字符串
|
* @return {*} string
|
*/
|
export const XMLToJSON = xmlStr => {
|
const parser = new DOMParser()
|
const xmlDoc = parser.parseFromString(xmlStr, 'text/xml')
|
const xmlObj = deepParse(xmlDoc.documentElement)
|
if (Reflect.has(xmlObj, 'Document')) {
|
return xmlObj
|
} else {
|
return {
|
Document: xmlObj,
|
}
|
}
|
}
|
|
|
export function removeTextKey(obj) {
|
if (typeof obj !== 'object' || obj === null) {
|
// 如果是数值字符串,转换为数值
|
if (typeof obj === 'string' && /^-?\d+(\.\d+)?$/.test(obj)) {
|
return Number(obj);
|
}
|
return obj;
|
}
|
|
if (Array.isArray(obj)) {
|
return obj.map(item => removeTextKey(item));
|
}
|
|
if (Object.prototype.hasOwnProperty.call(obj, '#text')) {
|
// 如果 #text 的值是数值字符串,转换为数值
|
const textValue = obj['#text'];
|
return typeof textValue === 'string' && /^-?\d+(\.\d+)?$/.test(textValue) ? Number(textValue) : textValue;
|
}
|
|
const newObj = {};
|
for (const key in obj) {
|
if (Object.prototype.hasOwnProperty.call(obj, key)) {
|
newObj[key] = Object.keys(obj[key]).length === 0 ? '' : removeTextKey(obj[key]);
|
}
|
}
|
return newObj;
|
}
|