详解用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新手们容易犯的几个错误总结
Apr 01 Python
Python计时相关操作详解【time,datetime】
May 26 Python
Python Paramiko模块的使用实际案例
Feb 01 Python
python实现简单登陆流程的方法
Apr 22 Python
python日期时间转为字符串或者格式化输出的实例
May 29 Python
Python中的异常处理try/except/finally/raise用法分析
Feb 28 Python
Python当中的array数组对象实例详解
Jun 12 Python
python操作kafka实践的示例代码
Jun 19 Python
使用python+whoosh实现全文检索
Dec 09 Python
Spring Cloud Feign高级应用实例详解
Dec 10 Python
PyQt5高级界面控件之QTableWidget的具体使用方法
Feb 23 Python
Python命名空间namespace及作用域原理解析
Jun 05 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
实用函数10
2007/11/08 PHP
php 获取select下拉列表框的值
2010/05/08 PHP
ThinkPHP V2.2说明文档没有说明的那些事实例小结
2015/07/01 PHP
PHP图形操作之Jpgraph学习笔记
2015/12/25 PHP
PHP 获取客户端 IP 地址的方法实例代码
2018/11/11 PHP
js 页面传参数时 参数值含特殊字符的问题
2009/12/13 Javascript
jquery实现输入框动态增减的实例代码
2013/07/14 Javascript
node.js中的path.basename方法使用说明
2014/12/09 Javascript
jQuery中scrollTop()方法用法实例
2015/01/16 Javascript
jQuery Easyui快速入门教程
2016/08/21 Javascript
通过学习bootstrop导航条学会修改bootstrop颜色基调
2017/06/11 Javascript
微信小程序商品详情页的底部弹出框效果
2020/11/16 Javascript
这应该是最详细的响应式系统讲解了
2019/07/22 Javascript
微信小程序实现左侧滑栏过程解析
2019/08/26 Javascript
js实现课堂随机点名系统
2019/11/21 Javascript
微信小程序使用 vant Dialog组件的正确方式
2020/02/21 Javascript
微信小程序实现抖音播放效果的实例代码
2020/04/11 Javascript
写了个监控nginx进程的Python脚本
2012/05/10 Python
python中字符串比较使用is、==和cmp()总结
2018/03/18 Python
Python Web版语音合成实例详解
2019/07/16 Python
运用PyTorch动手搭建一个共享单车预测器
2019/08/06 Python
pandas中ix的使用详细讲解
2020/03/09 Python
基于python爬取有道翻译过程图解
2020/03/31 Python
西班牙太阳镜品牌:Hawkers
2018/03/11 全球购物
英国健康和美容技术产品购物网站:CurrentBody
2019/07/17 全球购物
班级聚会策划书
2014/01/16 职场文书
工商治理实习生的自我评价分享
2014/02/20 职场文书
技术总监管理岗位职责
2014/03/09 职场文书
网络宣传方案
2014/03/15 职场文书
民事授权委托书范文
2014/08/02 职场文书
2016简历自荐信优秀范文
2016/01/29 职场文书
《神奇的鸟岛》教学反思
2016/02/22 职场文书
高中语文教材(文学文化常识大全一)
2019/08/13 职场文书
vue3中的组件间通信
2021/03/31 Vue.js
MySQL数据库⾼可⽤HA实现小结
2022/01/22 MySQL
分享五个Node.js开发的优秀实践 
2022/04/07 NodeJs