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 } const parent = graphic._parent // 右击是编辑点时 graphicLayer.removeGraphic(graphic) if (parent) { graphicLayer.removeGraphic(parent) } } }, { 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 }