MS RFC 77:支持一个类中的多个标签对象

日期

2011/10/01

作者

史蒂夫·莱姆,托马斯·邦福特

联系

sdalime在comcast.net上,

状态

2011-12-15通过

版本

地图服务器6.2

1。概述

这个RFC建议允许在一个类中定义多个标签对象。在许多用例中,这是有价值的。

  • 在具有不同样式的标签下方添加文本,例如以斜体显示的替换名称。

  • 用多个防护罩和道路编号标记道路。

  • 支持在一个点周围放置许多值的复杂气象绘制。

目前,对这些用例的支持非常有限。基本上,您必须多次绘制层,并分别放置每段文本。这是低效的,不允许组标签冲突避免。

2。拟议技术变更

2.1核心对象变更

类对象将需要支持多个标签对象,其方式与它们支持多个样式的方式大致相同。实际上,实现将遵循StyleObj模式。

一个关键的要求是,额外的标签是独立的,也就是说,它们需要允许在labelobj中定义标签文本和条件显示。为此,我们建议在labelobj中添加以下属性:

  • 表达

  • 文本

这些属性的行为与它们的classobj等价物一样。此外,labelobj将扩展为多个属性,用于在标签缓存上下文中保存每个功能值。他们是:

  • labelText(要绘制的字符串)

  • labelpoly(边界框形状obj)

标签的labelText将按照以下顺序设置:

  • 标签文本(此RFC的新标签)

  • 类文本

  • 层标签项目

  • 形状文本

空的labelText值意味着不会呈现标签。

labelcachememberobj也需要更改。首先,它需要像当前支持的样式属性一样支持多个labelobj(见下面的点和多边形讨论)。还将添加一个标签计数器。因为要绘制的文本将包含在标签中,所以可以删除文本属性。

2.2标签呈现变化

2.2.1点和多边形标签

点和多边形特征的标记是基于单个计算的标签点完成的。一个ClassObj中的多个标签将作为一个组应用于一个标签点,即,必须成功放置所有标签文本,否则将不会绘制整个组。在这种情况下,可以使用一个新函数msaddlabelgroup()将类中的所有标签作为单个元素添加到标签缓存中。一组标签的边界形状将被视为避免碰撞计算的边界形状。

使用label->position和/或label->offset相对于标签点定位多个标签。

对于标签组,标签优先级将从类中定义的第一个标签开始。当分配标签labelText值(在缓存填充代码之外)时,将考虑比例阈值。超出比例的标签将设置labelText=null,并且不会绘制,尽管组中的其他标签可能是。

标签缓存冲突功能必须更新才能查看多个标签,尤其是查找重复文本的代码(标签->注意)。

2.2.2线标签

线条标签是另一回事。线条通常用于派生曲线文本、重复标签,有时两者都使用。在这种情况下,一个特性可能会为缓存贡献几十个标签。处理这些是不切实际的,因为我们将一个点或多边形与一个标签点。a更常见的用法是用多个名称或名称和标记/文本组合的组合来标记一行。因此,对于行标签,方法将是简单地使用现有的缓存设施,但添加一个循环来处理多个标签(如果可用)。

将来可能在某些情况下使用上面描述的标签分组,但这不在本工作的范围之内。

2.3MapScript

类对象将需要支持与样式相同的标签。目前,classobj支持以下方法:getStyle、insertStyle、removeStyle、moveStyleUp和moveStyleDown。我们建议为前三个添加标签等价物(标签顺序的导入程度不如样式顺序)。

还不清楚如何在mapscript中定义/操作类标签。在swig/mapscript中,标签标记为不可变。需要做进一步的工作来理解这是否代表回归。

三。实施细节

3.1。受影响的文件

将LIS有限公司变更为:

  • mapserver.h:核心结构更改

  • mapfile.c:读/写/初始化更改

  • mapdraw.c:对msdrawshape()和msdrawLabelCache()的重大更改

  • maplabel.c:对msaddlabel()的更改和msaddlabelgroup()的添加

  • maplayer.c:更改为mslayerwhichitems()以说明标签文本和表达式

  • maputil.c:对msbindLayerToShape()和msshapeGetAnotation()的更改

其他各种文件都会看到随着ClassObj从一个标签更改为多个标签而发生的微小更改。

3.2文件变更

Classobj的文档(标签0..n)和labelobj(文本和表达式)需要更新。mapscript文档将需要更改以记录新方法以及类和标签之间对象层次结构的更改。也必须更改mapfile xml文件。许多测试用例将添加到MapServer回归测试套件中-所有现有的标记测试都将继续有用。

3.3臭虫ID

4127。正在沙盒中进行工作(http://svn.osgeo.org/mapserver/sandbox/sdlime/rfc-77/)。

4配置示例

在其他文本下方添加可选文本:

LABELITEM 'item1'
CLASS
  ...
  LABEL # always displayed using LAYER:LABELITEM as a source for text
    FONT 'arial'
    ...
  END
  LABEL # conditionally displayed using LABEL:TEXT as a source for text
    EXPRESSION ('[item2]' ~ '.') # item2 has something in it
    FONT 'arial-italic'
    TEXT '[item2]'
    OFFSET 0 15
    ...
  END
END

5。向后兼容性

在mapfile级别,没有任何问题,现有的mapfile应该在不做任何更改的情况下运行。这可能会在mapscript中引入回归,尽管范围并不完全已知。

5.1与其他未解决的标签错误的关系

  • #1355-无,测试也有效,带有分组标签。

  • 2866——没有。

  • #2981-无。

  • 3009——没有。

  • #3044-这已经得到支持(票可以关闭)。

  • #3335-每个附加标签都支持样式。

  • #3675-这将由本投标邀请书解决。标签内容将由新的文本属性定义。

6.增强

虽然超出了这项工作的范围,但似乎有一些与分组标签的相对位置相关的有趣工作是可能的。例如,定义相对于上一个标签的位置而不是相对于标签点的位置可能很有用。

7。投票历史

2011年12月15日通过,史蒂文、丹姆、杰夫姆、托马斯布、史蒂文、豪沃德的+1。