文章目录

  • 1.背景
  • 2.行政区域数据获取
  • 3.获取GeoJson数据

1.背景

项目中用到省市区三级的行政区划的选择,在网上找到的数据与最新的行政区域划分不一致,也难以确认数据的完成性。

基于echarts完成数据地区分布图时,需要提供地区对应的geoJson格式地图。

2.行政区域数据获取

高德开放平台提供了丰富数据API,其中行政区域信息可通过以下接口:
https://restapi.amap.com/v3/config/district?keywords=中国&subdistrict=3&key=5b138cc729f37d29702ff904ca9cedeb

接口获取的数据是按照行政等级多层嵌套,为了方便后续操作,将数据转化为了List。
以下代码将行政区划转化为List并添加了idparent_id,同时保存为json数组(area_dict.json)和MySQL数据库脚本(area_dict.sql)。

#-*-coding:UTF-8-*-
"""
Author: Gray Snail
Date: 2020-06-30最新行政区划获取
基于高德地图API获取数据
https://restapi.amap.com/v3/config/district?keywords=中国&subdistrict=3&key=5b138cc729f37d29702ff904ca9cedeb"""
import json
import requestsdef parse_district(districtObj : dict, idx=1, parent_id=0):res = []if 'name' in districtObj.keys():if districtObj['level'] == 'street':return reslng, lat = districtCenter(districtObj['center'])level = districtLevel(districtObj['level'])citycode = districtObj['citycode'] if isinstance(districtObj['citycode'], str) else ''# {"citycode":"0379","adcode":"410300","name":"洛阳市","center":"112.434468,34.663041","level":"city"}# idx, districtObj['adcode'], districtObj['name'], level, citycode, lng, lat, parent_iditem = {'id'        : idx,'adcode'    : districtObj['adcode'],'name'      : districtObj['name'],'level'     : level,'citycode'  : citycode,'lng'       : lng,'lat'       : lat,'parent_id' : parent_id}res.append(item)parent_id = idxidx = idx + 1if isinstance(districtObj.get('districts'), list) and len(districtObj['districts']) > 0:for subitem in districtObj['districts']:subs = parse_district(subitem, idx, parent_id)res += subsidx += len(subs)return resdef districtLevel(levelStr):map_val = {'country': 0,'province': 1,'city': 2,'district': 3}return map_val[levelStr]def districtCenter(center):items = center.split(',')return float(items[0]), float(items[1])# 结果保存为json数组
def saveJson(data):with open('area_dict.json', 'w', encoding='utf-8') as fp:json.dump(data, fp, ensure_ascii=False, indent=4)print('Save json file: area_dict.json')# 保存为SQL脚本
def saveSqlFile(data, includeCreate=True):# +--------------+-------------+------+-----+---------+----------------+# | Field        | Type        | Null | Key | Default | Extra          |# +--------------+-------------+------+-----+---------+----------------+# | area_id      | int(11)     | NO   | PRI | NULL    | auto_increment |# | area_code    | char(6)     | NO   | MUL | NULL    |                |# | area_name    | varchar(20) | NO   | MUL | NULL    |                |# | level        | tinyint(1)  | NO   | MUL | 0       |                |# | city_code    | char(4)     | YES  |     | NULL    |                |# | longitudinal | int(11)     | YES  |     | 0       |                |# | lateral      | int(11)     | YES  |     | 0       |                |# | parent_id    | int(11)     | NO   | MUL | -1      |                |# +--------------+-------------+------+-----+---------+----------------+createCode = """
CREATE TABLE `area_dict` (`area_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '地区Id',`area_code` char(6) NOT NULL COMMENT '地区编码',`area_name` varchar(20) NOT NULL COMMENT '地区名',`level` tinyint(1) NOT NULL DEFAULT '0' COMMENT '地区级别(1:省份province,2:市city,3:区县district,4:街道street)',`city_code` char(4) DEFAULT NULL COMMENT '城市编码',`lng` int(11) DEFAULT '0' COMMENT '城市中心经度',`lat` int(11) DEFAULT '0' COMMENT '城市中心纬度',`parent_id` int(11) NOT NULL DEFAULT '-1' COMMENT '地区父节点',PRIMARY KEY (`area_id`),KEY `areaCode` (`area_code`),KEY `parentId` (`parent_id`),KEY `level` (`level`),KEY `areaName` (`area_name`)
) ENGINE=InnoDB AUTO_INCREMENT=3261 DEFAULT CHARSET=utf8 COMMENT='地区码表';
"""with open('area_dict.sql', 'w', encoding='utf-8') as fp:if includeCreate:fp.write(createCode)for item in data:item['lng'] = int(item['lng'] * 1e6)item['lat'] = int(item['lat'] * 1e6)sql = "INSERT INTO area_dict(`area_id`,`area_code`,`area_name`,`level`,`city_code`,`lng`,`lat`,`parent_id`) " + \"VALUES({id},'{adcode}','{name}',{level},'{citycode}',{lng},{lat},{parent_id});\n".format(**item)fp.write(sql)print('Save sql file: area_dict.sql')if __name__ == "__main__":url = 'https://restapi.amap.com/v3/config/district?keywords=中国&subdistrict=3&key=5b138cc729f37d29702ff904ca9cedeb'response = requests.get(url)if response.ok and response.status_code == 200:data = response.json()data = parse_district(data)print('Download data successful, total:{0}!'.format(len(data)))saveJson(data)saveSqlFile(data)else:print('Request error!')

3.获取GeoJson数据

数据来源:基于阿里云datav,数据文件以地区编码命名。
根据行政区域数据中保存的area_dict.json自动下载对应GeoJson文件。

行政区划的更新,两个平台的数据可能存在差异,即同一地区有着不同的地区编码,导致对应地区的地图无法下载。代码中errorCodes记录了未成功下载的地区编码。2020.07.01,未下载成功的不到30条。

#-*-coding:UTF-8-*-
"""
Author: Gray Snail
Date: 2020-06-30GeoJson地图数据下载
基于阿里云datav
http://datav.aliyun.com/tools/atlas
"""
import requests
import json
import osdef loadDistrict(filename):# {"citycode":"0379","adcode":"410300","name":"洛阳市","center":"112.434468,34.663041","level":"city"}data = []with open(filename, 'r', encoding='utf-8') as fp:data = json.load(fp)return datadef saveGeoJson(areaCode, force=False):saveName = 'geo/{0}.json'.format(areaCode)if not force and os.path.isfile(saveName):return None baseUrl = 'https://geo.datav.aliyun.com/areas_v2/bound/{0}_full.json'baseUrl2 = 'https://geo.datav.aliyun.com/areas_v2/bound/{0}.json'if areaCode[-2:] == '00':url = baseUrl.format(areaCode)else:url = baseUrl2.format(areaCode)print(url)response = requests.get(url)if response.ok and response.status_code == 200:res_json = response.json()with open(saveName, 'w', encoding='utf-8') as fp:json.dump(res_json, fp, ensure_ascii=False)else:return areaCodeif __name__ == "__main__":districts = loadDistrict('area_dict.json')errorCodes = []for district in districts:code = saveGeoJson(district['adcode'])if not code is None:errorCodes.append(code)print(errorCodes)

省市区三级行政区数据获取和GeoJson地图下载相关推荐

  1. 省市区三级行政区代码(包含港澳台)sql2

    一.sql INSERT INTO `region`(`id`, `pid`, `pids`, `name`, `pinyin`, `full_name`, `level`) VALUES ('371 ...

  2. 省市区三级行政区代码(包含港澳台)sql1

    一.sql INSERT INTO `region`(`id`, `pid`, `pids`, `name`, `pinyin`, `full_name`, `level`) VALUES ('110 ...

  3. 省市区三级行政区代码(包含港澳台)sql3

    一.sql INSERT INTO `region`(`id`, `pid`, `pids`, `name`, `pinyin`, `full_name`, `level`) VALUES ('431 ...

  4. 省市区三级联动(带经纬度、离线地图)

    因为最近在做一个百度离线地图功能,里面就涉及到一个需求:根据省市区三级联动定位地图中心 然后在网上找了挺久的,主要是省市区经纬度的json文件,csdn上好多要积分的:省市区经纬度json文件 这是我 ...

  5. 高德地图看各省分界线_从高德采集最新的省市区三级坐标和行政区域边界,用js在浏览器中运行...

    本文描述的是对国家统计局于2019-01-31发布的<2018年统计用区划代码和城乡划分代码(截止2018年10月31日)>中省市区三级的坐标和行政区域边界的采集.随着时间变化,本文内容会 ...

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

    首先,来看下效果图 在线体验地址:https://geojson.hxkj.vip,并提供实时geoJson数据文件下载 可下载的数据包含省级geojson行政边界数据.市级geojson行政边界数据 ...

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

    首先,来看下效果图 在线体验地址:https://geojson.hxkj.vip,并提供实时geoJson数据文件下载 可下载的数据包含省级geojson行政边界数据.市级geojson行政边界数据 ...

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

    首先,来看下效果图 在线体验地址:https://geojson.hxkj.vip,并提供实时geoJson数据文件下载 可下载的数据包含省级geojson行政边界数据.市级geojson行政边界数据 ...

  9. 省市区(县)行政区划境界线(geojson)获取说明及代码

    高德地图行政区划查询接口说明 高德地图WEB服务API提供了很多实用的Web接口,申请完高德地图key(详见获取key),就可以使用.本篇博文介绍的行政区划境界线下载,使用的是行政区划查询这个接口,接 ...

最新文章

  1. Vue实现左右菜单联动实现
  2. LEMP+memcached
  3. SVG中的坐标系统和坐标变换
  4. Xamarin图表开发基础教程(10)OxyPlot框架支持的图表类型
  5. python音乐的数据抓取与分析_Python练习之抓取QQ音乐数据
  6. iptables 实际操作 之 规则查询 2
  7. 在 Docker 上运行一个 RESTful 风格的微服务
  8. mysql5.623 GTID主从复制+半同步复制安装与配置
  9. delphi 调用浏览器内核_HFL:基于混合模糊测试的Linux内核漏洞挖掘
  10. 0元包邮 | 知识图谱学习导图
  11. 运维部门工作总结_运维部工作总结
  12. 小米路由插件二维码2020_打造5G时代的AIoT智能互联 小米路由AX3600评测
  13. 【笔记本触摸屏】实用技巧整理
  14. 如何看待花呗接入央行个人征信?
  15. android基带版本,Android - 基带版本为未知时自动隐藏
  16. 前端css单位小结:vh、vw、百分比、rem、px、计算属性calc
  17. 六千档最强万金油?华硕无畏Pro15 2022锐龙版笔记本体验
  18. tyvector在matlab中代表,MATLAB曲线绘制
  19. java手机怎么测网速_用来检查网络和网速android小程序
  20. @数字信号处理实验1

热门文章

  1. 接了个变态需求:生成 Excel + PDF 导出,用 Java 怎么实现?
  2. 经典书摘:基于信用本质,区块链应用的9大场景
  3. python常量基本类型有哪些_【Python③】python基本数据类型,变量和常量
  4. 1.9UPC寒假个人训练第一场
  5. 在安全创新的道路上飞奔
  6. 05_CAP与BASE原理
  7. 自己动手写数据库系统:容灾恢复原理和容灾恢复日志的设计
  8. ytu 2463:给小鼠补充代码(DFS 深度优先搜索)
  9. 大华网络摄像头通过gstreamer 获取不到RTSP流
  10. 顶级配置+散热黑科技+炫酷外观,红魔6S Pro不愧年度游戏旗舰