详解用Python调用百度地图正/逆地理编码API
一、背景
- (正)地理编码指的是:将地理位置名称转换成经纬度;
- 逆地理编码指的是:将经纬度转换成地理位置信息,如地名、所在的省份或城市等
百度地图提供了相应的API,可以方便调用。相应的说明文档如下:
- 正地理编码
- 逆地理编码
具体API的参数可以查看相应的“服务文档”:
不过首次使用时需要申请,具体在控制台。申请AK的方式可参见其他文章。
二、源码
废话不多说,直接放源码。这里提供了Python调用这两个API的方法。
#!/usr/bin/env python # -*- coding:utf-8 -*- # @Author: Wild Orange # @Email: jixuanfan_seu@163.com # @Date: 2020-06-21 16:06:14 # @Last Modified time: 2020-07-01 19:35:28 import requests AK='[这里填写自己申请的AK值]' def Pos2Coord(name): ''' @func: 通过百度地图API将地理名称转换成经纬度 @note: 官方文档 http://lbsyun.baidu.com/index.php?title=webapi/guide/webservice-geocoding @output: lng: 经度 lat: 纬度 conf: 打点绝对精度(即坐标点的误差范围) comp: 描述地址理解程度。分值范围0-100,分值越大,服务对地址理解程度越高 level: 能精确理解的地址类型 ''' url = 'http://api.map.baidu.com/geocoding/v3/?address=%s&output=json&ak=%s'%(name,AK) res = requests.get(url) if res.status_code==200: val=res.json() if val['status']==0: retVal={'lng':val['result']['location']['lng'],'lat':val['result']['location']['lat'],\ 'conf':val['result']['confidence'],'comp':val['result']['comprehension'],'level':val['result']['level']} else: retVal=None return retVal else: print('无法获取%s经纬度'%name) def Coord2Pos(lng,lat,town='true'): ''' @func: 通过百度地图API将经纬度转换成地理名称 @input: lng: 经度 lat: 纬度 town: 是否获取乡镇级地理位置信息,默认获取。可选参数(true/false) @output: address:解析后的地理位置名称 province:省份名称 city:城市名 district:县级行政区划名 town: 乡镇级行政区划 adcode: 县级行政区划编码 town_code: 镇级行政区划编码 ''' url='http://api.map.baidu.com/reverse_geocoding/v3/?output=json&ak=%s&location=%s,%s&extensions_town=%s'%(AK,lat,lng,town) res=requests.get(url) if res.status_code==200: val=res.json() if val['status']==0: val=val['result'] retVal={'address':val['formatted_address'],'province':val['addressComponent']['province'],\ 'city':val['addressComponent']['city'],'district':val['addressComponent']['district'],\ 'town':val['addressComponent']['town'],'adcode':val['addressComponent']['adcode'], 'town_code':val['addressComponent']['town_code']} else: retVal=None return retVal else: print('无法获取(%s,%s)的地理信息!'%(lat,lng))
注意:
函数只返回一些较为常用的地理位置信息。之前提到的官网中的说明文档是最全的,如果确实有需要,可以修改程序代码。
三、使用方法
(1)正地理编码
比如获取学校的经纬度:
val=Pos2Coord('江苏省南京市江宁区秣陵街道东南大学九龙湖校区') print(val)
输出结果:
{'lng': 118.81871976794395, 'lat': 31.88198449339288, 'conf': 80, 'comp': 57, 'level': '餐饮'}
可以看出,结果存在一定偏差。竟然把学校标记成了餐馆。。。我们可以具体到百度拾取坐标系统中看一下。结果定位到了学校西南角。
(2)逆地理编码
反过来,我们也可以根据经纬度查询地理位置信息。
val=Coord2Pos(118.81871976794395,31.88198449339288) print(val)
输出结果:
{'address': '江苏省南京市江宁区苏源大道', 'province': '江苏省', 'city': '南京市', 'district': '江宁区', 'town': '秣陵街道', 'adcode': '320115', 'town_code': '320115011'}
解析出的地理位置信息是准确的,可以精确到乡镇级行政区划。
(3)一个有意思的例子
之前也看到了,在正地理编码中,如果提供的地理位置信息不精确,则返回的经纬度很可能存在较大偏差。有这样的需求:根据企业名称,获取其地理位置(经纬度),以及所在的省份、地级市、县级市等信息。
一种直接的思路是:直接将企业名称作为地理位置传给正地理编码API,获取其经纬度;再依据经纬度,利用逆地理编码,获取其所在的省份、地级市、县级市。
随便举个栗子,比如“金华银行股份有限公司”。
val=Pos2Coord('金华银行股份有限公司') print(val)
结果:
{'lng': 119.65923457293306, 'lat': 29.10738796331567, 'conf': 70, 'comp': 100, 'level': '金融'}
我们看看定位到哪里了:
emm… 定位到一个广场的旁边。不过大致的位置还是准确的,毕竟还是在金华市内。如果精度要求不高,这个结果还是可以接受的。
那如果精度要求比较高呢?我们就需要获取非常准确的企业位置信息。百度企业信用提供了企业基本信息的查询。
可以看到,企业的地址为:浙江省金华市丹溪路1388号。
我们把这个地址代入API:
Pos2Coord('浙江省金华市丹溪路1388号')
得到结果:
{'lng': 119.65161604390546, 'lat': 29.083163015462144, 'conf': 80, 'comp': 100, 'level': '门址'}
再看看定位到了哪里:
emm…好像看不出来。。我对这里也不熟。。直接到百度地图中看一下:
放到最大后,可以看到,坐标恰好落在“金华银行”上面。Perfect!
人工获取企业具体的地理位置似乎太麻烦了。有没有简单方法呢?可以查看我之前写的一篇文章:用Python爬虫获取百度企业信用中企业基本信息
最后通过逆地理编码获取省份、地级市、县级市信息。
Coord2Pos(119.65161604390546,29.083163015462144)
输出结果:
{'address': '浙江省金华市婺城区双龙南街680号', 'province': '浙江省', 'city': '金华市', 'district': '婺城区', 'town': '西关街道', 'adcode': '330702', 'town_code': '330702007'}
到此这篇关于详解用Python调用百度地图正/逆地理编码API的文章就介绍到这了,更多相关Python调用百度地图正/逆地理编码 内容请搜索猪先飞以前的文章或继续浏览下面的相关文章希望大家以后多多支持猪先飞!
相关文章
- 这篇文章主要介绍了python-opencv-画外接矩形框的实例代码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-09-04
Python astype(np.float)函数使用方法解析
这篇文章主要介绍了Python astype(np.float)函数使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-06-08- 2022虎年新年即将来临,小编为大家带来了一个利用Python编写的虎年烟花特效,堪称全网最绚烂,文中的示例代码简洁易懂,感兴趣的同学可以动手试一试...2022-02-14
- 在本篇文章里小编给大家分享的是一篇关于python中numpy.empty()函数实例讲解内容,对此有兴趣的朋友们可以学习下。...2021-02-06
python-for x in range的用法(注意要点、细节)
这篇文章主要介绍了python-for x in range的用法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-05-10- 这篇文章主要介绍了Python 图片转数组,二进制互转操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-09
- 这篇文章主要介绍了Python中的imread()函数用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-16
- 这篇文章主要介绍了python如何实现b站直播自动发送弹幕,帮助大家更好的理解和学习使用python,感兴趣的朋友可以了解下...2021-02-20
python Matplotlib基础--如何添加文本和标注
这篇文章主要介绍了python Matplotlib基础--如何添加文本和标注,帮助大家更好的利用Matplotlib绘制图表,感兴趣的朋友可以了解下...2021-01-26- 这篇文章主要介绍了解决python 使用openpyxl读写大文件的坑,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-13
- 今天小编就为大家分享一篇python 计算方位角实例(根据两点的坐标计算),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-04-27
- 采用CSS覆盖的方法就可以了,但是官方是不允许这么做的...2013-10-13
- 这篇文章主要为大家详细介绍了python实现双色球随机选号,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-05-02
- 在本篇文章里小编给大家整理的是一篇关于python中使用np.delete()的实例方法,对此有兴趣的朋友们可以学习参考下。...2021-02-01
- 这篇文章主要介绍了使用Python的pencolor函数实现渐变色功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-03-09
- 这篇文章主要介绍了python自动化办公操作PPT的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-05
Python getsizeof()和getsize()区分详解
这篇文章主要介绍了Python getsizeof()和getsize()区分详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-11-20- 这篇文章主要介绍了解决python 两个时间戳相减出现结果错误的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-12
- 这篇文章主要为大家详细介绍了python实现学生通讯录管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-02-25
- 这篇文章主要介绍了PyTorch一小时掌握之迁移学习篇,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-09-08