数据资源 | 干货满满!利用Python获取中国行政区边界经纬度坐标

查看原文:【数据seminar】数据资源 | 干货满满!利用Python获取中国行政区边界经纬度坐标

启研学社由知名学者担任学术顾问,由高校师生与企研数据科学团队联合组建的,是以大数据资源及相关技术助力中国学术、智库与行业研究为宗旨的研究组织。团队当前的主要目标是挖掘行政、经济与社会大数据资源在经济学学术、智库与相关行业研究领域中的应用价值,以学术研究为标准开展大数据治理研究,努力探索大数据分析技术融入中国经济社会研究的可行进路。

目录

Part 1  获取中国行政区边界经纬度坐标的几种方法

方法1

方法2

方法3

方法4

Part 2  利用Python从高德开放平台获取行政区边界经纬度

1、基于高德提供的模板

2、基于高德开发平台的web API接口

3、小结

Part 3  总结和预告

友情链接

某君手中有一份某市企业的经纬度坐标数据,希望统计出该市从南至北,从东到西,每平方公里上企业数量(下文简称为:企业数量地理分布)。

处理思路如下:要求得该市的企业数量地理分布,首先,需要获取该市行政区边界经纬度坐标;然后,将企业与行政区边界的经纬度坐标换算为地理上的距离;最后,统计出该市企业数量的地理分布。

本文解决了统计某市企业数量地理分布的第一步:获取行政区边界经纬度坐标(之后会推送后续的步骤,敬请关注!)。首先介绍几种获取中国行政区边界经纬度的方法,然后基于高德开放平台[1],提供2份已实现功能的Python代码,供读者参考。

注:本文适合具有Python基础并了解HTTP协议的读者。若无相关知识储备亦无妨,本文已写好相关注释,以便读者能够将代码运行起来。

Part 1  获取中国行政区边界经纬度坐标的几种方法

本节介绍4种获取中国行政区边界经纬度坐标的方法。

方法1

从“国家基础地理信息中心”运行并维护的“全国地理信息资源目录服务系统”中下载全国基础地理数据[2]。

注:原始矢量数据,不是最终地图。该数据整体现势性为2015年,现势性,是指地图对地理信息现状的反映程度。

方法2

通过“国家基础地理信息中心”承办的“国家地理信息公共服务平台天地图2021版[3]”提供的API接口进行查询。

方法3

通过“高德开放平台”提供的API接口进行查询。本文使用该方法

方法4

通过“百度地图开放平台[4]”提供的API接口进行查询。

上述方法优劣如下 :

获取方法优势劣势
方法1:下载矢量数据全量下载,获取方便数据整体现势性为2015年
方法2:天地图平台更新及时需要申请权限
方法3:高德开放平台更新及时需要申请权限
方法4:百度地图开放平台更新及时需要申请权限

注:上述优劣比较是笔者使用中的体会,仅供参考。

Part 2  利用Python从高德开放平台获取行政区边界经纬度

本节提供了两份python代码供读者参考。第一份代码,基于高德开放平台提供的案例,利用该案例,我们无需申请KEY,亦可获取行政区边界经纬度。第二份代码,基于高德开放平台提供的API接口,需申请KEY。

读者若要运行本节的代码,请先安装好python环境和requests模块。

1、基于高德提供的模板

高德开放平台已经为广大开发人员提供了一个获取行政区边界的实用案例[5]。利用该案例我们可以非常方便地获取行政区边界的经纬度。

代码的基本思路如下:

  1. python模拟浏览器发起请求

  2. 解析网站返回的响应数据

  3. 保存我们需要的数据

python代码如下:

import requests

# 这里的 AK 是高德样例中内置的 key. 不需要再申请key.
AK = '6e79f6d236e295632f21b385e363b6e8'


def get_boundary_from_gaode_demo(level: str, keyword: str) -> dict:
    """
    功能: 获取某省市区的边界 gis 坐标

    level: 行政级别 district 区、 city 市、 province 省
    keywords: 某个具体的省, 市, 区

    return: 返回网页响应.
    """

    # 模拟浏览器
    headers = {
        'Referer': 'https://lbs.amap.com/',
        'Accept': 'application/json, text/javascript, */*; q=0.01',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36',
        'Accept-Language': 'zh-CN,zh;q=0.9',
        'accept-encoding': 'gzip, deflate, br'
    }

    # 设置参数
    params = (
        # 获取边界不需要返回下级行政区
        ('subdistrict', '0'),
        # 返回行政区边界坐标组等具体信息
        ('extensions', 'all'),
        # 行政级别 district、city、province
        ('level', level),
        # AK, 这里是高德样例提供的 key
        ('key', AK),
        ('s', 'rsv3'),
        # 返回结果为json格式
        ('output', 'json'),
        # 检索的行政区划名称
        ('keywords', keyword),
        ('platform', 'JS'),
        ('logversion', '2.0'),
        ('appname', 'https://lbs.amap.com/demo/javascript-api/example/district-search/draw-district-boundaries'),
        ('sdkversion', '1.4.15'),
    )

    # 发起请求,获得响应.
    response = requests.get('https://restapi.amap.com/v3/config/district', headers=headers, params=params)

    # 返回响应结果.
    res = response.json()
    boundary = res['districts'][0]['polyline']

    return boundary


if __name__ == '__main__':
    
    # 参数1 : 行政级别 district 区、 city 市、 province 省
    level = 'district'
    
    # 参数2 : 待查询边界的行政区
    keyword = '杭州市'

    # 调用函数 get_boundary_from_gaode_demo() 获取边界经纬度
    boundary = get_boundary_from_gaode_demo(level, keyword)

    # 查看边界有多少个经纬度点组成
    print(len(boundary))

2、基于高德开发平台的web API接口

第一份代码, 直接爬取高德提供的样例中的数据,因此不需要申请key, 但高德平台可能会更改这个key,导致代码失效。

通过查阅高德的开发文档,我们发现,高德平台提供了获取行政区边界的经纬度的web api接口文档[6],但这个方式需要向高德平台申请key。

python代码如下:

注意: 代码中需要补充填写 key 值。

import requests


def get_boundary_from_api(keywords: str) -> dict:
    """
    获取某个行政区划地理信息

    keywords: 具体的行政区划, 例如 '杭州市' 等
    """

    # 向高德开发平台申请的key
    key = 'xxxxxxxxxxxxxxxxxxxxxxx'

    # 发起请求的url
    url = r'https://restapi.amap.com/v3/config/district'

    # 设置参数
    params = (
        # key参数, 是我们申请的key
        ("key", key),
        # keywords参数, 是我们需要查询的行政区划
        ("keywords", keywords),
        # extensions=='all' , 则响应中会返回边界的经纬度.
        ("extensions", 'all')
    )

    # 发起请求,获取响应
    response = requests.get(url, params=params)

    # 解析响应,返回数据
    res = response.json()
    boundary = res["districts"][0]["polyline"]

    return boundary


if __name__ == '__main__':

    # 调用函数获取数据
    boundary = get_boundary_from_api('杭州市')

    # 查看边界由多少经纬度点组成.
    print(len(boundary))

3、小结

本节提供了从高德开放平台获取行政区边界经纬度的两份python代码, 它们各有优劣:

  1. 基于样例的方法,不需要向高德申请key,拿来就能用,但可能不稳定。

  2. 基于接口的方法,需要申请key,但更为稳定。

Part 3  总结和预告

本文分享了获取中国行政区边界经纬度坐标的四种方法,并解决了统计企业数量地理分布的第一步。之后,我们将陆续推出,经纬度坐标距离换算等相关推文,逐步实现“企业数量地理分布”的计算。敬请期待!

友情链接

[1]高德开放平台: https://lbs.amap.com/

[2]1:100万全国基础地理数据库: https://www.webmap.cn/commres.do?method=result100W

[3]国家地理信息公共服务平台: https://www.tianditu.gov.cn/

[4]百度地图开放平台: https://lbsyun.baidu.com/

[5]高德开放平台的实用案例: https://lbs.amap.com/demo/javascript-api/example/district-search/draw-district-boundaries

[6]高德web api接口文档: https://lbs.amap.com/api/webservice/guide/api/district

在地图上画出各省市边界,北京市密云县json内容如下: {"type": "FeatureCollection", "features": [{"type": "Feature","properties":{"id":"110228","name":"密云县","cp":[117.0923,40.5121],"childNum":1},"geometry":{"type":"Polygon","coordinates":[[[116.7586,40.7064],[116.7847,40.7016],[116.7888,40.714],[116.7902,40.727],[116.7819,40.7524],[116.7833,40.7579],[116.7902,40.7517],[116.8025,40.7462],[116.819,40.7504],[116.8272,40.749],[116.8396,40.7607],[116.8341,40.7703],[116.8506,40.7751],[116.8506,40.7785],[116.8671,40.7847],[116.8629,40.7922],[116.8712,40.7943],[116.8739,40.7991],[116.8808,40.7977],[116.8863,40.8012],[116.8959,40.7936],[116.8945,40.7819],[116.8973,40.7778],[116.9234,40.7737],[116.9247,40.7627],[116.9289,40.7565],[116.9234,40.7524],[116.9261,40.7449],[116.9412,40.7401],[116.9453,40.7284],[116.9563,40.7229],[116.9659,40.714],[116.9646,40.7092],[117.0044,40.6968],[117.0195,40.6954],[117.0305,40.692],[117.0497,40.7002],[117.084,40.7023],[117.0964,40.7057],[117.1115,40.7071],[117.117,40.6995],[117.1225,40.7009],[117.1527,40.6968],[117.1664,40.6989],[117.1788,40.6934],[117.1829,40.6975],[117.2063,40.6947],[117.231,40.6844],[117.242,40.6769],[117.2612,40.681],[117.2777,40.6666],[117.2914,40.6597],[117.3257,40.6604],[117.3367,40.6631],[117.3367,40.6666],[117.3463,40.6741],[117.3615,40.6748],[117.3903,40.6837],[117.4068,40.6865],[117.4205,40.6865],[117.4507,40.6796],[117.4644,40.6734],[117.4796,40.6776],[117.4947,40.6748],[117.5056,40.6666],[117.507,40.6549],[117.5029,40.6528],[117.5015,40.6364],[117.4796,40.6357],[117.4713,40.6474],[117.448,40.6419],[117.4301,40.6405],[117.4219,40.6377],[117.4178,40.6185],[117.4136,40.6062],[117.4205,40.5945],[117.4232,40.5821],[117.4301,40.5787],[117.426,40.5732],[117.4205,40.5691],[117.404,40.5739],[117.4013,40.5698],[117.3944,40.567],[117.3889,40.5615],[117.3766,40.5663],[117.3656,40.5759],[117.3505,40.5801],[117.334,40.5766],[117.3106,40.5766],[117.2955,40.567],[117.2667,40.5581],[117.2502,40.5485],[117.253,40.5416],[117.2502,40.5375],[117.2598,40.5196],[117.2475,40.5121],[117.2392,40.5176],[117.2337,40.5135],[117.2131,40.5128],[117.2104,40.5073],[117.209,40.497],[117.2173,40.4949],[117.2282,40.4812],[117.2255,40.4778],[117.2365,40.4688],[117.2351,40.4578],[117.2639,40.4414],[117.2571,40.4297],[117.2502,40.429],[117.2337,40.4166],[117.2324,40.4036],[117.2392,40.3988],[117.2406,40.3947],[117.2365,40.394],[117.2351,40.3892],[117.2282,40.3857],[117.2241,40.3754],[117.2186,40.3775],[117.209,40.3734],[117.1925,40.3761],[117.1774,40.3748],[117.1637,40.3706],[117.1472,40.372],[117.1472,40.3672],[117.139,40.3624],[117.1184,40.3548],[117.1129,40.3542],[117.1005,40.3603],[117.0593,40.3377],[117.0538,40.337],[117.0525,40.3439],[117.0374,40.3473],[117.0236,40.337],[117.0126,40.326],[117.0113,40.3082],[117.0058,40.3027],[117.0003,40.302],[117.0044,40.2958],[116.9728,40.2848],[116.9522,40.2621],[116.9495,40.2567],[116.9659,40.2374],[116.9536,40.2292],[116.9412,40.2237],[116.9316,40.2306],[116.9206,40.223],[116.9028,40.2244],[116.8973,40.2319],[116.8918,40.2347],[116.8932,40.2415],[116.8739,40.2683],[116.8753,40.2759],[116.8712,40.2889],[116.8588,40.2917],[116.8492,40.3102],[116.8341,40.3082],[116.8272,40.2985],[116.8231,40.2862],[116.819,40.2834],[116.808,40.2869],[116.7888,40.2889],[116.7833,40.2793],[116.7696,40.2731],[116.7517,40.2752],[116.7448,40.2793],[116.7352,40.2793],[116.7435,40.2889],[116.7435,40.2944],[116.7668,40.3143],[116.7696,40.3219],[116.7682,40.3253],[116.7517,40.3267],[116.7503,40.3315],[116.7448,40.3349],[116.7448,40.3391],[116.7297,40.3349],[116.7311,40.3391],[116.7229,40.3397],[116.727,40.361],[116.7188,40.361],[116.7188,40.3693],[116.7133,40.3686],[116.7064,40.3761],[116.7119,40.3802],[116.7091,40.3871],[116.7119,40.3919],[116.7215,40.396],[116.7242,40.4036],[116.7242,40.4166],[116.7201,40.4235],[116.7188,40.4297],[116.7201,40.4386],[116.7229,40.4427],[116.7229,40.4475],[116.7078,40.4661],[116.7009,40.4812],[116.6927,40.4881],[116.6982,40.4942],[116.7009,40.508],[116.7119,40.5183],[116.7133,40.5231],[116.7174,40.5251],[116.7091,40.532],[116.7091,40.543],[116.6776,40.5519],[116.6844,40.554],[116.6982,40.5656],[116.7064,40.5643],[116.7146,40.5746],[116.7119,40.5849],[116.7091,40.5904],[116.7105,40.6007],[116.705,40.6027],[116.7078,40.6075],[116.7023,40.6151],[116.7064,40.624],[116.7023,40.6316],[116.7119,40.6425],[116.7119,40.6556],[116.7091,40.6618],[116.7146,40.668],[116.7146,40.6796],[116.7311,40.6913],[116.7476,40.6968],[116.7586,40.7064]]]}} ]}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值