MS RFC 108:动态热图(核密度估计)层¶
- 日期
2014/01
- 作者
托马斯堡
- 联系方式
- 作者
马修·库德特
- 联系方式
- 状态
采用
- 版本
MAPServer 7
- 最后更新
2014/02/13
1。动机¶
热图是在常规栅格网格上表示稀疏数据的常用方法,其中网格上的每个像素与其与稀疏数据集的每个样本之间的距离成反比。它们通常用颜色渐变来表示,其中色调编码数据样本的密度,还可以选择属性的强度。“heatmap”一词本身的含义各不相同;在本RFC的上下文中,我们将使用它来引用 Kernel Density Estimation 地图。

核密度估计图示例(SA维基百科提供的图像CC)¶
此RFC建议在栅格处理管道中添加一个矢量,将输入矢量源转换为1波段8位栅格,然后可以使用MapServer的本地栅格处理进行样式化。
2。建议增加¶
添加heatmap层需要对mapserver库进行以下主要更改:
为栅格层实现“kerneldensity”连接类型,其中连接指向另一个用作矢量数据源的 Mapfile 层或组-实际矢量到栅格转换的实现:
在1波段浮点位图数组中垂直累积
对具有可配置半径的位图应用高斯过滤
应用规范化将位图单元格缩放为8位
从8bit位图创建内存中的gdal数据源
扩展栅格范围支持,以允许热图颜色渐变通常需要的缺失功能:
允许多个范围(允许具有多个停止点的颜色渐变)
允许在HSL空间而不是RGB中进行颜色插值
解释颜色插值中的alpha值
2.1矢量到栅格操作¶
矢量到栅格的管道在处理带有 连接型内核密度. 此操作的输出是一个gdal数据源的句柄,然后该句柄可以由栅格处理代码的其余部分正常处理。
虽然可以设计一个更通用的API来处理这个矢量到栅格的管道,但最初的实现将分支到一个特定于heatmap的处理程序。对这种API的设计的思考可以推迟到需要其他矢量到栅格的转换时,为这个RFC的范围设计一个似乎还为时过早。
热tmap矢量到栅格采用以下参数:
连接“layer name”:引用要用作输入向量数据源的层的名称或组。名称优先,然后是minscale/maxscale与当前地图比例匹配的组中的第一层。引用的层可能是类型点层。其他图层类型将导致为输入要素的每个顶点添加一个样本。
处理“kerneldensity_radius=10”:高斯滤波器的半径(以像素为单位),以在所有功能累积后应用于位图阵列。值越大,计算过滤数据所需的CPU时间就越长。

半径设置为10像素的结果¶

半径设置为20像素的结果¶
处理“kerneldensity_compute_borders=on_off”:半径为“r”的内核不能应用于沿图像边界的“r”像素。默认情况下,将输入数据源的searchrect扩展到当前地图范围之外的特征“r”像素,以便计算出的热图扩展到结果图像的整个范围。如果平铺软件对其请求应用“r”像素的元缓冲,则可以在平铺时禁用此功能,以避免计算此额外信息的性能开销。
处理“kerneldensity_normalization=auto numeric”:如果设置为“auto”,则创建的栅格带将进行缩放,使其强度范围从0到255,以便完全跨越配置的颜色渐变。这种行为可能不可取(通常用于平铺),因为给定位置的像素的强度将根据当前地图请求的范围而变化。如果设置为数值,则样本将乘以给定值。由用户决定使用哪一个缩放值,因此生成的像素跨越整个0-255范围;确定该值主要是一个尝试和错误的过程。超出0-255范围的像素将被剪裁为0或255。

应用了固定比例。与之前的图像相比,红色区域的数量更多是因为所选的比例因子使大量像素超出了255限制。¶

应用较低的固定比例。没有像素达到255限制¶
2.2高级样本加权和过滤¶
默认情况下,每个特征的权重为1.0,生成的heatmap将表示向量特征的空间密度。如果这不是所需的行为,则可以在源向量层上使用常规类/样式语法,对一个特性逐个应用不同的权重。使用的权重将从匹配样式的大小值中读取。标准表达式和min/maxscaledenom适用;如果一个特性导致没有匹配的类和/或样式,它将被忽略并从生成的heatmap中丢弃。本文最后的例子给出了一些如何实现这一目标的例子。

当不应用样本加权或滤波时,代表纯特征密度的热图,实际的向量点被表示在旁边。(此RFC中的其他示例在每个样本上以属性权重呈现)¶
2.3栅格颜色渐变¶
添加的功能 MS RFC 6:连续特征值的颜色范围映射 对于矢量特征,由于扩展到支持栅格层,将进行扩展以支持更复杂的颜色渐变。请注意,这些添加将应用于所有栅格分类,而不仅仅是热图图层。
Support for multiple stops :栅格图层范围的实际支持仅限于单个颜色范围/数据范围。我们将支持多个范围以允许多个颜色停止,并且还将考虑可选的alpha值。下面的示例创建一个从完全透明的蓝色到蓝色的渐变(对于0到32之间的值),然后对于32到255之间的值创建蓝色到红色的渐变。
class style COLORRANGE "#0000ff00" "#0000ffff" DATARANGE 0 32 end style COLORRANGE "#0000ffff" "#ff0000ff" DATARANGE 32 255 end end
注解
每个像素值将使用一个样式块。用户应确保提供的数据范围从0到255,没有重叠,并且所选的颜色范围停止点从一个停止点到下一个停止点是连续的。
processing range_colorspace=rgb_hsl:当前范围支持在rgb空间的站点之间插入颜色,这通常会导致颜色被冲掉。插值可以在HSL空间中进行,这通常会导致需要的热图输出。

在RGB空间内插入时被冲掉的颜色¶
2.4 scaletoken添加¶
为了方便地根据实际的地图比例尺调整内核密度参数,实现了 MS RFC 86:基于比例的字符串替换 将被扩展以替换处理密钥中的令牌。请参阅本RFC末尾的示例,了解如何在heatmap上下文中使用它。
2.5向后兼容性¶
没有人预料到。在RGB空间中范围支持的行为是将颜色插值扩展到提供的数据范围之外(对于不跨越0-255的数据范围),而HSL插值的行为是将这些值视为节点数据。考虑到这种行为尚未正式形式化,可能需要修改RGB插值,使其行为相同。
2.6性能影响¶
高斯滤波器分配请求图像大小的两个临时浮点*位图,在边界计算被激活或未被激活的情况下,可以选择扩展。对于非常大的映像请求,这可能会导致大量的分配。高斯滤波的成本也取决于选择的半径,
2.7与切片的相容性¶
已添加启用平铺兼容输出的选项,并且在平铺时必须使用这些选项。不这样做 will 导致切片彼此不一致。
2.8 Mapfile 示例¶
map
size 1000 500
extent -180 -90 180 90
name "test heat"
imagetype "png"
web
metadata
"ows_srs" "epsg:4326 epsg:3857 epsg:900913"
"ows_enable_request" "*"
end
end
projection
"+init=epsg:4326"
end
layer
name "heatmap"
type raster
connectiontype kerneldensity
connection "points"
status on
processing "RANGE_COLORSPACE=HSL"
processing "KERNELDENSITY_RADIUS=20"
processing "KERNELDENSITY_ATTRIBUTE=VAL"
processing "KERNELDENSITY_COMPUTE_BORDERS=ON"
processing "KERNELDENSITY_NORMALIZATION=AUTO"
offsite 0 0 0
class
style
COLORRANGE "#0000ff00" "#0000ffff"
DATARANGE 0 32
end
style
COLORRANGE "#0000ffff" "#ff0000ff"
DATARANGE 32 255
end
end
end
layer
name "points"
status on
type POINT
data "pnts.shp"
end
end
加上 MS RFC 86:基于比例的字符串替换 处理尺度可以根据尺度动态设置内核半径。请注意,任何其他处理密钥都可以用相同的方法更新。在下面的示例中,1/1到1/25000000的核心半径为50像素,1/25000000及以下的核心半径为10像素:
layer
name "heatmap"
...
processing "KERNELDENSITY_RADIUS=%radius%"
SCALETOKEN
NAME "%radius%"
VALUES
"0" "50"
"25000000" "10"
END
END
...
end
通过在源向量层上使用class->style->size语法,可以对每个样本应用不同的权重:
从功能属性读取的权重:
layer name "points" status on type POINT data "pnts.shp" class style size [attribute] end end end
从非数字属性读取的权重:
layer name "points" status on type POINT data "pnts.shp" classitem "risk" class expression "high" style size 5 end end class expression "medium" style size 3 end end class expression "low" style size 1 end end end
三。其他¶
3.1审查期间的意见¶
建议使用256像素高度的静态(PNG)图像来定义栅格层中使用的颜色渐变,而不是使用class->style->colorrange。这允许使用标准图像处理软件更容易地可视化生成颜色渐变。
“radius”是影响所用过滤内核的唯一参数。提供一种方法来提供手工提供的内核是一个可行的添加。可能需要更多的讨论来确定适当的语法。
建议使用直线或多边形的质心作为结果采样点,而不是使用每个顶点。一旦支持所有可用的geomtransforms,就可以使用层级geomtransforms来获得结果。
建议使用手写公式来确定核半径和/或其他过滤参数。引入公式处理超出了此RFC的范围,可以通过在源向量层的class->style->size级别使用适当的scaleTokens和/或加权/过滤来实现类似的功能。
3.2投票历史¶
+1来自托马斯布、汤克、丹尼尔、史蒂文、塔马斯、斯蒂芬、迈克尔斯、佩林、杰夫姆、史蒂文和叶旺德沃塞纳