完成創(chuàng)建,如下圖,獲得 AK:

官方開發(fā)文檔

在開發(fā)文檔—接口服務(wù)—地理編碼,找到開發(fā)文檔。

地址是https://lbsyun.baidu.com/faq/api?title=webapi/guide/webservice-geocoding

!](https://image-bed-1311591712.cos.ap-shanghai.myqcloud.com/img/image-20231218190402439.png)

地理編碼服務(wù)(又名 Geocoder)是一類 Web API 接口服務(wù)。

地理編碼服務(wù)提供將結(jié)構(gòu)化地址數(shù)據(jù)(如:北京市海淀區(qū)上地十街十號)轉(zhuǎn)換為對應(yīng)坐標(biāo)點(diǎn)(經(jīng)緯度)功能。可通過該功能,將結(jié)構(gòu)化地址(省/市/區(qū)/街道/門牌號)解析為對應(yīng)的位置坐標(biāo)。地址結(jié)構(gòu)越完整,地址內(nèi)容越準(zhǔn)確,解析的坐標(biāo)精度越高。

官方案例

點(diǎn)擊快速調(diào)用代碼,來到官方的示例:

API 服務(wù)地址為:

https://api.map.baidu.com/geocoding/v3/?address=北京市海淀區(qū)上地十街10號&output=json&ak=您的ak&callback=showLocation
//GET請求

下面是一個(gè) python 案例,請求”北京市海淀區(qū)上地十街 10 號”的經(jīng)緯度,得到 json 格式的經(jīng)緯度返回值。

# encoding:utf-8
import requests

# 接口地址
url = "https://api.map.baidu.com/geocoding/v3"

# 此處填寫你在控制臺-應(yīng)用管理-創(chuàng)建應(yīng)用后獲取的AK
ak = "填寫自己的AK"

params = {
"address": "北京市海淀區(qū)上地十街10號",
"output": "json",
"ak": ak,

}

response = requests.get(url=url, params=params)
if response:
print(response.json())

返回 json 格式參數(shù)

{
"status": 0,
"result": {
"location": {
"lng": 116.30762232672,
"lat": 40.056828485961
},
"precise": 1,
"confidence": 80,
"comprehension": 100,
"level": "門址"
}
}

返回值含義

返回參數(shù)含義如下,建議以comprehension字段作為解析結(jié)果判斷標(biāo)準(zhǔn),comprehension分值范圍 0-100,分值越大,百度地圖返回的結(jié)果精確度越高。

狀態(tài)碼含義如下:

可以看到只有返回碼為 0,才請求正確。可以在 python 代碼里添加判斷語句,解析返回碼為 0 的數(shù)據(jù),返回碼為其他情況,則不解析。

開始實(shí)戰(zhàn)

用一個(gè)包含290個(gè)車站名字的excel表為數(shù)據(jù)源,批量獲取這些車站的經(jīng)緯度信息。本文使用的數(shù)據(jù)源是290個(gè)車站excel文件,公眾號后臺回復(fù)車站可以獲取此文件。

數(shù)據(jù)源如下所示:

執(zhí)行完代碼獲得結(jié)果如下:

實(shí)戰(zhàn)開始:

創(chuàng)建一個(gè)get_geocoding(addr)函數(shù),傳入一個(gè)地址,函數(shù)返回經(jīng)緯度信息。

def get_geocoding(addr):
# 接口地址
url = "https://api.map.baidu.com/geocoding/v3"

# 此處填寫你在控制臺-應(yīng)用管理-創(chuàng)建應(yīng)用后獲取的AK
ak = "自己的AK" # 切換自己的AK

params = {
"address": addr,
"output": "json",
"ak": ak,
}

response = requests.get(url=url, params=params)
if response:
response = response.json() # 轉(zhuǎn)為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) # 經(jīng)緯度數(shù)據(jù)轉(zhuǎn)為混合數(shù)據(jù)類型元組t1
t2 = ','.join(map(str, t1)) # 混合數(shù)據(jù)類型元組t1,轉(zhuǎn)為字符串t2
return t2
else:
print(addr, "未獲取到經(jīng)緯度")

使用 tqdm 庫,顯示 pandas 執(zhí)行 progress_apply 函數(shù)過程的進(jìn)度條:

from tqdm import tqdm
tqdm.pandas(desc='獲取經(jīng)緯度進(jìn)度條', unit="個(gè)") # tqdm顯示進(jìn)度條
df["經(jīng)緯度等信息"] = df["檢索車站名稱"].progress_apply(get_geocoding) # 調(diào)用函數(shù),批量獲取地址經(jīng)緯度,使用tqdm時(shí),apply換為progress_apply

執(zhí)行過程的進(jìn)度條如下:

可以選擇導(dǎo)出為 csv 文件或者 excel 文件:

df.to_csv('result.csv', index=False)  # 生成csv
df.to_excel('result.xlsx', index=False) # 生成excel

計(jì)算程序執(zhí)行用時(shí):

import time
time_start = time.time() # 程序起始時(shí)間
time_end = time.time() # 程序結(jié)束時(shí)間
t = time_end - time_start # 運(yùn)行時(shí)間
print('共用時(shí)%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"

# 此處填寫你在控制臺-應(yīng)用管理-創(chuàng)建應(yīng)用后獲取的AK
ak = "自己的AK" # 切換自己的AK

params = {
"address": addr,
"output": "json",
"ak": ak,
}

response = requests.get(url=url, params=params)
if response:
response = response.json() # 轉(zhuǎn)為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) # 經(jīng)緯度數(shù)據(jù)轉(zhuǎn)為混合數(shù)據(jù)類型元組t1
t2 = ','.join(map(str, t1)) # 混合數(shù)據(jù)類型元組t1,轉(zhuǎn)為字符串t2
return t2
else:
print(addr, "未獲取到經(jīng)緯度")

if __name__ == "__main__":
# 讀取一個(gè)excel,批量獲取地址經(jīng)緯度
df = pd.read_excel("上海局車站名稱.xlsx")
print(df.head())
time_start = time.time() # 程序起始時(shí)間
# df["經(jīng)緯度等信息"] = df["檢索車站名稱"].apply(get_geocoding) # 調(diào)用函數(shù),批量獲取地址經(jīng)緯度

tqdm.pandas(desc='獲取經(jīng)緯度進(jìn)度條', unit="個(gè)") # tqdm顯示進(jìn)度條
df["經(jīng)緯度等信息"] = df["檢索車站名稱"].progress_apply(get_geocoding) # 調(diào)用函數(shù),批量獲取地址經(jīng)緯度,使用tqdm時(shí),apply換為progress_apply

df["lon經(jīng)度"] = df["經(jīng)緯度等信息"].str.split(',', expand=True)[0]
df["lat維度"] = df["經(jīng)緯度等信息"].str.split(',', expand=True)[1]
df["precise是否精確查找"] = df["經(jīng)緯度等信息"].str.split(',', expand=True)[2]
df["confidence絕對精度"] = df["經(jīng)緯度等信息"].str.split(',', expand=True)[3]
df["comprehension地址理解程度"] = df["經(jīng)緯度等信息"].str.split(',', expand=True)[4]
df["level地址結(jié)構(gòu)"] = df["經(jīng)緯度等信息"].str.split(',', expand=True)[5]

df = df.drop("經(jīng)緯度等信息", axis=1)

# df.to_csv('result.csv', index=False) # 生成csv
df.to_excel('result.xlsx', index=False) # 生成excel
time_end = time.time() # 程序結(jié)束時(shí)間
t = time_end - time_start # 運(yùn)行時(shí)間
print('共用時(shí)%s秒' % t)

輸出的 excel 表格內(nèi)容如下:

本文使用的數(shù)據(jù)源是如下所示的290個(gè)車站excel文件,公眾號后臺回復(fù)車站可以獲取此文件。

下一期,我將使用獲取到的這些經(jīng)緯度數(shù)據(jù),通過python可視化地圖工具進(jìn)行分析,歡迎關(guān)注我的公眾號。

本文章轉(zhuǎn)載微信公眾號@程序員coding

上一篇:

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

下一篇:

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

我們有何不同?

API服務(wù)商零注冊

多API并行試用

數(shù)據(jù)驅(qū)動選型,提升決策效率

查看全部API→
??

熱門場景實(shí)測,選對API

#AI文本生成大模型API

對比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉(zhuǎn)化潛力

25個(gè)渠道
一鍵對比試用API 限時(shí)免費(fèi)

#AI深度推理大模型API

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

10個(gè)渠道
一鍵對比試用API 限時(shí)免費(fèi)