完成創建,如下圖,獲得 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

上一篇:

用gin寫簡單的crud后端API接口

下一篇:

使用gin搭建api后臺系統之cookie與session
#你可能也喜歡這些API文章!

我們有何不同?

API服務商零注冊

多API并行試用

數據驅動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內容創意新穎性、情感共鳴力、商業轉化潛力

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費