前言
跟着老师做一个疫情演化分析系统的项目,我主要负责的是封控事件预测这一块,需要用到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还是挺好用的