公众号后台回复“图书“,了解更多号主新书内容
作者:J哥
来源:菜J学Python
不知道大家会在什么场合使用地图可视化,对我来说地图可视化的优点除了它可以展示海量的位置数据,更重要的是它可以很酷很炫,给人一种赏心悦目的舒适感。如下是J哥做的一个简单热力图:
热力地图
制作此类可视化地图的前提是获得海量的经纬度数据,数据从何而来?当然是腾讯地图、高德地图和百度地图这些大家耳熟能详的平台。所以今天给大家分享用Python批量获取经纬度的三种方法,并分别评测它们的效率。
首先,咱们需要在腾讯位置服务平台注册并获得一个key,作为位置数据调用的密匙。步骤如下:
腾讯地图开放平台
获得key以后,咱们就可以构造API数据请求函数tengxun(),将json格式数据中的经纬度解析出来即可,Python代码如下:
import requests
def tengxun(addr):
url = "https://apis.map.qq.com/jsapi?" #腾讯地图API接口
para = {
"qt": "geoc",
"addr":addr, #传入地址参数
"output": "json",
"key": "D7EBZ-NHYKX-UAH4A-74TW4-6M2JE-UHFLY", #即腾讯地图API的key
"pf":"jsapi",
"ref":"jsapi"
}
req = requests.get(url,para) #请求数据
req = req.json() #转为json格式
#print(req)
m = req["detail"]
g = f"{m['pointx']},{m['pointy']}" #解析到经纬度数据
print(g)
return g
tengxun(addr="深圳市")
传入自变量“深圳市”,运行Python代码,即可获得深圳市的经纬度数据:
'113.883080,22.553290'
函数构造好以后,导入准备好的excel文件,文件包含广州500所学校的地址数据。可在「菜J学Python」公众后台回复学校自动获取。
import pandas as pd
df1 = pd.read_excel("gz_school.xlsx")
df1.head()
数据预览:
3、应用函数
将学校数据中的地址列应用于前文构造的函数,批量获取500所学校的经纬度数据并进行程序计时。
import time
time_start = time.time() #程序起始时间
df1['经纬度']=df1['address'].apply(tengxun) #调用函数
time_end = time.time() #程序结束时间
t = time_end-time_start #运行时间
print('共用时%s秒'%t)
通过腾讯地图批量解析500个地址获取经纬度数据共用时约52.40秒,平均1秒钟可以获取9个地址的经纬度。
共用时52.39904499053955秒
获取到经纬度数据后,保存为excel文件。
df1.head()
df1.to_excel('result.xlsx',index = False)
数据预览:
同样的,高德也需要提前在高德开放平台注册并创建应用,获取你的专属key。
高德地图开放平台
import pandas as pd
import requests
import time
import csv
import json
def gaode(addr):
para = {
'key':'你自己的', #高德地图开放平台申请的key
'address':addr #传入地址参数
}
url = 'https://restapi.amap.com/v3/geocode/geo?' #高德地图API接口
req = requests.get(url,para)
req = req.json()
print('-' * 30)
m = req['geocodes'][0]['location']
print(m)
return m
gaode(addr="深圳")
df2 = pd.read_excel('gz_school.xlsx') #读取地址数据
time_start = time.time()
df2['经纬度'] = df2['address'].apply(gaode) #调用函数
time_end = time.time()
t = time_end-time_start
print('共用时%s秒'%t)
通过高德地图批量解析500个地址获取经纬度数据共用时约37.74秒,平均1秒钟可以获取13个地址的经纬度,解析速度高于腾讯地图。
共用时37.740272998809814秒
百度地图批量获取经纬度方法与高德地图一致。
百度地图开放平台
import pandas as pd
import requests
import time
import csv
import json
def baidu(addr):
url = "http://api.map.baidu.com/geocoding/v3/?" #百度地图API接口
para = {
"address": addr, #传入地址参数
"output": "json",
"ak": "你自己的" #百度地图开放平台申请ak
}
req = requests.get(url,para)
req = req.json()
#print(req)
print('-' * 30)
m = req["result"]["location"]
g = f"{m['lng']},{m['lat']}"
print(g)
return g
baidu(addr="深圳")
df3 = pd.read_excel('gz_school.xlsx')
time_start = time.time()
df3['经纬度'] = df3['address'].apply(baidu)
time_end = time.time()
t = time_end-time_start
print('共用时%s秒'%t)
通过百度地图批量解析500个地址获取经纬度数据共用时约24.06秒,平均1秒钟可以获取20个地址的经纬度,解析速度高于高德地图和腾讯地图。
共用时24.0550799369812秒
仅从解析速度来看,百度地图效率高于高德地图,高德地图高于腾讯地图。当然,解析速度还要考虑程序运行时的网络状况、电脑自身配置等因素。另外,地址数据解析还要考虑准确率,只有综合考虑解析速度和准确率,才能更加客观地判断哪一种方法最优,准确率方面的评测将在以后的文章中进行分享。
◆ ◆ ◆ ◆ ◆
麟哥新书已经在京东上架了,我写了本书:《拿下Offer-数据分析师求职面试指南》,目前京东正在举行100-50活动,大家可以用相当于原价5折的预购价格购买,还是非常划算的:
点击下方小程序即可进入购买页面:
数据森麟公众号的交流群已经建立,许多小伙伴已经加入其中,感谢大家的支持。大家可以在群里交流关于数据分析&数据挖掘的相关内容,还没有加入的小伙伴可以扫描下方管理员二维码,进群前一定要关注公众号奥,关注后让管理员帮忙拉进群,期待大家的加入。
管理员二维码:
猜你喜欢
● 麟哥拼了!!!亲自出镜推荐自己新书《数据分析师求职面试指南》● 厉害了!麟哥新书登顶京东销量排行榜!● 笑死人不偿命的知乎沙雕问题排行榜
● 用Python扒出B站那些“惊为天人”的阿婆主!● 你相信逛B站也能学编程吗点击阅读原文,即可参与京东100-50购书活动