2023年1月实时获取地图边界数据方法,省市区县多级联动【附区县乡镇街道geoJson文件下载】

news2024/12/28 23:25:50
首先,来看下效果图

map.gif

在线体验地址:https://geojson.hxkj.vip,并提供实时geoJson数据文件下载

可下载的数据包含省级geojson行政边界数据、市级geojson行政边界数据、区/县级geojson行政边界数据、省市区县街道行政编码四级联动数据(可精确到乡镇/街道级)、省市区县街道乡村五级行政编码。

前段时间给公司弄了一套基于echarts map的地图数据展示的平台,开发过程中发现百度官方已经不提供地图下载了,于是只能期望能在网上搜到哪位大佬帮忙收集的json文件。找是找到了,然鹅发现大部分都年代久远了,很多地区其实已经重新划分行政区划了。
所以,只能想想其他办法了,回想起平常使用高德地图搜索某个地名的时候,好像会有个边界区域给我们绘制出来,然后我就觉得它既然能画出来,应该会有办法从某些渠道获取,或者高德地图会提供相应的API。于是乎,去到了高德开放平台仔细的查看了一下他提供的api,哈哈,果然有!有了接口,接下来就是撸码了。

第一步,通过高德api获取边界数据

通过查阅API文档可以知道,获取边界数据的接口为行政区查询服务(AMap.DistrictSearch)。使用该服务之前记得去申请一个key,用于调用高德接口,申请地址直通车:https://lbs.amap.com/dev/key/app。

1、在页面添加 JS API 的入口脚本标签,并将其中「您申请的key值」替换为您刚刚申请的 key;
<script type="text/javascript" src="https://webapi.amap.com/maps?v=1.4.11&key=「您申请的key值」&plugin=AMap.DistrictSearch"></script>
2、通过以下方式获取数据,以获取中国地图为例;
this.opts = {
    subdistrict: 1,   //返回下一级行政区
    showbiz: false  //最后一级返回街道信息
};
this.district = new AMap.DistrictSearch(this.opts);//注意:需要使用插件同步下发功能才能这样直接使用
this.district.search('中国', (status, result) => {
    if (status == 'complete') {
        this.getData(result.districtList[0], '', 100000);
    }
});
getData(data, level, adcode) {//处理获取出来的边界数据
    var subList = data.districtList;
    if (subList) {
        var curlevel = subList[0].level;
        if (curlevel === 'street') {//为了配合echarts地图区县名称显示正常,这边街道级别数据需要特殊处理
            let mapJsonList = this.geoJsonData.features;
            let mapJson = {};
            for (let i in mapJsonList) {
                if (mapJsonList[i].properties.name == this.cityName) {
                    mapJson.features = [].concat(mapJsonList[i]);
                }
            }
            this.mapData = [];
            //这个mapData里包含每个区域的code、名称、对应的等级,实现第三步功能时能用上
            this.mapData.push({name: this.cityName, value: Math.random() * 100, level: curlevel});
            this.loadMap(this.cityName, mapJson);
            this.geoJsonData = mapJson;
            return;
        }
       
        //街道级以上的数据处理方式
        this.mapData = [];
        for (var i = 0, l = subList.length; i < l; i++) {
            var name = subList[i].name;
            var cityCode = subList[i].adcode;
            //这个mapData里包含每个区域的code、名称、对应的等级,实现第三步功能时能用上
            this.mapData.push({
                name: name,
                value: Math.random() * 100,
                cityCode: cityCode,
                level: curlevel
            });
        }
        this.loadMapData(adcode);
    }
},
3、接下来,利用 AMapUI.loadUI 可以构造一个创建一个 DistrictExplorer 实例,然后利用 DistrictExplorer 的实例,可以根据当前需要加载城市的 areaCode获取到该城市的 geo 数据
loadMapData(areaCode) {
    AMapUI.loadUI(['geo/DistrictExplorer'], DistrictExplorer => {

        //创建一个实例
        var districtExplorer = window.districtExplorer = new DistrictExplorer({
            eventSupport: true, //打开事件支持
            map: this.map
        });

        districtExplorer.loadAreaNode(areaCode, (error, areaNode) => {

            if (error) {
                console.error(error);
                return;
            }
            let mapJson = {};
            //特别注意这里哦,如果查看过正常的geojson文件,都会发现,文件都是以features 字段开头的,所以这里要记得加上
            mapJson.features = areaNode.getSubFeatures();
            this.loadMap(this.cityName, mapJson);
        });
    });
},

第二步,用echarts把边界数据渲染出来

我这边使用的echarts版本为当前的最新版4.2.0,相关文档查阅地址传送门:https://echarts.baidu.com/option.html#series-map。千万别看错文档了,他好几个版本放在一起,关键是每个版本某些属性会不一样,所以要特别注意文档的版本与引入的echarts版本保持一致。

1、在页面引入JS文件,我这边引入的bootstrap cdn提供的文件
<script src="https://cdn.bootcss.com/echarts/4.2.0-rc.2/echarts.min.js"></script>
2、注册echarts并使用刚刚通过高德API获取的数据渲染成map
//html
<div id="map"></div>

//注册并赋值给echartsMap 
this.echartsMap = this.$echarts.init(document.getElementById('map'));

//通过loadMap函数加载地图
loadMap(mapName, data) {
    if (data) {
        this.$echarts.registerMap(mapName, data);//把geoJson数据注入echarts
      //配置echarts的option
        var option = {
            visualMap: {
                type: 'piecewise',
                pieces: [
                    {max: 30, label: '安全', color: '#2c9a42'},
                    {min: 30, max: 60, label: '警告', color: '#d08a00'},
                    {min: 60, label: '危险', color: '#c23c33'},
                ],
                color: '#fff',
                textStyle: {
                    color: '#fff',
                },
                visibility: 'off'
            },
            series: [{
                name: '数据名称',
                type: 'map',
                roam: false,
                mapType: mapName,
                selectedMode: 'single',
                showLegendSymbol: false,
                visibility: 'off',
                itemStyle: {
                    normal: {
                        color: '#ccc',
                        areaColor: '#fff',
                        borderColor: '#fff',
                        borderWidth: 0.5,
                        label: {
                            show: true,
                            textStyle: {
                                color: "rgb(249, 249, 249)"
                            }
                        }
                    },
                    emphasis: {
                        areaColor: false,
                        borderColor: '#fff',
                        areaStyle: {
                            color: '#fff'
                        },
                        label: {
                            show: true,
                            textStyle: {
                                color: "rgb(249, 249, 249)"
                            }
                        }
                    }
                },
                data: this.mapData,//这个data里包含每个区域的code、名称、对应的等级,实现第三步功能时能用上
            }]
        };
        this.echartsMap.setOption(option);
    }
},

做完这一步,如果不出问题,中国地图已经安静的躺在你的屏幕上了!

第三步,实现省市区县下探功能

1、添加点击事件
this.echartsMap.on('click', this.echartsMapClick);

echartsMapClick(params) {//地图点击事件
    if (params.data.level == 'street') return;//此处的params.data为this.mapData里的数据
    this.cityCode = params.data.cityCode;
    //行政区查询
    //按照adcode进行查询可以保证数据返回的唯一性
    this.district.search(this.cityCode, (status, result) => {
        if (status === 'complete') {
            this.getData(result.districtList[0], params.data.level, this.cityCode);//这个getData函数在前面已经定义过了
        }
    });
},

此项目这边是基于VUE开发的,看完之后有什么不懂的,可以留言说明.

项目GitHub地址:https://github.com/TangSY/echarts-map-demo
省市区县geojson边界数据下载地址:https://geojson.hxkj.vip/
乡镇街道geojson下载地址:https://map.hxkj.vip

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/140243.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

QT 学习笔记(十三)

文章目录一、QDataStream 二进制文件读写1. QDataStream 简介2. QDataStream 实际演示2.1 QDataStream 读写文件操作2.2 实现代码——主窗口头文件 widget.h2.3 实现代码——主窗口源文件 widget.cpp二、QTextStream 文本文件读写1. QTextStream 简介2. QTextStream 实际演示2.…

【王道操作系统】3.2.3 页面置换算法(最佳置换算法、先进先出置换算法、最近最久未使用置换算法、普通时钟置换算法、改造型时钟置换算法)

页面置换算法(最佳置换算法、先进先出置换算法、最近最久未使用置换算法、普通时钟置换算法、改造型时钟置换算法) 文章目录页面置换算法(最佳置换算法、先进先出置换算法、最近最久未使用置换算法、普通时钟置换算法、改造型时钟置换算法)1.最佳置换算法---OPT2.先进先出置换算…

[安洵杯 2019]不是文件上传(文件名不能用“,数据库可识别hex编码)

打开题目尝试上传文件发现只能上传图片&#xff0c;然后看见了图片的路径&#xff0c;但是图片码连不上蚁键&#xff0c;结合题目&#xff0c;然后看到了题目给出的github源码 <?php include("./helper.php"); $show new show(); if($_GET["delete_all&qu…

STS安装,SVN配置及WEB工程配置简单说明_1.0.0

Spring Tool Suite构建java web项目概述1, 下载安装Spring Tool Suite Spring Tool Suite 简称为sts, 为构建基于Spring企业应用&#xff0c;提供了最好的Eclipse开发环境。STS 提供了最新基于Java和Spring应用所需要的所有工具,STS官网主页地址为http://spring.io/tools/sts/,…

画布创作,签名大致就是起笔落笔

画布创作&#xff0c;签名大致就是起笔落笔 前言 在画布创作过程中&#xff0c;签名手的基本形态是&#xff0c;不停的点、划。 就像我们写字一样&#xff0c;字越写越大&#xff0c;但是我们不知道笔画的大小。 一个字是一个非常小的点、横&#xff0c;一个横就把这个字给分…

JVM学习(一):简单聊聊性能调优这门艺术

一、性能调优背景说明1.1 生产环境中的问题生产环境发生了内存溢出该如何处理&#xff1f;生产环境应该给服务器分配多少内存合适&#xff1f;如何对垃圾回收器的性能进行调优&#xff1f;生产环境CPU负载飙高该如何处理&#xff1f;生产环境应该给应用分配多少线程合适&#x…

2-2进程管理-处理机调度

文章目录一.调度的层次二.进程调度的时机、切换与过程、调度方式三.调度器、闲逛进程四.调度算法的评价指标五.调度算法&#xff08;一&#xff09;先来先服务SCFS&#xff08;二&#xff09;短作业优先算法SJF&#xff08;三&#xff09;高响应比优先HRRN&#xff08;四&#…

cas6.6关于redis连接问题的一次记录,主要问题 1远程主机强迫关闭了一个现有的连接,主要问题2ERR unknown command `HELLO`

项目背景&#xff1a; 公司要求用cas单点登录&#xff0c;这个cas需要引入redis当做ticket缓存&#xff0c;但是出现连接不上的问题由于用redismanager可视化软件看了是可以连接的&#xff0c;进行了查询是redis配置文件中需要配置参数问题截图如下 问题输出如下 2023-01-04…

192:vue+openlayers: 选择feature,弹窗操作,删除所选feature

第192个 点击查看专栏目录 本示例的目的是介绍如何在vue+openlayer中使用select来选择feature元素,选择的过程中弹窗出现删除和关闭按钮,删除的内容是selected的feature,关闭的是功能浮窗。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果; 注意如果Ope…

《设计模式》模板方法模式

《设计模式》模板方法模式定义&#xff1a; 模板方法模式又叫模板模式&#xff0c;在一个抽象类中公开定义了执行它的方法的模板&#xff0c;子类可以根据需要重写方法实现&#xff0c;但是调用将按照抽象类中定义的方式进行。模板方法模式相当于定义了一个操作中算法的骨架&a…

回归预测 | MATLAB实现CNN-GRU卷积门控循环单元多输入多输出

回归预测 | MATLAB实现CNN-GRU卷积门控循环单元多输入多输出 目录回归预测 | MATLAB实现CNN-GRU卷积门控循环单元多输入多输出预测效果基本介绍程序设计往期精彩参考资料预测效果 基本介绍 MATLAB实现CNN-GRU卷积门控循环单元多输入多输出&#xff0c;运行环境Matlab2020及以上…

【国科大模式识别】第三次作业

【题目一】现有四个来自于两个类别的二维空间中的样本, 其中第一类的两个样本为 (1,4)T(1,4)^T(1,4)T 和 (2,3)T(2,3)^T(2,3)T, 第二类的两个样本为 (4,1)T(4,1)^T(4,1)T 和 (3,2)T(3,2)^T(3,2)T 。这里, 上标 TTT 表示向量转置。若采用规范化增广样本表示形式, 并假设初始的权…

权限问题的理解——Linux

这里是目录标题一、重定向二、 学Linux的意义三、shell命令的运行原理四、Linux权限管理1.Linux中具体用户的分类五、Linux文件相关的权限概念文件类型文件的权限文件的权限操作去掉权限加上权限八进制文件权限操作更改文件的拥有者和所属组六、目录的权限七、默认权限权限掩码…

树莓派项目归档

Flask Flask登录注册界面美化 Flask 修改路由 Flask 创建404json返回 返回虚拟温湿度 Flask-移植开发环境到VSCode-手机局域网访问测试 Flask AJAX 获取数据 Flask 将项目从win部署到树莓派 添加监控窗口 Flask 编写shell脚本快速启动服务 树莓派 树莓派4B Ubuntu MAT…

leetcode螺旋矩阵总结

螺旋矩阵题目&#xff1a; leetcode54&#xff0c;59&#xff0c;885&#xff0c;2326 leetcode54 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;[1,2,3,6,9,8,7,4,5] 输入&#xff1a;matrix [[1,2,3,4],[5,6,7,8],[9,10,11,12]] 输出&#xff1a;[…

MSTP技术中引入的必要性

目前&#xff0c;城域光传送网大量存在的是传统的SONET/SDH环网和简单的MSTP网络&#xff0c;对带宽的指配基本上是静态的&#xff0c;无法适应大量的突发性数据业务&#xff0c;需要大量的人工操作和维护&#xff0c;耗时耗力、容易出错。为了改变现状&#xff0c;人们不断在传…

第二章 Flink 环境部署

Flink 系列教程传送门 第一章 Flink 简介 第二章 Flink 环境部署 第三章 Flink DataStream API 第四章 Flink 窗口和水位线 第五章 Flink Table API&SQL 第六章 新闻热搜实时分析系统 一、Flink架构 Flink 是一个分布式系统&#xff0c;需要有效分配和管理计算资源…

python-turtle画图

认识TurtleTurtle是一个渲染器基于底层图形编程结构(API)构建&#xff0c;主要用于场景的构建以及3D物体的绘制(3D游戏、虚拟场景等)Turtle是一个窗体程序Turtle是Python语言中的一个很流行的绘制图像的函数库&#xff0c;想象一个小海龟在一个横轴为x&#xff0c;纵轴为y的坐标…

时序数据库 TDengine 携手北京科技大学设计研究院,助力冶金工业智慧化

北京科技大学设计研究院有限公司作为北京科技大学全资产业化技术推广机构&#xff0c;从 2013 年开始在冶金、钢铁行业进行业务系统开发和实施&#xff0c;围绕先进材料、绿色低碳和智能制造不断深耕细作&#xff0c;持续创新。其拥有高效轧制与智能制造国家工程研究中心、国家…

DPDK工作原理和环境搭建

DPDK工作原理DPDK环境搭建编译DPDKDPDK工作原理DPDK实践之处理UDP数据总结DPDK环境搭建 工具准备&#xff1a;VMware、ubuntu16.04。 &#xff08;1&#xff09;VMware添加两个网卡。桥接网卡作为 DPDK 运行的网卡&#xff0c;NAT 网卡作为 ssh 连接的网卡。 &#xff08;2&…