标记

本节讨论通过标准SLD选项控制标签放置的详细信息。它还描述了一些地理服务器增强的标签放置选项,这些选项提供了更好的地图输出。

LabelPlacement

SLD规范定义了两种可用于 <LabelPlacement> 元素:

  • <PointPlacement> 将标签放置在单个点上

  • <LinePlacement> 沿直线放置标签

PointPlacement

什么时候? <PointPlacement> 是否使用该几何图形在单个 标签点 .对于线条,此点位于线条可见部分的中间。对于多边形,点是多边形可见部分的质心。标签相对于标签点的位置可以由以下子元素控制:

Element

Description

<AnchorPoint>

确定标签相对于标签点的位置。以0-1之间的小数形式给出的值。

<Displacement>

从定位点偏移标签。以像素为单位给出的值。

<Rotation>

按给定的度数顺时针旋转标签。

解释这些选项的最好方法是举例。

AnchorPoint

定位点确定标签相对于标签点的放置位置。

<AnchorPoint>
  <AnchorPointX>
    0.5
  </AnchorPointX>
  <AnchorPointY>
    0.5
  </AnchorPointY>
</AnchorPoint>

此处作为(x,y)顺序对列出的定位点值是相对于标签的边界框指定的,值从0到1(含0到1)。例如:

  • (默认) 框的左下角是(0,0)

  • 右上角是(1,1)

  • 中心是(0.5,0.5)

因此,要使定位点位于标签正下方(标签顶部居中),请使用(0.5,0):

<AnchorPoint>
  <AnchorPointX>
    0.5
  </AnchorPointX>
  <AnchorPointY>
    0
  </AnchorPointY>
</AnchorPoint>
../../../_images/label_bbox.png

以下示例显示更改定位点如何影响标签的位置:

../../../_images/point_x0y0_5.png

(0,0.5)将标签放置在标签点的右侧

../../../_images/point_x0_5y0_5.png

(0.5,0.5)将标签的中心放置在标签点

../../../_images/point_x15y0_5.png

(1,0.5)将标签放置在标签点的左侧

../../../_images/point_x0_5y0.png

(0.5,0)将标签水平居中放置在标签点上方

取代

位移允许精细控制标签的位置。位移值将标签从定位点的位置偏移指定数量的像素。元素语法为:

<Displacement>
  <DisplacementX>
     10
  </DisplacementX>
  <DisplacementY>
      0
  </DisplacementY>
</Displacement>

实例:

../../../_images/point_x0y0_5_displacex10.png

Displacement of X=10 pixels (compare with default anchor point of (X=0, Y=0.5) shown above)

../../../_images/point_x0y1_displacey10.png

Displacement of Y=-10 pixels (compare with anchor point (X= 0.5, Y=1.0) - not shown)

旋转

可选的 <Rotation> 元素指定标签应按给定度数顺时针旋转

<Rotation>
  45
</Rotation>

下面的例子说明了旋转如何与锚定点和位移相互作用。

../../../_images/rot1.png

45度旋转

../../../_images/rot2.png

45 degree rotation with anchor point (X=0.5, Y=0.5)

../../../_images/rot3.png

45 degree rotation with 40-pixel X displacement

../../../_images/rot4.png

45 degree rotation with 40-pixel Y displacement with anchor point (X=0.5, Y=0.5)

LinePlacement

要标记线性特征(如道路或河流),请 <LinePlacement> 无法指定元素。这表明样式器应该确定标签沿直线的最佳位置和旋转。

标准的sld lineplacement元素提供了一个可选的子元素, <PerpendicularOffset> .geoserver通过特定于供应商的选项对行标签的放置提供了更多的控制;有关详细信息,请参阅下面的内容。

PerpendicularOffset

可选的 <PerpendicularOffset> 元素允许您将标签放置在线条的上方或下方。(这类似于 <DisplacementY> 用于上述标签点。)位移值以像素为单位指定。正值向上置换,负值向下置换。

<LabelPlacement>
  <LinePlacement>
    <PerpendicularOffset>
       10
    </PerpendicularOffset>
  </LinePlacement>
</LabelPlacement>

实例:

../../../_images/lp_1.png

PerpendicularOffset = 0 (default)

../../../_images/lp_2.png

PerpendicularOffset = 10

从多个属性组合标签

这个 <Label> 中的元素 <TextSymbolizer> 允许混合内容。这意味着它的内容可以是纯文本和 Filter Expressions .这种混合被认为是一种连接。您可以利用它从多个属性中创建复杂的标签。

例如,如果希望州名及其缩写出现在标签中,可以执行以下操作:

<Label>
  <ogc:PropertyName>STATE_NAME</ogc:PropertyName> (<ogc:PropertyName>STATE_ABBR</ogc:PropertyName>)
</Label>

你会得到一个标签,看起来像 Texas (TX) .

如果您需要添加额外的空白区域或换行符,您将遇到一个XML怪事。label元素中的空白处理遵循一个名为“collapse”的XML规则,其中必须删除所有前导和尾随空白,而XML元素中间的所有空白(和换行符)都折叠成一个空白。

那么,如果需要在属性名之间插入换行符或两个或多个空格的序列呢?输入CDATA。CDATA是一个特殊的XML部分,必须按原样返回给解释器,而不遵循任何空白处理规则。例如,如果你想让州缩写放在下一行,你可以使用以下内容:

<Label>
  <ogc:PropertyName>STATE_NAME</ogc:PropertyName><![CDATA[
]]>(<ogc:PropertyName>STATE_ABBR</ogc:PropertyName>)
</Label>

地理服务器增强选项

geoserver提供了许多标签样式选项作为SLD规范的扩展。使用这些选项可以更好地控制地图的外观,因为SLD标准没有足够的表现力来提供所有可能需要的选项。

这些选项被指定为 <TextSymbolizer> .

优先级标签

可选的 <Priority> 元素允许指定标签优先级。这控制在渲染期间如何解决标签之间的冲突(重叠)。元素内容可以是 expression 检索或计算图层中每个要素的相对优先级值。或者,内容可以是一个常量值,以设置层标签相对于渲染地图上其他层的优先级。

标签的默认优先级为1000。

备注

标准SLD冲突解决方案

如果 <Priority> 元素不存在,或者如果一组标签都具有相同的优先级,则使用标准SLD标签冲突解决方案。在此策略下,从一组冲突标签中显示的标签基本上是随机选择的。

例如,以下列城市数据集为例:

City Name   | population
------------+------------
Yonkers     |     197,818
Jersey City |     237,681
Newark      |     280,123
New York    |   8,107,916
../../../_images/priority_all.png

城市位置(大比例尺地图)

知道纽约市的人比知道泽西市的人多。因此,我们希望给予“纽约”标签优先权,以便在与(重叠的)“泽西市”发生冲突时可以看到它。为此,我们在 <TextSymbolizer>

<Priority>
    <ogc:PropertyName>population</ogc:PropertyName>
</Priority>

这确保了在小范围内,纽约的标签优先于附近人口较少的城市:

../../../_images/priority_some.png

城市位置(小比例尺地图)

没有优先标签,泽西市可以优先于纽约,使其难以解释地图。在显示许多特征的尺度上,优先级标签对于确保大城市比小城市更容易被看到是至关重要的。

../../../_images/priority_lots.png

分组功能(组)

这个 group 选项允许为逻辑组中的多个功能显示单个标签。

<VendorOption name="group">yes</VendorOption>

分组的工作原理是收集具有相同标签文本的所有特征,然后根据以下规则为组选择代表性几何图形:

Geometry

标签点

点集

使用视图矩形内的第一个点。

线条集

线条连接在一起,裁剪到视图矩形,并使用最长路径。

多边形集

多边形被剪切到视图矩形,并使用最大的多边形。

如果需要,可以通过指定 标签组 选择权。

警告

请注意,标签确实指示了应组合在一起的功能。例如,单独对城市名称分组可能最终创建一个包含两个城市名称的组 巴黎 (法国)和 巴黎 (德克萨斯州)。

道路数据是一个典型的例子,用来说明为什么分组是有用的。通常只需要为所有“主要街道”显示一个标签,而不是为每个“主要街道”块显示一个标签。

group 选项为“关闭”(默认),不执行分组,并且每个块功能都被标记(取决于标签取消冲突):

../../../_images/group_not.png

group 使用选项时,将具有相同标签的几何图形组合在一起,并从整个组中确定标签位置。这将产生一个更不杂乱的地图:

../../../_images/group_yes.png

标签组

这个 labelAllGroup 选项可以与 group 选项(参见 分组功能(组) )。它导致 all 要标记的行组中不相交的路径,而不仅仅是最长的路径。

<VendorOption name="labelAllGroup">true</VendorOption>

重叠和分隔标签(环绕空格)

默认情况下,geoserver不会“在彼此之上”呈现标签。通过使用 spaceAround 选项可以允许标签重叠,也可以在标签周围添加额外空间。为选项提供的值为正或负大小,以像素为单位。

<VendorOption name="spaceAround">10</VendorOption>

使用默认值0时,标签的边界框不能与另一个标签的边界框重叠:

../../../_images/space_0.png

带负号 spaceAround 值,允许重叠:

../../../_images/space_neg.png

有一个积极的 spaceAround 值为10,每个标签与其他标签至少相距20像素:

../../../_images/space_10.png

积极的 spaceAround 值实际提供的空间是预期的两倍。这是因为您可以为一个标签指定一个空格,为另一个标签(在另一个文本符号中)指定一个空格,为3。他们之间的总距离是8。第一个符号(“5”)中的两个标签将彼此间隔5个像素,总共10个像素。

备注

不同文本符号中值之间的交互

在SLD文件中可以有多个文本符号,每个符号都有不同的 spaceAround 选项。如果所有的 spaceAround 选项大于等于0,这将执行您通常期望的操作。如果你有负值(“允许重叠”),那么这些标签可以重叠你说过不应该重叠的标签。如果你不喜欢这种行为,就不难改变-请随意提交补丁!

跟踪线

这个 followLine 选项强制标签跟随直线的曲线。要使用此选项,请将以下内容添加到 <TextSymbolizer> .

备注

直线

直线不需要使用followline。geoserver将自动跟随直线的方向。但是在这种情况下 followLine 可用于确保文本在长于行的情况下不会呈现。

<VendorOption name="followLine">true</VendorOption>

需要使用 <LinePlacement> 与此选项一起确保标签沿直线放置:

<LabelPlacement>
  <LinePlacement/>
</LabelPlacement>

最大位移

这个 maxDisplacement 选项控制标签沿直线、点周围和多边形内部的位移。

对于线,通常geoserver只在其中心点标记一条线。如果此标签与另一个标签冲突,则可能根本不显示。当启用此选项时,贴标机将尝试通过使用 最大位移 从预先计算的标签点沿直线的像素。

如果与 重复 的价值 maxDisplacement 应该永远是 降低repeat .

对于点,这会导致渲染器开始围绕点旋转以搜索空的停止点来放置标签,一步一步地增加圆的大小,直到达到最大位移。同样的情况也发生在多边形的标签点周围(通常是质心)。

<VendorOption name="maxDisplacement">10</VendorOption>

重复

这个 repeat 选项确定geoserver沿直线显示标签的频率。通常,无论长度如何,geoserver只标记每行一次。为此选项指定正值会使贴标机尝试每隔 重复 像素。对于长的或复杂的线(如轮廓线),这使得标签更具信息性。

<VendorOption name="repeat">100</VendorOption>

最大角度

与一起使用时 跟踪线 , the maxAngleDelta 选项设置曲线标签中两个后续字符之间的最大角度(度)。大角度可以创建视觉上不连贯的单词或重叠字符。建议不要使用大于30的角度。

<VendorOption name="maxAngleDelta">15</VendorOption>

自动包装

这个 autoWrap 选项在标签超过给定宽度(以像素为单位)时包装标签。大小应该足够宽以容纳最长的单词,否则单个单词将被拆分为多行。

<VendorOption name="autoWrap">50</VendorOption>
../../../_images/label_autoWrap.png

启用自动包装的标签

强制左对齐

渲染器试图沿直线绘制标签,以使文本直立,以获得最大的易读性。这意味着标签可能不遵循线方向,而是旋转180°以正确向上显示文本。在某些情况下,不需要更改标签的方向;例如,如果标签是显示线条方向的方向箭头。

这个 forceLeftToRight 选项可以设置为 false 要禁用标签翻转,请使标签始终遵循被标记行的固有方向:

<VendorOption name="forceLeftToRight">false</VendorOption>

冲突解决

默认情况下,标签受 冲突解决 ,表示渲染器将不允许任何标签与已绘制的标签重叠。设置 conflictResolution 选择权 false 使此标签绕过冲突解决。这意味着即使标签与其他标签重叠,也将绘制标签,并且在标签重叠之后绘制的其他标签可能会重叠。

<VendorOption name="conflictResolution">false</VendorOption>

非常好

如果标签与所标记的几何图形特别不匹配,geoserver将删除这些标签。

Geometry

拟合优度算法

Point

始终返回1.0,因为标签位于

线

总是返回1.0,因为标签总是放在行上。

Polygon

标签大约每封信都取样一次。从这些点到多边形的距离是确定的,每个样本根据它与多边形的距离投票。(请参阅labelcachedefault goodnessoffit())

默认值为0.5,但可以使用以下方法修改:

<VendorOption name="goodnessOfFit">0.3</VendorOption>

多边形对齐

geoserver通常尝试在多边形中水平放置标签,如果标签位置繁忙或标签在多边形中不适合,则放弃。此选项允许geoserver尝试标签的交替旋转。

<VendorOption name="polygonAlign">mbr</VendorOption>

Option

Description

manual

默认值。只有手动指定的旋转 <Rotation> 将使用标记

ortho

如果标签水平不合适,且多边形高度大于宽度,则也将尝试垂直对齐。

mbr

如果标签水平不合适,将计算最小边界矩形,并尝试使用与之对齐的标签。

图形调整大小

当A <Graphic> 默认情况下是为标签指定的,它以其本机大小和纵横比显示。这个 graphic-resize 选项指示渲染器放大或拉伸图形以完全包含标签的文本。如果使用此选项, graphic-margin 也可以指定选项。

<VendorOption name="graphic-resize">stretch</VendorOption>

Option

Description

none

图形以其原始大小显示(默认)

proportional

图形大小均匀增加以包含标签文本

stretch

图形大小以各向异性方式增加以包含标签文本

../../../_images/label_graphic-resize_none.png
../../../_images/label_graphic-resize_stretch.png

Labeling with a Graphic Mark "square" - L) at native size; R) with "graphic-resize"=stretch and "graphic-margin"=3

图形边距

这个 graphic-margin 选项指定在标签文本周围使用的边距(以像素为单位) graphic-resize 已指定选项。

<VendorOption name="graphic-margin">margin</VendorOption>

分音

这个 partials 选项指示渲染器渲染跨越地图范围的标签,通常不绘制这些标签,因为无法保证放置在当前范围一侧的地图(瓦片渲染)将包含标签的另一半。通过启用“partials”,样式编辑器将负责另一半在那里(可能是因为标签点已手动放置,并确保在所有缩放级别上不会相互冲突)。

<VendorOption name="partials">true</VendorOption>

下划线文本

这个 underlineText 选项指示渲染器为标签加下划线。下划线的工作方式类似于典型的文字处理程序文本下划线。下划线的粗细和位置将由字体定义,颜色将与文本相同。空格也将加下划线。

<VendorOption name="underlineText">true</VendorOption>

一些下划线示例:

../../../_images/label_underlines.png

删除线文本

这个 strikethroughText 选项指示渲染器删除标签。删除线将像一个典型的文字处理器文本删除线一样工作。线条的粗细和位置将由字体定义,颜色将与文本相同。空间也将被敲击。

<VendorOption name="strikethroughText">true</VendorOption>

一些删除线示例:

../../../_images/label_strikethrough.png

字符间距

这个 charSpacing 选项控制字符之间的空间量,正值增加字符间距,负值缩小字符间距(最终使字符重叠)。该值以像素为单位指定。

<VendorOption name="charSpacing">3</VendorOption>

在道路名称的字符之间添加3个额外像素的空间示例:

../../../_images/charSpacing.png

字间距

这个 wordSpacing 选项控制单词之间的空格量,对于该选项,只接受正值(或零)。该值以像素为单位指定。

<VendorOption name="wordSpacing">5</VendorOption>

在道路名称的单词之间添加5个额外像素的空间示例:

../../../_images/wordSpacing.png

位移模式

点/多边形标签的标签位移方向的逗号分隔列表(与maxdisplacement一起使用)。将依次尝试指示。有效值是基本方向缩写,尤其是, N, W, E, S, NW, NE, SW, SE .

以下示例设置了通常用于点的典型“对角线位移”:

<VendorOption name="displacementMode">NE, NW, SW, SE</VendorOption>

虽然这只允许垂直方向的位移:

<VendorOption name="displacementMode">N, S</VendorOption>