text: import * as mars3d from "mars3d"
  
  export let map // mars3d.Map三维地图对象
  export let graphicLayer // 矢量图层对象
  export const kgUtil = window.kgUtil
  
  // 需要覆盖config.json中地图属性参数（当前示例框架中自动处理合并）
  export const mapOptions = {
    scene: {
      center: { lat: 31.516143, lng: 117.282937, alt: 46242, heading: 2, pitch: -49 }
    }
  }
  
  export const eventTarget = new mars3d.BaseClass() // 事件对象，用于抛出事件到面板中
  
  /**
   * 初始化地图业务，生命周期钩子函数（必须）
   * 框架在地图初始化完成后自动调用该函数
   * @param {mars3d.Map} mapInstance 地图对象
   * @returns {void} 无
   */
  export function onMounted(mapInstance) {
    map = mapInstance // 记录map
  
    // 创建矢量数据图层
    graphicLayer = new mars3d.layer.GraphicLayer({
      hasEdit: true,
      isAutoEditing: true // 绘制完成后是否自动激活编辑
    })
    map.addLayer(graphicLayer)
  
    bindLayerEvent() // 对图层绑定相关事件
    bindLayerContextMenu() // 在图层绑定右键菜单,对所有加到这个图层的矢量数据都生效
  }
  
  /**
   * 释放当前地图业务的生命周期函数
   * @returns {void} 无
   */
  export function onUnmounted() {
    map = null
  }
  
  // 绘制
  export function drawPolygon(type) {
    graphicLayer.startDraw({
      type: type,
      edittype: "polygon",
      style: {
        color: "#ff0000",
        opacity: 0.6,
        outline: true,
        outlineWidth: 3,
        outlineColor: "#ffffff",
        clampToGround: true
      }
    })
  }
  
  // 绘制(带高度)
  export function drawExtrudedPolygon(type) {
    graphicLayer.startDraw({
      type: type,
      edittype: "polygon",
      style: {
        color: "#ffd500",
        opacity: 0.4,
        diffHeight: 300
      }
    })
  }
  
  // 在图层级处理一些事物
  function bindLayerEvent() {
    // 在layer上绑定监听事件
    graphicLayer.on(mars3d.EventType.click, function (event) {
      console.log("监听layer，单击了矢量对象", event)
    })
    /* graphicLayer.on(mars3d.EventType.mouseOver, function (event) {
      console.log("监听layer，鼠标移入了矢量对象", event)
    })
    graphicLayer.on(mars3d.EventType.mouseOut, function (event) {
      console.log("监听layer，鼠标移出了矢量对象", event)
    }) */
  
    // 数据编辑相关事件，用于属性弹窗的交互
    graphicLayer.on(mars3d.EventType.drawCreated, function (e) {
      if (graphicLayer.hasEdit) {
        eventTarget.fire("graphicEditor-start", e)
      }
    })
    graphicLayer.on(
      [mars3d.EventType.editStart, mars3d.EventType.editMovePoint, mars3d.EventType.editStyle, mars3d.EventType.editRemovePoint],
      function (e) {
        eventTarget.fire("graphicEditor-update", e)
      }
    )
    graphicLayer.on([mars3d.EventType.editStop, mars3d.EventType.removeGraphic], function (e) {
      eventTarget.fire("graphicEditor-stop", e)
    })
  }
  
  // 在图层绑定Popup弹窗
  export function bindLayerPopup() {
    graphicLayer.bindPopup(function (event) {
      const attr = event.graphic.attr || {}
      attr["类型"] = event.graphic.type
      attr["来源"] = "我是layer上绑定的Popup"
      attr["备注"] = "我支持鼠标交互"
  
      return mars3d.Util.getTemplateHtml({ title: "矢量图层", template: "all", attr: attr })
    })
  }
  
  // 绑定右键菜单
  export function bindLayerContextMenu() {
    graphicLayer.bindContextMenu([
      {
        text: "开始编辑对象",
        icon: "fa fa-edit",
        show: function (e) {
          const graphic = e.graphic
          if (!graphic || !graphic.startEditing) {
            return false
          }
          return !graphic.isEditing
        },
        callback: function (e) {
          const graphic = e.graphic
          if (!graphic) {
            return false
          }
          if (graphic) {
            graphicLayer.startEditing(graphic)
          }
        }
      },
      {
        text: "停止编辑对象",
        icon: "fa fa-edit",
        show: function (e) {
          const graphic = e.graphic
          if (!graphic) {
            return false
          }
          return graphic.isEditing
        },
        callback: function (e) {
          const graphic = e.graphic
          if (!graphic) {
            return false
          }
          if (graphic) {
            graphicLayer.stopEditing(graphic)
          }
        }
      },
      {
        text: "删除对象",
        icon: "fa fa-trash-o",
        show: (event) => {
          const graphic = event.graphic
          if (!graphic || graphic.isDestroy) {
            return false
          } else {
            return true
          }
        },
        callback: function (e) {
          const graphic = e.graphic
          if (!graphic) {
            return
          }
          graphicLayer.removeGraphic(graphic)
        }
      },
  
      {
        text: "计算周长",
        icon: "fa fa-medium",
        callback: function (e) {
          const graphic = e.graphic
          const strDis = mars3d.MeasureUtil.formatDistance(graphic.distance)
          globalAlert("该对象的周长为:" + strDis)
        }
      },
      {
        text: "计算面积",
        icon: "fa fa-reorder",
        callback: function (e) {
          const graphic = e.graphic
          const strArea = mars3d.MeasureUtil.formatArea(graphic.area)
          globalAlert("该对象的面积为:" + strArea)
        }
      }
    ])
  }
  
  export function updateLayerHasEdit(val) {
    graphicLayer.hasEdit = val
  }
  
  // 保存GeoJSON
  export function downloadJsonFile() {
    const geojson = graphicLayer.toGeoJSON()
    mars3d.Util.downloadFile("我的标注.json", JSON.stringify(geojson))
  }
  
  /**
   * 打开geojson文件
   *
   * @export
   * @param {FileInfo} file 文件
   * @returns {void} 无
   */
  export function openGeoJSON(file) {
    const fileName = file.name
    const fileType = fileName?.substring(fileName.lastIndexOf(".") + 1, fileName.length).toLowerCase()
  
    if (fileType === "json" || fileType === "geojson") {
      const reader = new FileReader()
      reader.readAsText(file, "UTF-8")
      reader.onloadend = function (e) {
        let geojson = this.result
        geojson = simplifyGeoJSON(geojson) // 简化geojson的点
        graphicLayer.loadGeoJSON(geojson, {
          flyTo: true
        })
      }
    } else if (fileType === "kml") {
      const reader = new FileReader()
      reader.readAsText(file, "UTF-8")
      reader.onloadend = function (e) {
        const strkml = this.result
        kgUtil.toGeoJSON(strkml).then((geojson) => {
          geojson = simplifyGeoJSON(geojson) // 简化geojson的点
          console.log("kml2geojson", geojson)
  
          graphicLayer.loadGeoJSON(geojson, {
            flyTo: true
          })
        })
      }
    } else if (fileType === "kmz") {
      // 加载input文件控件的二进制流
      kgUtil.toGeoJSON(file).then((geojson) => {
        geojson = simplifyGeoJSON(geojson) // 简化geojson的点
        console.log("kmz2geojson", geojson)
  
        graphicLayer.loadGeoJSON(geojson, {
          flyTo: true
        })
      })
    } else {
      globalMsg("暂不支持 " + fileType + " 文件类型的数据！")
    }
  }
  
   
  
  // 简化geojson的坐标
  function simplifyGeoJSON(geojson) {
    try {
      geojson = turf.simplify(geojson, { tolerance: 0.000001, highQuality: true, mutate: true })
    } catch (e) {
      console.log("加载出错", e)
    }
    return geojson
  }
  