利用高德地图API进行地址层次化处理(地理编码&逆地理编码)

利用高德地图API进行地址层次化处理(地理编码&逆地理编码)


前言

跟着老师做一个疫情演化分析系统的项目,我主要负责的是封控事件预测这一块,需要用到LSTM做时间序列预测,所给的数据集大概是这样的:
在这里插入图片描述
如果拿每个场所作为一个地点进行统计,得到的数据将会十分稀疏(一个地点在这两个月内的经停病例数很少,有些甚至一天也没有阳性病例经过)
因此考虑把这些地点进行聚类,首先考虑的是从区域入手,把他们归为相应的区之中。
学长告诉我高德有一个地理编码和逆地理编码的API,地理/逆地理编码 API文档,借助这个API,我们就可以把这些场所的具体地址进行输出


一、具体代码

import pandas as pd
import urllib
path = 'C:/Users/new/Desktop/疫情演化系统/数据/轨迹数据.xlsx'
data = pd.read_excel(path)

data['完整地址'] = ''
data['所在区'] = ''
data['街道'] = ''
data['township'] = ''

API_key = ""  # 使用高德地图地理编码API所需的key,这里我申请的是个人key,每日只能查询5000条数据
city = "天津"  # 默认对天津的地点进行地理编码和逆编码
city = urllib.parse.quote(city)  # 这里要注意,按照标准,URL只允许一部分ASCII字符,其他字符(如汉字)是不符合标准的,此时就要进行编码,下方的address同样需要

for index,row in data.iterrows():
    address = row['场所']
    address = urllib.parse.quote(address)
    geo_url = "https://restapi.amap.com/v3/geocode/geo?key={}&address={}&city={}".format(API_key,address,city)
    
    req = urllib.request.Request(geo_url)  # 将url对象转化为request对象
    ret = urllib.request.urlopen(req)  # 发送请求,打开url,也可以直接传入url
    result = ret.read().decode('utf-8')
    
    result = eval(result)
    if result['status'] == '1':  # 有时候API会有一些没法返回正常的查询结果,比如乐齐国际影城,不知道为啥返回不了正常结果,status=0
        location = result['geocodes'][0]['location']
        longitude, latitude = eval(location)  # 地点对应经纬度

        regeo_url = 'https://restapi.amap.com/v3/geocode/regeo?key={}&location={}&extensions=base'.format(API_key,location)  # extensions 参数取值为 all 时会返回基本地址信息、附近 POI 内容、道路信息以及道路交叉口信息
        req = urllib.request.Request(regeo_url)  # 将url对象转化为request对象
        ret = urllib.request.urlopen(req)  # 发送请求,打开url,也可以直接传入url
        result = ret.read().decode('utf-8')
        
        result = eval(result)
        if result['status'] == '1':
            formatted_address = result['regeocode']['formatted_address']  # 完整地址
            district = result['regeocode']['addressComponent']['district']  # 所在区
            street = result['regeocode']['addressComponent']['streetNumber']['street']  # 所在街道
            township = result['regeocode']['addressComponent']['township']  # 暂不了解此词条的含义
            # formatted_address
            # district
            # street
            # township
            if formatted_address:  # 主要是防止有些地址返回的是空集
                data.loc[index,'完整地址'] = formatted_address
            if district:
                data.loc[index,'所在区'] = district
            if street:
                data.loc[index,'街道'] = street
            if township:
                data.loc[index,'township'] = township
            if longitude:
                data.loc[index,'经度'] = longitude
            if latitude:
                data.loc[index,'纬度'] = latitude
                
outputpath='C:/Users/new/Desktop/Geocoding.csv'
data.to_csv(outputpath,sep=',',index=False,header=True,encoding='utf_8_sig')  # 保存结果

二、结果

在这里插入图片描述


总结

高德的这个API还是挺好用的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值