什么是百度Geocoding API?Geocoding API是一个供程序员调用的、http形式的地图服务接口 。主要服务那些非网页程序的调用 。例如C# 、C++、JAVA等开发语言都能发送http请求且能接收返回数据 。
【把百度地图Geocoding API封装成UDF】用户只需在请求的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 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.910925geocoding("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 UDFfrom sqlalchemy import create_engineconn = 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 -lprint(conns)connection=conns['sqlite://'].session.connection.connectionconnection.create_function('geocoding', 1, geocoding)%sql select geocoding('杭州临安汽车东站')
文章插图
推荐阅读
- 百度广告如何发布
- 科普|物理学家在水下开枪“自杀”:把科学作S玩明白了
- 淘宝自己开店怎么上货 淘宝店铺一键铺货怎么发货
- 百度黑帽SEO 推技术的原理
- 解冻淘宝店铺保证金需要把店铺商品下架吗 淘宝店被彻底释放了保证金怎么办?
- 别总把咳嗽当成感冒治!吃错药只会加重病情
- 百度搜索正式升级冰桶算法5.0
- 把店铺转让给别人注意事项 淘宝网店怎么转让给别人
- 淘宝如何把销量做起来 淘宝怎么经营才能有销量
- 把淘宝验证登录取消吗 淘宝取消实名认证