import * as mars3d from "mars3d" export let map // mars3d.Map三维地图对象 export let graphicLayer // 矢量图层对象 let pathEntity = null // 需要覆盖config.json中地图属性参数(当前示例框架中自动处理合并) export const mapOptions = { scene: { center: { lat: 32.550222, lng: 117.366824, alt: 2696, heading: 273, pitch: -67 } }, control: { clockAnimate: true, // 时钟动画控制(左下角) timeline: true // 是否显示时间线控件 } } /** * 初始化地图业务,生命周期钩子函数(必须) * 框架在地图初始化完成后自动调用该函数 * @param {mars3d.Map} mapInstance 地图对象 * @returns {void} 无 */ export function onMounted(mapInstance) { map = mapInstance // 记录map // 创建矢量数据图层 graphicLayer = new mars3d.layer.GraphicLayer() map.addLayer(graphicLayer) mars3d.Util.fetchJson({ url: "//data.mars3d.cn/file/apidemo/flypath.json" }) .then(function (res) { initPath(res) }) .catch(function (error) { console.log("加载JSON出错", error) }) } /** * 释放当前地图业务的生命周期函数 * @returns {void} 无 */ export function onUnmounted() { map = null } // 改变视角 跟踪,上方和侧方 export function viewAircraft() { map.trackedEntity = pathEntity.entity pathEntity.flyToPoint({ radius: 500, // 距离目标点的距离 heading: 40, pitch: -50, duration: 0.01 }) } export function viewTopDown() { map.trackedEntity = undefined map.flyToPoint(pathEntity.positionShow, { radius: 2000, heading: -90, pitch: -89 }) } export function viewSide() { map.trackedEntity = undefined map.flyToPoint(pathEntity.positionShow, { radius: 3000, heading: -90, pitch: -25 }) } function initPath(data) { const property = new Cesium.SampledPositionProperty() property.forwardExtrapolationType = Cesium.ExtrapolationType.HOLD let start let stop for (let i = 0, len = data.length; i < len; i++) { const item = data[i] const lng = Number(item.x.toFixed(6)) // 经度 const lat = Number(item.y.toFixed(6)) // 纬度 const height = item.z // 高度 const time = item.time // 时间 let position = null if (lng && lat) { position = Cesium.Cartesian3.fromDegrees(lng, lat, height) } let juliaDate = null if (time) { juliaDate = Cesium.JulianDate.fromIso8601(time) } if (position && juliaDate) { property.addSample(juliaDate, position) } if (i === 0) { start = juliaDate } else if (i === len - 1) { stop = juliaDate } const primitive = new mars3d.graphic.PointPrimitive({ position: position, style: { pixelSize: 4, color: "#cccccc" }, popup: "编号:" + item.id + "
时间:" + time }) graphicLayer.addGraphic(primitive) } // 设置时钟属性 map.clock.startTime = start.clone() map.clock.stopTime = stop.clone() map.clock.currentTime = start.clone() map.clock.clockRange = Cesium.ClockRange.LOOP_STOP map.clock.multiplier = 5 if (map.controls.timeline) { map.controls.timeline.zoomTo(start, stop) } // 创建path对象 pathEntity = new mars3d.graphic.PathEntity({ position: property, orientation: new Cesium.VelocityOrientationProperty(property), style: { resolution: 1, leadTime: 0, trailTime: 3600, color: "#ff0000", width: 3 }, label: { text: "飞机1号", font_size: 19, font_family: "楷体", color: Cesium.Color.AZURE, outline: true, visibleDepth: false, outlineColor: Cesium.Color.BLACK, outlineWidth: 2, horizontalOrigin: Cesium.HorizontalOrigin.CENTER, verticalOrigin: Cesium.VerticalOrigin.BOTTOM, pixelOffset: new Cesium.Cartesian2(10, -25) // 偏移量 }, model: { url: "//data.mars3d.cn/gltf/mars/wrj.glb", scale: 0.1, minimumPixelSize: 20 }, popup: "飞行1号" }) graphicLayer.addGraphic(pathEntity) // 圆锥追踪体 const coneTrack = new mars3d.graphic.ConeTrack({ position: property, style: { length: 100, angle: 12, // 半场角度 color: "#ff0000", opacity: 0.5 } }) graphicLayer.addGraphic(coneTrack) }