在之前的项目中,遇到给定小区或者零售户的地址,获取他们经纬度的需求,借助百度地图、高德地图等地图平台,提供的API可以实现该目的。
坐标获取平台
高德地图:地理/逆地理编码-API文档-开发指南-Web服务 API | 高德地图API
高德、腾讯地图坐标系转百度坐标系:
百度地图示例
数据样例
调用地图接口时要传入相应的参数,这里优先使用省、市、区、小区名称合成参数列,作为接口传入的参数,样例数据见下方截图。该关键列无法解析坐标,或精度差,可以使用省、市、区、地址合成参数列。
获取key
地图平台提供的接口,需要申请对应的key才能使用,key的申请参考对应地图平台提供的帮助文档。个人申请key的调用次数受限,可以企业的名义申请,调用次数较多,基本满足需要。
百度地图坐标获取
利用百度地图进行小区坐标获取(坐标的获取以百度为主),会返回小区的经度、纬度、精度、类型。精度数值为1-100,越高则表明坐标误差越小。对应含义见下图。
类型表示该坐标对应的地址类型,当类型为地产小区、门址、商务大厦且精度大于90则判定该坐标合格可以使用。
# 导库
import json
from urllib.request import urlopen, quote
import requests
import pandas as pd
import numpy as np
import datetime
import time
from fake_useragent import UserAgent
# 获取经纬度坐标,坐标精度
def getlnglat(address):
ua = UserAgent()
ua_get = ua.random
header_get = {
'User-Agent': ua_get,
'Connection': "close"
}
# 百度提供的接口
url = 'http://api.map.baidu.com/geocoding/v3/?address='
# 数据
output = 'json'
#KEY要去百度地图开发者平台申请
ak = 'key'
# 通过百度创建应用得到ak,记得写为浏览器端,然后写*
address = quote(str(address))
uri = url + address + '&output=' + output + "&ak=" + ak
try:
req = requests.get(uri, headers=header_get).text
# print( req)
# res = req.read().decode()
time.sleep(0.1)
# print(res)
temp = json.loads(req)
if temp['status'] == 0:
# 精度
lat = temp['result']['location']['lat']
# 纬度
lng = temp['result']['location']['lng']
# 百度地图解析结果精度判断以字段comprehension的值为依据
acc = temp['result']['comprehension']
use = temp['result']['level']
else:
lat = 0
lng = 0
acc = "无"
use = '无'
# return lat, lng,acc
return lat, lng, acc, use
except Exception as e:
print(e)
# print(data['地址1'].iloc[i])
time.sleep(3)
getlnglat(address)
#需要采集坐标的小区数据,数据案例见文件夹下“小区样表.xlsx”
data = pd.read_excel('地址样表.xlsx')
# data['地址']=data['area_name']+data['com_name']
# 坐标获取的进度条
def process_bar(percent, start_str='', end_str='', total_length=0):
bar = ''.join(["\033[31m%s\033[0m" % ' '] * int(percent * total_length)) + ''
bar = '\r' + start_str + bar.ljust(total_length) + ' {:0>4.1f}%|'.format(percent * 100) + end_str
print(bar, end='', flush=True)
jwd = []
# 获取所有的小区经纬
shuju = len(data['地址'])
for i in range(shuju):
time.sleep(0.1)
end_str = '100%'
process_bar(i / (shuju), start_str='', end_str=end_str, total_length=15)
a = getlnglat(data['地址'].iloc[i])
# print(a)
jwd.append(a)
data['经纬度'] = jwd
# 保存
data.to_excel('QYJJSJ.xlsx')