为开源奉献一份自己的力量:Cesium没有热力图组件,我们自己封装!

大家好,我是日拱一卒的攻城师不浪,专注可视化、数字孪生、前端提效、nodejs、AI学习、GIS等学习沉淀,这是2024年输出的第27/100篇文章。
交流合作:brown_7778

请添加图片描述

前言

热力图,在很多可视化场景开发中会被经常提到,先来了解下它在产品表达方面的突出作用:

  1. 可视化数据密度:热力图通过颜色的渐变展示数据点的密度。例如,在城市规划中,可以用热力图展示某区域内人口的分布密度,帮助决策者了解人口集中的地方。

  2. 突出热点区域:通过颜色的对比,热力图可以很直观地突出某些热点区域。例如,在商业分析中,可以用热力图展示某购物中心的顾客流量,找出最受欢迎的区域。

  3. 简化复杂数据:热力图能将复杂的、难以直接理解的数据变得一目了然。通过颜色的变化,用户可以迅速抓住数据的主要趋势和特征

  4. 空间分析:热力图可以帮助进行空间分析,识别出特定区域的模式异常。例如,在环境监测中,可以使用热力图展示空气质量或污染源分布,帮助环保部门采取措施。

在产品表达方面,热力图的意义在于:

  1. 提高用户体验:热力图可以使数据展示更加直观,用户无需复杂的分析就能迅速理解数据的核心信息。

  2. 支持决策:通过直观的可视化,热力图可以为用户提供有价值的信息支持,帮助他们做出更明智的决策

  3. 数据呈现的美观性:热力图色彩丰富,能够提升数据展示的美观性吸引力,使用户对产品的视觉体验更好。

  4. 增强互动性:许多热力图允许用户进行交互操作,例如放大、缩小、点击查看详细信息等,提高了产品的互动性和用户参与度。

综上所述,热力图在可视化场景中不仅能提升数据可视化的效果,还能为用户提供更直观的分析工具,帮助他们更好地理解和利用数据,做出快速应对和决策

数据类型

在开发热力图之前,我们首先要知道要用到什么样的数据类型,下面我给出一个示例:

{
  "type": "FeatureCollection",
  "features": [
    {
      "type": "Feature",
      "geometry": {
        "type": "Point",
        "coordinates": [118.01958286942317, 36.81208337028062]
      },
      "properties": {
        "OBJECTID": 275,
        "lng": 118.019583,
        "lat": 36.812083,
        "num": 1
      }
    },
    {
      "type": "Feature",
      "geometry": {
        "type": "Point",
        "coordinates": [118.0362495360232, 36.81208337028062]
      },
      "properties": {
        "OBJECTID": 277,
        "lng": 118.03625,
        "lat": 36.812083,
        "num": 0.983159
      }
    },
    //...
  ]
}

可以清晰的看出,features里面包含了一个一个的点位(Point),实际开发过程中主要使用每个点位中的properties属性,包括经纬度以及当前点位的数据值(num)

数据处理

拿到可用的数据之后,我们需要对数据进行处理,整合成我们想要的格式类型

const { res } = await getGeojson("/json/heatMap.json");
const { features } = res;
// 最终要用到的数据格式
let heatData = [];
if (features?.length) {
  heatData = features.map((item) => {
    return {
      x: item.properties.lng,
      y: item.properties.lat,
      value: item.properties.num,
    };
  });
}

热力图组件封装

cesiumHeatMap = new CesiumHeatmap(viewer, {
  zoomToLayer: true,
  points: heatData,
  heatmapDataOptions: { max: 1, min: 0 },
  heatmapOptions: {
    maxOpacity: 1,
    minOpacity: 0,
  },
});

Cesium官方并没有直接提供现成的热力图组件,所以我们只能自己动手,丰衣足食了。

这里的CesiumHeatmap就是我们要封装的组件,先来看下它都需要哪些属性:

  • zoomToLayer: 热力图初始化成功之后,相机是否自动定位到热力图区域的上方角度;

  • points:渲染热力图所需要的数据;

  • heatmapDataOptions:每个点都有一个数据值,这里是设置最大最小数据值范围;

  • heatmapOptions:根据数据值的大小设置透明度的范围;

开发这个组件依赖到一位国外大佬的开源库heatmap.js:https://www.patrick-wied.at/static/heatmapjs/

但是库已经很老了,已经接近8年未维护了,所以有些地方不太兼容,在开发过程中作者把源码下下来,把报错的地方修改了一下。

原理

CesiumHeatmap组件的原理其实就是用html的canvas进行绘制,然后在Cesium中创建成图层,根据经纬度坐标屏幕坐标的转换,对区域渲染进行控制,最终添加进Cesium的viewer场景当中。

npm包

目前组件已经发布为【npm包】:https://www.npmjs.com/package/cesium-heatmap-es6

该组件的特点

  • 提供3种绘制方式:Entity实体(可贴模型,有三维效果)、Primitive图元、Layer图层;

  • 提供重绘,通过摄像头的高度进行重绘;

  • 提供heatmap.js的所有配置参数入口;

  • 源码ts编写,发布支持es6umd两种模式;

这个包的发起者是大佬
ONEGISER,后来我在使用过程中有一点小问题,进行修改后与大佬沟通,然后顺理成章的成了开源的贡献者。

组件源码】:https://github.com/cesium-plugin/cesium-heatmap-es6

完整使用源码】:https://github.com/tingyuxuan2302/cesium-vue3-vite

如果开源对你有帮助,也希望点一个免费star,支持作者持续开源。

有需要进技术产品开发交流群(可视化&GIS)可以加我:brown_7778(备注来意),也欢迎数字孪生可视化领域的交流合作。

最后,如果觉得文章对你有帮助,也希望可以一键三连👏👏👏,支持我持续开源和分享~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值