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脚本
"""
@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 = []
get_info(n, result)
result = [[None if isinstance(e, list) and not e else e for e in sublst] for sublst in result]
return result
def main() -> None:
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 数据结构