首页 » 网站推广 » phpgeocodingapi技巧_把百度地图Geocoding API封装成UDF

phpgeocodingapi技巧_把百度地图Geocoding API封装成UDF

访客 2024-12-08 0

扫一扫用手机浏览

文章目录 [+]

Geocoding API是一个供程序员调用的、http形式的舆图做事接口。
紧张做事那些非网页程序的调用。
例如C# 、C++、Java等开拓措辞都能发送http要求且能吸收返回数据。

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

phpgeocodingapi技巧_把百度地图Geocoding API封装成UDF

Geocoding API有哪些功能?

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

phpgeocodingapi技巧_把百度地图Geocoding API封装成UDF
(图片来自网络侵删)
地址解析是指,由详细到街道的构造化地址得到百度经纬度信息,且支持名胜古迹、标志性建筑名称直接解析返回百度经纬度。
例如:“北京市海淀区中关村落南大街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 requestsurl=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

fromsqlalchemyimportcreate_engineconn=create_engine('sqlite://')connection = conn.raw_connection()connection.create_function('geocoding', 1, geocoding)print(conn.execute("selectgeocoding('杭州临安汽车东站')").fetchall()[0][0])ipython-sql下如何注册UDF?

%load_ext sql%sql sqlite://conns=%sql -lprint(conns)connection=conns['sqlite://'].session.connection.connectionconnection.create_function('geocoding', 1, geocoding)%sql selectgeocoding('杭州临安汽车东站')

参考http://api.map.baidu.com/lbsapi/cloud/geocoding-api.htmhttps://github.com/catherinedevlin/ipython-sql

标签:

相关文章