大家好,我是日拱一卒的攻城师不浪,专注可视化、数字孪生、前端提效、nodejs、AI学习、GIS等学习沉淀,这是2024年输出的第27/100篇文章。
交流合作:brown_7778
前言
热力图
,在很多可视化场景开发中会被经常提到,先来了解下它在产品表达方面的突出作用:
-
可视化数据密度:热力图通过
颜色
的渐变展示数据点的密度
。例如,在城市规划中,可以用热力图展示某区域内人口的分布密度,帮助决策者了解人口集中的地方。 -
突出热点区域:通过颜色的对比,热力图可以很直观地突出某些
热点区域
。例如,在商业分析中,可以用热力图展示某购物中心的顾客流量,找出最受欢迎的区域。 -
简化复杂数据:热力图能将复杂的、难以直接理解的数据变得一目了然。通过颜色的变化,用户可以迅速抓住数据的主要
趋势和特征
。 -
空间分析:热力图可以帮助进行
空间分析
,识别出特定区域的模式
和异常
。例如,在环境监测中,可以使用热力图展示空气质量或污染源分布,帮助环保部门采取措施。
在产品表达方面,热力图的意义在于:
-
提高用户体验:热力图可以使数据展示更加
直观
,用户无需复杂的分析就能迅速理解数据的核心信息。 -
支持决策:通过直观的可视化,热力图可以为用户提供有价值的
信息支持
,帮助他们做出更明智的决策
。 -
数据呈现的美观性:热力图色彩丰富,能够提升数据展示的
美观性
和吸引力
,使用户对产品的视觉体验更好。 -
增强互动性:许多热力图允许用户进行
交互操作
,例如放大、缩小、点击查看详细信息等,提高了产品的互动性和用户参与度。
综上所述,热力图在可视化场景中不仅能提升数据可视化的效果
,还能为用户提供更直观的分析工具
,帮助他们更好地理解和利用数据,做出快速应对和决策
。
数据类型
在开发热力图之前,我们首先要知道要用到什么样的数据类型
,下面我给出一个示例:
{"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编写,发布支持
es6
和umd
两种模式;
这个包的发起者是大佬
ONEGISER
,后来我在使用过程中有一点小问题,进行修改后与大佬沟通,然后顺理成章的成了开源的贡献者。
【组件源码】:https://github.com/cesium-plugin/cesium-heatmap-es6
【完整使用源码】:https://github.com/tingyuxuan2302/cesium-vue3-vite
如果开源对你有帮助,也希望点一个免费star
,支持作者持续开源。
有需要进技术产品开发交流群(可视化&GIS)可以加我:brown_7778(备注来意),也欢迎
数字孪生可视化领域
的交流合作。
最后,如果觉得文章对你有帮助,也希望可以一键三连👏👏👏,支持我持续开源和分享~