相关API地址:地理/逆地理编码-API文档-开发指南-Web服务 API | 高德地图API
第一步:根据地址获取其坐标(高德地理编码)
第二步:根据坐标获取其详细地址信息(高德逆地理编码)
第三步:结果输出到CSV文件中(犹豫我是批量查询,所以每查询一万次就写入一次数据)
1-29w.csv文件格式如下:
输出结果文件如下:
完整代码如下:代码中key秘钥是本人自己的,如果你需要执行,请替换上你自己的秘钥
申请地址:高德开放平台 | 高德地图API
import requests
import pandas as pd
from urllib.parse import urlencode
def parse(): #读文件
#total_data = pd.read_csv('data.csv',index_col=1,header=1,usecols=['yhbh','yddz'],delimiter=',')
total_data = pd.read_csv('1-29w.csv',index_col = False)
#for i in range(len(total_data)):
#data = np.array(total_data)
yhbh_list=total_data['yhbh']
yddz_list=total_data['yddz']
return yhbh_list,yddz_list
#total_list_data = total_data['yddz']
#return total_list_data
def search_location(address): #根据地址搜索坐标
params = {
'key': 'ceb4faac0f812edab24d1855b8b26b7c',
'address': address,
'city': '广东'
}
base_url = 'https://restapi.amap.com/v3/geocode/geo?'+str(urlencode(params,encoding='UTF-8'))
#response = requests.get(url=base_url, params=params)
response = requests.get(url=base_url)
json_data = response.json()
#print(json_data)
if json_data['status'] == '1' and len(json_data['geocodes']) > 0:
#print(json_data['geocodes'][0]['location']) #高德坐标
# 利用location搜索township
township_str = search_address_detail(location=json_data['geocodes'][0]['location']) #调用函数
#print('township_str:'+str(township_str))
return township_str
else:
return '获取地址高德坐标失败'
def search_address_detail(location): #输入高德坐标,搜索
params = {#'location': location,
'key': 'ceb4faac0f812edab24d1855b8b26b7c',
'radius':'50',
'batch':'false',
'roadlevel':'0',
'extensions':'all'
}
base_url = 'https://restapi.amap.com/v3/geocode/regeo?'+str(urlencode(params,encoding='UTF-8'))+str('&location='+str(location))
response = requests.get(url=base_url)
json_data = response.json()
if json_data['status'] == '1':
if json_data['regeocode']['addressComponent']['township']:
return json_data['regeocode']['addressComponent']['township'] #返回街道信息
else:
return '请求根据高德坐标获取街道信息成功,但没有查询到街道信息'
else:
return '请求根据高德坐标获取街道信息失败'
#return 'errorSearchAddress', json_data
if __name__ == '__main__':
df = pd.DataFrame(columns=['yhbh', 'yddz', 'jiedao'])
yhbh_list,yddz_list = parse() #读取文件
#address_list=['深圳市南山区珠光村']
index = 0
yddz_len=len(yddz_list)
try:
for i in range(len(yddz_list)):
# 搜索location
township_str= search_location(yddz_list[i])
#将查询的数据插入到dataframe中,以便后面输出到csv文件中
df.loc[index] = [yhbh_list[i],yddz_list[i], township_str]
print('文件有%s条数据,成功请求了%s条数据,街道信息为:%s'%(yddz_len,index,township_str))
if i%10000==0 and i!=0: #每查询一万条数据,就输出到csv文件中,采取追加方式输出
df.to_csv('jiedao1-29w.csv',mode='a', index=0,header=False)#第2个开始,就不需要表头了
print('第%s个一万条数据,输出csv成功'%(i+1))
df=df.drop(index=df.index)#清空dataframe数据,避免重复输出前面插入df的数据
elif i%10000==0 and i==0:
df.to_csv('jiedao1-29w.csv',mode='a', index=0) #输出第一个文件需要带有表头
print('第%s个一万条数据,输出csv成功'%(i+1))
df=df.drop(index=df.index)#清空dataframe数据,避免重复输出前面插入df的数据
index = index + 1
df.to_csv('jiedao1-29w.csv',mode='a', index=0,header=False)
print('最后一个一万条数据,输出csv成功')
except Exception as e: #如果报错了,报错之前查询的数据,也输出到CSV文件中
print('报错信息:'+str(e))
df.to_csv('jiedao1-29w.csv',mode='a', index=0,header=False)
print('报错了,存储CSV成功')