点击上方“蓝字”关注我们百度API获取经纬度/地址Mar 28, 2020

本期介绍给定地址/经纬度,使用百度API来获取经纬度/地址。

本文约3k字,预计阅读18分钟。

本次是第三篇爬虫实战,这一次只是涉及最基础的爬虫知识,只需要会调用「requests包」即可完成该项目。

起因:因为论文需要,将获取的1000多个地址转化为经纬度以便后续计算,我嫌使用别人的工具麻烦,因此自己写了个简单的函数来获取经纬度,现在拿出来分享下。

不同的API地图的坐标系标准各有不同:

谷歌地图采用的是WGS84地理坐标系(中国范围除外),谷歌中国地图采用的是GCJ02地理坐标系,百度采用的是BD09坐标系,而设备一般包含GPS芯片或者北斗芯片获取的经纬度为WGS84地理坐标系,为什么不统一用WGS84地理坐标系这就是国家地理测绘总局对于出版地图的要求,出版地图必须符合GCJ02坐标系标准了,也就是国家规定不能直接使用WGS84地理坐标系。(具体内容自行查阅,本次我们使用百度API)

获取AK

首先我们打开百度API开放平台,注册/登陆自己的账号,成为百度开发者,在「应用管理」--- 「我的应用」中创建应用,如下所示:

在「创建应用」中输入「应用名称」,并且「请求校验方式」选择「IP白名单交验」,这里我们不使用「sn校验方式」,因为需要计算sn,并且为了方便,IP白名单选择了“0.0.0.0/0”,不对IP进行限制(这里是为了Debug,如果想要上线,请设置合理的IP白名单),然后提交即可。

在「我的应用」中出现如下应用:

「访问应用(AK)」是我们所需的。

获取地址对应的经纬度---地理编码

查看百度开放平台中的「开发文档」---「Web服务API」,选择「地点输入提示」---「地理编码」,我们可以找到地理编码接口的url:

完整的请求参数如下:

参数名 参数含义 类型 举例 默认值 是否必须
address 待解析的地址。最多支持84个字节 string
city 地址所在的城市名。 string 北京市
ak 用户申请注册的key,自v2开始参数修改为“ak” string
output 输出格式为json或者xml string json或xml xml

主要的返回结果参数为:

名称 含义 类型
status 返回结果状态值, 成功返回0,其他值请查看下方返回码状态表。 int
location 经纬度坐标(包含lng和lat) object
precise 位置的附加信息,是否精确查找。1为精确查找;0为不精确。 int
level 能精确理解的地址类型,包含:UNKNOWN、国家、省、城市、区县、乡镇、村庄等 string

接下来我们使用「request包」爬取对应的json内容:

def BaiduQuery(address, currentkey):  """  :param address: address  :param currentkey: AK  """  url = 'http://api.map.baidu.com/geocoding/v3/?'  params = {    "address": address,    "city": '北京市',    "output": 'json',    "ak": currentkey,  }  response = requests.get(url, params=params)  answer = response.json()

以北京东四地区为例,执行函数:

BaiduQuery('东四', currentkey="sLTKStSk6QGaAK2XriSseziy9FghVXkV")

得到的json结果如下:

{'status': 0, 'result': {'location': {'lng': 116.43043084078596, 'lat': 39.93757214936878}, 'precise': 0, 'confidence': 50, 'comprehension': 100, 'level': '商圈'}}

分析json数据,我们需要的内容应该是「result」中的「location」中的「lng(经度)」和「lat(纬度)」,当然你也可以获取其他信息。

查询该经纬度:

结果正确!

结合上述分析,最终我们的代码如下:

def geocoding(address, currentkey):    """    address convert lat and lng    :param address: address    :param currentkey: AK    :return: places_ll    """    url = 'http://api.map.baidu.com/geocoding/v3/?'    params = {        "address": address,        "city": '北京市',        "output": 'json',        "ak": currentkey,    }    response = requests.get(url, params=params)    answer = response.json()    if answer['status'] == 0:        tmpList = answer['result']        coordString = tmpList['location']        coordList = [coordString['lng'], coordString['lat']]        places_ll.append([address, float(coordList[0]), float(coordList[1])])        print([address, float(coordList[0]), float(coordList[1])])    else:        return -1

地址:

l = ['东四',  '天坛', '官园', '万寿公园', '奥体中心',  '农展馆','万柳', '北部新区', '丰台花园',  '云岗',  '石景山古城', '房山', '大兴','亦庄',  '通州',  '顺义',  '昌平',  '门头沟',   '平谷',  '怀柔','密云',  '延庆',  '定陵',  '八达岭',   '密云水库',  '东高村', '永乐店', '榆垡',   '琉璃河', '前门', '永定门内',   '西直门北',   '南三环', '东四环']

结果:

['东四', 116.430431, 39.937572]['天坛', 116.419342, 39.888663]['官园', 116.37293, 39.933926]['万寿公园', 116.37434, 39.885845]['奥体中心', 116.406138, 39.990549]['农展馆', 116.473398, 39.943151]...['南三环', 116.38953, 39.864106]['东四环', 116.494326, 39.895722]

注意:

地址的名字相当关键,当你自己使用百度地图时,输入地址,百度会帮你进行「联想修正」,但你通过百度API进行查找时,地址不匹配的话,它会返回一个默认的经纬度:116.413384,39.910925,这里我举例北京市的地区,要是限定其他地区,返回的默认经纬度可以自行测试(看经纬度相同的数量)。举例:

「万寿公园」这个地名我之前得到的是「万寿西宫」,结果无法匹配,查找资料后,才知道在百度地图上匹配的是万寿公园。

可以通过比较经纬度的方法,人工进行地名的修正(其他方法没有想到,我自己查找了1000多条地名,自己修正了400多例)

获取经纬度对应的地址---逆地理编码

查看「全球逆地理编码」,我们可以找到逆地理编码接口的url:

http://api.map.baidu.com/reverse_geocoding/v3/?ak=您的ak&output=json&coordtype=wgs84ll&location=31.225696563611,121.49884033194  //GET请求

主要的请求参数为:

参数名 参数含义 类型 举例 默认值 是否必须
location 根据经纬度坐标获取地址。 float
ak 用户申请注册的key,自v2开始参数修改为“ak” string
output 输出格式为json或者xml string json或xml xml

主要的返回参数:

名称 含义 类型
status 返回结果状态值, 成功返回0,其他值请查看下方返回码状态表。 int
location 经纬度坐标 object
formatted_address 结构化地址信息 string

代码如下:

def reverse_geocoding(lng, lat, currentkey):    """    lat and lng convert address    :param lng: longitude    :param lat: latitude    :param currentkey: AK    :return: places_ll    """    url = 'http://api.map.baidu.com/reverse_geocoding/v3/?'    params = {        "location": str(lat)+','+str(lng),        "output": 'json',        "ak": currentkey,        "coordtype": "wgs84ll",    }    response = requests.get(url, params=params)    answer = response.json()    if answer['status'] == 0:        tmpList = answer['result']        address = tmpList['formatted_address']        print([lng, lat, address])        places_ll.append([address, lng, lat])    else:        return -1

以东四的经纬度为例,json结果为:

{'status': 0, 'result': {'location': {'lng': 116.44318395258946, 'lat': 39.94483923411242}, 'formatted_address': '北京市东城区东中街16号', 'business': '东四,东直门,东四十条', 'addressComponent': {'country': '中国', 'country_code': 0, 'country_code_iso': 'CHN', 'country_code_iso2': 'CN', 'province': '北京市', 'city': '北京市', 'city_level': 2, 'district': '东城区', 'town': '', 'town_code': '', 'adcode': '110101', 'street': '东中街', 'street_number': '16号', 'direction': '附近', 'distance': '23'}, 'pois': [], 'roads': [], 'poiRegions': [], 'sematic_description': '', 'cityCode': 131}}

最后输出:

[116.430431, 39.937572, '北京市东城区东中街16号']

Github

GitHub地址:https://github.com/BlackSpaceGZY/Crawler

往期精彩回顾今日头条爬虫实战----爬取图片
哔哩哔哩爬虫实战----验证码识别扫码关注更多精彩

全球地区资料json 含中英文 经纬度_爬虫实战(三)使用百度API获取经纬度/地址...相关推荐

  1. 全球地区资料json 含中英文 经纬度_[喵咪软件推荐(1)]全球国家信息库

    前言 哈喽大家好啊!今天又来刨坑了,这次给大家带来的是软件推荐系列,主要是把一些特别好用的一些软件推荐给大家并且分析使用场景以及用法,今天要给大家介绍的一个类软件呢,主要是解决全球化地址这类问题,那么 ...

  2. 全球地区资料json 含中英文 经纬度_含乳饮料行业发展趋势及市场化程度分析(附报告目录)...

    含乳饮料行业发展趋势及市场化程度分析(附报告目录) 1.饮料行业基本情况 <饮料通则>(GB/T10789-2015)定义饮料是经过定量包装的,供直接饮用或按一定比例用水冲调或冲泡饮用的, ...

  3. 全球地区资料json 含中英文 经纬度_2020年Brain Bee北京、天津、河北赛区地区赛参赛说明...

    本赛事信息转自微信公众号"ICP留学字典" 就在刚刚,Brain Bee官网正式公布了2020年Brain Bee脑科学大赛的参赛说明,新的赛季正式开始,报名已启动. 在今年,IC ...

  4. 百度api获取经纬度以及经纬度的转换

    vue根据百度api获取到自己所在位置的经纬度以及具体的位置名称 <group class="site" label-width="5.5em" labe ...

  5. php 地址获取百度经纬度,根据百度api获取一个地址的经纬度

    这个也是个很实用的功能,前几天需求里用到了. 然后百度,结果各种报错. 所以想了想还是自己写个帖子记录一下,以后再用到可以拿现成的. 百度api开放平台 百度api开放平台web端api 上面是官网的 ...

  6. 使用百度api获取经纬度的偏差问题

    通过 http://api.map.baidu.com/geocoder 和 http://api.map.baidu.com/geocoding/v3/ 获取地址 "北京市顺义区金关北二街 ...

  7. 百度android api坐标转地址,百度API从经纬度坐标到地址的转换服务

    /// /// 百度API从经纬度坐标到地址的转换服务 /// /// /// /// public string GetAddress(string lng, string lat) { strin ...

  8. 百度地图获取经纬度后,获取区域代码和地址

    百度地图获取经纬度后,获取区域代码和地址: function getdistrct_code($location){$url ="api.map.baidu.com/geocoder/v2/ ...

  9. 根据php经纬度百度地图打点,PHP使用百度地图获取指定地址坐标:经纬度(图文+视频)...

    本篇文章主要给大家介绍PHP使用百度地图获取指定地址坐标之经纬度的实现方法. 在之前的文章[PHP使用百度地图获取指定地址坐标:创建AK]中,已经给大家介绍了如何在百度地图开放平台中创建AK(api ...

最新文章

  1. 398. Random Pick Index
  2. 跨链Cosmos(6)ABCI 原理
  3. folderutils.java_值得分享的超全文件工具类FileUtil
  4. 手把手教你Android Studio的安装与配置
  5. 乐高创意机器人moc_乐高变形金刚爵士方头仔MOC图纸
  6. 金融时报:人工智能在银行中的应用—对全球30家大型银行的调查
  7. 导出合并小文件_关于微信语音导出,这个方法强烈建议~
  8. android基础知识(2)
  9. Android Q版本实现自动连接WiFi
  10. docker容器内开启22 ssh_细述docker容器中创建SSH服务镜像
  11. 高级查询组件dynamicCondition升级为v2.0.0版本(一)——使用步骤
  12. Keras自定义损失函数出现:ValueError: Unknown loss function: focal_loss
  13. 梦想天空分外蓝,实习结束总结
  14. 正大国际期货:智星在线交易平台是什么?提供哪些交易执行模式和订单类型?
  15. 计算机科学与技术专业学建模嘛,工学学科(基本专业四):计算机科学与技术专业介绍...
  16. SDS之Object Storage: 对象存储,老树开新花
  17. 面向对象的三大基本特征、五大基本原则
  18. android 终端运行 vim / vi 命令执行失败 busybox解决之
  19. Timer定时器应用小例子
  20. 在Docker容器中运行程序时出错,You have to remove (or rename) that container to be able to reuse that name

热门文章

  1. SQL Server 2005 COM+ 目录要求 (警告)
  2. JAVA 客户端跳转与服务器端跳转 get与post
  3. 【Spring学习】Spring简介
  4. C#生成PDF文件中时,设置边框为虚线和隐藏显示单个或者多个边框。
  5. 网络编程7_ multiprocessing类-管道.数据共享, 信号量,事件,进程池
  6. 父页面与子ifream传值,父页面获取子页面document元素与方法
  7. RxJava+Retrofit+MVP+Dagger2
  8. 巧用云计算 突围移动APP行业乱象
  9. SQL建表公共字段脚本
  10. 大数据科学认识与理解论坛全攻略