<返回更多

把百度地图Geocoding API封装成UDF

2020-07-05    
加入收藏

什么是百度Geocoding API?

Geocoding API是一个供程序员调用的、http形式的地图服务接口。主要服务那些非网页程序的调用。例如C# 、C++、JAVA等开发语言都能发送http请求且能接收返回数据。

用户只需在请求的url字串中拼接好关键字或者经纬度信息,即可获取到相应的百度经纬度或者结构化地理信息。

把百度地图Geocoding API封装成UDF

 

Geocoding API有哪些功能?

Geocoding API包括地址解析和逆地址解析功能。

注意:

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('杭州临安汽车东站')
把百度地图Geocoding API封装成UDF

 

 

声明:本站部分内容来自互联网,如有版权侵犯或其他问题请与我们联系,我们将立即删除或处理。
▍相关推荐
更多资讯 >>>