import * as mars3d from "mars3d" export let map // mars3d.Map三维地图对象 export let graphicLayer // 矢量图层对象 // 需要覆盖config.json中地图属性参数(当前示例框架中自动处理合并) export const mapOptions = { scene: { center: { lat: 31.773622, lng: 117.077444, alt: 5441, heading: 359, pitch: -57 } } } export const eventTarget = new mars3d.BaseClass() /** * 初始化地图业务,生命周期钩子函数(必须) * 框架在地图初始化完成后自动调用该函数 * @param {mars3d.Map} mapInstance 地图对象 * @returns {void} 无 */ export function onMounted(mapInstance) { map = mapInstance // 记录map // 演示数据的时间 map.clock.currentTime = Cesium.JulianDate.fromDate(new Date("2020-11-25 10:10:00")) // 加载车辆 mars3d.Util.fetchJson({ url: "//data.mars3d.cn/file/apidemo/car-list.json" }) .then(function (res) { const tableData = res.data eventTarget.fire("carList", { tableData }) showCarList(tableData) }) .catch(function () { globalMsg("查询信息失败") }) } /** * 释放当前地图业务的生命周期函数 * @returns {void} 无 */ export function onUnmounted() { map = null } const colors = [ "rgb(40, 40, 255)", "rgb(0, 88, 176)", "rgb(0, 128, 255)", "rgb(0, 217, 0)", "rgb(0, 151, 0)", "rgb(255, 199, 83)", "rgb(255, 144, 30)", "rgb(202, 101, 0)", "rgb(255, 0, 0)" ] function showCarList(arr) { console.log("加载" + arr.length + "条") // 创建矢量数据图层 graphicLayer = new mars3d.layer.GraphicLayer() map.addLayer(graphicLayer) // 鼠标移入提示信息 graphicLayer.bindTooltip(function (event) { const data = event.graphic.options return "车辆编号:" + data.id + "
车牌号码:" + data.name }) // 单击地图空白处 map.on(mars3d.EventType.clickMap, function (event) { if (lastClickCar) { lastClickCar.removeShading("circle") lastClickCar = null } }) // 绑定点击事件 graphicLayer.on(mars3d.EventType.click, (event, position) => { const car = event.graphic console.log("单击了车辆", car) if (lastClickCar) { if (lastClickCar === car) { return } // 重复单击,跳出 lastClickCar.removeShading("circle") lastClickCar = null } car.addShading({ type: "circle", materialType: mars3d.MaterialType.CircleWave, speed: 10, count: 3, gradient: 0.1, radius: 50, color: "#ffff00", opacity: 0.3, show: true }) lastClickCar = car // 视角定位下 // car.flyToPoint({ radius: 1000 }) }) let lastClickCar for (let i = 0; i < arr.length; i++) { const item = arr[i] item.show = true let modelParam switch (item.type) { case 1: modelParam = { scale: 2, url: "//data.mars3d.cn/gltf/mars/car/tufangche.glb" } break case 2: modelParam = { scale: 1, url: "//data.mars3d.cn/gltf/mars/car/wajueji.glb" } break default: } const car = new mars3d.graphic.DynamicRoamLine({ id: item.id, name: item.name, model: { clampToGround: true, show: true, ...modelParam }, shadow: [ { type: "polyline", color: colors[i], width: 2, clampToGround: true, maxDistance: 500, show: true } ] }) graphicLayer.addGraphic(car) } // 定时获取卡车和铲车的列表数据 createPath() } // 取轨迹数据的时间间隔(单位:秒) const timeStep = 10 let lastTime // 首次获取并创建轨迹 function createPath() { // 取数据的时间范围,结束时间 const date = Cesium.JulianDate.toDate(map.clock.currentTime) const endTime = mars3d.Util.formatDate(date, "yyyy-MM-dd HH:mm:ss") // 修改当前时间回退一分钟,因为数据永远是当前时间之前的。 date.setSeconds(date.getSeconds() - 60) map.clock.currentTime = window.Cesium.JulianDate.fromDate(date) // 取数据的时间范围,开始时间 date.setMinutes(date.getMinutes() - 10) // 初次取一定时间内的数据 const beginTime = mars3d.Util.formatDate(date, "yyyy-MM-dd HH:mm:ss") // 记录最后一次读取数据的时间 lastTime = endTime // 取数据 getPathList(beginTime, endTime) // 定时更新 setInterval(() => { updatePath() }, timeStep * 1000) } // 后续更新轨迹 function updatePath() { const beginTime = lastTime const date = new Date(beginTime) date.setSeconds(date.getSeconds() + timeStep) const endTime = mars3d.Util.formatDate(date, "yyyy-MM-dd HH:mm:ss") lastTime = endTime // 取数据 getPathList(beginTime, endTime) } // 读取车辆gps坐标路径的接口 function getPathList(beginTime, endTime) { mars3d.Util.fetchJson({ url: "//data.mars3d.cn/file/apidemo/car-path.json" }) .then((res) => { const listALL = res.data || [] // 因为读取静态json,为了演示动态,筛选数据内符合时间范围内的数据。 // 真实接口中可以注释下面代码。 const d_beginTime = new Date(beginTime) const d_endTime = new Date(endTime) const list = listALL.filter((item) => { const thistime = new Date(item.time) return thistime >= d_beginTime && thistime <= d_endTime }) const path = `${endTime} 获取到 ${list.length} 条GPS坐标记录` eventTarget.fire("showPath", { path }) // 循环车辆 graphicLayer.eachGraphic((car) => { // 取出对应车辆的轨迹列表 const path = list.filter((item) => { return item.id === car.id }) if (path && path.length > 0) { // 更新车辆的轨迹 car.updatePath(path, { timeColumn: "time", getPosition: function (item) { return Cesium.Cartesian3.fromDegrees(parseFloat(item.lon), parseFloat(item.lat), 0) } }) } }) }) .catch(() => { globalMsg("实时查询车辆路径信息失败,请稍候再试") }) } export function onSelect(id, selected) { const car = graphicLayer.getGraphicById(id) if (!car) { return } if (selected) { car.show = true car.flyToPoint({ radius: 900 }) } else { car.show = false } } export function onChange(data) { data.forEach((item) => { const car = graphicLayer.getGraphicById(item) if (car) { car.flyToPoint({ radius: 900 }) } }) } // 点击行 export function flyToModel(id) { const car = graphicLayer.getGraphicById(id) if (car) { car.flyToPoint({ radius: 900 }) } }