什么是百度Geocoding API?
Geocoding API是一個供程序員調用的、http形式的地圖服務接口。主要服務那些非網頁程序的調用。例如C# 、C++、JAVA等開發語言都能發送http請求且能接收返回數據。
用戶只需在請求的url字串中拼接好關鍵字或者經緯度信息,即可獲取到相應的百度經緯度或者結構化地理信息。

Geocoding API有哪些功能?
Geocoding API包括地址解析和逆地址解析功能。
- 地址解析是指,由詳細到街道的結構化地址得到百度經緯度信息,且支持名勝古跡、標志性建筑名稱直接解析返回百度經緯度。例如:“北京市海淀區中關村南大街27號”地址解析的結果是“lng:116.31985,lat:39.959836”,“百度大廈”地址解析的結果是“lng:116.30815,lat:40.056885”逆地址解析是指,由百度經緯度信息得到結構化地址信息。例如:“lat:31.325152,lng:120.558957”逆地址解析的結果是“江蘇省蘇州市虎丘區塔園路318號”。
注意:
1.因為Geocoding和反Geocoding使用的門址數據以及算法都不是一樣的,所以會出現不能一一對應的現象。
2.解析過程中可能會出現一對坐標值對應多個地址門牌信息,本接口將返回距離坐標點最近的一個地址門牌信息。
問題
最近一個項目,需要根據數據庫的地址列轉為經緯度信息,對比了geopy和百度的Geocoding API后,基于簡單快捷的考慮,決定直接使用百度的API。
代碼實現
地址解析為經緯度
addr="杭州臨安汽車東站"
key="f247cdb592eb43ebac6ccd27f796e2d2"
url= f'http://api.map.baidu.com/geocoder?address={addr}&output=json&key={key}'
requests.get(url).json()
返回,
{'status': 'OK',
'result': {'location': {'lng': 119.738708, 'lat': 30.236846},
'precise': 1,
'confidence': 70,
'level': '長途汽車站'}}
經緯度反向解析為地址,
lng_lat=[119.738708,30.236846]
key="f247cdb592eb43ebac6ccd27f796e2d2"
import requests
url=f"http://api.map.baidu.com/geocoder?callback=renderReverse&location={lng_lat[1]},{lng_lat[0]}&output=json&pois=1&key={key}"
requests.get(url).json()
返回,
{'status': 'OK',
'result': {'location': {'lng': 119.738708, 'lat': 30.236846},
'formatted_address': '浙江省杭州市臨安市錢王街261號',
'business': '錦城',
'addressComponent': {'city': '杭州市',
'direction': 'south',
'distance': '66',
'district': '臨安市',
'province': '浙江省',
'street': '錢王街',
'street_number': '261號'},
'cityCode': 179}}
封裝成Python函數
geocoding("hello")
#返回116.413384,39.910925
測試下
geocoding("杭州臨安汽車東站")
#返回 119.738708,30.236846
碰到地址無法解析,會返回116.413384,39.910925
geocoding("hello")
#返回116.413384,39.910925
經反向解析為,
{'status': 'OK',
'result': {'location': {'lng': 116.413384, 'lat': 39.910925},
'formatted_address': '北京市東城區正義路2號',
'business': '天安門,前門,東單',
'addressComponent': {'city': '北京市',
'direction': 'near',
'distance': '29',
'district': '東城區',
'province': '北京市',
'street': '正義路',
'street_number': '2號'},
'cityCode': 131}}
注冊為SQLite UDF
from sqlalchemy
import create_engine
conn = create_engine('sqlite://')
connection = conn.raw_connection()
connection.create_function('geocoding', 1, geocoding)
print(conn.execute("select geocoding('杭州臨安汽車東站')").fetchall()[0][0])
ipython-sql下如何注冊UDF?
%load_ext sql
%sql sqlite://
conns=%sql -l
print(conns)
connection=conns['sqlite://'].session.connection.connection
connection.create_function('geocoding', 1, geocoding)
%sql select geocoding('杭州臨安汽車東站')
