Vue+heatmap.js實(shí)現(xiàn)熱力圖的展示

需求的效果:
地圖熱力圖.png

需求:

在地圖上根據(jù)地區(qū)的位置顯示相關(guān)信息的數(shù)量高低(或參數(shù)的大小)硼莽,展示不同顏色,用來(lái)表示數(shù)據(jù)煮纵,話不多說(shuō)懂鸵,開(kāi)始擼代碼:

1、html中的代碼:

這里的id='heatmap'是一個(gè)父級(jí)的盒子醉途,其中的圖片寬度和高度都是父級(jí)元素的100%矾瑰,用來(lái)展示熱力圖的位置

<div class="maps">
      <div class="hotPic" id="heatmap">
        <img src="../../../assets/stationchange/zhutubeijing.png" alt="">
      </div>
    </div>
2、data中存放的變量
data() {
    return {
      points: [],       // 熱力圖數(shù)據(jù)存放數(shù)組
      cavWidth: null,    //獲取寬度
      cavHeight: null,    //獲取高度
    }
  },
3隘擎、method中的方法
methods:{
    // 初始化獲取寬高(考慮到后期的適配殴穴,獲取父級(jí)元素的寬高)
    getRectValue(){
      this.cavWidth = document.getElementById("heatmap").clientWidth;
      this.cavHeight = document.getElementById("heatmap").clientHeight;
      console.log(this.cavWidth,this.cavHeight)
    },
    // 初始化獲取數(shù)據(jù)(模擬的展示數(shù)據(jù))
    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)
      }
    },
}

在這里說(shuō)明一下,熱力圖的數(shù)據(jù)是根據(jù)數(shù)據(jù)中的坐標(biāo)點(diǎn)進(jìn)行疊加(下面的兩段代碼是數(shù)據(jù)結(jié)構(gòu)的介紹)

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

最終熱力圖上的顯示是需要多個(gè)point進(jìn)行疊加的,也就是相當(dāng)于多個(gè)point的集合

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

接上面的模擬數(shù)據(jù)方法:

// 初始化熱力圖
    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, //傳遞回調(diào)以接收極值更改更新
        // blur, //將應(yīng)用于所有數(shù)據(jù)點(diǎn)的模糊因子采幌。模糊因子越高劲够,漸變將越平滑
        // xField, //數(shù)據(jù)點(diǎn)中x坐標(biāo)的屬性名稱
        // yField, //數(shù)據(jù)點(diǎn)中y坐標(biāo)的屬性名稱
        // valueField //數(shù)據(jù)點(diǎn)中y坐標(biāo)的屬性名稱
      })

      var max = 0

      // var width = 600

      // var height = 400
      var data = {
        max: 100,     //數(shù)據(jù)對(duì)比(max和min進(jìn)行數(shù)據(jù)對(duì)比,從而展示熱力顏色)
        min:0,
        data: self.points

      }
      heatmapInstance.setData(data)
    },
Tips:熱力圖的每一次加載都會(huì)在dom里創(chuàng)建一個(gè)自己的canvas休傍,所以征绎,在每次初始化之前都需要提前清楚上一次的創(chuàng)建,防止熱力圖展示的疊加(本人親自踩過(guò)的坑)
// 刪除之前的熱力圖
    deleteHotMap(){
      var heatmapBox = document.getElementById("heatmap");
      if(heatmapBox.children.length>1){
        var oldCanvas = heatmapBox.children[1];
        heatmapBox.removeChild(oldCanvas);
      }
    },
4磨取、在周期函數(shù)里進(jìn)行初始化

但是這里需要注意的是人柿,為了自適應(yīng)窗口的大小,保證x忙厌、y的位置不會(huì)存在誤差凫岖,這里要進(jìn)行相關(guān)的函數(shù)處理,需要對(duì)窗口的大小進(jìn)行監(jiān)聽(tīng)逢净,窗口大小改變時(shí)哥放,進(jìn)行對(duì)數(shù)據(jù)中的x、y進(jìn)行重新計(jì)算:

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;
      })()
    }
  },

當(dāng)然爹土,為了保證熱力圖的數(shù)據(jù)能夠自動(dòng)根據(jù)窗口的大小進(jìn)行改變甥雕,當(dāng)然少不了監(jiān)聽(tīng)函數(shù),對(duì)視口的寬高進(jìn)行設(shè)置,

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);
      },
    }
  },
總結(jié):

由于是項(xiàng)目中涉及到的胀茵,會(huì)有的坑已經(jīng)被本人踩過(guò)了社露,代碼及拿即用,歡迎各位猿友電站或在下方評(píng)論宰掉,有問(wèn)題評(píng)論我會(huì)及時(shí)回復(fù)的呵哨,謝謝。
heatmap的官網(wǎng)指導(dǎo):https://www.patrick-wied.at/static/heatmapjs/docs.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末轨奄,一起剝皮案震驚了整個(gè)濱河市孟害,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌挪拟,老刑警劉巖挨务,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異玉组,居然都是意外死亡谎柄,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門惯雳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)朝巫,“玉大人,你說(shuō)我怎么就攤上這事石景∨常” “怎么了拙吉?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)揪荣。 經(jīng)常有香客問(wèn)我筷黔,道長(zhǎng),這世上最難降的妖魔是什么仗颈? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任佛舱,我火速辦了婚禮,結(jié)果婚禮上挨决,老公的妹妹穿的比我還像新娘请祖。我一直安慰自己,他們只是感情好凰棉,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布损拢。 她就那樣靜靜地躺著,像睡著了一般撒犀。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上掏秩,一...
    開(kāi)封第一講書(shū)人閱讀 49,950評(píng)論 1 291
  • 那天或舞,我揣著相機(jī)與錄音,去河邊找鬼蒙幻。 笑死映凳,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的邮破。 我是一名探鬼主播诈豌,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼抒和!你這毒婦竟也來(lái)了矫渔?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤摧莽,失蹤者是張志新(化名)和其女友劉穎庙洼,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體镊辕,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡油够,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了征懈。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片石咬。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖卖哎,靈堂內(nèi)的尸體忽然破棺而出鬼悠,到底是詐尸還是另有隱情删性,我是刑警寧澤,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布厦章,位于F島的核電站镇匀,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏袜啃。R本人自食惡果不足惜汗侵,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望群发。 院中可真熱鬧晰韵,春花似錦、人聲如沸熟妓。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)起愈。三九已至只恨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間抬虽,已是汗流浹背官觅。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留阐污,地道東北人休涤。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像笛辟,于是被迫代替她去往敵國(guó)和親功氨。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容