直接上图

现在很多的数据分析中,都会用热力图来直观展示特征群体的分布情况,为后期的营销运营等服务。

本篇主要介绍,在经过前期数据整理后,利用python和百度地图API,如何根据拿到的地址列表绘制出热力图。

整个过程的思路大体分为部分:

1、读入已经整理好的地址列表,调用百度API功能取出各个地址对应的经纬度;

2、将所有地址及地址对应的经纬度,存入一个csv文件备份;

3、将经纬度数据整理成热力图html需要的格式;

4、按照热力图html格式,整理完成并打开。

一、申请百度开发者密匙

百度API是什么?百度地图API是为开发者免费提供的一套基于百度地图服务的应用接口,基于这些应用接口,我们就可以很方便地将实际地址转换为经纬度坐标。

如下图,在百度拾取坐标系统(http://api.map.baidu.com/lbsapi/getpoint/index.html)中,直接输入地址,点击“百度一下”,在右边选择对应的目标,即可复制出经纬度了,咱们接下来的经纬度就是这样来的。

使用百度地图API功能,需要先在百度开发者平台上http://lbsyun.baidu.com/,注册,然后申请密匙,应用名称自定义,应用类型选择浏览器端即可。(注意,如果调用代码是提示{"status":220,"message":"APP Referer校验失败"},说明浏览器的AK没在白名单中,最简单粗暴的方式,就是直接将白名单定为*,意思是所有的IP都能调用此API,有一丢丢危险,慎用哈!)

二、调用百度API取出各个地址对应的经纬度

定义一个函数取经纬度

from bs4 import BeautifulSoup
import requests
import csv
import re#调用百度地图API查询位置
def getlocation(name):bdurl='http://api.map.baidu.com/geocoder/v2/?address='output='json'ak='应用AK'#输入刚刚申请的AKcallback='showLocation'uri=bdurl+name+'&output=t'+output+'&ak='+ak+'&callback='+callbackheaders = {'Connection': 'close'}res=requests.get(uri,headers = headers)s=BeautifulSoup(res.text,'lxml')lng=s.find('lng')#经度lat=s.find('lat')#纬度if lng:return lng.get_text()+','+lat.get_text()

一开始输入的地址文件格式如下图左边红色部分,取经纬度后备份文件格式如右边的绿色部分

三、将经纬度整理成热力图html需要的格式

百度热力图的经纬度格式如下: 。lng表示经度; lat表示纬度; count表示热力值,这个数越大,最终在图上的亮度越高,经过本人测试,对于单点,热力值=10时在地图上才可见,热力值>=100时,亮度达到最高,由于本案中每个地址仅出现一次,可以默认这个热力值为30即可

需要将获取的经纬度整理成以上格式,代码如下:

#将坐标按照百度API的格式进行整理
import csvreader=csv.reader(open('yyc.csv'))
for row in reader:loc=row[1]sloc=loc.split(',')lng=''lat=''if len(sloc)==2:#第一行是列名需要做判断lng=sloc[0]lat=sloc[1]count='30'#row[2]out='{\"lng\":'+lng+',\"lat\":'+lat+',\"count\":'+count+'},'print(out)

完整代码在这里!

from bs4 import BeautifulSoup
import requests
import csv
import re#调用百度地图API查询位置
def getlocation(name):bdurl='http://api.map.baidu.com/geocoder/v2/?address='output='json'ak='应用AK'#输入百度地图上申请的密匙,代码如果给别人,这个密钥一定要删掉callback='showLocation'uri=bdurl+name+'&output=t'+output+'&ak='+ak+'&callback='+callbackheaders = {'Connection': 'close'}res=requests.get(uri,headers = headers)s=BeautifulSoup(res.text,'lxml')lng=s.find('lng')#经度lat=s.find('lat')#纬度if lng:return lng.get_text()+','+lat.get_text()#将csv文件中的地址读取出来并构建成一个list
with open('donghuicheng.csv','r',newline='',encoding='utf-8') as csvfile:reader = csv.reader(csvfile)data = []for row in reader:data.append(row[0])
#print(data)#houses=[]#定义列表用于存放房子的信息#特别注意一个问题,当查询的数据量大时(len(p)约>900时),会出现ConnectionAbortedError问题,查了一下有人说了异步提交的问题
#也有人说是电脑防火墙等软件的问题阻止的,经过自己的尝试,最后锁定是并发问题,普通API用户的并发是60/秒,认证用户是160/秒,需要设置休眠
import time
n=1
num=len(data)-1#去掉标题行
file=open('yyc.csv', 'w', newline='')#自己定义一个文件yyc,用于备份保存地址、经纬度信息
headers = ['name', 'loc', 'count']
writers = csv.DictWriter(file, headers)
writers.writeheader()
while n<num:#循环将信息存放进列表name = data[n]loc = getlocation(name)house = {'name': '','loc': '','count': ''}#将房子的信息放进一个dict中house['name'] = namehouse['loc'] = lochouse['count'] = 10writers.writerow(house)#将dict写入到csv文件中n+=1if n%100 == 0:time.sleep(10) #避免ConnectionAbortedError问题print(n)
file.close()#将坐标按照百度API的格式进行整理
import csvreader=csv.reader(open('yyc.csv'))
for row in reader:loc=row[1]sloc=loc.split(',')lng=''lat=''if len(sloc)==2:#第一行是列名需要做判断lng=sloc[0]lat=sloc[1]count='30'#row[2]out='{\"lng\":'+lng+',\"lat\":'+lat+',\"count\":'+count+'},'print(out)

以上代码执行结果会得到符合热力图html格式的经纬度,接下来把这些经纬度复制到html模板即可。

热力图html模板在这里

把上面代码获取的内容,复制到下面var points中即可

  <!DOCTYPE html>
<html>
<head><meta http-equiv="Content-Type" content="text/html; charset=GBK" /><meta name="viewport" content="initial-scale=1.0, user-scalable=no" /><script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=lB1LFGD8N6ydaTCSmVxiPYSly973KBHa"></script><script type="text/javascript" src="http://api.map.baidu.com/library/Heatmap/2.0/src/Heatmap_min.js"></script><title>热力图功能示例</title><style type="text/css">ul,li{list-style: none;margin:0;padding:0;float:left;}html{height:100%}body{height:100%;margin:0px;padding:0px;font-family:"微软雅黑";}#container{height:90%;width:100%;}#r-result{width:100%;}</style>
</head>
<body><div id="container"></div><div id="r-result"><input type="button"  onclick="openHeatmap();" value="显示热力图"/><input type="button"  onclick="closeHeatmap();" value="关闭热力图"/></div>
</body>
</html>
<script type="text/javascript">var map = new BMap.Map("container");          // 创建地图实例var point = new BMap.Point(113.3312,23.147399);map.centerAndZoom(point, 12);             // 初始化地图,设置中心点坐标和地图级别map.enableScrollWheelZoom(); // 允许滚轮缩放var points =[
{"lng":113.405740055,"lat":23.0728039283,"count":50},
{"lng":113.532428081,"lat":23.0712678757,"count":50}
];if(!isSupportCanvas()){alert('热力图目前只支持有canvas支持的浏览器,您所使用的浏览器不能使用热力图功能~')}//详细的参数,可以查看heatmap.js的文档 https://github.com/pa7/heatmap.js/blob/master/README.md//参数说明如下:/* visible 热力图是否显示,默认为true* opacity 热力的透明度,1-100* radius 势力图的每个点的半径大小* gradient  {JSON} 热力图的渐变区间 . gradient如下所示*  {.2:'rgb(0, 255, 255)',.5:'rgb(0, 110, 255)',.8:'rgb(100, 0, 255)'}其中 key 表示插值的位置, 0~1.value 为颜色值.*/heatmapOverlay = new BMapLib.HeatmapOverlay({"radius":20});map.addOverlay(heatmapOverlay);heatmapOverlay.setDataSet({data:points,max:100});//是否显示热力图function openHeatmap(){heatmapOverlay.show();}function closeHeatmap(){heatmapOverlay.hide();}closeHeatmap();function setGradient(){/*格式如下所示:{0:'rgb(102, 255, 0)',.5:'rgb(255, 0, 0)',1:'rgb(255, 0, 0)'}*/var gradient = {};var colors = document.querySelectorAll("input[type='color']");colors = [].slice.call(colors,0);colors.forEach(function(ele){gradient[ele.getAttribute("data-key")] = ele.value;});heatmapOverlay.setOptions({"gradient":gradient});}//判断浏览区是否支持canvasfunction isSupportCanvas(){var elem = document.createElement('canvas');return !!(elem.getContext && elem.getContext('2d'));}
</script>

将这个html文件在浏览器中打开,就是本篇中第一个图

python应用之根据地址表绘热力图相关推荐

  1. import _winreg:用python操作修改windows注册表

    用python操作修改windows注册表,显然要比用C或者C++简单. 主要参考资料:官方文档:http://docs.python.org/library/_winreg.html 通过 pyth ...

  2. python算法与数据结构-顺序表(39)

    阅读目录 1.顺序表介绍 2.顺序表的结构 3.顺序表的两种基本实现方式 5.元素存储区扩充 6.顺序表的增删改查操作的Python代码实现 7.顺序表的增删改查操作的C语言代码实现 1.顺序表介绍 ...

  3. Python模块——_winreg操作注册表

    From: http://blog.sina.com.cn/s/blog_4b5039210100gmsb.html 用python操作修改windows注册表,显然要比用C或者C++简单. 主要参考 ...

  4. Python开发资源速查表

    Python开发资源速查表 Python实现算法和设计模式 algorithms - Python的一个算法模块. PyPattyrn - 一个用于实现常见设计模式的简单而有效的库. python-p ...

  5. Python excel xlwings+QT 考勤表开发 -【Python Office开发基础培训】 拆分合并文件

    Python excel xlwings+QT 考勤表开发 1. 概述 2. QT界面搭建 2.1搭建界面 3. 搭建软件架构 3. 读取输入文件 3.1链接文件 3.2读取表格 3.3解析为树状结构 ...

  6. Python模块_winreg操作注册表

    用python操作修改windows注册表,显然要比用C或者C++简单. 主要参考资料:官方文档:http://docs.python.org/library/_winreg.html 通过pytho ...

  7. python写透视挂_用Python实现数据的透视表的方法

    在处理数据时,经常需要对数据分组计算均值或者计数,在Microsoft Excel中,可以通过透视表轻易实现简单的分组运算.而对于更加复杂的分组运算,Python中pandas包可以帮助我们实现. 1 ...

  8. 交换机工作原理、MAC地址表、路由器工作原理详解

    一:MAC地址表详解 说到MAC地址表,就不得不说一下交换机的工作原理了,因为交换机是根据MAC地址表转发数据帧的.在交换机中有一张记录着局域网主机MAC地址与交换机接口的对应关系的表,交换机就是根据 ...

  9. 的确好用!Python数据科学速查表中文版强势来袭!

    1速查速记,不二之选! DataCamp 推出的 Python 数据科学速查表(中文版),一共 11 张表,包括:Python 基础.导入数据.Jupyter Notebook.Numpy 基础.Pa ...

最新文章

  1. 在线翻译系统属于计算机应用领域中,【单选题】网状物编织物和机件上的滚花部分,可以在轮廓线附件用( )线示意画出...
  2. path与classpath区别 path是Windows查找.exe文件的路径;classpath是jvm查找.class文件的路径
  3. svn导出文件进行比较
  4. Hadoop centos 6.5 配置
  5. 深圳多管齐下破解“融资难”
  6. cookie无法读取bdstoken_第二章(第12节):cookie操作
  7. jpg怎么合成一份_海外商标注册申请程序复杂吗?应该怎么注册?
  8. graphics | 基础绘图系统(五)——plot函数功能再探和低级绘图函数
  9. 20145202马超《信息安全系统设计基础》实验三总结
  10. 中科大研发的FTP搜索工具~
  11. Xshell、MobaXterm、Secure CRT等工具用法
  12. 2021届西农计算机复试工作方案(学院)
  13. Matlab中zeros和ones函数用法
  14. Verifying dml pool data
  15. uWSGI, Gunicorn, 啥玩意儿?
  16. C#压缩ACCESS数据库的类源码
  17. 微信小程序 live-player 实时音视频播放 组件
  18. jquery实现歌词滚动
  19. 网络基础(六)-- 路由器的转发原理,路由表,静态路由及其配置
  20. 一个大牛的acm历程(很棒 优秀的人真的很多)

热门文章

  1. 安卓查看内存读写测试软件_装机小贴士:内存双通道重要吗
  2. 3dMax 放样(牙膏)
  3. python中socket与UDP使用与通信详解
  4. 【问题解决】arcgis地图无法放大缩小
  5. 哈希加密---bcrypt
  6. 三种方式将wmv格式的视频快速转为mp4
  7. 如何解决iCloud空间被Mac桌面和文稿占用太多的问题?
  8. 2023年Android黑科技保活方案,应用永生,拒绝强制杀死 最高适配Android 13 小米 华为 Oppo vivo 等最新机型 拒绝强杀 开机自启动 附demo apk 附研究资料
  9. 【Unity】Hololens第三视角(Spectator View)preview 版(ipad或者iphone版) 实现及踩坑记录
  10. 移动云计算应用开发入门经典