之前的博客中介绍到利用区县级shp转市级shp的方法Arcgis制作全国行政区(精确到县级),但实际操作起来还是比较麻烦的,并且部分省份没有BOUA文件。今天,分享另外一个方法,利用Python迅速获取全国市县级单元的Shapefile文件。

目录

  • 一、矢量数据文件下载
  • 二、获取市级行政单元Shapefile
  • 三、获取县级行政单元Shapefile(2021.2.16更新)

一、矢量数据文件下载

这里推荐两个网站,一个是高德地图的区划矢量数据高德地区API,另外一个是阿里云的区划矢量数据阿里云矢量数据,如下图所示(左图为高德,右图为阿里云)

不难看出,高德地图中的重庆市是没有各个区县单元的(其他直辖市也都没有),而阿里云中是含有各个区县单元。此外,高德地图的精度要高于阿里云。

注:若阿里云旁边没有下载按钮,可以按照如下方式自行创建json文件

以下载宣城市数据为例

1. 复制红框中第一条或第二条网址,用浏览器打开


访问API结果如下:

2. 复制网址中全部内容,放入自行创建的json文件中。(可以先自行创建txt文件,复制完内容后,直接更改后缀名即可变为json文件)

个人推荐:如果需要直辖市的区县数据可以使用阿里云的区划数据,其他省份的用高德地图会精确一点。

两个网站最终下载下来都是json类型的矢量数据文件(高德是geojson)

二、获取市级行政单元Shapefile

这里借助python中强大的空间分析库geopandas即可将geojson文件转为shapefile文件。但是geopandas库安装起来还是比较麻烦的!(直接pip会报错,它依赖于这四个库gdal、Shapely、Fiona、pyproj,详细安装流程可参考geopandas安装心得

安装完成后,在python中执行以下命令即可输出得到shapefile

import geopandas
import os
os.chdir('C:/Users/dell/Desktop/') #工作路径转为桌面
def saveShapefile(file_name,output_shapefile_name):try:data = geopandas.read_file(file_name) localPath = str(output_shapefile_name)data.to_file(localPath, driver='ESRI Shapefile', encoding='gbk') print("转化成功,文件存放位置:"+localPath)except:print("转化失败")
saveShapefile('安徽省.geojson','Anhui_province')

当然,不借助geopandas,利用其他在线工具也可以将json文件转为shapefile文件,但生成的dbf文件可能会乱码!(因为dbf文件需要gbk编码格式才能正常显示中文)

最终生成文件如下左图所示,dbf文件内容(可正常显示)如右图所示:

三、获取县级行政单元Shapefile(2021.2.16更新)

基本思想为:先获取所有区县的json文件,再将其转为Shapefile文件。以山东省为例,基本步骤如下所示

1. 进入阿里云矢量数据网站,复制山东省的矢量数据API,如下图所示:

注:有些省份两个API都能用,有些省份可能第一条API放入如下代码中会报错,尽量复制第二条API

2. 执行下述代码,即可得到山东省所有区县的json文件

import requests
import json
import re
import os
os.chdir('c:/users/dell/Desktop/')def get_data(url):r = requests.get(url)data = r.json()['features']return datadef get_json(url,file_name):pattern = '\d+'output = {"type": "FeatureCollection","features":[]}data = get_data(url)with open(file_name,'w') as f:   for city in data:city_code = city['properties']['adcode']url = re.sub(pattern,str(city_code),url)city_data = get_data(url)if city_data:output['features'].extend(city_data)print(city['properties']['name']+'下所有区县保存完毕')else:  #考虑部分省份存在市级单元以下无县级单元new_url = 'https://geo.datav.aliyun.com/areas/bound/geojson?code=' + str(city_code)other_data = get_data(new_url)output['features'].extend(other_data)print(city['properties']['name']+'已为最小行政单元,保存完毕')json.dump(output,f,indent=4)
if __name__=='__main__':url = 'https://geo.datav.aliyun.com/areas/bound/geojson?code=370000_full'  #复制的APIget_json(url,'山东省.json')

部分结果如下所示:

3. 转化Shapefile,此部分代码与市级转化基本一致

import geopandas
def saveShapefile(file_name,output_shapefile_name):try:data = geopandas.read_file(file_name) localPath = str(output_shapefile_name)data.to_file(localPath, driver='ESRI Shapefile', encoding='gbk') print("转化成功,文件存放位置:"+localPath)except Exception as e:print(e)
saveShapefile('山东省.json','ShanDong_province')

在Geoda中加载生成的Shapefile文件,如下图所示:

注意:阿里云矢量数据还是比较新的(目前更新于2020年4月),部分省份的县级行政单元个数可能与全国地理基础信息网存在出入!!!

以上就是本次分享的全部内容~

Python 一键获取全国市县级行政单元Shapefile文件相关推荐

  1. 获取clientheight为0_用10行python代码获取全国城市交通生活圈

    今天在网上冲浪看到一个很花哨的数据,全国各城市主要商圈从早上6点到晚上10点的20min,30min,45min,60min,90min生活圈轮廓. 1 获取思路 按下F12 按下F12,点击淮海路可 ...

  2. Python 一键获取市县级城市经纬度信息

    目录 一.数据来源 二.全部代码 三.使用介绍 3.1 获取全省所有地级市经纬度信息 3.2 获取某个地级市下所有区县经纬度信息 3.3 获取全省所有区县经纬度信息 一.数据来源 本文所涉及的市.县级 ...

  3. python随机生成车牌_使用Python自动化获取全国每个城市的车牌代码

    最近有这样一需求,需要获取12123交管查询网站上的全国每个城市对应的城市id和车牌代码.最初的想法是直接用Python写个爬虫,遍历每个城市,然后用Xpath提取DOM节点数据就好了.然而在实际操作 ...

  4. python如何获取多个excel单元格的值

    一. 获取多个单元格的值报错:AttributeError: 'tuple' object has no attribute 'value' 需要读取的sample.xlsx 代码读取的是A3:B10 ...

  5. Python一键获取某排名第一的手游,所有英雄皮肤(附源码)

    目录 最近总是有老妹喊我打王者带她们上分,但是我吧不经常玩,有哪些皮肤,叫什么名字,长啥样都不知道,万一妹妹问起来答不上岂不是很尴尬! 这不得先把功课做足了,于是我用Python把这些皮肤全部给爬下来 ...

  6. python一键获取豆瓣租房小组前十页信息,并导入EXCEL(Xpath法)

    #encoding=utf-8 模块导入 import requests from lxml import etree import xlwt import urllib.request 主程序 de ...

  7. 教程:获取中国行政单位shapefile文件

    1.阿里云地图小工具:http://datav.aliyun.com/tools/atlas 在"范围选择器"中,选择自己需要的行政区域范围,可以下载JSON格式文件. 2.使用免 ...

  8. 聊天尬住了?教你用Python一键获取斗图表情包,从此摇身变海王

    很多兄弟在聊天上没有下太多的功夫,导致自己聊天的时候很容易尬住,然后就不知道聊啥了,这时候合适表情包分分钟就能救场,但是一看自己收藏的表情包,好家伙,两只手都数得过来. 所以今天来给兄弟们分享一下爬取 ...

  9. 聊天突然尬住?教你用Python一键获取斗图表情包,各种表情包轻松化解尴尬

    很多兄弟在聊天上没有下太多的功夫,导致自己聊天的时候很容易尬住,然后就不知道聊啥了,这时候合适表情包分分钟就能救场,但是一看自己收藏的表情包,好家伙,两只手都数得过来. 所以今天来给兄弟们分享一下爬取 ...

最新文章

  1. 二维码Data Matrix的解码实现(zxing-cpp)
  2. 岩板铺地好吗_威廉顿岩板1200x2700x9mm,上墙铺地非常好看大气
  3. duilib控件的一些属性
  4. [bzoj2456]mode
  5. Python天天美味(32) - python数据结构与算法之堆排序
  6. 文件字节输出流 java
  7. ARM Cortex-M0(6)--- 存储器系统
  8. 百度昆仑AI芯片已完成研发:明年初量产 由三星代工
  9. Linux学习——gcc编译C程序
  10. Oracle日期函数TRUNC
  11. 两种有趣的排序方法:睡眠排序、猴子排序(golang版本)
  12. 人工智能“乐高模式”,人工智能进入变革时代
  13. 关于swiftUI和UIKit混用
  14. 变量、参数和内存分配
  15. “互联网+”环境下高职毕业生求职风险应对策略
  16. Vue批量生成二维码并打包下载
  17. 微信小程序判断手机系统
  18. js实现bind函数
  19. 购买计算机的英语作业,《计算机专业英语》作业.doc
  20. 微信小程序---双向绑定传参

热门文章

  1. 张艾迪(创始人):我们接管世界
  2. 9.8.1 1.打印head标签的内容。2.打印body标签的内容。3.打印id为Hi的标签对象
  3. 西门子1200 总线控制V90伺服程序模板 两种控制模式 1.基于111报文自己编写的PN通讯控制V90伺服程序
  4. 懊悔!早一点遇到这份1399页Nginx笔记,我绝不会错过阿里offer!
  5. C/C++用海伦公式求三角形面积(同时运用条件语句不断优化程序)
  6. 华为ap WA131SN-NZ设置胖ap开启wifi无线网络
  7. A-level经济难,但是想学好应该怎么做?
  8. Tomcat的安装与启动
  9. 如何对pdf电子文档进行手写签名
  10. 中国人必须知道的76个常识。。。看了才发现,自己知道的实在太少了。。。