有一个经纬度的excel文档,共4万多条数据。想知道每个数据对应的城市。
1. 思路:
1.首先,需要在百度地图开放平台上注册账号并创建一个应用,获取相应的开发者密钥(AK)。 2.在Python中使用requests模块发送HTTP请求,将经纬度坐标和开发者密钥作为参数传入请求URL中,请求百度地图API。 3.解析API返回的JSON数据,提取其中的城市和地址信息。
import requests
import pandas as pd
import time
import random
#通过经纬度获得城市名和城市地址(省市区)
def get_address(lat, lng, ak):
url = f"https://api.map.baidu.com/reverse_geocoding/v3/?ak={ak}&output=json&coordtype=wgs84ll&location={lat},{lng}"
response = requests.get(url)
data = response.json()
city = data['result']['addressComponent']['city'] #解析城市名
address = data['result']['formatted_address'] #解析地址
return city, address
#替换成自己的ak
ak = 'Your_ak'
#读取文档
df = pd.read_excel('C:/VV/学习/读研/毕业论文/数据/中间稿/经纬度-congqing&sichuan.xlsx')
#将文档中每一行经纬度,请求接口,返回并打印数据
city_list = []
address_list = []
for index, row in df.iterrows():
lat = row['latitude']
lng = row['longitude']
city1, address1 = get_address(lat, lng, ak)
print(city1, address1)
#将数据加入列表中
city_list.append(city1)
address_list.append(address1)
sleep_time = random.uniform(0.04, 0.2)
time.sleep(sleep_time) #个人开发者API请求每秒最多30次,休息一下
# 将城市地址添加到 DataFrame 中
df['city'] = city_list
df['address'] = address_list
#将两列写入文档中
city_df = df[['city', 'address']]
city_df.to_excel('C:/VV/学习/读研/毕业论文/数据/中间稿/经纬度-congqing&sichuan.xlsx', index=False)
2. 每日限额
后发现个人开发者每日限制请求5000次(免费,付费无所谓)。于是每天请求一下下。修改下DataFrame中的数据范围。
#假设从文档第50001行开始,再读取5000行
#读取文档,skiprows=5000 跳过了前5000行,使用 nrows=5000 读取了5000行数据
df = pd.read_excel('C:/VV/学习/读研/毕业论文/数据/中间稿/经纬度-congqing&sichuan.xlsx', skiprows=5000, nrows=5000)
#将文档中每一行经纬度,请求接口,返回并打印数据
city_list = []
address_list = []
for index, row in df.iterrows():
lat = row['latitude']
lng = row['longitude']
city1, address1 = get_address(lat, lng, ak)
print(city1, address1)
#将数据加入列表中
city_list.append(city1)
address_list.append(address1)
sleep_time = random.uniform(0.04, 0.2)
time.sleep(sleep_time) #API请求每秒最多30次,休息一下
# 将城市地址添加到 DataFrame 中
df['city'] = city_list
df['address'] = address_list
# 将DataFrame中数据写入Excel文件中,从第50001行开始
with pd.ExcelWriter('C:/VV/学习/读研/毕业论文/数据/中间稿/经纬度-congqing&sichuan.xlsx') as writer:
df[['city', 'address']].to_excel(writer, startrow=5000, index=False, header=False)