Vue+heatmap.js实现热力图的展示

需求的效果:
地图热力图.png

需求:

在地图上根据地区的位置显示相关信息的数量高低(或参数的大小),展示不同颜色,用来表示数据,话不多说,开始撸代码:

1、html中的代码:

这里的id='heatmap'是一个父级的盒子,其中的图片宽度和高度都是父级元素的100%,用来展示热力图的位置

<div class="maps">
      <div class="hotPic" id="heatmap">
        <img src="../../../assets/stationchange/zhutubeijing.png" alt="">
      </div>
    </div>
2、data中存放的变量
data() {
    return {
      points: [],       // 热力图数据存放数组
      cavWidth: null,    //获取宽度
      cavHeight: null,    //获取高度
    }
  },
3、method中的方法
methods:{
    // 初始化获取宽高(考虑到后期的适配,获取父级元素的宽高)
    getRectValue(){
      this.cavWidth = document.getElementById("heatmap").clientWidth;
      this.cavHeight = document.getElementById("heatmap").clientHeight;
      console.log(this.cavWidth,this.cavHeight)
    },
    // 初始化获取数据(模拟的展示数据)
    initValue(){
      var len = 30
      while (len--) {
        var val = Math.floor(Math.random() * 100)
        // max = Math.max(max, val)
        var point = {
          x: Math.floor(Math.random() * 500),
          y: Math.floor(Math.random() * 400),
          value: val
        }
        this.points.push(point)
      }
    },
}

在这里说明一下,热力图的数据是根据数据中的坐标点进行叠加(下面的两段代码是数据结构的介绍)

point = {
  x: 5, // x coordinate of the datapoint, a number(x坐标)
  y: 5, // y coordinate of the datapoint, a number(y坐标)
  value: 100 // the value at datapoint(x, y)
};

最终热力图上的显示是需要多个point进行叠加的,也就是相当于多个point的集合

data = {
  max: 100,   
  min: 0,
  data: [
    point, point ,point, point
  ]
};

接上面的模拟数据方法:

// 初始化热力图
    initHotPic(){
      this.deleteHotMap()
      let self = this
      var heatmapInstance = Heatmap.create({
        container: document.getElementById('heatmap'),
        gradient: {//渐变颜色
          "0": "rgba(255,255,255,1)",//value为0的颜色
          "0.3": "#82ff6d",//value为500的颜色
          "0.8": "#f3ff6d",//value为1000的颜色
          "1": "#ff6d6d",//value为2000的颜色
        },
        // radius: 10,
        maxOpacity: 1,
        minOpacity: 0,
        blur: .75,
        // radius:30, //半径
        // opacity:0.5, //透明
        // maxOpacity, //热图中最大值具有的最大不透明度
        // minOpacity, //热图中最小值的最小不透明度
        // onExtremaChange, //传递回调以接收极值更改更新
        // blur, //将应用于所有数据点的模糊因子。模糊因子越高,渐变将越平滑
        // xField, //数据点中x坐标的属性名称
        // yField, //数据点中y坐标的属性名称
        // valueField //数据点中y坐标的属性名称
      })

      var max = 0

      // var width = 600

      // var height = 400
      var data = {
        max: 100,     //数据对比(max和min进行数据对比,从而展示热力颜色)
        min:0,
        data: self.points

      }
      heatmapInstance.setData(data)
    },
Tips:热力图的每一次加载都会在dom里创建一个自己的canvas,所以,在每次初始化之前都需要提前清楚上一次的创建,防止热力图展示的叠加(本人亲自踩过的坑)
// 删除之前的热力图
    deleteHotMap(){
      var heatmapBox = document.getElementById("heatmap");
      if(heatmapBox.children.length>1){
        var oldCanvas = heatmapBox.children[1];
        heatmapBox.removeChild(oldCanvas);
      }
    },
4、在周期函数里进行初始化

但是这里需要注意的是,为了自适应窗口的大小,保证x、y的位置不会存在误差,这里要进行相关的函数处理,需要对窗口的大小进行监听,窗口大小改变时,进行对数据中的x、y进行重新计算:

created(){
    this.initValue()
  },
  mounted(){
    this.getRectValue()
    this.initHotPic()
    this.progressDom = document.getElementsByClassName('progress_list')
    var _this = this
    window.onresize = () => {
      return (() => {
        _this.cavWidth = document.getElementById("heatmap").clientWidth;
        _this.cavHeight = document.getElementById("heatmap").clientHeight;
      })()
    }
  },

当然,为了保证热力图的数据能够自动根据窗口的大小进行改变,当然少不了监听函数,对视口的宽高进行设置,

watch:{
    cavWidth:{
      handler(curVal, oldVal) {
        var _this = this;
        _this.cavWidth = curVal;
        if (oldVal != 0 && oldVal!=null) {
          for (var i = 0; i < this.points.length; i++) {
            this.points[i].x = Number((this.points[i].x * curVal / oldVal).toFixed(0));
          }
          _this.initHotPic();
        }
        // console.log("宽=" + curVal, oldVal);
      },
    },
    cavHeight:{
      handler(curVal, oldVal) {
        var _this = this;
        _this.cavHeight = curVal;
        if (oldVal != 0 && oldVal!=null) {
          for (var i = 0; i < this.points.length; i++) {
            this.points[i].y = Number((this.points[i].y * curVal / oldVal).toFixed(0));
            console.log(this.points[i].y)
          }
          _this.initHotPic();
        }
        // console.log("高=" + curVal, oldVal);
      },
    }
  },
总结:

由于是项目中涉及到的,会有的坑已经被本人踩过了,代码及拿即用,欢迎各位猿友电站或在下方评论,有问题评论我会及时回复的,谢谢。
heatmap的官网指导:https://www.patrick-wied.at/static/heatmapjs/docs.html

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,042评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 89,996评论 2 384
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,674评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,340评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,404评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,749评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,902评论 3 405
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,662评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,110评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,451评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,577评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,258评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,848评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,726评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,952评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,271评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,452评论 2 348

推荐阅读更多精彩内容