一个方便快捷的获取全国各省市矢量边界shp文件的方法。
一、获取目标城市和行政编码
如果有高德地图API KEY即可实现全自动
如果没有的话只能手动获取目标城市的邮政编码或城市代码
手动获取:
1.打开阿里云的数据可视化平台http://datav.aliyun.com/tools/atlas/
2.选择目标城市及其行政编码
自动获取
def get_district_code(city, api_key):
url = district_url.format(city=city, api_key=api_key)
payload = {
}
headers = {
}
response = requests.request("GET", url, headers=headers, data=payload)
result = json.loads(response.text)
return result["districts"][0]["adcode"]
二.运行python
输入目标城市
输入行政编码
输入文件存储路径
即可得到目标城市的shp文件
运用此代码下载数据时发现,只有下载全国、省、市级别这类有下一级行政区划的数据时可以运行成功,比如北京市可以下载,但北京市朝阳区就会出现报错;河南省可以下载,但禹州市就会报错;
对于上述问题的解决办法是:
下载目标城市的shp文件时,先在可视化平台上观察该目标城市是否有下一级行政区划
比如下图:下载北京市shp文件时,可以明显看到可视化平台上北京市有下一级行政区划,即北京市各区;而朝阳区就没有下一级别行政区划。
这时就可以通过简单修改代码来解决该问题:
对于有下一级别行政区划的目标城市不用修改代码;
对于没有下一级别行政区划的目标城市可将“_full
”删除即可:
三、完整代码
# -*- coding: utf-8 -*-
import geopandas
import requests
import json
import os
district_url = 'https://restapi.amap.com/v3/config/district?keywords={city}&key={api_key}'
geo_json_url = 'https://geo.datav.aliyun.com/areas/bound/{city_code}_full.json'
api_key = None # 配置高德地图API KEY
path = None
def get_district_code(city, api_key):
url = district_url.format(city=city, api_key=api_key)
payload = {
}
headers = {
}
response = requests.request("GET", url, headers=headers, data=payload)
result = json.loads(response.text)
return result["districts"][0]["adcode"]
def download_geojson(city, city_code):
file_path = os.path.join(path, city + '.json')
if os.path.exists(file_path):
print('Reading from local files...')
with open(file_path, 'r') as f:
result = json.load(f)
else:
print('Downloading from website...')
url = geo_json_url.format(city_code=city_code)
response = requests.get(url)
result = json.loads(response.text)
with open(file_path, 'w') as f:
json.dump(result, f, indent=4)
return result
def generate_shape(city):
file_name = os.path.join(path, city + '.json')
shp_file_path = os.path.join(path, city + '.shp')
try:
data = geopandas.read_file(file_name)
localPath = str(shp_file_path)
data.to_file(localPath, driver='ESRI Shapefile', encoding='gbk')
print(f"{city}shp文件生成成功")
print(f"文件存储在:{os.path.join(path,city+'.shp')}")
except Exception as e:
print(e)
if __name__ == '__main__':
city = input('输入城市名称:')
if api_key is None:
city_code = input('输入城市编码:')
else:
city_code = get_district_code(city, api_key)
path = input('输入存储路径:')
download_geojson(city, city_code)
generate_shape(city)
文章参考:https://www.bilibili.com/read/cv10961151
这里再放一个2013年-2023年省市县行政区边界的下载链接:https://www.shengshixian.com/