python调用高德api获取省市区三级行政区经纬度

1 说明

  • 高德行政区域查询API文档
    (https://lbs.amap.com/api/webservice/guide/api/district)
  • 使用API前您需先申请Key,若无高德地图API账号需要先申请账号,申请链接高德API Key (https://lbs.amap.com/dev/key)
  • 高德的经纬度为GCJ-02坐标系

2 python脚本

#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
@File : get_lng_lat.py
@Author : jakin
@Time : 2023/5/5 16:47

"""

import requests
import pandas as pd


def get_city_data(key: str, keywords: str, subdistrict: int) -> dict:
    """
    通过高德API获取指定区域的行政区划信息

    :param key: 高德API的key,用于访问API接口
    :param keywords: 区域名称,可为省、市、区县等
    :param subdistrict: 区域级别,取值为0-3,0表示中国,1表示省份,2表示市,3表示区县
    :return: 包含行政区划信息的字典
    """
    url = f"https://restapi.amap.com/v3/config/district?keywords={keywords}&subdistrict={subdistrict}&" \
          f"key={key}"
    response = requests.get(url)
    return response.json()


def get_info(data: dict, result: list, parent_name: str = None, parent_adcode: str = None,
             parent_citycode: str = None) -> None:
    """
    递归函数,遍历整个区域划分的嵌套字典结构,并将每个行政区划的"name"、"adcode"、"center" 和 "citycode" 放在列表中,再保存在 result列表中

    :param data: 当前区域的行政区划信息
    :param result: 保存所有行政区划信息的列表
    :param parent_name: 上级行政区划的名称
    :param parent_adcode: 上级行政区划的adcode
    :param parent_citycode: 上级行政区划的citycode
    """
    for district in data['districts']:
        # 将上一级信息与本级信息存入一个列表
        line = [
            district['name'], district['adcode'], district['center'].split(",")[0], district['center'].split(",")[1],
            district['citycode'], parent_name, parent_adcode, parent_citycode
        ]
        result.append(line)
        # 递归处理下一级行政区划,将本级信息作为上一级信息传入
        if district['districts']:
            get_info(district, result, district['name'], district['adcode'], district['citycode'])


def get_lng_lat(n: dict) -> list:
    """
    对输入的行政区划字典进行处理,返回包含所有行政区划的 "name"、"adcode"、"center" 和 "citycode" 的列表

    :param n: 包含行政区划信息的字典
    :return: 包含所有行政区划信息的列表
    """
    result = []
    # 将最高级别的 "name"、"adcode"、"center" 和 "citycode" 初始化为空字符串
    get_info(n, result)
    # 将列表中为空的子列表元素设为None
    result = [[None if isinstance(e, list) and not e else e for e in sublst] for sublst in result]
    return result


def main() -> None:
    # 获取中国所有省市区的数据,subdistrict=3 表示获取到区县一级的数据
    city_data = get_city_data(key='ab26*******35ff4f', keywords='中国', subdistrict=3)
    lst = get_lng_lat(city_data)
    df = pd.DataFrame(lst, columns=['name', 'adcode', 'lng', 'lat', 'citycode', 'parent_name', 'parent_adcode',
                                    'parent_citycode'])
    df.insert(0, 'id', range(1, len(df) + 1))
    df.to_excel('省市区3级行政区1.xlsx', index=False)


if __name__ == '__main__':
    main()

3 数据结构数据结构

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据百度API获取经纬度对应的省市区信息,可以使用Python进行实现。以下是一个示例代码: ```python import requests def get_location_info(latitude, longitude): ak = '你的百度开发者API密钥' # 需要替换为自己的百度开发者API密钥 url = f'http://api.map.baidu.com/reverse_geocoding/v3/?ak={ak}&output=json&coordtype=wgs84ll&location={latitude},{longitude}' response = requests.get(url) data = response.json() if data['status'] == 0: province = data['result']['addressComponent']['province'] city = data['result']['addressComponent']['city'] district = data['result']['addressComponent']['district'] return province, city, district else: return None # 使用示例 latitude = 39.9087 # 纬度 longitude = 116.3975 # 经度 location_info = get_location_info(latitude, longitude) if location_info: province, city, district = location_info print(f'该经纬度所在位置为:省份:{province},城市:{city},区县:{district}') else: print('获取位置信息失败') ``` 以上代码中,我们使用了Python的requests库发送HTTP请求,并通过百度API的逆地理编码接口获取经纬度对应的位置信息。需要注意,你需要将`ak`变量的值替换为自己的百度开发者API密钥。 具体步骤为: 1. 引入requests库,用于发送HTTP请求。 2. 定义一个`get_location_info`函数,该函数接受经度和纬度作为参数,并返回省市区的信息。 3. 在函数中构建请求URL,包括百度API密钥、经纬度等信息,并发送GET请求获取响应数据。 4. 解析API返回的JSON数据,提取省市区信息。 5. 在主程序中,调用`get_location_info`函数,传入经纬度参数,获取位置信息。 6. 如果成功获取位置信息,则将其打印出来;否则输出获取位置信息失败的提示。 注意,以上代码仅为示例,具体的实现需要根据你所使用的具体百度API接口和参数进行适当的调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值