百度web api解析经纬度

百度web api解析经纬度

背景

手里有某一类POI的地址名称,如上海市所有电影院地址,但是要做地图数据可视化需要打到地图上去的时候却需要经纬度数据,这时候就需要用到地理编码。

预备知识

地理坐标系
目前常用的地理坐标系主要有 WGS84,GCJ02和BD09三种。
WGS84为一种大地坐标系,也是目前广泛使用的GPS全球卫星定位系统使用的坐标系,也是国际通用坐标系。
GCJ02又名火星坐标系,是由中国国家测绘局制订的地理信息系统的坐标系统,由WGS84坐标系经加密后的坐标系,Google国内地图、高德、QQ地图使用。
BD09为百度坐标系,在GCJ02坐标系基础上再次加密。
注 互联网地图在国内必须至少使用GCJ02进行首次加密,不允许直接使用WGS84坐标下的地理数据,同时任何坐标系均不可转换为WGS84坐标。
地理编码
百度的地理编码(Geocoder)是一类Web API接口服务,包括正地理编码和逆地理编码。正地理编码将结构化地址数据(如:北京市海淀区上地十街十号)转换为对应坐标点的经纬度信息,逆地理编码是将坐标点的经纬度信息转换为对应位置信息(如所在行政区划,周边地标点分布)。如果是单个地址进行正逆编码的话直接在网页进行查询就好,如果是批量的话,需要一点爬虫技术,简单的就是把所有地址构造成一个列表,然后把地址作为输入参量不断环获取对应的经纬度。下面代码实现读取经纬度测试.xlsx文件,并对里面的地址列进行地理编码,输出的经纬度保存到经纬度输出结果.xlsx 文件里。

完整代码

# -*- coding: utf-8 -*-
"""
Created on Wed Nov 21 17:05:26 2018
projectname: geocoder
@author:帅帅de三叔
"""
import pandas as pd #导入数据分析库pandas
import requests #导入网页请求库
from tqdm import tqdm
inputfile="经纬度测试.xlsx" #数据文件
outputfile="经纬度测试结果.xlsx" #输出文件
data=pd.read_excel(inputfile,index_col=u'序号') #读取数据
address=data[u"地址"] #地址列

bd_lng_list=[] #用来存放经度
bd_lat_list=[] #用来存放纬度
precise_list=[] #用来存放打点精准状态
confidence_list=[] #用来存放误差范围

def get_bdlnglat(iaddress): #定义获取经纬度函数
    try:#如果成功返回结果的话,追加记录
        url='http://api.map.baidu.com/geocoder?output=json&ret_coordtype=bd09ll&key=您的ak&city=上海市&address='+str(iaddress) #访问网址
        response=requests.get(url) #get访问
        answer=response.json() #json化
        bd_lng=answer['result']['location']['lng'] #百度经度
        bd_lat=answer['result']['location']['lat'] #百度纬度
        precise=answer['result']['precise'] #是否精确打点
        confidence=answer['result']['confidence'] #误差范围
        bd_lng_list.append(bd_lng) #追加经度
        bd_lat_list.append(bd_lat) #追加纬度
        precise_list.append(precise) #追加打点状态
        confidence_list.append(confidence) #追加误差范围
    except: #如果不成功返回结果的话,都追加空值
        bd_lng_list.append("") #追加经度
        bd_lat_list.append("") #追加纬度
        precise_list.append("") #追加打点状态
        confidence_list.append("") #追加误差范围
        print(iaddress,"没有找到") #把不能解码的条目打印出来
             
for addr in tqdm(address): #对地址进行循环调用get_bdlnglat函数
    get_bdlnglat(addr)
    
bd_lng=pd.Series(bd_lng_list,index=data.index) #经度序列化
bd_lat=pd.Series(bd_lat_list,index=data.index) #纬度序列化
precise=pd.Series(precise_list,index=data.index) #精确度序列化
confidence=pd.Series(confidence_list,index=data.index) #置信度序列化
result=pd.concat([data,bd_lng,bd_lat,precise,confidence],axis=1)  
result.columns=list(data.columns)+["百度经度","百度纬度","精准打点","置信度"] #命名表头
result.index=data.index
result.to_excel(outputfile) #写入到excel

代码解读

首先读取poi结构化地址列,然后定义 get_bdlnglat() 函数,将结构化地址作为输入变量不断循环对百度的geocorder服务器进行访问,返回地址的经度和纬度,是否精确打点,以及置信度等参数,其中是否精确打点是二元值,0表示精确打点,1表示非精确打点,置信度表示可能对打点偏差距离的刻画,距离越大,置信度越低,最后保存为一个excel文件 经纬度测试结果.xlsx。用百度API进行正向编码,地址结构越完整,地址内容越准确,解析的坐标精度越高, 支持输出国测局坐标(GCJ02)和百度坐标(BD09),默认输出百度坐标(BD09),用百度API做正逆地理编码,代码中你的AK需要自行去百度开放平方申请,且每个AK配额上限是6万次/天。

发布了45 篇原创文章 · 获赞 12 · 访问量 8661

猜你喜欢

转载自blog.csdn.net/zengbowengood/article/details/96874962