获取街道镇级的地图geoJson数据方法,使用echarts绘制出街道镇级的地图区域画面(中山市为例)

Posted 君归乐

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了获取街道镇级的地图geoJson数据方法,使用echarts绘制出街道镇级的地图区域画面(中山市为例)相关的知识,希望对你有一定的参考价值。

一、需求

1、在echarts上绘制市级以下的区、县的区域地图。
2、在市级下很多都是有区、县的区域,而少部分是不存在区、县的,是直接市下面一级就是街道、镇级别的区域。
3、统一管理区域数据,有区县的市直接拿区县的geoJson数据,没有区县的市级直接拿街道、镇级的geoJson数据来绘制区域地图。

二、获取geoJson数据

注意:以下方法获取的都是2015年左右的数据。

第一种方法(不可获取街道、镇级数据)

阿里云数据可视化平台
http://datav.aliyun.com/portal/school/atlas/area_selector

可以直接获取全国、各省、各市以及个县级市详细地图信息的geoJson数据

注意:目前平台还拿不到街道、镇的区域数据。

第二种方法(可获取街道、镇级数据)

第一步(下载kml文件)

BIGEMAP
http://www.bigemap.com/reader/download/

下载完后打开,选择地图

这里以“广东省-中山市-石岐区街道”为例子
可以看出蓝色的区域范围会自动围起区域来


右边红色箭头可以下载街道区域的kml文件下来保存到本地

第二步(导入kml文件获取geoJson)

geojson.io
http://geojson.io/#map=2/20.0/0.0

导入第一步下载好的kml

导入所有的街道、镇数据的效果

右边红色圈的json数据就是我们需要放到echarts展示地图的geoJson数据
复制右边的geoJson数据(ctrl a + ctrl + c)

三、echarts绘制地图(vue版本)

效果图

代码

<template>
  <div ref="map" class="map"></div>
</template>

<script>
import ref,reactive,onMounted from "vue";
import * as echarts from "echarts";
export default 
    setup()
        let eCharts = null;
        let map = ref(null);
        let option = reactive(
            series:[
                
                    name:"地图",
                    type:"map",
                    map:"中山市",
                    itemStyle: 
                        areaColor: '#11225C',
                        borderColor: '#00A5FE',
                        borderWidth: 1
                    ,
                    label: 
                        show: true,
                        color: '#fff'
                    ,
                
            ]
        )
        onMounted(()=>
        	// 复制下来的geoJson数据
            fetch('442000.geoJson')
            .then(response => response.json())
            .then(data => 
                echarts.registerMap("中山市",geoJSON:data)
                eCharts = echarts.init(map.value)
                eCharts.setOption(option)
                window.addEventListener("resize",()=>
                    if(!eCharts)return;
                    eCharts.resize();
                )
            );
        )
        return
            map
        
    

</script>

<style lang="scss" scoped>
.map
    width:1200px;
    height:800px;

</style>

四、遇到的问题

1、Error: Invalid geoJson format Cannot read properties of undefined (reading ‘length’)

原因:
生成的地图里有一个区域为两块不连续的地图块,所以type为GeometryCollection,echarts 中对于此类型没有做处理。

解决方案:
把两块不连续的数组数据放到一起,类型type为Polygon。

改变前

"type": "Feature",
"geometry": 
 	"type": "GeometryCollection",
    "geometries": [
        
            "type": "Polygon",
            "coordinates": [
                [
                    [
                        113.30025185815984,
                        22.55341993226088
                    ],
                    ...数据
                ]
            ]
        ,
        
            "type": "Polygon",
            "coordinates": [
                [
                    [
                        113.27243485793879,
                        22.591996179437235
                    ],
                    ...数据
                ]
            ]
        
    ]

改变后

"type": "Feature",
"geometry": 
    "type": "Polygon",
    "coordinates": [
        [
            [
                113.30025185815984,
                22.55341993226088
            ]
        ],
        [
            [
                113.27243485793879,
                22.591996179437235
            ]
        ]
    ]

再次运行就可以正常显示绘制的效果了。

参考文章:
https://blog.csdn.net/weixin_44861708/article/details/114223258

使用GeoServer导出地图数据GeoJSON并应用

在项目中,需要使用乡镇街道的地图边界,之前一直使用的是百度地图或Echarts地图,其没有这部分行政区的数据,需要在第三方购买数据,其提供的是shp文件

主文件:counties.shp

索引文件:counties.shx

dBASE表: ounties.dbf

我使用GeoServer将shp文件导入(文件导入时选择GBK编码),然后再使用GeoServer界面管理中导出数据功能导出为GeoJSON格式

开始使用的GeoServer2.3.8,当导出问KML数据,中文没出现乱码现象,但是导出为GeoJSON时,出现乱码现象,在网上也没搜到解决办法。

寻找中文乱码问题,找了半天,没找到,重新下载GeoServer2.8.0版本,没有经过其他处理就解决了乱码问题。

注意:GeoServer对jdk有要求,在下载对应版本时要注意看其文档说明。

我使用county.shp做了一个demo

shp文件(第二个文件是导入GeoServer时自动生成的)

导入后,在GeoServer管理界面中如下:

选择右边下来中的GeoJSON,会在网页中打开一个json文件,保存到本地即可

echarts使用的地图格式就是GeoJSON

OpenLayers展示效果:

 

使用GeoJSON文件在Echarts中的展示效果

在百度地图上的展示效果:

在控制台上输出部分行政区名字:

 

说明:在echarts中,使用的编码为UTF-8,导出的GeoJSON文件,Features的properties中没有属性为name的,而在使用echarts的功能上时,需要使用的name属性,

修改GeoJSON中行政区对应的属性名改为name即可,下面一张图是我导入省级地图,修改后,对部分省使用echarts进行着色效果。

 

 

以上是关于获取街道镇级的地图geoJson数据方法,使用echarts绘制出街道镇级的地图区域画面(中山市为例)的主要内容,如果未能解决你的问题,请参考以下文章

使用GeoServer导出地图数据GeoJSON并应用

d3.js 地图:使用 geojson 文件和 CSV 数据

如何从地图上获取街道地址、邮政编码、国家、州?

AmCharts4:来自 GeoJSON 的自定义地图的 getPolygonById 方法?

是否可以使用地图 API 调用(例如,必应地图、谷歌地图)从街道地址获取商店网站地址? [关闭]

OpenLayers如何获取手动绘制的GeoJson数据