forked from drone/command-center-dashboard

罗广辉
2025-04-02 e1699c4851f6ca397cd0ad1ff63f32c737654836
src/utils/cesium/kmz.js
@@ -1,91 +1,82 @@
import axios from 'axios';
import JsZip from 'jszip';
import axios from 'axios'
import JsZip from 'jszip'
const noWmpl = ['Folder', 'Placemark', 'Point', 'coordinates'];
const noWmpl = ['Folder', 'Placemark', 'Point', 'coordinates']
/**
 * @description: 读取kmz文件解析出kml文件
 * @param {string} filePath 文件地址
 * @return {*}
 */
export const analyzeKmzFile = (filePath) => {
export const analyzeKmzFile = filePath => {
  return (
    axios({
      url: filePath,
      method: 'get',
      responseType: 'arraybuffer',
      authorization: false
         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');
        });
         .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;
   let regx = null
  if (isWpml) {
    if (params.mode) {
      regx = new RegExp(
        `<wpml:${params.name}>${params.findRegx}<\\/wpml:${params.name}>`,
        params.mode,
      );
            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);
};
   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) => {
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;
      });
               : `<wpml:${v}>${settingParmas[key][v]}</wpml:${v}>`
            parmaStr += xml
         })
      const xml = noWmpl.includes(key)
        ? `<${key}>${parmaStr}</${key}>`
        : `<wpml:${key}>${parmaStr}</wpml:${key}>`;
      paramGroup += xml;
            : `<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;
            : `<wpml:${key}>${settingParmas[key]}</wpml:${key}>`
         paramGroup += xml
    }
  });
  return paramGroup;
};
   })
   return paramGroup
}
/**
 * @description: JSON转XML
@@ -94,98 +85,98 @@
 * @return {*} string
 */
export const JSONToXML = (obj, rootName, isEnd) => {
  let xml = '';
   let xml = ''
  const buildXml = (obj, rootName) => {
    let xml = '';
      let xml = ''
    if (Array.isArray(obj)) {
      obj.forEach((item) => {
        const str = !noWmpl.includes(rootName) && isEnd ? 'wpml:' : '';
        xml += `<${str}${rootName}>${buildXml(item)}</${str}${rootName}>`;
      });
         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) => {
         Object.keys(obj).forEach(key => {
        if (key === '#text') {
          xml += obj[key];
               xml += obj[key]
        } else {
          const str = !noWmpl.includes(key) && isEnd ? 'wpml:' : '';
               const str = !noWmpl.includes(key) && isEnd ? 'wpml:' : ''
          if (key === 'Placemark') {
            xml += `${buildXml(obj[key], key)}`;
                  xml += `${buildXml(obj[key], key)}`
          } else if (key === 'action') {
            if (Array.isArray(obj[key])) {
              xml += `${buildXml(obj[key], key)}`;
                     xml += `${buildXml(obj[key], key)}`
            } else {
              xml += `<${str}${key}>${buildXml(obj[key], key)}</${str}${key}>`;
                     xml += `<${str}${key}>${buildXml(obj[key], key)}</${str}${key}>`
            }
          } else {
            xml += `<${str}${key}>${buildXml(obj[key], key)}</${str}${key}>`;
                  xml += `<${str}${key}>${buildXml(obj[key], key)}</${str}${key}>`
          }
        }
      });
         })
    } else {
      xml += obj;
         xml += obj
    }
    return xml;
  };
      return xml
   }
  const header = isEnd ? '<?xml version="1.0" encoding="UTF-8"?>' : '';
   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" 的全大写形式
  </kml>`
   return xml
  }
  return null;
};
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 = {};
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:', '');
            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();
                  obj[nodeName] = item.nodeValue.trim()
          }
        } else if (item.nodeType === 1) {
          // element node
          // 递归调用处理子节点
          if (obj[nodeName] === undefined) {
            const nodeValue = deepParse(item);
                  const nodeValue = deepParse(item)
            if (nodeValue[nodeName] === undefined) {
              obj[nodeName] = nodeValue;
                     obj[nodeName] = nodeValue
            } else {
              obj[nodeName] = nodeValue[nodeName];
                     obj[nodeName] = nodeValue[nodeName]
            }
          } else {
            if (!obj[nodeName].push) {
              const old = obj[nodeName];
              obj[nodeName] = [];
              obj[nodeName].push(old);
                     const old = obj[nodeName]
                     obj[nodeName] = []
                     obj[nodeName].push(old)
            }
            const nodeValue = deepParse(item);
                  const nodeValue = deepParse(item)
            if (nodeValue[nodeName] === undefined) {
              obj[nodeName].push(nodeValue);
                     obj[nodeName].push(nodeValue)
            }
          }
        }
@@ -194,25 +185,25 @@
  } else if (xml.nodeType === 3) {
    // text node
    // 处理文本节点的内容
    obj = xml.nodeValue.trim();
      obj = xml.nodeValue.trim()
  }
  return obj;
};
   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);
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;
      return xmlObj
  } else {
    return {
      Document: xmlObj,
    };
  }
};
   }
}