利用python快速获取全国各省市shp文件

一个方便快捷的获取全国各省市矢量边界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/

猜你喜欢

转载自blog.csdn.net/qq_43874102/article/details/129368114