详解用Python调用百度地图正/逆地理编码API


Posted in Python onJuly 02, 2020

一、背景

  • (正)地理编码指的是:将地理位置名称转换成经纬度;
  • 逆地理编码指的是:将经纬度转换成地理位置信息,如地名、所在的省份或城市等

百度地图提供了相应的API,可以方便调用。相应的说明文档如下:

  • 正地理编码
  • 逆地理编码

具体API的参数可以查看相应的“服务文档”:

详解用Python调用百度地图正/逆地理编码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': '餐饮'}

可以看出,结果存在一定偏差。竟然把学校标记成了餐馆。。。我们可以具体到百度拾取坐标系统中看一下。结果定位到了学校西南角。

详解用Python调用百度地图正/逆地理编码API

(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': '金融'}

我们看看定位到哪里了:

详解用Python调用百度地图正/逆地理编码API

emm… 定位到一个广场的旁边。不过大致的位置还是准确的,毕竟还是在金华市内。如果精度要求不高,这个结果还是可以接受的。

那如果精度要求比较高呢?我们就需要获取非常准确的企业位置信息。百度企业信用提供了企业基本信息的查询。

详解用Python调用百度地图正/逆地理编码API

可以看到,企业的地址为:浙江省金华市丹溪路1388号。

我们把这个地址代入API:

Pos2Coord('浙江省金华市丹溪路1388号')

得到结果:

{'lng': 119.65161604390546, 'lat': 29.083163015462144, 'conf': 80, 'comp': 100, 'level': '门址'}

再看看定位到了哪里:

详解用Python调用百度地图正/逆地理编码API

emm…好像看不出来。。我对这里也不熟。。直接到百度地图中看一下:

详解用Python调用百度地图正/逆地理编码API

放到最大后,可以看到,坐标恰好落在“金华银行”上面。Perfect!

人工获取企业具体的地理位置似乎太麻烦了。有没有简单方法呢?可以查看我之前写的一篇文章:用Python爬虫获取百度企业信用中企业基本信息

最后通过逆地理编码获取省份、地级市、县级市信息。

Coord2Pos(119.65161604390546,29.083163015462144)

输出结果:

{'address': '浙江省金华市婺城区双龙南街680号', 'province': '浙江省', 'city': '金华市', 'district': '婺城区', 'town': '西关街道', 'adcode': '330702', 'town_code': '330702007'}

到此这篇关于详解用Python调用百度地图正/逆地理编码API的文章就介绍到这了,更多相关Python调用百度地图正/逆地理编码 内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
全面解读Python Web开发框架Django
Jun 30 Python
python实现根据窗口标题调用窗口的方法
Mar 13 Python
python访问系统环境变量的方法
Apr 29 Python
Python简单实现安全开关文件的两种方式
Sep 19 Python
利用python模拟实现POST请求提交图片的方法
Jul 25 Python
解决Pycharm运行时找不到文件的问题
Oct 29 Python
解决Django中修改js css文件但浏览器无法及时与之改变的问题
Aug 31 Python
pyqt5 QScrollArea设置在自定义侧(任何位置)
Sep 25 Python
Python集合操作方法详解
Feb 09 Python
关于Python 中的时间处理包datetime和arrow的方法详解
Mar 19 Python
python用tkinter实现一个简易能进行随机点名的界面
Sep 27 Python
Python中np.random.randint()参数详解及用法实例
Sep 23 Python
基于django2.2连oracle11g解决版本冲突的问题
Jul 02 #Python
解决django migrate报错ORA-02000: missing ALWAYS keyword
Jul 02 #Python
使用PyWeChatSpy自动回复微信拍一拍功能的实现代码
Jul 02 #Python
使用Keras建立模型并训练等一系列操作方式
Jul 02 #Python
python解释器安装教程的方法步骤
Jul 02 #Python
Python分析最近大火的网剧《隐秘的角落》
Jul 02 #Python
keras训练浅层卷积网络并保存和加载模型实例
Jul 02 #Python
You might like
一篇入门的php Class 文章
2007/04/04 PHP
php 空格,换行,跳格使用说明
2009/12/18 PHP
php中error与exception的区别及应用
2014/07/28 PHP
php安装ssh2扩展的方法【Linux平台】
2016/07/20 PHP
PHP实现执行外部程序的方法详解
2017/08/17 PHP
浅析js中取绝对值的2种方法
2013/07/09 Javascript
基于jquery实现的可编辑下拉框实现代码
2014/08/02 Javascript
JavaScript返回上一页的三种方法及区别介绍
2015/07/04 Javascript
Ionic如何创建APP项目
2016/06/03 Javascript
纯css下拉菜单 无需js
2016/08/15 Javascript
JS如何生成一个不重复的ID的函数
2016/12/25 Javascript
基于bootstrap按钮式下拉菜单组件的搜索建议插件
2017/03/25 Javascript
js实现按座位号抽奖
2017/04/05 Javascript
基于Vue实例对象的数据选项
2017/08/09 Javascript
JS实现闭包中的沙箱模式示例
2017/09/07 Javascript
基于Vue2-Calendar改进的日历组件(含中文使用说明)
2019/04/14 Javascript
javascript设计模式 ? 状态模式原理与用法实例分析
2020/04/22 Javascript
详解JS函数防抖
2020/06/05 Javascript
Python编程中使用Pillow来处理图像的基础教程
2015/11/20 Python
python getopt详解及简单实例
2016/12/30 Python
神经网络理论基础及Python实现详解
2017/12/15 Python
Python基于ThreadingTCPServer创建多线程代理的方法示例
2018/01/11 Python
django manage.py扩展自定义命令方法
2018/05/27 Python
Python3.5内置模块之os模块、sys模块、shutil模块用法实例分析
2019/04/27 Python
简单了解Pandas缺失值处理方法
2019/11/16 Python
python-web根据元素属性进行定位的方法
2019/12/13 Python
基于第一个PhoneGap(cordova)的应用详解
2013/05/03 HTML / CSS
美国专营婴幼儿用品的购物网站:buybuy BABY
2017/01/01 全球购物
北美领先的智能产品购物网站:Wellbots
2018/06/11 全球购物
美国在线面料商店:Fashion Fabrics Club
2020/01/31 全球购物
幼儿园毕业寄语
2014/04/03 职场文书
小平您好观后感
2015/06/09 职场文书
新学期感想
2015/08/10 职场文书
学生会主席任命书
2015/09/21 职场文书
关于Mybatis中SQL节点的深入解析
2022/03/19 Java/Android
Java 垃圾回收超详细讲解记忆集和卡表
2022/04/08 Java/Android