详解用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脚本操作文件的小示例分享
Aug 27 Python
python数据抓取分析的示例代码(python + mongodb)
Dec 25 Python
pyqt5利用pyqtDesigner实现登录界面
Mar 28 Python
python中使用ctypes调用so传参设置遇到的问题及解决方法
Jun 19 Python
Python Pandas数据中对时间的操作
Jul 30 Python
PyQt Qt Designer工具的布局管理详解
Aug 07 Python
Flask框架学习笔记之消息提示与异常处理操作详解
Aug 15 Python
Django REST framework 单元测试实例解析
Nov 07 Python
解决Jupyter Notebook开始菜单栏Anaconda下消失的问题
Apr 13 Python
idea2020手动安装python插件的实现方法
Jul 17 Python
pycharm永久激活超详细教程
Oct 29 Python
基于python实现银行管理系统
Apr 20 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
Windows下安装Memcached的步骤说明
2010/04/25 PHP
php发送post请求的三种方法
2014/02/11 PHP
常用PHP框架功能对照表
2014/10/23 PHP
PHP使用strtotime获取上个月、下个月、本月的日期
2015/12/30 PHP
php 修改上传文件大小限制实例详解
2016/10/23 PHP
tp5.1 框架数据库常见操作详解【添加、删除、更新、查询】
2020/05/26 PHP
网页的标准,IMG不支持onload标签怎么办
2006/06/29 Javascript
JS去除字符串的空格增强版(可以去除中间的空格)
2009/08/26 Javascript
Mootools 1.2教程 选项卡效果(Tabs)
2009/09/15 Javascript
javascript实现div的拖动并调整大小类似qq空间个性编辑模块
2012/12/12 Javascript
原生js实现移动开发轮播图、相册滑动特效
2015/04/17 Javascript
AngularJS通过$location获取及改变当前页面的URL
2016/09/23 Javascript
JS实现简单的二元方程计算器功能示例
2017/01/03 Javascript
jQuery日程管理控件glDatePicker用法详解
2017/03/29 jQuery
用最简单的方法判断JavaScript中this的指向(推荐)
2017/09/04 Javascript
Element Input组件分析小结
2018/10/11 Javascript
Vue 表情包输入组件的实现代码
2019/01/21 Javascript
js打开word文档预览操作示例【不是下载】
2019/05/23 Javascript
vue-router跳转时打开新页面的两种方法
2019/07/29 Javascript
ES6中异步对象Promise用法详解
2019/07/31 Javascript
[10:49]2014国际邀请赛 叨叨刀塔第二期为真正的电竞喝彩
2014/07/21 DOTA
[49:18]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 OG vs TNC
2018/04/01 DOTA
python 读写、创建 文件的方法(必看)
2016/09/12 Python
Python3 queue队列模块详细介绍
2018/01/05 Python
FFrpc python客户端lib使用解析
2019/08/24 Python
python实现飞船大战
2020/04/24 Python
django 模型中的计算字段实例
2020/05/19 Python
python 实现图片批量压缩的示例
2020/12/18 Python
HTML5+CSS3实现拖放(Drag and Drop)示例
2014/07/07 HTML / CSS
韩国演唱会订票网站:StubHub韩国
2019/01/17 全球购物
庆八一活动方案
2014/01/25 职场文书
《满井游记》教学反思
2014/02/26 职场文书
农业开发项目建议书
2014/05/16 职场文书
oracle DGMGRL ORA-16603报错的解决方法(DG Broker)
2021/04/06 Oracle
javascript拖曳互换div的位置实现示例
2021/06/28 Javascript
win10电脑老是死机怎么办?win10系统老是死机的解决方法
2022/08/05 数码科技