MS RFC 6:连续特征值的颜色范围映射

日期

2005/09/27

作者

比尔宾科

联系

宾科网的账单

状态

提出

描述:此建议解决了需要能够轻松地将连续的特征值映射到连续的颜色范围。这个RFC是围绕Bug 1305的讨论(以及我对该讨论的解释)的结果。

已经在MapServer 4.6+上应用了一个初步补丁(在RFC过程到位之前),但是,对于所使用的格式几乎没有共识,也不支持为使用颜色范围的类正确显示图例。

背景

这项工作始于我创建的一个补丁,它能够快速地可视化具有大量值的数据。特别是,我希望绘制出房地产价值图,以及各种可能具有大范围价值的比率。对我来说,这样做的自然方法是设置一个最大值、一个最小值以及那些映射到的颜色。我写的补丁让mapserver为每个功能的值做一个线性内插到那个颜色范围。

此功能的初始语法只向样式块添加了5个新关键字,如下所示:

STYLE
  COLOR 60 60 60
  MINCOLOR 0 0 0
  MAXCOLOR 255 255 0
  MINVALUE 0.0
  MAXVALUE 300000.0
  GRADIENTITEM "sale_price"
END

经过一些讨论,术语梯度被证明是有问题的。此外,新关键词的数量似乎很高。经过一些讨论,语法改成了这种格式:

STYLE
  COLORRANGE 0 0 0  255 255 0 # black to yellow
  DATARANGE 0.0 100.0
  RANGEITEM "foobar"
END

虽然这仍然只是一个样式下的一组关键字,但它看起来更简单,现在正在MapServer4.6分支中工作。

当前语法问题

一些人指出,当前的语法可以通过以下方式加以改进:

  1. 将新关键字移动到块中

  2. 添加使用插值类型的方法关键字(“线性”是第一个定义的类型,“对数”是第二个潜在类型等)。

  3. 添加一个interval关键字,该关键字将限制互操作前舍入值实际使用的颜色数。

  4. 将所有关键字移出样式块。

  5. 允许单独定义颜色范围,以便重复使用

建议的新语法

为了满足上述需求,我建议使用以下新的块语法:

COLORRANGE
  RANGEITEM 'itemname' #required
  MINCOLOR 0 0 0 #optional - default = Black
  MAXCOLOR 255 255 0 #optional -default = White
  MINVALUE 0.0 #optional - default = 0
  MAXVALUE 100.0 #optional - default = 1
  INTERVALS 10 #optional - default = 0 (unlimited)
  METHOD LINEAR #optional - default = 'LINEAR'
END

我建议这个街区住在阶级一级。我将它放在类中而不是层(或更高)级别的原因如下:

  1. 类是可以定义图例项的最低级别(通过使用命名类)

  2. 允许将多个色带应用于一个图层(即红色->黄色和黄色->绿色,以形成相邻的Reg->黄色->绿色)。

  3. 允许单独突出显示“越界”值(使用不同的类)。

(如果我们希望在OutlineColor上提供此功能,那么我建议创建一个格式相同的OutlineColorRange块。)

注意:我对这里的所有关键字名称和格式都很灵活(并且一直如此)。然而,考虑到围绕这件事的讨论,我想我应该把一个草人放起来,从这里开始。

建议的图例格式

我张贴了一个我认为传奇应该如何看待的模型

https://github.com/MapServer/MapServer/issues/324

该格式只更改图例的高度(已经是动态的),因此它不应具有主要的布局含义。(在实现过程中,对颜色条的高度进行吹毛求疵。)

我还没有启动Legend支持,希望在这方面有所帮助。但是,我相信这很简单,如果没有志愿者,我会自己做。

MapScript问题

正如SeanGillies在讨论中提到的,这应该作为一个类封装在mapscript中。虽然我不同意他把它放在层上(见上文),但他的其他建议似乎都是正确的。

我建议使用一个名为colorramp的类,它具有以下读/写属性:

Color minColor
Color maxColor
double minValue
double maxValue
String rangeItem
String method
int intervals

两种方法

Color findColor(double value)
double findValue(Color color)

颜色渐变可以通过适当的构造函数或通过ClassObj对象上的新(读/写)属性获得:

ColorRange colorRange

注意:我需要帮助将这些添加到mapscript中,因为我没有很好地完成这项工作的swig经验。

受影响的文件

随着RFC的发展,我将更新这个列表,但现在,我看到的是:

  • mapfile.h=>更改关键字

  • maplexer.l=>更改关键字

  • mapfile.c=>处理新关键字

  • mapscript/swiginc/*.i=>各种接口修改,以满足上述要求

  • maplegend.c=>添加新的图例支持

  • mapdraw.c=>更新现有的颜色范围代码以使用新的关键字和添加间隔和对数方法

向后兼容性问题

现在,某些代码要求在要显示的任何层上设置颜色属性。要么这需要改变,要么我们必须决定这意味着什么,如果一个颜色和一个颜色范围都被定义。一个选项是对超出范围的任何值使用颜色。

多种映射方法

该系统将允许尽可能少的努力添加新的颜色映射方法。如果一个新的颜色映射方法只使用这个RFC定义的关键字,它应该是一个简单的如下:

  1. 使用签名实现函数

int mappingFn(colorRangeObj\* range, shapeObj\* shape, colorObj \*color)

This function should use the shape and range parameters to determine the
shapes color, and modify the color parameter accordingly.
  1. 选择一个唯一的方法名(“Linear”、“对数”、“Discrete”)修改方法msmapColorRamp(),以便在颜色范围定义中找到其方法名时调用其方法。

备注

msmapolorramp()方法是使用if/then逻辑还是通过函数指针分派,稍后可以确定。目前,我认为最简单的方法是将所有映射逻辑+所有当前方法移动到mapcolorrange.c文件中。

臭虫识别码

目前,https://github.com/MapServer/MapServer/issues/1305正在对此进行跟踪

投票历史

没有