MS RFC 108:动态热图(核密度估计)层

日期

2014/01

作者

托马斯堡

联系

tbonfort@terriscope.fr

作者

马修·库德特

联系

mathieu.coudert@gmail.com

状态

采用

版本

MAPServer 7

最后更新

2014/02/13

1。动机

热图是在常规栅格网格上表示稀疏数据的常用方法,其中网格上的每个像素与其与稀疏数据集的每个样本之间的距离成反比。它们通常用颜色渐变来表示,其中色调编码数据样本的密度,还可以选择属性的强度。“heatmap”一词本身的含义各不相同;在本RFC的上下文中,我们将使用它来引用 Kernel Density Estimation 地图。

../../_images/heatmap-wikipedia.png

核密度估计图示例(SA维基百科提供的图像CC)

此RFC建议在栅格处理管道中添加一个矢量,将输入矢量源转换为1波段8位栅格,然后可以使用MapServer的本地栅格处理进行样式化。

2。建议增加

添加heatmap层需要对mapserver库进行以下主要更改:

  • 为栅格层实现“kerneldensity”连接类型,其中连接指向另一个用作矢量数据源的映射文件层或组-实际矢量到栅格转换的实现:

    • 在1波段浮点位图数组中垂直累积

    • 对具有可配置半径的位图应用高斯过滤

    • 应用规范化将位图单元格缩放为8位

    • 从8bit位图创建内存中的gdal数据源

  • 扩展栅格范围支持,以允许热图颜色渐变通常需要的缺失功能:

    • 允许多个范围(允许具有多个停止点的颜色渐变)

    • 允许在HSL空间而不是RGB中进行颜色插值

    • 解释颜色插值中的alpha值

2.1矢量到栅格操作

矢量到栅格的管道在处理带有 连接型内核密度. 此操作的输出是一个gdal数据源的句柄,然后该句柄可以由栅格处理代码的其余部分正常处理。

虽然可以设计一个更通用的API来处理这个矢量到栅格的管道,但最初的实现将分支到一个特定于heatmap的处理程序。对这种API的设计的思考可以推迟到需要其他矢量到栅格的转换时,为这个RFC的范围设计一个似乎还为时过早。

热tmap矢量到栅格采用以下参数:

  • 连接“layer name”:引用要用作输入向量数据源的层的名称或组。名称优先,然后是minscale/maxscale与当前地图比例匹配的组中的第一层。引用的层可能是类型点层。其他图层类型将导致为输入要素的每个顶点添加一个样本。

  • 处理“kerneldensity_radius=10”:高斯滤波器的半径(以像素为单位),以在所有功能累积后应用于位图阵列。值越大,计算过滤数据所需的CPU时间就越长。

../../_images/heatmap-hsl-10.png

半径设置为10像素的结果

../../_images/heatmap-hsl.png

半径设置为20像素的结果

  • 处理“kerneldensity_compute_borders=on_off”:半径为“r”的内核不能应用于沿图像边界的“r”像素。默认情况下,将输入数据源的searchrect扩展到当前地图范围之外的特征“r”像素,以便计算出的热图扩展到结果图像的整个范围。如果平铺软件对其请求应用“r”像素的元缓冲,则可以在平铺时禁用此功能,以避免计算此额外信息的性能开销。

  • 处理“kerneldensity_normalization=auto numeric”:如果设置为“auto”,则创建的栅格带将进行缩放,使其强度范围从0到255,以便完全跨越配置的颜色渐变。这种行为可能不可取(通常用于平铺),因为给定位置的像素的强度将根据当前地图请求的范围而变化。如果设置为数值,则样本将乘以给定值。由用户决定使用哪一个缩放值,因此生成的像素跨越整个0-255范围;确定该值主要是一个尝试和错误的过程。超出0-255范围的像素将被剪裁为0或255。

../../_images/heatmap-hsl-fix-scale.png

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

../../_images/heatmap-hsl-fix-scale2.png

应用较低的固定比例。没有像素达到255限制

2.2高级样本加权和过滤

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

../../_images/heatmap-hsl-density.png

当不应用样本加权或滤波时,代表纯特征密度的热图,实际的向量点被表示在旁边。(此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,没有重叠,并且所选的颜色范围停止点从一个停止点到下一个停止点是连续的。

  • 处理范围_colorspace=rgb_hsl:

../../_images/heatmap-rgb.png

在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问题跟踪ID

https://github.com/MapServer/MapServer/pull/4857

3.2投票历史

+1来自托马斯布、汤克、丹尼尔、史蒂文、塔马斯、斯蒂芬、迈克尔斯、佩林、杰夫姆、史蒂文和叶旺德沃塞纳