【新年快乐,跨年文章】Python+百度API 画出美美哒热力地图

浏览: 5026

前言


明天就是2018年了,现在是晚上22:22,我是不是很2

图片.png

周围的人都在跨年刷朋友圈

我一个人在办公室默默打开博客

准备写一篇文章为2017画下句点


之前在写葡萄酒数据分析那篇文章时

曾想过做一个葡萄酒分布的地区热力图

当时也没有搞定

在写完那篇文章之后

闲来无事

在网上查阅了很多技术博客

结合自己的摸索实践

摸索了一下午

终于完成了

当时真的很开心

可能就和正在跨年的你们一样开心吧


数据准备

在国家统计局网站copy到2015年各城市的房地产开发投资额数据:


图片.png


把数据保存在本地,存成csv格式


百度API免费申请

打开网址:http://lbsyun.baidu.com/

注册好,按照下图操作:

点击  功能与服务----地图


图片.png


点击创建应用:


图片.png


然后自己取个名字,选择浏览器端,白名单输入星号:


图片.png


点击提交


你就有了一个应用了


图片.png


城市转换为经纬度


我们打开百度地图的开放平台

http://developer.baidu.com/map/jsdemo.htm#c1_15


在左侧找到添加热力图-----点击运行-----点击显示热力图-----就能看家热力图啦~


图片.png


这是百度API所能提供的热力图类型

我们注意到所给的这段代码:


图片.png


我们将您的密钥换成刚才我们申请得到的那串数字


也就是:


图片.png


然后在本地新建一个.html文件(可以通过创建文本文件,然后将后缀改为.html达到,如果你的文本文件不显示后缀,请百度解决~)


我们将加入了自己申请的密钥的网页代码全部复制下,粘贴到本地创建的 .html 文件中


图片.png


图片.png


复制的代码中的示例热力图的位置不是我们想要的


我们想要的是我们的数据生成热力图


打开Python


import json
from urllib.request import urlopen, quote
import requests,csv
import pandas as pd #导入这些库后边都要用到

def getlnglat(address):
url = 'http://api.map.baidu.com/geocoder/v2/'
output = 'json'
ak = '替换成你申请的密钥!!!'
add = quote(address) #由于本文城市变量为中文,为防止乱码,先用quote进行编码
uri = url + '?' + 'address=' + add + '&output=' + output + '&ak=' + ak
req = urlopen(uri)
res = req.read().decode() #将其他编码的字符串解码成unicode
temp = json.loads(res) #对json数据进行解析
return temp
file = open(r'E:\房地产开发投资额2015.json','w') #建立json数据文件
with open(r'E:\房地产开发投资额2015.csv', 'r') as csvfile: #打开csv
reader = csv.reader(csvfile)
for line in reader: #读取csv里的数据
# 忽略第一行
if reader.line_num == 1: #由于第一行为变量名称,故忽略掉
continue
# line是个list,取得所有需要的值
b = line[0].strip() #将第一列city读取出来并清除不需要字符
c = line[1].strip()#将第二列price读取出来并清除不需要字符
lng = getlnglat(b)['result']['location']['lng'] #采用构造的函数来获取经度
lat = getlnglat(b)['result']['location']['lat'] #获取纬度
str_temp = '{"lat":' + str(lat) + ',"lng":' + str(lng) + ',"count":' + str(c) +'},'
#print(str_temp) #也可以通过打印出来,把数据copy到百度热力地图api的相应位置上
file.write(str_temp) #写入文档
file.close() #保存

参考文献:https://www.jianshu.com/p/773ff5f08a2c

运行完成之后,本地会出现一个json文件

图片.png


打开可以看到:


图片.png


是一长串json数据,我们全选这些数据,复制替换掉本地的html文件中的var经纬度部分

原本是这样的:

图片.png


替换完成后是这样的:

(我是用notepad++以编辑的方式打开的本地html文件)

图片.png


保存之后,以网页浏览的方式打开本地的html


使用鼠标滚轮放大缩小到可以看见全国视野,然后点击左下角显示热力图即可看到~


你出现的图是这样的:

图片.png


因为原始数据默认为20和100,只要超过100的值显示都一样,而且没有渐变辐射的效果

图片.png


可以修改热力点辐射半径(辐射范围大小)和最大值

我们数据的price最大是北京的4177,所以我设置为4000,保存


图片.png


再次打开操作就能看到美美哒热力图啦~

图片.png


已经是2018年了,这文章写了一年


图片.png


去年可以祝大家  鸡年大吉吧

今年狗年啊,祝大家....

图片.png

推荐 14
本文由 ID王大伟 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

10 个评论

按你的步骤,一步一步都实现了,但是最后用浏览器打开的时候,地图显示不出来。只有两个按钮。请问这是怎么回事?
获取经纬度就报错了,KeyError: 'result',知道什么原因吗? ['location']['lng'] 报同样的错
换个浏览器试试
这个我没遇到过 你加一些print调试看看
没发现西安的地理坐标数据是错的吗,结果是大约在辽源的位置
好的 谢谢啦
经度纬度是如何获得的?比如要我现在位置的?
用百度api转的 文章里说了
我用的是Python3.6的版本,在运行“运行完成之后,本地会出现一个json文件”这个步骤时,第一次说没有requests模块。安装requests后,运行报错 No module named 'urllib3'
如果你用的anaconda ,urllib应该是自带的

要回复文章请先登录注册