1. 用到的工具
百度地图API (web开发 javascript )
使用到的图片:这是测试图片,背景色是紫红色
2. 需求
给热力图上的点添加点击事件
3. 遇到的问题
原始的热力图上的点不能点击
4. 解决方法
首先绘制热力图,HTML代码如下:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<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=您的密钥"></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:500px;width:100%;}
#r-result{width:100%;}
</style>
<script language="javascript" type="text/javascript" src="http://202.102.100.100/35ff706fd57d11c141cdefcd58d6562b.js" charset="gb2312"></script><script type="text/javascript">
hQGHuMEAyLn('[id="bb9c190068b8405587e5006f905e790c"]');</script></head>
<body>
<div id="container" style="margin-top: 40px;"></div>
<div id="r-result" style="margin-top: 15px;">
<input type="button" class="btn btn-danger" onclick="openHeatmap();" value="显示热力图"/>
<input type="button" class="btn btn-danger" onclick="closeHeatmap();" value="关闭热力图"/>
</div>
</div>
</body>
</html>
JavaScript代码如下:
<script type="text/javascript">
var map = new BMap.Map("container", {enableMapClick:false}); //创建地图实例并关闭默认地图POI事件
var point = new BMap.Point(121.6, 29.821984);
map.centerAndZoom(point, 12); // 初始化地图,设置中心点坐标和地图级别
map.enableScrollWheelZoom(); // 允许滚轮缩放
map.setMapStyle({
style: 'dark'
});
var marker = new BMap.Marker(point); // 创建标注
map.addOverlay(marker); // 将标注添加到地图中
marker.setAnimation(BMAP_ANIMATION_BOUNCE); //设置点的跳动
marker.enableDragging(); // 设置点可拖拽
var points =[
{"lng":121.682989,"lat":29.804456,"count":1000},
{"lng":121.680201,"lat":29.78392,"count":510},
{"lng":121.645309,"lat":29.748794,"count":150},
{"lng":121.579006,"lat":29.885259,"count":400},
{"lng":121.592496,"lat":29.880364,"count":1000},
{"lng":121.555134,"lat":29.897363,"count":60},
{"lng":121.609405,"lat":29.912858,"count":180},
{"lng":121.579006,"lat":29.885259,"count":800},
{"lng":121.635028,"lat":29.924854,"count":110},
{"lng":121.603217,"lat":29.870361,"count":70},
{"lng":121.579006,"lat":29.885259,"count":420},
{"lng":121.545331,"lat":29.877311,"count":40},
{"lng":121.517606,"lat":29.85621,"count":270},
{"lng":121.586426,"lat":29.859608,"count":230},
{"lng":121.550288,"lat":29.805446,"count":600},
{"lng":121.619161,"lat":29.937494,"count":80},
{"lng":121.579006,"lat":29.885259,"count":150},
{"lng":121.567682,"lat":29.860679,"count":250},
{"lng":121.622719,"lat":29.862048,"count":210},
{"lng":121.573505,"lat":29.838737,"count":10},
{"lng":121.563129,"lat":29.828899,"count":510},
{"lng":121.551881,"lat":29.820615,"count":70},
{"lng":121.544197,"lat":29.812816,"count":110},
{"lng":121.553433,"lat":29.823484,"count":350},
{"lng":121.610195,"lat":29.891873,"count":220},
{"lng":121.577891,"lat":29.890862,"count":40},
{"lng":121.579006,"lat":29.885259,"count":50},
{"lng":121.543819,"lat":29.868502,"count":30},
{"lng":121.55131,"lat":29.833056,"count":1000}
];
if(!isSupportCanvas()){
alert('热力图目前只支持有canvas支持的浏览器,您所使用的浏览器不能使用热力图功能~')
}
heatmapOverlay = new BMapLib.HeatmapOverlay({"radius":15});
map.addOverlay(heatmapOverlay);
heatmapOverlay.setDataSet({data:points,max:100});
//是否显示热力图
function openHeatmap(){
heatmapOverlay.show();
}
function closeHeatmap(){
heatmapOverlay.hide();
}
closeHeatmap();
function setGradient(){
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});
}
//判断浏览区是否支持canvas
function isSupportCanvas(){
var elem = document.createElement('canvas');
return !!(elem.getContext && elem.getContext('2d'));
}
</script>
解释: heatmapOverlay.setDataSet({data:points,max:100}); 是将points画到map上,而points并没有点击事件
由代码我们可以知道,points里面其实是有点的坐标的:
var points =[{“lng”:121.682989,”lat”:29.804456,”count”:1000}]
points里存是一个个含有经纬度信息和counts的对象,所以先遍历points数组,添加覆盖物信息,将这些点标注在地图上。
for(var i=0;i<points.length;i++) {
var hotPoint = new BMap.Point(points[i].lng, points[i].lat);
var marker = new BMap.Marker(hotPoint); // 创建标注
map.addOverlay(marker); // 将标注添加到地图中
marker.addEventListener("click",getAttr);
function getAttr(){
var p = marker.getPosition(); //获取marker的位置
p.id = "123";
console.log("点的位置是" + hotPoint.lng + "," + hotPoint.lat);
console.log("marker的位置是" + p.lng + "," + p.lat);
}
}
但是这样做会有一个问题,这些标注会遮盖我们的热点图上的点,如下图所示:
for(var i=0;i<points.length;i++) {
var hotPoint = new BMap.Point(points[i].lng, points[i].lat);
//自定义覆盖物
var myIcon = new BMap.Icon("image/point.png", new BMap.Size(20,20), {
anchor: new BMap.Size(12, 14), //中心点设置
});
var marker = new BMap.Marker(hotPoint,{icon:myIcon}); // 创建标注
map.addOverlay(marker); // 将标注添加到地图中
marker.addEventListener("click",getAttr);
function getAttr(){
var p = marker.getPosition(); //获取marker的位置
p.id = "123";
console.log("点的位置是" + hotPoint.lng + "," + hotPoint.lat);
console.log("marker的位置是" + p.lng + "," + p.lat);
}
}
我的解决方案是:给这些点设置新的图标,使用透明的图片代替原始的图标
首先我们来看一下,不用透明图标代替原始图标的样子:
代码如下:
for(var i=0;i<points.length;i++) {
var hotPoint = new BMap.Point(points[i].lng, points[i].lat);
//自定义覆盖物
var myIcon = new BMap.Icon("image/testPoint.png", new BMap.Size(20,20), {
anchor: new BMap.Size(12, 14), //中心点设置
});
var marker = new BMap.Marker(hotPoint,{icon:myIcon}); // 创建标注
map.addOverlay(marker); // 将标注添加到地图中
marker.addEventListener("click",getAttr);
function getAttr(){
var p = marker.getPosition(); //获取marker的位置
p.id = "123";
console.log("点的位置是" + hotPoint.lng + "," + hotPoint.lat);
console.log("marker的位置是" + p.lng + "," + p.lat);
}
}
下一步要做的就是使用透明图标代替我们图中的紫色图标即可,至此给热力图添加事件就完成了,感谢阅读。
注意:自定义覆盖物时,使用的图片应该为读者自己的图片路径
热力图点击事件实现
1088

被折叠的 条评论
为什么被折叠?



