所有文章 > API开发 > python实战:通过百度地图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

#你可能也喜欢这些API文章!