什么是热力图
在热力图(heatmap)以特殊高亮的形式显示访客热衷的页面区域和访客所在的地理区域的图示。现通常用于显示事发热点的区域。比如:实现展示地区人口密度,其关键是坐标信息的获取。
任务简介
日常工作中,经常可以见到各式各样精美的热力图,热力图的应用非常广泛。利用热力图可以看数据表里多个特征的两两相似度。在本项目中,为进一步挖掘地理位置对租赁价格的影响,引入百度地图工具,对价格进行深入分析。为使用百度的接口获取地理位置对应的经纬度,需要注册百度开发者,申请密钥,编写根据房屋具体地址通过百度地图获取其经纬度的模块。
任务5.1:使用百度地图API获取地址对应的经纬度。
登陆百度地图开放平台http://lbsyun.baidu.com/apiconsole/key注册用户,并创建服务器应用类型的AK。生成并获得相应的AK。如下图所示:
| # 应用百度地图API获取各个房屋的经纬度信息 class Html(object): soup = None def __init__(self, address): url0 = 'http://api.map.baidu.com/geocoder/v2/?address=' ak = '使用自己申请的AK填入' self.address = address city = '温州市' baiduAPI_url = url0 + address + '&city=' + city + '&output=json&pois=1&ak=' + ak html = requests.get(baiduAPI_url).text # 获取查询页的html self.soup = BeautifulSoup(html, features="html.parser") # 得到soup对象 def get_location(self): result = self.soup.get_text() print result try: st1 = result.find('"lng":') end1 = result.find('"lat":') lng = float(result[st1+6:end1-1]) # print lng end2 = result.find(',"precise"') lat = float(result[end1+6:end2-1]) #print lat except BaseException: return 0, 0 else: return lng, lat address = house['area'] price = house['price'] # 创建空列表coord,用来存储房屋的坐标(经纬度) coord = [] # 循环遍历每个房屋的具体地址,通过百度地图API获取其经纬度,并存入coord列表 for addrin address: #print addr loc = Html(addr).get_location() coordinate = str(loc).strip('()') coord.append(coordinate) coord_column = pd.Series(coord, name='coord') save = pd.DataFrame({'coord': coord_column}) save.to_csv("coord.csv", encoding="gbk", columns=['coord'], header=True, index=False) for i in range(len(house)): lng = str(coord_column[i].split(', ')[0]) lat = str(coord_column[i].split(', ')[1]) count = str(price[i]) out = '{\"lng\":' + lng + ',\"lat\":' + lat + ',\"count\":' + count + '},' print(out) |
获取的经纬度输出结果,部分如图所示。

首先,我们需要再创建一个AK,应用类型为浏览器。
<script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=***********"></script>
|
其次,设置中心位置点和地图的初始绽放缩放大小。
var map = new BMap.Map("container"); // 创建地图实例 var point = new BMap.Point(120.65029680539033, 27.964613394067255); map.centerAndZoom(point,13.5); // 初始化地图,设置中心点坐标和地图级别
|
最后,将上述获取的所有经纬度信息粘贴到points中。
var points =[{"lng":120.65029680539033,"lat":28.017170429729519,"count":800}, {"lng":120.65675472819095,"lat":28.003560697418448,"count":550}, {"lng":120.69157588750697,"lat":27.989555139505119,"count":1280},]
|
登陆网站http://lbsyun.baidu.com/jsdemo.htm#c1_15,粘贴对应用的HTML代码至源代码编辑器中,可运行得到相应的结果。

地图中热力图点的尺寸、透明度和梯度的信息可自定义设置。在浏览器中可以拖拽和缩放地图。在不同放大倍率下可以设定合适的热力图点参数。图的放大倍率和热力图点尺寸都不一样,方便更好地展示数据。
安装folium库,并撰写代码:
| #coding:utf-8 import pandas as pd from folium.pluginsimport HeatMap import folium house = pd.read_csv('result.csv', encoding='gbk') coord_column = pd.read_csv('coord.csv', encoding='gbk') address = house['area'] price = house['price'] dict=[] for i in range(len(house)): lng = coord_column.coord[i].split(', ')[0] lat = coord_column.coord[i].split(', ')[1] count = price[i] dict.append([float(lat),float(lng),float(count)]) m = folium.Map([27.964613394067255,120.65029680539033],tiles='stamentoner', zoom_start=13.5) HeatMap(dict).add_to(m) m.save('Heatmap.html')#存放路径 |
步骤五:运行程序.
