MS RFC 61:增强MapServer功能样式支持

日期

2010/09/11

作者

塔玛斯塞克勒斯

联系

gmail.com上的szekerest

状态

通过(2010/09/29实施,增加文件)

描述:这个RFC提出了一个通用的实现来呈现从各种数据源中检索到的特征样式。在这方面,我们打算增强现有的样式项选项,该选项现在可以为所有层类型指定,而不限于OGR驱动程序。

背景

目前,只有OGR驱动程序支持呈现附加到OGR数据源中某个功能的样式。理论上,只有少数数据源支持存储样式和功能(如mapinfo、autocad dxf、microstation dgn),但是,通过使用ogr2ogr sql选项,可以将这些样式作为单独的属性轻松传输到许多其他数据源,如下所示:

ogr2ogr -sql "select *, OGR_STYLE from srclayer" "dstlayer" "srclayer"

作为传输的结果,ogr样式字符串作为一个单独的属性添加到目标层。我们还可以根据以下示例在传输过程中重命名此属性:

ogr2ogr -sql "select *, OGR_STYLE as mystyleattribute from srclayer" "dstlayer" "srclayer"

目前,以这种方式传输的样式字符串只能由mapserver ogr驱动程序呈现,但是对于mapserver中的所有层类型实现这种选项是合理的。

建议的新语法

这个RFC不会改变样式项“auto”选项的当前行为,这会导致像以前一样调用驱动程序特定的layerGetAutoStyle vtable方法。如果驱动程序未实现layerGetAutoStyle,则会向用户提供一条错误消息:“此数据源不支持”styleitem auto“。

但是,我们将添加对指定包含样式字符串的feature属性的支持,格式为:styleitem“mystyleattribute”,它将告诉mapserver以通用方式从指定的属性初始化样式。

支持的样式表示

我们将实现对当前mapserver和ogr特定样式表示的支持。

mapserver样式表示遵循mapfile格式中样式和类条目的语法,如下示例:

"STYLE BACKGROUNDCOLOR 128 0 0 COLOR 0 0 208 END"

通过指定整个类而不是单个样式,可以基于每个要素使用更多选项(如设置表达式、标签属性、多个样式)。

除了mapserver样式外,还将支持OGR样式字符串格式,如以下文档中所述:https://gdal.org/user/OGR_feature_style.html

实际的样式格式将在运行时根据样式字符串的第一个字符进行标识。此解决方案将允许在同一层中指定多个样式格式。

实施细节

为了实现此增强,应在MapServer代码库中进行以下更改:

  1. 修改msdrawvectorlayer(在mapdraw.cpp中)以在为特定层设置StyleItem时调用新方法(mslayerGetFeatureStyle)。

  2. 在maplayer.c中实现mslayerGetFeatureStyle,它将根据从层中检索到的实际样式格式调用msupdateStyleFromString、msupdateClassFromString或新方法msograpTestyleFromString。

  3. 修改msograplayergetautostyle(在mapogr.cpp中),并将样式初始化的大部分提取到单独的函数(msogrupdatestyle)中。我们将添加一个新函数(msogrupdatestylefromstring),在该函数中,将使用ogstylemgr::initstylestring而不是ogstylemgr::initfromfeature初始化样式管理器。

  4. 修改(maplayer.c)中的mslayerwhichitems以检索包含在StyleItem参数中指定的样式字符串的属性。通过使用样式项“auto”,不会像以前那样检索其他属性。

MapScript问题

不需要修改mapscript接口,因为StyleItem参数已经公开。然而,这个属性现在将支持样式属性的名称,而不仅仅是“auto”值。

受影响的文件

要实现该解决方案,需要更改以下文件:

  • mapserver.h=>添加mslayerGetFeatureStyle和msograpTestyleFromString的声明

  • mapogr.cpp=>添加msogrupdatestylefromstring和msogrupdatestyle

  • maplayer.c=>修改mslayerwhichitems并实现mslayerGetFeatureStyle

  • mapdraw.c=>除了调用mslayerGetAutoStyle之外,还调用mslayerGetFeatureStyle

向后兼容性问题

当前“styleitem”auto“仅在OGR驱动程序中实现,该驱动程序用自定义实现覆盖layerGetAutoStyle。由于通用实现不会影响那些提供自定义自动样式实现的驱动程序,因此这种行为将继续像以前那样工作。

当使用“styleitem”mystyleattribute“设置时,我们提供了一个通用的实现来直接从feature属性设置样式,并且不会调用驱动程序特定的函数。此选项将以相同的方式适用于所有驱动程序。

进一步考虑

将来,除了mapserver和ogr样式的字符串之外,我们还可以提供进一步的样式表示支持。每个新的表示形式都需要一个适当的(快速的)方法来从样式字符串本身识别格式。

使用ogr样式格式将需要在中编译ogr驱动程序。如果我们在不支持ogr的情况下编译mapserver,并且使用了“styleitem”mystyleattribute“选项,则在实际样式格式为ogr样式字符串的情况下,可能无法正确呈现这些功能。

臭虫识别码

这里可以找到RFC-61(包含实现)的票据。

错误3544

投票历史

+史蒂文、丹尼尔、史蒂文、佩里克莱斯、阿塞法伊、法兰克、托马斯布、霍华德和塔马斯各1人。