import * as mars3d from "mars3d" export let map // mars3d.Map三维地图对象 let geoJsonLayer // 矢量图层对象,用于layer绑定展示 let graphicLayer // 矢量图层对象,用于graphic绑定展示 export const eventTarget = new mars3d.BaseClass() /** * 初始化地图业务,生命周期钩子函数(必须) * 框架在地图初始化完成后自动调用该函数 * @param {mars3d.Map} mapInstance 地图对象 * @returns {void} 无 */ export function onMounted(mapInstance) { map = mapInstance // 记录map // 创建矢量数据图层 graphicLayer = new mars3d.layer.GraphicLayer() map.addLayer(graphicLayer) map.on(mars3d.EventType.popupOpen, function (event) { const container = event.container // popup对应的DOM console.log("打开了popup(全局监听)", event) }) map.on(mars3d.EventType.popupClose, function (event) { const container = event.container // popup对应的DOM console.log("关闭了popup(全局监听)", event) }) bindLayerDemo() } /** * 释放当前地图业务的生命周期函数 * @returns {void} 无 */ export function onUnmounted() { map = null } export function removeDemoLayer() { graphicLayer.clear() if (geoJsonLayer) { geoJsonLayer.remove(true) geoJsonLayer = null } } // 1.在map地图上绑定Popup单击弹窗 export function bindMapDemo() { removeDemoLayer() // 关闭弹窗 map.closePopup() // 传入坐标和内容,可以直接任意弹出 const position = [116.328539, 30.978731, 1521] map.openPopup(position, "我是地图上直接弹出的") } // 2.在layer图层上绑定Popup单击弹窗 export function bindLayerDemo() { removeDemoLayer() geoJsonLayer = new mars3d.layer.GeoJsonLayer({ name: "标绘示例数据", url: "//data.mars3d.cn/file/geojson/mars3d-draw.json" }) map.addLayer(geoJsonLayer) // 在layer上绑定Popup单击弹窗 geoJsonLayer.bindPopup( function (event) { const attr = event.graphic.attr return attr.type + " 我是layer上绑定的Popup" + new Date().toLocaleTimeString() // return new Promise((resolve) => { // //这里可以进行后端接口请求数据,setTimeout测试异步 // setTimeout(() => { // resolve("Promise异步回调显示的弹窗内容信息"); // }, 2000); // }); }, { timeRender: true, closeButton: false } // timeRender实时刷新 ) geoJsonLayer.on(mars3d.EventType.popupOpen, function (event) { const container = event.container // popup对应的DOM console.log("图层上打开了popup", container) }) geoJsonLayer.on(mars3d.EventType.popupClose, function (event) { const container = event.container // popup对应的DOM console.log("图层上移除了popup", container) }) } // 2.在layer图层上预定义Popup单击弹窗 export function bindLayerDemo2() { removeDemoLayer() geoJsonLayer = new mars3d.layer.GeoJsonLayer({ name: "标绘示例数据", url: "//data.mars3d.cn/file/geojson/mars3d-draw.json", // popup按属性字段配置,可以是字符串模板或数组 // popup: 'all', //显示所有属性,常用于测试 // popup: '{name} {type}', popup: [ { field: "id", name: "编码" }, { field: "name", name: "名称" }, { field: "type", name: "类型" }, { type: "html", html: "" } ], popupOptions: { autoCenter: true } }) map.addLayer(geoJsonLayer) } // 2.在layer图层上绑定Popup单击弹窗 export function bindLayerTemplateDemo() { removeDemoLayer() geoJsonLayer = new mars3d.layer.GeoJsonLayer({ name: "标绘示例数据", url: "//data.mars3d.cn/file/geojson/mars3d-draw.json" }) map.addLayer(geoJsonLayer) // 在layer上绑定Popup单击弹窗 geoJsonLayer.bindPopup( function (event) { const attr = event.graphic.attr return "我是layer上绑定的自定义模版Popup
" + attr.type }, { template: `
{content}
×
`, horizontalOrigin: Cesium.HorizontalOrigin.LEFT, verticalOrigin: Cesium.VerticalOrigin.CENTER } ) geoJsonLayer.on(mars3d.EventType.popupOpen, function (event) { const container = event.container // popup对应的DOM console.log("图层上打开了popup", container) }) geoJsonLayer.on(mars3d.EventType.popupClose, function (event) { const container = event.container // popup对应的DOM console.log("图层上移除了popup", container) }) } // 3.在graphic数据上绑定Popup单击弹窗局部刷新 export function bindGraphicDemo1() { removeDemoLayer() const graphic = new mars3d.graphic.BoxEntity({ position: new mars3d.LngLatPoint(116.328539, 30.978731, 1521), style: { dimensions: new Cesium.Cartesian3(2000.0, 2000.0, 2000.0), fill: true, color: "#00ff00", opacity: 0.9, label: { text: "graphic绑定的演示", font_size: 19, pixelOffsetY: -45, horizontalOrigin: Cesium.HorizontalOrigin.CENTER, verticalOrigin: Cesium.VerticalOrigin.BOTTOM } }, attr: { remark: "示例1" } }) graphicLayer.addGraphic(graphic) function getInnerHtml(event) { // let attr = event.graphic.attr const inthtml = `
graphic.bindPopup
说明:Popup鼠标单击信息弹窗1
方式:可以绑定任意html
备注:我是graphic上绑定的Popup
` return inthtml } graphic.on(mars3d.EventType.popupOpen, function (event) { const container = event.container // popup对应的DOM console.log("打开了popup", container) const btnDetails = container.querySelector("#btnDetails") if (btnDetails) { btnDetails.addEventListener("click", (e) => { showXQ() }) } }) graphic.on(mars3d.EventType.popupClose, function (event) { const container = event.container // popup对应的DOM console.log("移除了popup", container) }) // 绑定Popup graphic.bindPopup(getInnerHtml).openPopup() } // 4.在graphic数据上绑定Popup单击弹窗 export function bindGraphicDemo2() { removeDemoLayer() const graphic = new mars3d.graphic.BillboardEntity({ position: new mars3d.LngLatPoint(116.328539, 30.978731, 1521), style: { image: "img/marker/di3.png", scale: 0.5, horizontalOrigin: Cesium.HorizontalOrigin.CENTER, verticalOrigin: Cesium.VerticalOrigin.BOTTOM, label: { text: "Popup局部更新绑定的演示", font_size: 18, font_family: "楷体", pixelOffsetY: -45, horizontalOrigin: Cesium.HorizontalOrigin.CENTER, verticalOrigin: Cesium.VerticalOrigin.BOTTOM } }, attr: { remark: "示例2" } }) graphicLayer.addGraphic(graphic) const innerHtml = `
graphic.bindPopup局部刷新
说明:Popup鼠标单击信息弹窗2
方式:可以绑定任意html
备注:我是graphic上绑定的Popup
时间:
` graphic.on(mars3d.EventType.popupOpen, function (event) { const container = event.container // popup对应的DOM const btnDetails = container.querySelector("#btnDetails") if (btnDetails) { btnDetails.addEventListener("click", (e) => { showXQ() }) } }) // 刷新局部DOM,不影响popup面板的其他控件操作 graphic.on(mars3d.EventType.postRender, function (event) { const container = event.container // popup对应的DOM const tdTime = container.querySelector("#tdTime") if (tdTime) { const date = mars3d.Util.formatDate(new Date(), "yyyy-MM-dd HH:mm:ss S") tdTime.innerHTML = date } }) // 绑定Popup graphic.bindPopup(innerHtml, { offsetY: -30 }).openPopup() } // 只是为了演示,可以单击详情 function showXQ() { const showHistoryLayer = true eventTarget.fire("showWebsite", { showHistoryLayer }) }