Python调用百度地图正/逆地理编码API实战与精度优化
本文详细介绍如何利用Python调用百度地图正/逆地理编码API。通过提供完整源码与具体示例,演示如何将地名转换为经纬度,或将坐标反查为详细地理位置。文章还探讨了正编码精度不足时的优化策略,结合企业信用数据提升定位准确度,适用于需要地理信息处理的开发场景。
背景与API简介
一、背景
- 正地理编码的核心功能是将具体的地理位置名称转换为对应的经纬度坐标;
- 逆地理编码则执行相反操作,将经纬度坐标解析为具体的地理位置信息,例如地名、所属省份或城市等;
百度地图提供了便捷的API接口供开发者调用,相关说明文档如下:
- 正地理编码
- 逆地理编码
具体的API参数详情可查阅对应的“服务文档”:

首次使用需先在控制台申请Access Key(AK),具体申请流程可参考其他相关文章。
Python源码实现
二、源码
直接展示核心代码,此处提供使用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': '金融'}
查看定位位置:

结果显示定位至一广场旁,但大致位置仍在金华市内。若对精度要求不高,此结果可接受。
若需高精度企业位置信息,可借助百度企业信用查询企业基本信息。

可见,该企业地址为:浙江省金华市丹溪路1388号。
将此地址代入API:
Pos2Coord('浙江省金华市丹溪路1388号')
得到结果:
{'lng': 119.65161604390546, 'lat': 29.083163015462144, 'conf': 80, 'comp': 100, 'level': '门址'}
再次查看定位位置:

直观上难以辨识,需放大查看。直接访问百度地图:

放大后可见,坐标恰好落在“金华银行”建筑上,效果理想。
人工获取企业具体地理位置较为繁琐,可参考前文:用Python爬虫获取百度企业信用中企业基本信息。
最后通过逆地理编码获取省份、地级市、县级市信息。
Coord2Pos(119.65161604390546,29.083163015462144)
输出结果:
{'address': '浙江省金华市婺城区双龙南街680号', 'province': '浙江省', 'city': '金华市', 'district': '婺城区', 'town': '西关街道', 'adcode': '330702', 'town_code': '330702007'}
至此,关于Python调用百度地图正/逆地理编码API的详解介绍完毕。更多相关内容可搜索本站历史文章或浏览后续文章,感谢支持。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













