标记¶
本节讨论通过标准SLD选项控制标签放置的详细信息。它还描述了一些地理服务器增强的标签放置选项,这些选项提供了更好的地图输出。
LabelPlacement¶
SLD规范定义了两种可用于 <LabelPlacement>
元素:
<PointPlacement>
将标签放置在单个点上<LinePlacement>
沿直线放置标签
PointPlacement¶
什么时候? <PointPlacement>
是否使用该几何图形在单个 标签点 .对于线条,此点位于线条可见部分的中间。对于多边形,点是多边形可见部分的质心。标签相对于标签点的位置可以由以下子元素控制:
Element |
Description |
|
确定标签相对于标签点的位置。以0-1之间的小数形式给出的值。 |
|
从定位点偏移标签。以像素为单位给出的值。 |
|
按给定的度数顺时针旋转标签。 |
解释这些选项的最好方法是举例。
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>
以下示例显示更改定位点如何影响标签的位置:
取代¶
位移允许精细控制标签的位置。位移值将标签从定位点的位置偏移指定数量的像素。元素语法为:
<Displacement>
<DisplacementX>
10
</DisplacementX>
<DisplacementY>
0
</DisplacementY>
</Displacement>
实例:
Displacement of X=10 pixels (compare with default anchor point of (X=0, Y=0.5) shown above)
Displacement of Y=-10 pixels (compare with anchor point (X= 0.5, Y=1.0) - not shown)
旋转¶
可选的 <Rotation>
元素指定标签应按给定度数顺时针旋转
<Rotation>
45
</Rotation>
下面的例子说明了旋转如何与锚定点和位移相互作用。
45度旋转
45 degree rotation with anchor point (X=0.5, Y=0.5)
45 degree rotation with 40-pixel X displacement
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>
实例:
PerpendicularOffset = 0 (default)
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
城市位置(大比例尺地图)
知道纽约市的人比知道泽西市的人多。因此,我们希望给予“纽约”标签优先权,以便在与(重叠的)“泽西市”发生冲突时可以看到它。为此,我们在 <TextSymbolizer>
:
<Priority>
<ogc:PropertyName>population</ogc:PropertyName>
</Priority>
这确保了在小范围内,纽约的标签优先于附近人口较少的城市:
城市位置(小比例尺地图)
没有优先标签,泽西市可以优先于纽约,使其难以解释地图。在显示许多特征的尺度上,优先级标签对于确保大城市比小城市更容易被看到是至关重要的。
分组功能(组)¶
这个 group
选项允许为逻辑组中的多个功能显示单个标签。
<VendorOption name="group">yes</VendorOption>
分组的工作原理是收集具有相同标签文本的所有特征,然后根据以下规则为组选择代表性几何图形:
Geometry |
标签点 |
点集 |
使用视图矩形内的第一个点。 |
线条集 |
线条连接在一起,裁剪到视图矩形,并使用最长路径。 |
多边形集 |
多边形被剪切到视图矩形,并使用最大的多边形。 |
如果需要,可以通过指定 标签组 选择权。
警告
请注意,标签确实指示了应组合在一起的功能。例如,单独对城市名称分组可能最终创建一个包含两个城市名称的组 巴黎 (法国)和 巴黎 (德克萨斯州)。
道路数据是一个典型的例子,用来说明为什么分组是有用的。通常只需要为所有“主要街道”显示一个标签,而不是为每个“主要街道”块显示一个标签。
当 group
选项为“关闭”(默认),不执行分组,并且每个块功能都被标记(取决于标签取消冲突):
当 group
使用选项时,将具有相同标签的几何图形组合在一起,并从整个组中确定标签位置。这将产生一个更不杂乱的地图:
标签组¶
这个 labelAllGroup
选项可以与 group
选项(参见 分组功能(组) )。它导致 all 要标记的行组中不相交的路径,而不仅仅是最长的路径。
<VendorOption name="labelAllGroup">true</VendorOption>
重叠和分隔标签(环绕空格)¶
默认情况下,geoserver不会“在彼此之上”呈现标签。通过使用 spaceAround
选项可以允许标签重叠,也可以在标签周围添加额外空间。为选项提供的值为正或负大小,以像素为单位。
<VendorOption name="spaceAround">10</VendorOption>
使用默认值0时,标签的边界框不能与另一个标签的边界框重叠:
带负号 spaceAround
值,允许重叠:
有一个积极的 spaceAround
值为10,每个标签与其他标签至少相距20像素:
积极的 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>
启用自动包装的标签
强制左对齐¶
渲染器试图沿直线绘制标签,以使文本直立,以获得最大的易读性。这意味着标签可能不遵循线方向,而是旋转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 |
|
默认值。只有手动指定的旋转 |
|
如果标签水平不合适,且多边形高度大于宽度,则也将尝试垂直对齐。 |
|
如果标签水平不合适,将计算最小边界矩形,并尝试使用与之对齐的标签。 |
图形调整大小¶
当A <Graphic>
默认情况下是为标签指定的,它以其本机大小和纵横比显示。这个 graphic-resize
选项指示渲染器放大或拉伸图形以完全包含标签的文本。如果使用此选项, graphic-margin
也可以指定选项。
<VendorOption name="graphic-resize">stretch</VendorOption>
Option |
Description |
|
图形以其原始大小显示(默认) |
|
图形大小均匀增加以包含标签文本 |
|
图形大小以各向异性方式增加以包含标签文本 |
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>
一些下划线示例:
删除线文本¶
这个 strikethroughText
选项指示渲染器删除标签。删除线将像一个典型的文字处理器文本删除线一样工作。线条的粗细和位置将由字体定义,颜色将与文本相同。空间也将被敲击。
<VendorOption name="strikethroughText">true</VendorOption>
一些删除线示例:
字符间距¶
这个 charSpacing
选项控制字符之间的空间量,正值增加字符间距,负值缩小字符间距(最终使字符重叠)。该值以像素为单位指定。
<VendorOption name="charSpacing">3</VendorOption>
在道路名称的字符之间添加3个额外像素的空间示例:
字间距¶
这个 wordSpacing
选项控制单词之间的空格量,对于该选项,只接受正值(或零)。该值以像素为单位指定。
<VendorOption name="wordSpacing">5</VendorOption>
在道路名称的单词之间添加5个额外像素的空间示例:
位移模式¶
点/多边形标签的标签位移方向的逗号分隔列表(与maxdisplacement一起使用)。将依次尝试指示。有效值是基本方向缩写,尤其是, N, W, E, S, NW, NE, SW, SE
.
以下示例设置了通常用于点的典型“对角线位移”:
<VendorOption name="displacementMode">NE, NW, SW, SE</VendorOption>
虽然这只允许垂直方向的位移:
<VendorOption name="displacementMode">N, S</VendorOption>