实现echarts的地图效果
准备数据
从 datav 地图小工具 这里下载对应的行政区的geojson数据,自己的项目里的数据从哪里下载还是自己生产的有你的项目决定,这里我只是测试使用,故从datav 地图小工具下载了香港的数据
WARNING
地图数据是个很敏感的东西,尤其是国家的行政边界,项目里使用请遵循对应的法律政策,我这里只是测试使用
加载数据并加到地图
maptalks里已经内置了geojson
的解析工具了GeoJSON
,可以快速的将geojson数据解析成图形要素
js
fetch("../assets/data/hk.json")
.then((res) => res.json())
.then((geojson) => {
const polygons = maptalks.GeoJSON.toGeometry(geojson);
layer.addGeometry(polygons);
addLabels();
});
配置图形的样式
从效果图里可以看出,每个图形的颜色是有图形的某个业务数据字段的大小决定的,所以这里我采用maptalks的样式插值color-interpolate
,geojson数据里我手动添加了value
字段的值,表示人口的数量,顾而根据人口数量来为每个图形配置颜色了
js
fetch("../assets/data/hk.json")
.then((res) => res.json())
.then((geojson) => {
const polygons = maptalks.GeoJSON.toGeometry(geojson);
polygons.forEach((polygon) => {
polygon.options.enableSimplify = false;
polygon.setSymbol({
polygonFill: {
type: "color-interpolate",
property: "value",
stops: [
[2000, "lightskyblue"],
[12000, "yellow"],
[30000, "orangered"],
],
},
// polygonFill: "lightskyblue",
polygonOpacity: 1,
lineWidth: 1,
lineColor: "#444",
});
});
layer.addGeometry(polygons);
});
添加图形的高亮效果
高亮效果即鼠标移动上去,对图形高亮提示,使该图形成为显眼包
,这里我们添加图形的mouseover
,mouseout
事件处理函数,在对应的事件里更新图形的样式即可
- mouseover 高亮图形
- mouseout 还原图形原始的样式
js
function mouseEventFunc(e) {
const polygon = e.target;
if (e.type === "mouseover") {
if (!polygon._oldSymbol) {
polygon._oldSymbol = polygon.getSymbol();
}
polygon.setSymbol({
polygonFill: "#FFCF00",
lineWidth: 1,
lineColor: "#444",
shadowBlur: 5,
shodowColor: "black",
});
} else if (e.type === "mouseout") {
if (polygon._oldSymbol) {
polygon.setSymbol(polygon._oldSymbol);
}
}
}
function addPolygons() {
fetch("../assets/data/hk.json")
.then((res) => res.json())
.then((geojson) => {
const polygons = maptalks.GeoJSON.toGeometry(geojson);
polygons.forEach((polygon) => {
polygon.options.enableSimplify = false;
polygon.setSymbol({
polygonFill: {
type: "color-interpolate",
property: "value",
stops: [
[2000, "lightskyblue"],
[12000, "yellow"],
[30000, "orangered"],
],
},
// polygonFill: "lightskyblue",
polygonOpacity: 1,
lineWidth: 1,
lineColor: "#444",
});
polygon.on("mouseover mouseout", mouseEventFunc);
});
layer.addGeometry(polygons);
addLabels();
});
}
添加文字标注
这里我们把文字标注单独的做了份数据,maptalks的图形Polygon
是支持通过样式配置自动生成文字标注的,但是自动生成的文字的位置是利用数学方法计算出来的,效果不理想,因而人工做了个文字标注的数据
js
function addLabels() {
fetch("../assets/data/hklabel.geojson")
.then((res) => res.json())
.then((geojson) => {
const points = maptalks.GeoJSON.toGeometry(geojson);
points.forEach((point) => {
const { name } = point.getProperties();
point.setSymbol({
textName: name,
textHaloRadius: 0.2,
textHaloFill: "#fff",
});
});
layer.addGeometry(points);
});
}
开启文字碰撞
js
const layer = new maptalks.VectorLayer("layer", {
// enableAltitude: true
collision: true,
collisionDelay: 250,
collisionBufferSize: 10,
}).addTo(map);