详解用Python调用百度地图正/逆地理编码API
作者:wild_orange 发布时间:2021-06-01 16:35:39
一、背景
(正)地理编码指的是:将地理位置名称转换成经纬度;
逆地理编码指的是:将经纬度转换成地理位置信息,如地名、所在的省份或城市等
百度地图提供了相应的API,可以方便调用。相应的说明文档如下:
正地理编码
逆地理编码
具体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': '餐饮'}
可以看出,结果存在一定偏差。竟然把学校标记成了餐馆。。。我们可以具体到百度拾取坐标系统中看一下。结果定位到了学校西南角。
(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': '金融'}
我们看看定位到哪里了:
emm… 定位到一个广场的旁边。不过大致的位置还是准确的,毕竟还是在金华市内。如果精度要求不高,这个结果还是可以接受的。
那如果精度要求比较高呢?我们就需要获取非常准确的企业位置信息。百度企业信用提供了企业基本信息的查询。
可以看到,企业的地址为:浙江省金华市丹溪路1388号。
我们把这个地址代入API:
Pos2Coord('浙江省金华市丹溪路1388号')
得到结果:
{'lng': 119.65161604390546, 'lat': 29.083163015462144, 'conf': 80, 'comp': 100, 'level': '门址'}
再看看定位到了哪里:
emm…好像看不出来。。我对这里也不熟。。直接到百度地图中看一下:
放到最大后,可以看到,坐标恰好落在“金华银行”上面。Perfect!
人工获取企业具体的地理位置似乎太麻烦了。有没有简单方法呢?可以查看我之前写的一篇文章:用Python爬虫获取百度企业信用中企业基本信息
最后通过逆地理编码获取省份、地级市、县级市信息。
Coord2Pos(119.65161604390546,29.083163015462144)
输出结果:
{'address': '浙江省金华市婺城区双龙南街680号', 'province': '浙江省', 'city': '金华市', 'district': '婺城区', 'town': '西关街道', 'adcode': '330702', 'town_code': '330702007'}
来源:https://blog.csdn.net/qq_35408030/article/details/107070635


猜你喜欢
- 创建NumPy矩阵NumPy对于多维数组的运算,默认情况下并不进行矩阵运算。如果需要对数组进行矩阵运算,则可以调用相应的函数。在NumPy中
- 1. 代码完整的源代码:import torchfrom torch import nn# 定义一个LSTM模型class LSTM(nn.
- yum or rpm?yum安装方式很方便,但是下载mysql的时候从官网下载,速度较慢。rpm安装方式可以从国内镜像下载mysql的rpm
- 目的临床数据的记录时间和对应标签(逗号后面的数字)记录在txt文件里,要把标签转换为3类标签,并且计算出每个标签的分别持续时间,然后绘制成柱
- 希腊Web 设计师Christos Chiotis 发表在 CssGlobe 的一篇文章,讲述了黄金分割率在 CSS 中的应用。黄金分割率是
- 还是用图说话A文件:比如,我想筛选出“设计井别”、“投产井别”、“目前井别”三列数据都为11的数据,结果如下:当然,这里的筛选条件可以根据用
- 如何在ADO中客户端利用好缓存技术?具体应用见下例:global.asa< !--METADATA TYPE=&q
- 本文实例讲述了flask框架路由常用定义方式。分享给大家供大家参考,具体如下:路由的各种定义方式请求方式限定使用 methods 参数指定可
- 1. 前言春联是中国传统文化中最具内涵的元素之一,它以对仗工整、简洁精巧的文字描绘美好形象,抒发美好愿望,是中国特有的文学形式,是华人们过年
- 测试方法首先使用implode, serialize, json_encode, msgpack_pack创建四个文本文件,用于测试。创建代
- 今天萌发一个想法,用css来实现透视效果。起初,我想到的是我们常见的添加阴影效果的方法,用多个div通过偏移来实现,但这需要很多 div,不
- 环境配置Django版本1.11python版本3.6.2前言在编写Django网站的时候,在涉及模板方面,一些简单的例子都没有问题,但这些
- 转用一门新语言通常是一项大决策,尤其是当你的团队成员中只有一个使用过它时。今年 Stream 团队的主要编程语言从 Python 转向了 G
- 本文实例讲述了golang操作mongodb的方法。分享给大家供大家参考。具体实现方法如下:package mainimport (&nbs
- OpenCV 是一个流行的开源计算机视觉库,可用于不同的编程语言,例如 Python、C++ 和 JavaScript。它提供了一套丰富的工
- 记录下如何远程使用服务器上的jupyter notebook。主要是在服务器端执行以下操作:激活需要使用的环境使用pip list 或con
- 本文实例为大家分享了python实现自动打卡小程序的具体代码,供大家参考,具体内容如下"""湖南大学疫情防控每
- js判断某个字符出现的次数的简单实例function patch(re,s){ //参数1正则式,参数2字符串re=eval_r("
- 有时需要读取jpg图像的长和宽,tensorflow提供了很好的支持直接上示例decode_jpeg_data = tf.placehold
- 由于浏览器是单线程的,因此脚本在载的时候会阻塞下载其它资源;虽然在现在浏览器已经有所改善,但仍然有待改进。 很显然,脚本必须按顺序执行,但没