直接上代码
#这是最终版本
import pandas as pd
import json
import requests
#获取经纬度
def getlnglat(address): #从本地的xlsx文件中获取商圈名称,作为此函数的实参
output = 'json'
ak = '你的ak码(自行去百度地图平台申请)' # 百度地图密钥ak,“控制台”-“应用管理”-“我的应用”-“创建应用”-“命名、*”提交后会生成AK
url = 'http://api.map.baidu.com/geocoding/v3/?address={0}&output={1}&ak={2}'.format(address,output,ak)
print(url)
html = requests.get(url=url)
html = html.text
temp = json.loads(html, strict=False)
lat = temp['result']['location']['lat']
lng = temp['result']['location']['lng']
return lat, lng #纬度 latitude,经度 longitude
def re_html(data): #生成HTML适配的格式
data_html = pd.DataFrame(columns=['content']) #建立一个列名为content的dataframe对象
for indexs in data.index: #重新整理成html里适配的格式
data_html.loc[indexs, 'content'] = '{' + \
'"lat":' + str(data.loc[indexs, '纬度']) + ',' + \
'"lng":' + str(data.loc[indexs, '经度']) + ',' + \
'"address":' + '"' + str(data.loc[indexs, '名称']) + '"' + \
'}' + ','
data_html.to_csv(r'C:\Users\lupo\OneDrive\桌面\school\school_result.xls', encoding="gbk") #相对路径,生成了该csv文件
if __name__ == '__main__':
data = pd.read_excel(r'C:\Users\lupo\OneDrive\桌面\school\pschool_b.xls')
for index in data.index: #index为data的序号,从0开始
get_location = getlnglat(data.loc[index, '名称']) #通过序号进行索引,获得MC列下对应的地址名称
lat = get_location[0]
lng = get_location[1]
data.loc[index, '纬度'] = lat
data.loc[index, '经度'] = lng
print(data)
re_html(data)
我的原始数据格式(pschool_b.xls):
处理后的数据格式(school_result.xls):
下一步就可以愉快地基于结果使用Arcgis10.2在地图上根据经纬度标点了。
ps:最大的体会的经常报错result,原来是其中的一个地名百度地图不确定是哪个经纬度,所以报错。类似于原始数据的第14行,如果我不加上西中街小学后面的地址(北京市东城区东直门外大街10号楼),那么这个程序就会报错(因为百度地图不确认西中街小学在哪里),这个时候就需要基于个别地名加具体的地址了,再跑程序。