import * as mars3d from "mars3d" export let map // mars3d.Map三维地图对象 export let graphicLayer // 矢量图层对象 let arrData // 需要覆盖config.json中地图属性参数(当前示例框架中自动处理合并) export const mapOptions = { scene: { center: { lat: 24.688611, lng: 119.260277, alt: 1673759, heading: 348, pitch: -69 } } } /** * 初始化地图业务,生命周期钩子函数(必须) * 框架在地图初始化完成后自动调用该函数 * @param {mars3d.Map} mapInstance 地图对象 * @returns {void} 无 */ export function onMounted(mapInstance) { map = mapInstance // 记录map // 创建矢量数据图层 graphicLayer = new mars3d.layer.GraphicLayer({ // 点的聚合配置 clustering: { enabled: true, pixelRange: 20 // opacity: 1, // getImage: function (count) { //getImage是完全自定义方式 // let colorIn // if (count < 10) { // colorIn = 'rgba(110, 204, 57, 0.6)' // } else if (count < 100) { // colorIn = 'rgba(240, 194, 12, 0.6)' // } else { // colorIn = 'rgba(241, 128, 23, 0.6)' // } // return mars3d.Util.getCircleImage(count, { // color: colorIn, // radius: 30, // }) // }, } // tooltip: '{text}', }) map.addLayer(graphicLayer) // 访问后端接口,取数据 mars3d.Util.fetchJson({ url: "//data.mars3d.cn/file/apidemo/mudi.json" }) .then(function (res) { arrData = res.data addFeature(graphicLayer, arrData) }) .catch(function (error) { console.log("加载JSON出错", error) }) } /** * 释放当前地图业务的生命周期函数 * @returns {void} 无 */ export function onUnmounted() { map = null graphicLayer.remove() graphicLayer = null } function addFeature(graphicLayer, arr) { graphicLayer.bindPopup(function (event) { const item = event.graphic?.attr if (!item) { return false } const inthtml = `
${item.text}
省:${item.province}
市: ${item.city}
县/区: ${item.district}
地址: ${item.address}
视频:
` return inthtml }) // 单击事件 graphicLayer.on(mars3d.EventType.click, function (event) { console.log("你单击了", event) if (map.camera.positionCartographic.height > 90000) { const graphic = event.graphic // graphic.closePopup() if (graphic) { // 单击了具体的点对象 const position = graphic.positionShow map.flyToPoint(position, { radius: 5000, // 距离目标点的距离 duration: 4, complete: function (e) { // 飞行完成回调方法 // graphic.openPopup() } }) } else { // 单击了聚合的点 const arrEntity = event.pickedObject.id map.flyTo(arrEntity) } } }) for (let i = 0, len = arr.length; i < len; i++) { const item = arr[i] const graphic = new mars3d.graphic.BillboardEntity({ position: new mars3d.LngLatPoint(item.lng, item.lat, item.z || 0), style: { image: "img/marker/mark3.png", horizontalOrigin: Cesium.HorizontalOrigin.CENTER, verticalOrigin: Cesium.VerticalOrigin.BOTTOM, scaleByDistance: new Cesium.NearFarScalar(1000, 0.7, 5000000, 0.3), label: { text: item.text, font_size: 19, color: Cesium.Color.AZURE, outline: true, outlineColor: Cesium.Color.BLACK, outlineWidth: 2, horizontalOrigin: Cesium.HorizontalOrigin.LEFT, verticalOrigin: Cesium.VerticalOrigin.BOTTOM, pixelOffset: new Cesium.Cartesian2(10, 0), // 偏移量 distanceDisplayCondition: new Cesium.DistanceDisplayCondition(0.0, 80000) } }, attr: item }) graphicLayer.addGraphic(graphic) } } // 计算贴地高度示例代码,可以将获取到的高度更新到数据库内,后续不用重复计算。 export function getDataSurfaceHeight() { if (!arrData) { globalMsg("数据尚未加载成功!") return } const lonCol = "lng" const latCol = "lat" const heightCol = "z" const positions = [] for (let i = 0, len = arrData.length; i < len; i++) { const item = arrData[i] // 所在经纬度坐标及海拔高度 const longitude = Number(item[lonCol]) const latitude = Number(item[latCol]) const height = Number(item[heightCol] || 0) const position = Cesium.Cartesian3.fromDegrees(longitude, latitude, height) positions.push(position) } showLoading() mars3d.PolyUtil.computeSurfacePoints({ map: map, positions: positions }).then((result) => { hideLoading() if (result.noHeight) { console.log("部分数据未获取到高度值,贴地高度计算存在误差") } for (let i = 0, len = arrData.length; i < len; i++) { const item = arrData[i] const point = mars3d.LngLatPoint.fromCartesian(result.positions[i]) item[lonCol] = point.lng item[latCol] = point.lat item[heightCol] = point.alt // 得到计算的高度值 } mars3d.Util.downloadFile("point.json", JSON.stringify({ data: arrData })) }) } export function enabledAggressive(val) { graphicLayer.clustering = val }