import * as mars3d from "mars3d" export let map // mars3d.Map三维地图对象 let canvasWindLayer // 需要覆盖config.json中地图属性参数(当前示例框架中自动处理合并) export const mapOptions = { scene: { center: { lat: 16.490922, lng: 101.305158, alt: 31274431, heading: 0, pitch: -88 } } } /** * 初始化地图业务,生命周期钩子函数(必须) * 框架在地图初始化完成后自动调用该函数 * @param {mars3d.Map} mapInstance 地图对象 * @returns {void} 无 */ export function onMounted(mapInstance) { map = mapInstance // 记录map map.basemap = 2017 // 蓝色底图 // 风场 canvasWindLayer = new mars3d.layer.CanvasWindLayer({ color: "#4696db", // 颜色 frameRate: 10, // 每秒刷新次数 speedRate: 120, // 风前进速率 particlesNumber: 3000, maxAge: 60, lineWidth: 1.5 }) map.addLayer(canvasWindLayer) loadEarthData() } /** * 释放当前地图业务的生命周期函数 * @returns {void} 无 */ export function onUnmounted() { map = null } // 滑动条事件 // 修改粒子数量 export function changeCount(val) { if (val) { canvasWindLayer.particlesNumber = val } } // 修改存活时间 export function changeAge(val) { if (val) { canvasWindLayer.maxAge = val } } // 修改移动速率 export function changeSpeed(val) { if (val) { canvasWindLayer.speedRate = val } } // 修改线宽 export function changeLinewidth(val) { if (val) { canvasWindLayer.lineWidth = val } } // 改变颜色 export function changeColor(color) { canvasWindLayer.color = color } // 加载全球数据 let earthWindData // 加载气象 let dongnanWindData export function loadEarthData() { map.flyHome() canvasWindLayer.speedRate = 50 canvasWindLayer.reverseY = false // false时表示 纬度顺序从大到小 mars3d.Util.fetchJson({ url: "//data.mars3d.cn/file/apidemo/windyuv.json" }) .then(function (res) { if (earthWindData) { canvasWindLayer.data = earthWindData return } earthWindData = res canvasWindLayer.data = earthWindData }) .catch(function (err) { console.log("请求数据失败!", err) }) } // 加载局部数据 export function loadDongnanData() { map.setCameraView({ y: 30.484229, x: 116.627601, z: 1719951, heading: 0, pitch: -90, roll: 0 }) canvasWindLayer.speedRate = 85 canvasWindLayer.reverseY = true // true时表示 纬度顺序从小到到大 // 访问windpoint.json后端接口,取数据 mars3d.Util.fetchJson({ url: "//data.mars3d.cn/file/apidemo/windpoint.json" }) .then(function (res) { if (dongnanWindData) { canvasWindLayer.data = dongnanWindData return } dongnanWindData = convertWindData(res.data) canvasWindLayer.data = dongnanWindData }) .catch(function () { globalMsg("实时查询气象信息失败,请稍候再试") }) } // 将数据转换为需要的格式:风向转UV function convertWindData(arr) { const arrU = [] const arrV = [] let xmin = arr[0].x let xmax = arr[0].x let ymin = arr[0].y let ymax = arr[0].y // 风向是以y轴正方向为零度顺时针转,0度表示北风。90度表示东风。 // u表示经度方向上的风,u为正,表示西风,从西边吹来的风。 // v表示纬度方向上的风,v为正,表示南风,从南边吹来的风。 for (let i = 0, len = arr.length; i < len; i++) { const item = arr[i] if (xmin > item.x) { xmin = item.x } if (xmax < item.x) { xmax = item.x } if (ymin > item.y) { ymin = item.y } if (ymax < item.y) { ymax = item.y } const u = mars3d.WindUtil.getU(item.speed, item.dir) arrU.push(u) const v = mars3d.WindUtil.getV(item.speed, item.dir) arrV.push(v) } const rows = getKeyNumCount(arr, "y") // 计算 行数 const cols = getKeyNumCount(arr, "x") // 计算 列数 return { xmin: xmin, xmax: xmax, ymax: ymax, ymin: ymin, rows: rows, cols: cols, udata: arrU, // 横向风速 vdata: arrV // 纵向风速 } } function getKeyNumCount(arr, key) { const obj = {} arr.forEach((item) => { obj[item[key]] = true }) let count = 0 for (const col in obj) { count++ } return count }