echarts地图-精确到乡镇-通过bigemap和geojson获取echarts精确到乡镇、街道的地图json数据插入到项目


前言

项目要求显示地图精确到乡镇,并且hover显示相应区域的数据。echarts地图怎么获取精确到乡镇的地图json数据呢?通过更换json文件达到目的,但使用本地json数据可能会加载数据过多卡顿,我们通过后端返回数据替换json达到目的,如果有更好的方法,感谢私信或评论。。欢迎点赞收藏,谢谢 ! (≧∇≦)/


一、通过bigemap和geojson获取echarts精确到乡镇、街道的地图json数据

示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。

1、获取到区县的地图json

我们可以通过 http://datav.aliyun.com/tools/atlas阿里旗下的高德地图提供的api,可以获取到中国各个省份/区级/县级的json数据,但是区级和县级,并没有包含街道和乡镇的数据.
在这里插入图片描述
我们还需要拿到乡镇数据的步骤

2、获取到乡镇的json数据

进入bigemap下载页面,下载绘制器,网址:http://www.bigemap.com/reader/download/
在这里插入图片描述
在这里插入图片描述
下载安装之后打开,可以在右上角进行区域的选择,可以发现,它是精确到镇级的,
这里 不要点击左边的下载按钮 ,请选择图中 红框选中的导出按钮,即可保存kml文件:
在这里插入图片描述
可以看到它在地图上的样子:
在这里插入图片描述

3、合并导出的json组成区县

geojson.io上把刚刚在bigemap地图下载器导出的kml文件导入进来,地址:http://geojson.io/#map=11/40.2261/117.1318
在这里插入图片描述
把他们一个一个打开,就会形成新的json,如果文件过多容易遗漏可以查看右边的table一个个对应上,也可以修改名字,但是不建议修改
在这里插入图片描述
把这个json内容替换掉之前的这个区县的json内容,就能实现。

4、json替换后地图显示不出来-报错

但由于种种原因,可能会报错,导致地图显示不出来,我们的解决方案是修改echarts源码,将node_modules\echarts\lib\coord\geo\parseGeoJson.js 中的方法改一下
如果函数一样,可直接复制粘贴下面这一段,其他情况,请参考下图2处修改逻辑自行更改。

function _default(geoJson, nameProperty) {
    decode(geoJson);
    return zrUtil.map(zrUtil.filter(geoJson.features, function (featureObj) {
        if (featureObj.geometry.geometries) {
            let geometry = featureObj.geometry.geometries.map(i => {
                return i.coordinates;
            });
            let { type, properties, ...params } = featureObj;
            return { type, properties, geometry };
        }
        // Output of mapshaper may have geometry null
        return featureObj.geometry && featureObj.properties && featureObj.geometry.coordinates.length > 0;
    }), function (featureObj) {
        var properties = featureObj.properties;
        var geo = featureObj.geometry;
        var coordinates = geo.coordinates;
        var geometries = [];

        if (geo.type === "GeometryCollection") {
            let geometry = {
                type: "Polygon"
            };
            let coordinatesArr = featureObj.geometry.geometries.map(i => {
                return i.coordinates;
            });
            geometry.coordinates = coordinatesArr;
            console.log(coordinatesArr, "coordinatesArr");
            coordinatesArr.forEach(i => {
                geometries.push({
                    type: "polygon",
                    // According to the GeoJSON specification.
                    // First must be exterior, and the rest are all interior(holes).
                    exterior: i[0],
                    interiors: i.slice(1)
                });
            });
        }

        if (geo.type === 'Polygon') {
            geometries.push({
                type: 'polygon',
                // According to the GeoJSON specification.
                // First must be exterior, and the rest are all interior(holes).
                exterior: coordinates[0],
                interiors: coordinates.slice(1)
            });
        }

        if (geo.type === 'MultiPolygon') {
            zrUtil.each(coordinates, function (item) {
                if (item[0]) {
                    geometries.push({
                        type: 'polygon',
                        exterior: item[0],
                        interiors: item.slice(1)
                    });
                }
            });
        }

        var region = new Region(properties[nameProperty || 'name'], geometries, properties.cp);
        region.properties = properties;
        return region;
    });
}

在这里插入图片描述
在这里插入图片描述
做到这里 echarts地图-精确到乡镇-的地图应该就能正常显示了,欢迎点赞收藏,谢谢 ! (≧∇≦)/

5、效果

在这里插入图片描述

5、补充之前未复现的报错

在这里插入图片描述
报错信息:Uncaught (in promise) Invalid geoJson format
TypeError: Cannot read properties of undefined (reading ‘length’)

function getGzMap(_data) { if (_chinaMap == undefined) { var dom = document.getElementById("container"); _chinaMap = echarts.init(dom); _chinaMap.on('click', function(params) { console.log(params); var _type = params.seriesType; if (_type == "map") { //window.parent.aaa('aa') //调用父页面方法 } else if (_type == "effectScatter") { window.parent.showMap(); } }) } var option = { backgroundColor: 'rgba(0,0,0,0)', visualMap: { type: 'piecewise', show: false, min: 0, max: 300, splitNumber: 3, itemWidth: 10, itemHeight: 10, itemGap: 5, seriesIndex: [1], pieces: [ { min: 0, max: 100, label: '优' }, { min: 101, max: 200, label: '良' }, { min: 201, max: 300, label: '高风险' } ], //color: ['#FA4D08', '#4BD94F', '#FBD32B'], //红、绿、黄 color: ['#F8DAE6', '#FEF9B5', '#B0D8B3'], //红、黄、绿 textStyle: { color: '#9EA8B1', fontSize: 10 } }, tooltip: { formatter: '{b}' }, geo: { map: 'guangdong', roam: true, aspectScale: 1, zoom: 1.5, layoutCenter: ['55%', '40%'], layoutSize: 500, label: { normal: { show: true }, emphasis: { show: true } }, itemStyle: { normal: { areaColor: '#323c48', borderColor: '#111', borderColor: '#3BB4DF', shadowColor: '#25A3FC', shadowBlur: 10 }, emphasis: { areaColor: '#ddb926' } } }, series: [{ type: 'effectScatter', coordinateSystem: 'geo', data: unitData, symbolSize: 10, symbol: 'image://../../../../Content/images/One/fire.png', //symbolRotate: 35, rippleEffect: { period: 4, scale: 5, brushType: 'fill', }, label: { normal: { formatter: '{b}', position: 'right', show: false }, emphasis: { show: false } }, itemStyle: { normal: { color: '#fff' } } }, { name: '', type: 'map', geoIndex: 0, mapType: 'guangdong', // 自定义扩展图表类型 label: { normal: { show: true, } }, itemStyle: { normal: { label: { show: true, fontSize: 10, color: '#111' }, shadowColor: '#ddb926', shadowBlur: 5, }, emphasis: { label: { show: true }, shadowColor: 'rgba(0, 0, 0, 0.5)', shadowBlur: 10 } }, data: _data }, { type: 'effectScatter', coordinateSystem: 'geo', data: windData, symbolSize: 10, symbol: 'image://../../../../Content/images/One/wind.png', //symbolRotate: 35, rippleEffect: { period: 4, scale: 5, brushType: 'fill', }, label: { normal: { formatter: '{b}', position: 'right', show: false }, emphasis: { show: false } }, itemStyle: { normal: { color: '#fff' } } }, ] }; $.getJSON('../../MapCN/guangdong.json', function(chinaJson) { echarts.registerMap('guangdong', chinaJson); _chinaMap.setOption(option, true); }); }
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值