Skip to content
目录

实现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);

This document is generated by mdpress