MS RFC 11:支持曲线标签

日期

2006/02/09

作者

本杰森

联系

加利福尼亚州DigitalJunkies的Benjcarson

作者

史蒂芬石灰

联系

com.net上的石灰

状态

通过

概述

最常要求的特征之一是沿着线性特征的标签。此RFC描述了此功能的初始实现。

技术细节

建议的解决方案有几个主要目标:

  • 将几乎所有的计算和数据存储隔离到最少数量的函数和结构中。

  • 轻松集成到现有的labelcacheobj结构和标签缓存处理例程中。

一个新的函数msPolyLineLabelPath()是这个新功能的唯一计算函数。与现有的mspolyLineLabelPoint()函数一样,它采用输入功能和注释字符串,并计算标签位置。但是,它不计算单个点(和可选的角度),而是为注释字符串中的每个字符计算标签点和角度。计算结果返回到一个名为“labelpathobj”的新结构中,该结构如下:

typedef struct {
  multipointObj path;
  shapeObj bounds;
  double *angles;
} labelPathObj;

如果曲线标签不适合所讨论的功能,则函数将返回空值,因此可以进行传统的标记(例如,如果功能只有2个点,则不需要曲线标签)。曲线标签的边界多边形也将在此函数中计算并存储在LabelPathObj结构的“边界”成员中。

为了将labelpathobj放入标签缓存中,需要做两件事:

  • 扩展labelcachememberobj以可选地引用labelpathobj

  • 除了函数msaddlabel已经接受的参数外,还扩展函数msaddlabel以获取labelpathobj

由于每个labelpathobj都将包含弯曲标签的边界,因此它将准备好与现有标签缓存呈现代码一起使用。

标签缓存呈现的唯一附加功能是检测何时应呈现文本路径而不是传统标签的代码。必须编写用于呈现文本路径的特定于驱动程序的代码,但一般来说,这很简单,只需要为路径中的每个字符调用一次普通的文本呈现代码。

映射文件含义

提出了简单地扩展labelobj角参数。目前它需要一个角度(以度数表示)或关键字auto。我们建议添加对关键字follow的支持。这将把新的labelobj成员angle follow设置为ms_true(如果弯曲标签不合适,还将angle auto ms_true设置为angle follow意味着angle auto)。

支持非GD渲染器

目前,所有MapServer输出渲染都使用标签缓存的内容,这基本上是不可知的。情况不会再这样了。支持曲线标签所需的位置计算确实利用了从gd/freetype接口派生的字体度量。SWF、PDF和SVG渲染很有可能利用甚至基于GD的曲线标签,但最好将其视为此实现中仅限于栅格的输出功能。如果未来开发了对其他渲染器的字体度量支持,则可以轻松扩展此功能以支持它们。

缺陷追踪系统

已设置bug 1620以跟踪此功能添加。

投票历史

+1:酸橙、阿塞法、纳西诺干酪、温热丹干酪、莫里塞特干酪