import * as mars3d from "mars3d"
|
|
export let map // mars3d.Map三维地图对象
|
export const mapOptions = {
|
scene: {
|
center: { lat: 23.359088, lng: 116.19963, alt: 1262727, heading: 2, pitch: -60 }
|
},
|
layers: []
|
}
|
|
/**
|
* 初始化地图业务,生命周期钩子函数(必须)
|
* 框架在地图初始化完成后自动调用该函数
|
* @param {mars3d.Map} mapInstance 地图对象
|
* @returns {void} 无
|
*/
|
export function onMounted(mapInstance) {
|
map = mapInstance // 记录map
|
|
map.imageryLayers._layers.forEach(function (layer, index, arr) {
|
layer.brightness = 0.4
|
})
|
|
// 加载气象
|
mars3d.Util.fetchJson({ url: "//data.mars3d.cn/file/apidemo/windpoint.json" })
|
.then(function (res) {
|
showWindLine(res.data)
|
})
|
.catch(function (error) {
|
console.log("加载JSON出错", error)
|
})
|
}
|
|
/**
|
* 释放当前地图业务的生命周期函数
|
* @returns {void} 无
|
*/
|
export function onUnmounted() {
|
map = null
|
}
|
|
const colors = ["#006837", "#1a9850", "#66bd63", "#a6d96a", "#d9ef8b", "#ffffbf", "#fee08b", "#fdae61", "#f46d43", "#d73027", "#a50026"]
|
const breaks = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 99] // 等值面的级数
|
|
// 等值线面
|
function showWindLine(arr) {
|
const pointGrid = []
|
for (let i = 0, len = arr.length; i < len; i++) {
|
const item = arr[i]
|
|
pointGrid.push({
|
type: "Feature",
|
properties: item,
|
geometry: {
|
type: "Point",
|
coordinates: [item.x, item.y]
|
}
|
})
|
}
|
|
const points = {
|
type: "FeatureCollection",
|
features: pointGrid
|
}
|
|
// 插值
|
// points = turf.interpolate(points, 10, {
|
// gridType: 'point', // 'square' | 'point' | 'hex' | 'triangle'
|
// property: 'speed',
|
// units: 'kilometers', // degrees, radians, miles, or kilometers
|
// weight: 1
|
// })
|
// 适当降低插值结果的精度便于显示
|
// points.features.map((i) => (i.properties.speed = Number(i.properties.speed.toFixed(2))))
|
|
// 等值面
|
const geojsonPoly = turf.isobands(points, breaks, {
|
zProperty: "speed"
|
})
|
|
const geoJsonLayer = new mars3d.layer.GeoJsonLayer({
|
name: "等值面",
|
data: geojsonPoly,
|
popup: "{speed}",
|
symbol: {
|
styleOptions: {
|
fill: true, // 是否填充
|
color: "#ffff00", // 颜色
|
opacity: 0.7 // 透明度
|
},
|
callback: function (attr, styleOpt) {
|
// 得到点的权重,计算落在那个色度带
|
const val = Number(attr.speed.split("-")[0] || 0)
|
const color = getColor(val)
|
return {
|
color: color
|
}
|
}
|
}
|
})
|
map.addLayer(geoJsonLayer)
|
|
// 等值线
|
const geojsonLine = turf.isolines(points, breaks, {
|
zProperty: "speed"
|
})
|
|
// 进行平滑处理
|
// let features = geojsonLine.features;
|
// for (let i = 0; i < features.length; i++) {
|
// let _coords = features[i].geometry.coordinates;
|
// let _lCoords = [];
|
// for (let j = 0; j < _coords.length; j++) {
|
// let _coord = _coords[j];
|
// let line = turf.lineString(_coord);
|
// let curved = turf.bezierSpline(line);
|
// _lCoords.push(curved.geometry.coordinates);
|
// }
|
// features[i].geometry.coordinates = _lCoords;
|
// }
|
|
const layerDZX = new mars3d.layer.GeoJsonLayer({
|
name: "等值线",
|
data: geojsonLine,
|
popup: "{speed}",
|
symbol: {
|
styleOptions: {
|
width: 2, // 边框宽度
|
color: "#000000", // 边框颜色
|
opacity: 0.5, // 边框透明度
|
clampToGround: false // 是否贴地
|
}
|
}
|
})
|
map.addLayer(layerDZX)
|
}
|
|
function getColor(value) {
|
for (let i = 0; i < breaks.length; i++) {
|
if (breaks[i] === value) {
|
return colors[i]
|
}
|
}
|
return colors[0]
|
}
|