WebGis——实现热力图

简介: WebGis——实现热力图

关于热力图的原理:

1、首先获取热力图数据,数据构成为xy坐标和value值

2、根据热力图数据的坐标在canvas图上绘制一个个从中心向外灰度渐变的圆

3、利用灰度可以叠加的原理,计算每个像素点数据交叉叠加得到的灰度值

4、根据每个像素计算得到的灰度值,在一条彩色色带中进行颜色映射,最后对图像进行着色,得到热力图

demo如下:

首先写一个热力图假数据

    initdata() {
      var data = [
        { x: 71, y: 77, value: 25 },
        { x: 38, y: 75, value: 97 },
        { x: 73, y: 19, value: 71 },
        { x: 72, y: 42, value: 63 },
        { x: 63, y: 95, value: 97 },
        { x: 90, y: 37, value: 34 },
        { x: 77, y: 42, value: 66 },
        { x: 171, y: 254, value: 20 },
        { x: 6, y: 82, value: 64 },
        { x: 87, y: 77, value: 14 },
        { x: 100, y: 200, value: 80 }
      ]
      this.data = data
    },

接下来我们创建一个canvas画布,在画布上绘制径向渐变的圆。

<template>
  <div class="">
    <canvas id="mycanvas" width="500" height="200" />
  </div>
</template>
    initcanvas() {
      // 找到该canvas节点
      var c = document.getElementById('mycanvas')
      // 创建文本对象
      var context = c.getContext('2d')
      // 遍历热力图数据
      this.data.forEach(point => {
        // 解构赋值
        const { x, y, value } = point
        // 开始画圆
        context.beginPath()
        // 通过art方法画圆,x-起始点x坐标,y-起始点y坐标,30-圆半径,0-初始角度,2*Math.PI最终角度实际上就是360度
        context.arc(x, y, 30, 0, 2 * Math.PI)
        context.closePath()
        // 创建渐变色: r,g,b取值比较自由,我们只关注alpha的数值,这里是径向渐变,xy都代表圆点位置,只不过一个半径是0一个半径是30
        const radialGradient = context.createRadialGradient(x, y, 0, x, y, 30)
        // 渐变
        radialGradient.addColorStop(0.0, 'rgba(0,0,0,1)')
        radialGradient.addColorStop(1.0, 'rgba(0,0,0,0)')
        // 填充渐变色
        context.fillStyle = radialGradient
        // 设置globalAlpha: 需注意取值需规范在0-1之间,我们这里的14是value的最小值,100是value的最大值,可以自行调整
        const globalAlpha = (value - 14) / (100 - 14)
        context.globalAlpha = Math.max(Math.min(globalAlpha, 1), 0)
        // 打印看到每个圆的灰色值是不一样的,然后每个像素叠加的地方也会累积灰度值,这就是核心原理
        console.log(context.globalAlpha)
        // 填充颜色
        context.fill()
        // 像素着色,获取我们整个画布的所有像素点的rgba
        const imageData = context.getImageData(0, 0, 1000, 800)
        const data = imageData.data
        // rgba,a在第四个所以我们只看a
        for (var i = 3; i < data.length; i += 4) {
          const alpha = data[i]
          // 根据a的值,来找我们彩色映射带的值,将彩色映射带的值重新赋予该canvas的imgdata
          const color = this.colorPicker(alpha)
          data[i - 3] = color[0]
          data[i - 2] = color[1]
          data[i - 1] = color[2]
        }
        context.putImageData(imageData, 0, 0)
      })
    },
    // 初始化彩色映射带
    inittool() {
      // 定义彩色映射带的渐变值
      const colorstops = {
        0.2: 'rgb(0,0,255)',
        0.3: 'rgb(43,111,231)',
        0.4: 'rgb(2,192,241)',
        0.6: 'rgb(44,222,148)',
        0.8: 'rgb(254,237,83)',
        0.9: '#f00',
        1.0: '#f00'
      }
      // 这里显示彩色映射带
      const canvas = document.createElement('canvas')
      canvas.width = 240
      canvas.height = 30
      const ctx = canvas.getContext('2d')
      const linearGradient = ctx.createLinearGradient(0, 0, 256, 30)
      for (const key in colorstops) {
        linearGradient.addColorStop(key, colorstops[key])
      }
      ctx.fillStyle = linearGradient
      ctx.fillRect(0, 0, 240, 30)
      // 我们取彩色应色带height设为1,因为多取也用不到,只需要第一行像素点的rgba
      this.imageData = ctx.getImageData(0, 0, 250, 1).data
      console.log(this.imageData)
      document.body.appendChild(canvas)
    },

替换imgdata方法

    colorPicker(position) {
      // 这里根据a的值也就是灰度值来截取对应彩色映射带的值,a值越小,对应的彩色映射带的值越靠前
      return this.imageData.slice(position * 4, position * 4 + 3)
    }

我们应该先初始化彩色映射带

  mounted() {
    this.initdata()
    this.inittool()
    this.initcanvas()
  },

最终显示:


相关文章
|
6月前
|
定位技术 数据安全/隐私保护 iOS开发
一文讲清楚地图地理坐标系
一文讲清楚地图地理坐标系
253 0
|
1月前
ThreeJs制作全息投影视频
这篇文章介绍了使用Three.js来创建全息投影效果的视频教程,涵盖了实现全息效果的技术要点和具体实施步骤。
45 2
ThreeJs制作全息投影视频
|
6月前
|
数据可视化 定位技术 网络架构
R语言在地图上绘制月亮图、饼状图数据可视化果蝇基因种群
R语言在地图上绘制月亮图、饼状图数据可视化果蝇基因种群
|
6月前
|
数据可视化
实现绘制Sankey桑基图(河流图、分流图)流程数据可视化
实现绘制Sankey桑基图(河流图、分流图)流程数据可视化
|
JSON 数据可视化 定位技术
可视化 | Python绘制高颜值台风地理轨迹图
可视化 | Python绘制高颜值台风地理轨迹图
|
定位技术 内存技术
GIS空间分析 三维分析4 制作飞行动画
本文中,我们利用ArcScene软件用3种方法制作了飞行动画
301 0
|
6月前
|
数据可视化 定位技术 数据格式
Tableau可视化设计案例-07 多边形地图和背景图地图
Tableau可视化设计案例-07 多边形地图和背景图地图
|
数据可视化
好玩的DEM制图:等高线地形图入门与进阶
好玩的DEM制图:等高线地形图入门与进阶
99 0
|
数据可视化 定位技术
GIS空间分析 数字地形分析4 明暗等高线的制作
🎈🎈🎈在本文中,你将学到如何利用ArcGIS软件基于DEM数据制作一副伪3D的明暗等高线图。期待点赞+关注😉。
175 0
|
定位技术 Python
综合练习之海龟作图
综合练习之海龟作图
106 0
下一篇
无影云桌面