import * as mars3d from "mars3d" export let map // mars3d.Map三维地图对象 let drawGraphic let graphicLayer // 需要覆盖config.json中地图属性参数(当前示例框架中自动处理合并) export const mapOptions = { scene: { center: { lat: -13.151771, lng: 55.60413, alt: 30233027, heading: 154, pitch: -89 }, cameraController: { zoomFactor: 3.0, minimumZoomDistance: 1, maximumZoomDistance: 300000000, constrainedAxis: false // 解除在南北极区域鼠标操作限制 }, clock: { multiplier: 10 // 速度 } }, control: { clockAnimate: true, // 时钟动画控制(左下角) timeline: true, // 是否显示时间线控件 compass: { top: "10px", left: "5px" } } } export const eventTarget = new mars3d.BaseClass() // 事件对象,用于抛出事件到面板中 /** * 初始化地图业务,生命周期钩子函数(必须) * 框架在地图初始化完成后自动调用该函数 * @param {mars3d.Map} mapInstance 地图对象 * @returns {void} 无 */ export function onMounted(mapInstance) { map = mapInstance // 记录map map.toolbar.style.bottom = "55px"// 修改toolbar控件的样式 // 创建矢量数据图层 graphicLayer = new mars3d.layer.GraphicLayer() map.addLayer(graphicLayer) graphicLayer.on(mars3d.EventType.click, function (event) { console.log("单击了卫星", event) }) // graphicLayer.on(mars3d.EventType.change, function (event) { // console.log("卫星位置变化", event) // }) graphicLayer.bindPopup(function (event) { const attr = event.graphic.attr || {} attr["类型"] = event.graphic.type attr["备注"] = "我支持鼠标交互" return mars3d.Util.getTemplateHtml({ title: "卫星图层", template: "all", attr: attr }) }) creatSatellite() } /** * 释放当前地图业务的生命周期函数 * @returns {void} 无 */ export function onUnmounted() { map = null } function creatSatellite() { const weixin = new mars3d.graphic.Satellite({ name: "GAOFEN 1", tle1: "1 39150U 13018A 21180.50843864 .00000088 00000-0 19781-4 0 9997", tle2: "2 39150 97.8300 252.9072 0018449 344.7422 15.3253 14.76581022440650", model: { url: "//data.mars3d.cn/gltf/mars/weixin.gltf", show: true }, cone: { angle1: 40, show: false }, label: { font_family: "楷体", font_size: 30, show: true }, path: { show: true } }) graphicLayer.addGraphic(weixin) weixin._lastInPoly = false setTimeout(() => { const position = weixin.position if (position) { map.flyToPoint(position, { radius: 900000, // 距离目标点的距离 pitch: -60 // 相机方向 }) } }, 3000) // 位置变化事件 graphicLayer.on(mars3d.EventType.change, function (event) { // 判断卫星是否在面内 const weixin = event.graphic if (!drawGraphic) { weixin._lastInPoly = false weixin.coneShow = false // 关闭视锥体 return } const position = weixin.position if (!position) { return } let openVideo = false const thisIsInPoly = drawGraphic.isInPoly(position) if (thisIsInPoly !== weixin._lastInPoly) { if (thisIsInPoly) { // 开始进入区域内 console.log("卫星开始进入区域内", weixin.name) weixin.coneShow = true // 打开视锥体 openVideo = true // 打开视频面板 } else { // 离开区域 console.log("卫星离开区域", weixin.name) weixin.coneShow = false // 关闭视锥体 openVideo = false // 关闭视频面板 } eventTarget.fire("video", { openVideo }) weixin._lastInPoly = thisIsInPoly } }) } // 框选查询 矩形 export function drawRectangle() { drawClear() map.graphicLayer.startDraw({ type: "rectangle", style: { color: "#ffff00", opacity: 0.2, outline: true, outlineColor: "#ffffff", outlineWidth: 2 }, success: function (graphic) { drawGraphic = graphic } }) } // 框选查询 圆 export function drawCircle() { drawClear() map.graphicLayer.startDraw({ type: "circle", style: { color: "#ffff00", opacity: 0.2, outline: true, outlineColor: "#ffffff", outlineWidth: 2 }, success: function (graphic) { drawGraphic = graphic } }) } // 框选查询 多边 export function drawPolygon() { drawClear() map.graphicLayer.startDraw({ type: "polygon", style: { color: "#ffff00", opacity: 0.2, outline: true, outlineColor: "#ffffff", outlineWidth: 2 }, success: function (graphic) { drawGraphic = graphic } }) } // 清除 export function drawClear() { map.graphicLayer.clear() drawGraphic = null }