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代码库中进行以下更改:
修改msdrawvectorlayer(在mapdraw.cpp中)以在为特定层设置StyleItem时调用新方法(mslayerGetFeatureStyle)。
在maplayer.c中实现mslayerGetFeatureStyle,它将根据从层中检索到的实际样式格式调用msupdateStyleFromString、msupdateClassFromString或新方法msograpTestyleFromString。
修改msograplayergetautostyle(在mapogr.cpp中),并将样式初始化的大部分提取到单独的函数(msogrupdatestyle)中。我们将添加一个新函数(msogrupdatestylefromstring),在该函数中,将使用ogstylemgr::initstylestring而不是ogstylemgr::initfromfeature初始化样式管理器
修改(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样式字符串的情况下,可能无法正确呈现这些功能。
投票历史¶
史蒂文、丹尼尔、史蒂文、佩里克莱斯、阿塞法伊、法兰克、托马斯布、霍华德和塔马斯