2024年您产品必备的10大AI API推荐
python实战:通过百度地图API批量获取经纬度
当我们需要获取一批地址的经纬度时,可以借助地图平台API接口批量处理。本文以百度地图开放平台为例,希望能对你有所启发。
注册
下面就开始吧。
打开百度地图开放平台,完成注册。
进入开放平台—我的应用—创建应用。
完成创建,如下图,获得 AK:
官方开发文档
在开发文档—接口服务—地理编码,找到开发文档。
地址是https://lbsyun.baidu.com/faq/api?title=webapi/guide/webservice-geocoding
!](https://image-bed-1311591712.cos.ap-shanghai.myqcloud.com/img/image-20231218190402439.png)
地理编码服务(又名 Geocoder)是一类 Web API 接口服务。
地理编码服务提供将结构化地址数据(如:北京市海淀区上地十街十号)转换为对应坐标点(经纬度)功能。可通过该功能,将结构化地址(省/市/区/街道/门牌号)解析为对应的位置坐标。地址结构越完整,地址内容越准确,解析的坐标精度越高。
官方案例
点击快速调用代码,来到官方的示例:
API 服务地址为:
https://api.map.baidu.com/geocoding/v3/?address=北京市海淀区上地十街10号&output=json&ak=您的ak&callback=showLocation
//GET请求
下面是一个 python 案例,请求”北京市海淀区上地十街 10 号”的经纬度,得到 json 格式的经纬度返回值。
# encoding:utf-8
import requests
# 接口地址
url = "https://api.map.baidu.com/geocoding/v3"
# 此处填写你在控制台-应用管理-创建应用后获取的AK
ak = "填写自己的AK"
params = {
"address": "北京市海淀区上地十街10号",
"output": "json",
"ak": ak,
}
response = requests.get(url=url, params=params)
if response:
print(response.json())
返回 json 格式参数
{
"status": 0,
"result": {
"location": {
"lng": 116.30762232672,
"lat": 40.056828485961
},
"precise": 1,
"confidence": 80,
"comprehension": 100,
"level": "门址"
}
}
返回值含义
返回参数含义如下,建议以comprehension
字段作为解析结果判断标准,comprehension
分值范围 0-100,分值越大,百度地图返回的结果精确度越高。
状态码含义如下:
可以看到只有返回码为 0,才请求正确。可以在 python 代码里添加判断语句,解析返回码为 0 的数据,返回码为其他情况,则不解析。
开始实战
用一个包含290个车站名字的excel表为数据源,批量获取这些车站的经纬度信息。本文使用的数据源是290个车站excel文件,公众号后台回复车站
可以获取此文件。
数据源如下所示:
执行完代码获得结果如下:
实战开始:
创建一个get_geocoding(addr)
函数,传入一个地址,函数返回经纬度信息。
def get_geocoding(addr):
# 接口地址
url = "https://api.map.baidu.com/geocoding/v3"
# 此处填写你在控制台-应用管理-创建应用后获取的AK
ak = "自己的AK" # 切换自己的AK
params = {
"address": addr,
"output": "json",
"ak": ak,
}
response = requests.get(url=url, params=params)
if response:
response = response.json() # 转为json格式
if response['status'] == 0:
result = response['result']
location = result['location']
lng = location['lng']
lat = location['lat']
precise = result['precise']
confidence = result['confidence']
comprehension = result['comprehension']
level = result['level']
# print(response)
# print(addr, lng, lat, precise, confidence, comprehension, level)
t1 = (lng, lat, precise, confidence, comprehension, level) # 经纬度数据转为混合数据类型元组t1
t2 = ','.join(map(str, t1)) # 混合数据类型元组t1,转为字符串t2
return t2
else:
print(addr, "未获取到经纬度")
使用 tqdm 库,显示 pandas 执行 progress_apply 函数过程的进度条:
from tqdm import tqdm
tqdm.pandas(desc='获取经纬度进度条', unit="个") # tqdm显示进度条
df["经纬度等信息"] = df["检索车站名称"].progress_apply(get_geocoding) # 调用函数,批量获取地址经纬度,使用tqdm时,apply换为progress_apply
执行过程的进度条如下:
可以选择导出为 csv 文件或者 excel 文件:
df.to_csv('result.csv', index=False) # 生成csv
df.to_excel('result.xlsx', index=False) # 生成excel
计算程序执行用时:
import time
time_start = time.time() # 程序起始时间
time_end = time.time() # 程序结束时间
t = time_end - time_start # 运行时间
print('共用时%s秒' % t)
完整代码如下:
import requests
import pandas as pd
import time
from tqdm import tqdm
def get_geocoding(addr):
# 接口地址
url = "https://api.map.baidu.com/geocoding/v3"
# 此处填写你在控制台-应用管理-创建应用后获取的AK
ak = "自己的AK" # 切换自己的AK
params = {
"address": addr,
"output": "json",
"ak": ak,
}
response = requests.get(url=url, params=params)
if response:
response = response.json() # 转为json格式
if response['status'] == 0:
result = response['result']
location = result['location']
lng = location['lng']
lat = location['lat']
precise = result['precise']
confidence = result['confidence']
comprehension = result['comprehension']
level = result['level']
# print(response)
# print(addr, lng, lat, precise, confidence, comprehension, level)
t1 = (lng, lat, precise, confidence, comprehension, level) # 经纬度数据转为混合数据类型元组t1
t2 = ','.join(map(str, t1)) # 混合数据类型元组t1,转为字符串t2
return t2
else:
print(addr, "未获取到经纬度")
if __name__ == "__main__":
# 读取一个excel,批量获取地址经纬度
df = pd.read_excel("上海局车站名称.xlsx")
print(df.head())
time_start = time.time() # 程序起始时间
# df["经纬度等信息"] = df["检索车站名称"].apply(get_geocoding) # 调用函数,批量获取地址经纬度
tqdm.pandas(desc='获取经纬度进度条', unit="个") # tqdm显示进度条
df["经纬度等信息"] = df["检索车站名称"].progress_apply(get_geocoding) # 调用函数,批量获取地址经纬度,使用tqdm时,apply换为progress_apply
df["lon经度"] = df["经纬度等信息"].str.split(',', expand=True)[0]
df["lat维度"] = df["经纬度等信息"].str.split(',', expand=True)[1]
df["precise是否精确查找"] = df["经纬度等信息"].str.split(',', expand=True)[2]
df["confidence绝对精度"] = df["经纬度等信息"].str.split(',', expand=True)[3]
df["comprehension地址理解程度"] = df["经纬度等信息"].str.split(',', expand=True)[4]
df["level地址结构"] = df["经纬度等信息"].str.split(',', expand=True)[5]
df = df.drop("经纬度等信息", axis=1)
# df.to_csv('result.csv', index=False) # 生成csv
df.to_excel('result.xlsx', index=False) # 生成excel
time_end = time.time() # 程序结束时间
t = time_end - time_start # 运行时间
print('共用时%s秒' % t)
输出的 excel 表格内容如下:
本文使用的数据源是如下所示的290个车站excel文件,公众号后台回复车站
可以获取此文件。
下一期,我将使用获取到的这些经纬度数据,通过python可视化地图工具进行分析,欢迎关注我的公众号。
本文章转载微信公众号@程序员coding