繁体   English   中英

Azure 带加权热量的地图控制 Map 图层

[英]Azure Maps Control With Weighted Heat Map Layer

我正在使用 Azure 地图创建一个 web 页面,上面有一个 Heat Map。

我有热量 map 成功拉入点并显示,但我需要更改它的渲染方式。

具体来说,我的热量 map 需要基于某个区域的时间长度 - 这可以通过查看我的数据点上的时间戳来完成。 关于如何使用类似日期时间的值在热 map 层中完成此操作的任何想法?

HeatMapLayer class 有一个名为weight的选项,它可以采用数据驱动的样式表达式,提供 0 到 1 之间的数字来指示权重。 在您的情况下,您正在使用时间戳,因此您首先要确定最小值和最大值的时间范围应该是什么。 如果您的时间戳是字符串,您应该在将数据添加到数据源之前循环遍历数据并计算数据的 integer 值并将其存储为功能中的属性(即time )。 例如: new Date('2022-2-14T03:24:00').getTime()

例如,您可能希望最大值为当前分钟 (0ms) 内发生的任何事情,最小值发生在 15 分钟 (900,000ms) 或更早的任何事情上。 然后,您可以组合一个公式,利用 integer 日期来获得 0 和 1 之间的标量值。这是使用普通 JavaScript 的数学运算:

var timeRange = 900000; //15 minutes
var now = Date.now();
var time = new Date('2022-2-14T03:24:00').getTime();

//Calculate the time offset and snap to the 0 to 15 minute range.
var dt = Math.max(0, Math.min(timeRange, now - time))

//We want the inverse weight since smaller dt should be higher. Thus 1 minus ratio.
var weight = 1 - dt/timeRange;

然后可以将其转换为数据驱动表达式,并在热 map 层选项中设置为权重值。

var timeRange = 900000; //15 minutes
var now = Date.now();
 
map.layers.add(new atlas.layer.HeatMapLayer(datasource, null, {
    weight: ['-', 1, ['/', ['max', 0, ['min', ['-', now, ['get', 'time']], timeRange]], timeRange]]timeRange]]
}), 'labels');

如果您想定期更新now的值,您可以重建表达式并使用setOptions function 更新热度 map。例如;

var timeRange = 900000; //15 minutes

function getWeightExp(){
    var now = Date.now();
    return ['-', 1, ['/', ['max', 0, ['min', ['-', now, ['get', 'time']], timeRange]], timeRange]];
}

//Create heatmap layer.
var heatMap = new atlas.layer.HeatMapLayer(datasource, null, {
    //Set weight option.
    weight: getWeightExp()
});

//Add the heatmap to the map.
map.layers.add(heatMap, 'labels');

//Set an update frequency. In this case once a minute.
setTimeout(function() {
    heatMap.setOptions({
        weight: getWeightExp()
    });
}, 60000);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM