在地图上创建热力图的方法

Posted ThingJS优锘

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在地图上创建热力图的方法相关的知识,希望对你有一定的参考价值。

热力图,是以特殊高亮的形式显示在地理区域的图示。通过颜色变化程度,可以直观反应出热点分布,区域聚集等数据信息。地图中的热力图就是把地图和热力图进行结合,实现在地图中进行热力图的显示。 热力图分析的本质——点数据分析。一般来说,点模式分析可以用来描述任何类型的事件数据, 因为每一事件都可以抽象化为空间上的一个位置点。通过点数据来分析隐藏在数据背后的规律。通过分析,可以使点数据变为点信息,可以更好地理解空间点过程,可以准确地发现隐藏在空间点背后的规律。热力图中点聚集分布,为分析提供了无限可能。 ThingJS能够快速实现在地图中添加热力图图层,左侧面板可对热力图各种参数进行调整。 热力图实现过程就是通过简单的数学变化,将离散的点信息映射到最终图像上的过程。从地图上看热力图,都是一个个离散点信息,引入地图组件脚本map,作为最终热力图像产生影响的区域。将所有离散点Map进行叠加,产生一幅灰度图像。离散点密度越高的地方,灰度图中像素点数值越高,即图像越亮。 完整代码如下:
var app = new THING.App();
 app.background = [0, 0, 0];
 
 // 引用地图组件脚本
 THING.Utils.dynamicLoad([\'https://www.thingjs.com/uearth/uearth.min.js\'], function () {
 
     var map = app.create({
         type: \'Map\',
         style: {
             night: false
         },
         attribution: \'高德\'
     });
 
     var tileLayer1 = app.create({
         type: \'TileLayer\',
         id: \'tileLayer1\',
         url: \'https://webst0{1,2,3,4}.is.autonavi.com/appmaptile?style=6&x={x}&y={y}&z={z}\'
     });
     map.baseLayers.add(tileLayer1);
     drawGeoHeatMap();
 
     var gradientObj = {
         \'常规\': { 0: \'rgb(0,0,255)\', 0.33: \'rgb(0,255,0)\', 0.66: \'rgb(255,255,0)\', 1.0: \'rgb(255,0,0)\' }
         , \'黄色\': { 0: \'rgb(255,237,160)\', 0.33: \'rgb(254,217,118)\', 0.66: \'rgb(227,26,28)\', 1.0: \'rgb(189,0,38)\' }
         , \'蓝色\': { 0: \'rgb(8,104,172)\', 0.33: \'rgb(67,162,202)\', 0.66: \'rgb(100,200,200)\', 1.0: \'rgb(186,228,188)\' }
     };
     var panel = new THING.widget.Panel({
         titleText: \'热力图设置\',
         hasTitle: true,
         width: 250
     });
 
     var config = {
         mosaic: false,
         needsUpdate: true,
         mosaicSize: 5,
         radius: 11,
         minOpacity: 0.2,
         maxOpacity: 0.8,
         gradient: \'常规\',
     };
 
     panel.addBoolean(config, \'mosaic\').caption(\'开启马赛克\').onChange(v => {
         app.query(\'.HeatMapLayer\')[0].renderer.mosaic = v;
     });
     panel.addBoolean(config, \'needsUpdate\').caption(\'随相机变化更新\').onChange(v => {
         app.query(\'.HeatMapLayer\')[0].needsUpdate = v;
     });
     panel.addNumberSlider(config, \'radius\').caption(\'热度半径\').min(1).max(50).isChangeValue(true).on(\'change\', function (v) {
         app.query(\'.HeatMapLayer\')[0].renderer.radius = v;
     });
     panel.addNumberSlider(config, \'minOpacity\').caption(\'最小值透明度\').step(0.01).min(0).max(1.0).isChangeValue(true).on(\'change\', function (v) {
         app.query(\'.HeatMapLayer\')[0].renderer.minOpacity = v;
     });
     panel.addNumberSlider(config, \'maxOpacity\').caption(\'最大值透明度\').step(0.01).min(0).max(1.0).isChangeValue(true).on(\'change\', function (v) {
         app.query(\'.HeatMapLayer\')[0].renderer.maxOpacity = v;
     });
     panel.addRadio(config, \'gradient\', [\'常规\', \'黄色\', \'蓝色\']).on(\'change\', function (v) {
         app.query(\'.HeatMapLayer\')[0].renderer.gradient = gradientObj[v];
     });
 
     //创建热力图 数据源的格式与FeatureLayer相同
     //valueField代表用来生成热力图使用的权重字段,不传的话所有点的权重相同,如果传则从数据的properties中读取该字段的值作为权重值
     function drawGeoHeatMap() {
         $.ajax({
             type: \'GET\',
             url: \'https://www.thingjs.com/uearth/res/beijing-POIs-3211.geojson\',
             dataType: \'json\',
             success: function (data) {
 
                 // 摄像机飞行到某位置
                 app.camera.flyTo({
                     \'position\': [2180781.194387175, 4091480.6054394436, 4392164.618219831],
                     \'target\': [2175757.1660447326, 4092209.551760269, 4381641.899891754],
                     \'time\': 2000,
                     \'complete\': function () {
                         var layer = app.create({
                             type: \'HeatMapLayer\',
                             dataSource: data, //数据源 geojson格式
                             valueField: config.valueField, //权重字段
                             needsUpdate: config.needsUpdate, //是否随相机的变化重新绘制热力图
                             renderer: {
                                 radius: config.radius, // 影响半径
                                 minOpacity: config.minOpacity,//最小值的透明度
                                 maxOpacity: config.maxOpacity,//最大值的透明度
                                 mosaic: config.mosaic,//是否使用马赛克效果
                                 mosaicSize: config.mosaicSize,//马赛克效果的像素值
                                 gradient: gradientObj[config.gradient] //色带
                             },
                         });
                         map.addLayer(layer);
                     }
                 });
             }
         });
     }
    

以上是关于在地图上创建热力图的方法的主要内容,如果未能解决你的问题,请参考以下文章

R语言绘图:在地图上绘制热力图

高德热力图在哪里看

ArcGIS JS API :热力图不同级别下的优化方法

热力图在数据可视化中的应用|大简学苑

高德热力图怎么打开

对于百度地图新推出的热力图,国内外是不是有其他类似的产品