申请一个web服务的key
进入高德开放平台
右上角进入控制台,进入应用管理->我的应用
创建一个新应用
名称和类型随便填即可,自己能区分的出来
添加一个key
名称按照自己的要求填
服务平台需要选Web服务(因为我们本来就是请求web服务的接口)
之后我们就拥有了一个key值,可以直接复制拿来用
进入高德api的地址并使用示例
地理/逆地理编码-API文档-开发指南-Web服务 API | 高德地图API
找到右侧边的目录,点击逆地址编码的锚点,就可以找到对应的api地址:
找到下方的服务示例(正常来说我们只需要经纬度即可):
点击运行得到示例效果:
编写python代码进行批量转换import requests
import json
import re
import pandas as pd
import os
import csv
class AddrCoordConver:
def __init__(self):
self.headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.92 Safari/537.36"
}
self.key_list = [
"key1",
"key2",
"key3",
"key4",
"key5",
"key6",
"key7"
]
# 默认的key索引
self.key_index = 0
# 读取的索引
self.index = 0
# 默认的接口数据
self.url = 'https://restapi.amap.com/v3/geocode/regeo?output=json&location={0},{1}&key={2}&radius=1000&extensions=base'
# 用key去填充,不用再次填充
self.url = self.url.format("{}", "{}", self.key_list[0])
# 示例数据
self.coordinate_list = [
{"lng": "113.256604", "lat": "23.144121"},
{"lng": "113.58603", "lat": "22.134642"},
{"lng": "115.299897", "lat": "22.845191"},
{"lng": "119.21103", "lat": "26.025337"},
{"lng": "106.686616", "lat": "26.635816"},
{"lng": "115.60030365", "lat": "22.88867569"},
{"lng": "114.23753357", "lat": "23.17083931"},
{"lng": "110.422377", "lat": "21.203437"},
{"lng": "110.393099", "lat": "21.252336"}
]
# 接口请求函数
def request_func(self, url):
requests.adapters.DEFAULT_RETRIES = 5 # 增加重连次数
s = requests.session()
s.keep_alive = False # 关闭多余连接
responce = requests.get(url, headers=self.headers)
if responce.status_code == 200:
return responce.text
else:
return None
# 逻辑处理函数
def conversion(self, coordinate_list):
len_coordinate_list = len(coordinate_list)
for coordinate in coordinate_list[self.index:]:
trans_dict = {}
# 每次用经度和维度填充地址
api_url = self.url.format(coordinate[0], coordinate[1])
load_dict = json.loads(self.request_func(api_url))
if load_dict["status"] == "1" and load_dict["infocode"] == "10000":
trans_dict["lng"] = coordinate[0] # 经度
trans_dict["lat"] = coordinate[1] # 维度
trans_dict["address"] = load_dict["regeocode"]["formatted_address"] # 地址
if not os.path.exists('output.csv'):
with open('output.csv', 'wb') as f:
csv.writer(f)
# 将字典写入DataFrame
df = pd.DataFrame(trans_dict, index=[0])
df.to_csv('./output.csv', mode='a', encoding='utf-8', header=False, index=False)
print("index: ", self.index, trans_dict)
self.index += 1
if self.index >= len_coordinate_list:
print("数据写入完成")
exit(0)
elif load_dict["status"] == "0" and load_dict["infocode"] == "10003":
print("访问已超出日访问量, 需要更换key")
print("当前key: ", self.key_list[self.key_index])
key_old = self.key_list[self.key_index]
# key索引 +1
self.key_index += 1
# 判断是否超出列表范围
if self.key_index < len(self.key_list):
# 换一个key, print(re.search("&key=(.*?)&", self.url).group(1))
self.url = re.sub(key_old, self.key_list[self.key_index], self.url)
print("更换后的新key: ", self.key_list[self.key_index])
# 重新调用(不是重新开始,需要对地址为空进行判断,相当于可以中断)
# 开始先将 所有的数据存到sqline里面,跑完之后统一导出写入表里,就可以判断数据不为空就不用重新处理?
self.index += 1
self.conversion(coordinate_list[self.index:])
else:
print("key用完了,请联系开发者.")
exit(0)
else:
print("接口数据获取失败!")
exit(0)
# main函数
def main(self):
# .apply()
csv_data = pd.read_csv("./data_new_1k.csv", encoding="utf-8")
self.conversion(csv_data.values)
if __name__ == '__main__':
addr_coord_conver = AddrCoordConver()
addr_coord_conver.main()
本文章修改于 2019/11/01 16:16:27