详解用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网络编程学习笔记(七):HTML和XHTML解析(HTMLParser、BeautifulSoup)
Jun 09 Python
Python记录详细调用堆栈日志的方法
May 05 Python
Python模拟鼠标点击实现方法(将通过实例自动化模拟在360浏览器中自动搜索python)
Aug 23 Python
几种实用的pythonic语法实例代码
Feb 24 Python
在NumPy中创建空数组/矩阵的方法
Jun 15 Python
python pytest进阶之conftest.py详解
Jun 27 Python
深入浅析python3中的unicode和bytes问题
Jul 03 Python
Python递归及尾递归优化操作实例分析
Feb 01 Python
python3注册全局热键的实现
Mar 22 Python
聊聊python中的循环遍历
Sep 07 Python
Python猫眼电影最近上映的电影票房信息
Sep 18 Python
python爬虫看看虎牙女主播中谁最“顶”步骤详解
Dec 01 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 判断数组是几维数组
2013/03/20 PHP
PHP中使用TCPDF生成PDF文档实例
2014/07/01 PHP
PHP return语句另类用法不止是在函数中
2014/09/17 PHP
PHP符合PSR编程规范的实例分享
2016/12/21 PHP
PHP判断密码强度的方法详解
2017/05/26 PHP
关于php支持的协议与封装协议总结(推荐)
2017/11/17 PHP
PHP pthreads v3在centos7平台下的安装与配置操作方法
2020/02/21 PHP
javascript实现划词标记+划词搜索功能
2007/03/06 Javascript
javascript-TreeView父子联动效果保持节点状态一致
2007/08/12 Javascript
jQuery 一个图片切换的插件
2011/10/09 Javascript
JavaScript中Math对象方法使用概述
2014/01/02 Javascript
jquery mobile页面跳转后样式丢失js失效的解决方法
2014/09/06 Javascript
jQuery实现防止提交按钮被双击的方法
2015/03/24 Javascript
跟我学习javascript的函数调用和构造函数调用
2015/11/16 Javascript
jquery动态添加文本并获取值的方法
2016/10/12 Javascript
JavaScript制作弹出层效果
2016/12/02 Javascript
Angular.JS去掉访问路径URL中的#号详解
2017/03/30 Javascript
Javascript实现信息滚动效果
2017/05/18 Javascript
在element-ui的el-tree组件中用render函数生成el-button的实例代码
2018/11/05 Javascript
JavaScript中callee和caller的区别与用法实例分析
2019/06/28 Javascript
微信小程序自定义单项选择器样式
2019/07/25 Javascript
layui多iframe页面控制定时器运行的方法
2019/09/05 Javascript
解决vue使用vant下拉框van-dropdown-item 绑定title值不变问题
2020/08/05 Javascript
Python中unittest用法实例
2014/09/25 Python
Flask入门教程实例:搭建一个静态博客
2015/03/27 Python
Python数据类型中的“冒号“[::]——分片与步长操作示例
2018/01/24 Python
Sanic框架异常处理与中间件操作实例分析
2018/07/16 Python
python pandas实现excel转为html格式的方法
2018/10/23 Python
西班牙手机之家:Phone House
2018/10/18 全球购物
C#里面如何判断一个Object是否是某种类型(如Boolean)?
2016/02/10 面试题
个人自我鉴定怎么写
2013/10/28 职场文书
公司门卫岗位职责范本
2014/07/08 职场文书
离职证明范本(5篇)
2014/09/19 职场文书
法人身份证明书
2014/10/08 职场文书
英文产品推荐信
2015/03/27 职场文书
2016年春节慰问信息大全
2015/11/30 职场文书