高德地图热力图问题之重复创建图层

前言:

最近这半年新到了一家公司,现在主要在做大屏可视化和小程序这块的业务,最近接到了一个大屏需求,需要用到热力图展示快递揽件的相关数据,一开始想着是用Echarts自带的热力图,去实现,但是领导说我们之前的地图全部是用高德地图去做的,因此被迫营业,开始去学习高德地图API,先把热力图的相关链接给大家安排上有关图层方法的介绍热力图的案例
由于当时时间紧张,自己也就没有太去注意一些细节问题

问题介绍:

基本功能均已实现,就是一张中国地图上显示各个省份的订单数据,由于屏幕涉及公司项目,我就不在这里做截图展示,主要问题是,我们热力图上的数据每隔3分钟要刷新一次,我在实现这个功能之后,领导发现,热力图的颜色会在一段时间之后持续变深

主要代码实现:

        //热力图订单数据
        get_expressInfo(){
            var that = this;
            // 这里的接口地址是个伪地址
            axios.get('/api/express/getData').then(res=> {
                var data = res.data.data;
                that. expressInfo = data.expressInfo;
                that.drwaHeatmap(that.expressInfo);
            })
        },
        //绘制热力图
        drwaHeatmap(heatMapData) {
            var that = this;
            that.map.plugin(["AMap.Heatmap"], function() {
            	// 初始化heatmap对象
            	that.heatmap = new AMap.Heatmap(that.map, {
                    radius: 20, // 给定半径
                    opacity: [0, 0.8],
                    gradient: {
                        0.5: "blue",
                        0.65: "rgb(117,211,248)",
                        0.7: "rgb(0, 255, 0)",
                        0.9: "#ffea00",
                        1.0: "red"
                    }
                });
                that.heatmap.setDataSet({
                    data: heatMapData
                });
            });
        },

定时器

setInterval(function() {
	that.get_expressInfo()
},180000);

心理路程:

一:得知这个bug之后,第一时间是去测试环境复现这一问题,然后我就觉得是数据的问题,随着定时器的刷新,可能我的expressInfo中的数据发生了变化,这里做下说明:expressInfo是一个数组,数组中有若干个object类型的item,这个object有三个属性count:数值,lat:纬度,lng:经度,我怀疑是每次的负值,改动了count,在drwaHeatmap方法中的第一行打断点调试,发现不是
二:然后,我就觉得很有可能是我每一次定时器都会重新绘画一次热力图,然后把每一次都是在上一次的基础上去进行描绘,导致了颜色加深,这次想法是正确的,按照这个逻辑我直接简单粗暴的给axios请求前加了如下一行代码

that.drwaHeatmap([]);

完美,perfect,我特娘的真是个天才,哈哈
这样是解决了颜色加深的问题,因为每次我都绘制了一个空的热力图,给领导汇报一下吧
三:领导不死心,看了API,想找一个类似于echarts中的resize和小程序中的reset方法,结果很遗憾,API中没有,然后他又通过控制台从vue实例中找到了heatmap这个对象:在控制台输入vm.heatmap,回车可以看到它的属性和方法,还是没有,然后他想直接清除图层也没成功,此时,他想起了我之前做的另外一张大屏,出现的问题,就是循环重复添加,与这个问题类似,然后指出了我的问题,三分钟创建一张图层,如果这个屏幕保持一个月常亮,那么会创建我也不知道多少个图层,就直接卡死,大家不要觉得领导怎么怎么,在这里向领导表示感谢,我在这里半年的时间学到了很多东西,哦,对了,领导是个后端,很厉害,也很负责
四:后来,看了一下我的代码,我每次定时器调用get_expressInfo时候都会同步调用一次绘制热力图方法,然后就会新建一个图层,其实我只需要加一个判断,有heatmap时,我就不创建图层,直接调用setDataSet就可以了,也就是加一个如下代码:

if (that.heatmap == null || !that.heatmap) {
     that.heatmap = new AMap.Heatmap(that.map, {
          radius: 20, // 给定半径
          opacity: [0, 0.8],
          gradient: {
               0.5: "blue",
               0.65: "rgb(117,211,248)",
               0.7: "rgb(0, 255, 0)",
               0.9: "#ffea00",
               1.0: "red"
          }
      });
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Vue.js是一个流行的JavaScript框架,而高德地图是一个提供地图和位置服务的平台。要在Vue.js中使用高德地图热力图,你可以按照以下步骤进行操作: 1. 在你的Vue项目中安装高德地图的JavaScript API库。你可以使用npm或yarn来安装,具体命令可以参考高德地图官方文档。 2. 创建一个Vue组件,用于显示地图和热力图。你可以在组件中使用高德地图提供的JavaScript API来初始化地图,并添加热力图图层。 3. 在组件的生命周期钩子函数中,例如`mounted`,使用高德地图API的热力图相关方法来设置热力图的数据和样式。 以下是一个简单的示例代码: ```vue <template> <div> <div id="map"></div> </div> </template> <script> export default { mounted() { // 初始化地图 const map = new AMap.Map('map', { zoom: 13, center: [116.39, 39.9], }); // 创建热力图实例 const heatmap = new AMap.Heatmap(map, { radius: 25, // 热力图点半径 }); // 设置热力图数据 heatmap.setDataSet({ data: [...], // 热力图数据数组 max: 100, // 热力图权重最大值 }); }, }; </script> <style> #map { width: 100%; height: 400px; } </style> ``` 在这个示例中,我们在组件的`mounted`函数中初始化了一个地图实例,并创建了一个热力图实例。然后,我们使用`setDataSet`方法设置了热力图的数据和样式。 注意:以上只是一个简单的示例,你可能需要根据你的具体需求进行更多的配置和处理,例如根据地图的变化更新热力图数据等。 希望对你有所帮助!如果还有其他问题,请继续提问。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值