详解用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中比较运算符的使用
May 13 Python
python实现Floyd算法
Jan 03 Python
怎么使用pipenv管理你的python项目
Mar 12 Python
Python lambda函数基本用法实例分析
Mar 16 Python
Python实现多属性排序的方法
Dec 05 Python
Python中时间datetime的处理与转换用法总结
Feb 18 Python
django框架模板语言使用方法详解
Jul 18 Python
wxPython多个窗口的基本结构
Nov 19 Python
python实现将json多行数据传入到mysql中使用
Dec 31 Python
Python替换NumPy数组中大于某个值的所有元素实例
Jun 08 Python
pytorch 中forward 的用法与解释说明
Feb 26 Python
Python简易开发之制作计算器
Apr 28 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
《OVERLORD》第四季,终于等到你!
2020/03/02 日漫
php连接mysql数据库代码
2009/03/10 PHP
一个PHP数组应该有多大的分析
2009/07/30 PHP
php实现TCP端口检测的方法
2015/04/01 PHP
php通过两层过滤获取留言内容的方法
2016/07/11 PHP
PHP mysqli_free_result()与mysqli_fetch_array()函数详解
2016/09/21 PHP
php 读取文件夹下所有图片、文件的实例
2018/10/17 PHP
PHP抽象类与接口的区别详解
2019/03/21 PHP
PHP基于session.upload_progress 实现文件上传进度显示功能详解
2019/08/09 PHP
基于JQuery的日期联动实现代码
2011/02/24 Javascript
jquery中animate动画积累的解决方法
2013/10/05 Javascript
javascript页面上使用动态时间具体实现
2014/03/18 Javascript
IE中JS跳转丢失referrer问题的2个解决方法
2014/07/18 Javascript
AngularJS入门知识之MVW类框架的编程思想探讨
2014/12/08 Javascript
jQuery插件制作之全局函数用法实例
2015/06/01 Javascript
微信小程序 实战实例开发流程详细介绍
2017/01/05 Javascript
javascript深拷贝的原理与实现方法分析
2017/04/10 Javascript
浅析webpack 如何优雅的使用tree-shaking(摇树优化)
2017/08/16 Javascript
使用Vue如何写一个双向数据绑定(面试常见)
2018/04/20 Javascript
详解如何在微信小程序开发中正确的使用vant ui组件
2018/09/13 Javascript
微信小程序实现留言功能
2018/10/31 Javascript
Python上传package到Pypi(代码简单)
2016/02/06 Python
Django 登陆验证码和中间件的实现
2018/08/17 Python
Python运维开发之psutil库的使用详解
2018/10/18 Python
如何利用Boost.Python实现Python C/C++混合编程详解
2018/11/08 Python
Python使用matplotlib 模块scatter方法画散点图示例
2019/09/27 Python
简单了解pytest测试框架setup和tearDown
2020/04/14 Python
python 多线程共享全局变量的优劣
2020/09/24 Python
HTML5实现移动端弹幕动画效果
2019/08/01 HTML / CSS
adidas官方旗舰店:德国运动用品制造商
2017/11/25 全球购物
社会学专业学生职业规划书
2014/02/07 职场文书
记帐员岗位责任制
2014/02/08 职场文书
工作作风整顿个人剖析材料
2014/10/11 职场文书
导游词之湖北梁子湖
2019/11/07 职场文书
Python中的turtle画箭头,矩形,五角星
2022/03/16 Python
python使用torch随机初始化参数
2022/03/22 Python