线

虽然线条看起来也可以是简单的形状,有长度但没有宽度,但是有许多选项和技巧可以使线条显示得很好。

线条层示例

这个 lines layer 下面的例子中使用的是一个虚构国家的道路信息。作为参考,下面包含了该层中点的属性表。

fid (功能ID)

name (道路名称)

type (道路等级)

line.1

人行道

公路

line.2

新月大道

第二的

line.3

森林大道

第二的

line.4

长路

公路

line.5

萨克森大街

第二的

line.6

里奇大街

第二的

line.7

霍利巷

地方公路

line.8

桑树街

地方公路

line.9

内森巷

地方公路

line.10

中央大街

地方公路

line.11

洛伊斯巷

地方公路

line.12

洛基路

地方公路

line.13

舰队街

地方公路

line.14

黛安娜法院

地方公路

line.15

雪松小径

地方公路

line.16

胜利之路

地方公路

line.17

高原路

地方公路

line.18

安逸街

地方公路

line.19

希尔街

地方公路

line.20

乡村公路

地方公路

line.21

主要街道

地方公路

line.22

贾尼·蓝道

地方公路

line.23

胫骨巷

地方公路

line.24

州街道

地方公路

line.25

河道

地方公路

Download the lines shapefile

简单线条

此示例指定线条为黑色,粗细为3像素。

../../../_images/line_simpleline.png

简单线条

代码

1 * {
2   stroke: black;
3   stroke-width: 3px;
4 }

细节

唯一的规则要求一个黑色的笔画(这个属性是强制的,以使笔画实际显示),3像素宽。

带边框的线条

此示例演示如何绘制带边框的线条(有时称为“cased lines”)。在这种情况下,线条以3像素的蓝色中心和1像素宽的灰色边框绘制。

../../../_images/line_linewithborder.png

带边框的线条

代码

1 * {
2   stroke: #333333, #6699FF;
3   stroke-width: 5px, 3px;
4   stroke-linecap: round;
5   z-index: 0, 1;
6 }

细节

CSS中的行没有“填充”的概念,只有“笔划”。因此,与点或多边形不同,不可能为线几何体的“边”设置样式。但是,可以通过绘制每行两次来达到这种效果:一次以一定的宽度绘制,另一次以较小的宽度绘制。这给了填充和笔画的错觉,除了沿着小线条的边缘之外,其他地方的大线条都被遮住了。

该样式通过指定两个笔画和两个笔画宽度来使用“多值属性”CSS支持。这会导致每个特征被绘制两次,第一次是深灰色。 (#333333 )行宽5像素,然后是较细的蓝色 (#6699FF )行3像素宽。

由于每行绘制两次,渲染的顺序是 very 重要。如果没有Z索引指示,每个特征将首先绘制灰色笔画,然后绘制蓝色笔画,然后渲染引擎将移动到下一个特征,依此类推。当线条交叉时,这将导致难看的重叠。通过使用z-index属性( 第3行 )相反,所有的灰色线条将首先被绘制,然后所有的蓝色线条将被绘制在顶部,从而确保蓝色线条在视觉上连接。

“stroke linecap”属性是唯一具有单个值的属性,这是因为灰色和蓝色线的值相同。

结果是3像素蓝线和1像素灰色边框,因为5像素灰线将在3像素蓝线的每侧显示1像素。

虚线

这个例子改变了 简单线条 创建一条由5个像素的绘制线和2个像素的空格交替组成的虚线。

../../../_images/line_dashedline.png

虚线

代码

1 * {
2   stroke: blue;
3   stroke-width: 3px;
4   stroke-dasharray: 5 2;
5 }

细节

在本例中,我们创建一条3像素宽的蓝线,并指定一个值为“5 2”的虚线数组,这将创建一个5像素的绘制线的重复图案,后跟2个像素的省略线。

铁路(孵化)

此示例使用图案填充创建铁路样式。线条和图案填充均为黑色,主线的厚度为2像素,垂直图案填充的宽度为1像素。

../../../_images/line_railroad.png

铁路(孵化)

代码

1 * {
2   stroke: #333333, symbol("shape://vertline");
3   stroke-width: 3px;
4   :nth-stroke(2) {
5     size: 12;
6     stroke: #333333;
7     stroke-width: 1px;
8   }
9 }

细节

在本例中,使用多值笔划:第一个值使渲染器绘制深灰色线条(根据“笔划宽度”属性,宽度为3像素),而第二个值通过反复重复“shape://vertline”符号来绘制线条,创建阴影效果。T.

为了指定符号本身的绘制方式,在以下位置使用“:nth stroke(2)”伪选择器: 第4行 指定重复符号的选项:特别是指示渲染器创建一个12px宽的符号,深灰色笔划1像素宽。

间隔图形符号

本例使用图形笔画和短划线数组创建“点和空间”线条类型。添加破折号数组规范允许控制一个符号和下一个符号之间的空间量。如果不使用破折号数组,线条将密集地填充点,每个点都与前一个点接触。

../../../_images/line_dashspace.png

沿直线的间隔符号

代码

 1 * {
 2   stroke: symbol(circle);
 3   stroke-dasharray: 4 6;
 4   :stroke {
 5     size: 4;
 6     fill: #666666;
 7     stroke: #333333;
 8     stroke-width: 1px;
 9   }
10 }

细节

与以前的其他示例一样,此示例使用 symbol(circle) 沿直线放置图形符号。

符号详细信息在嵌套规则中指定,位于 第4行 使用“:stroke”伪选择器,创建一个4像素宽、深灰色轮廓的灰色填充圆。

符号之间的间距由 stroke-dasharray第3行 它指定4个像素的笔向下(刚好足以绘制圆)和6个像素的笔向上,以提供间距。

带短划线偏移的交替符号

此示例演示如何创建交替使用虚线和图形符号的复杂线条样式。代码建立在前面示例中所示的功能之上:

  • stroke-dasharray 控制向下/向上打开行为以生成虚线

  • symbol(...) 将两个符号组合在一起沿一行放置符号,允许控制符号间距

这还显示了 dash offset ,它控制在破折号数组中开始渲染的位置。例如,使用破折号数组 5 10 短划线偏移量为 7 渲染器从开始绘制7个像素的图案。它跳过5个像素的“笔下”部分和2个像素的“笔上”部分,然后向上绘制剩余的8个像素,然后向下绘制5个像素,向上绘制10个像素,依此类推。

该示例演示如何使用这些功能创建两个同步的短划线数组序列,一个绘制线段和其他符号。

../../../_images/line_dashdot.png

交替短划线和符号

代码

 1 * {
 2   stroke: blue, symbol(circle);
 3   stroke-width: 1px;
 4   stroke-dasharray: 10 10, 5 15;
 5   stroke-dashoffset: 0, 7.5;
 6   :nth-stroke(2) {
 7     stroke: #000033;
 8     stroke-width: 1px;
 9     size: 5px;
10   }
11 }

细节

此示例再次使用多值属性创建应用于同一行的两个后续笔划。
第一个笔画是一条蓝色实线,1个像素宽,虚线数组为“10 10”。
第二个是一个重复的圆,使用“5 15”的破折号数组,破折号偏移为7.5。这使得序列从12.5像素的空白开始,然后是一个圆(然后在另一个图案的两个线段之间居中),然后是15像素的空白,依此类推。

使用伪选择器“nth stroke(2)”在 第6行 ,要求圆的宽度为5像素,没有填充,轮廓为深蓝色。

带默认标签的行

此示例在简单行上显示文本标签。这是在没有任何其他自定义的情况下标签的显示方式。

../../../_images/line_linewithdefaultlabel.png

带默认标签的行

代码

1 * {
2   stroke: red;
3   label: [name];
4   font-fill: black;
5 }

细节

此示例使用红色笔画线条,然后在线条中心添加水平黑色标签,使用“name”属性填充标签。

_css_line_

带垂直偏移的标签

这个例子在简单的行上显示了一个文本标签,就像前面的例子一样,但是会强制标签与行平行,并且会将它们偏移几个像素。

../../../_images/line_labelwithoffset.png

带默认标签的行

代码

1 * {
2   stroke: red;
3   label: [name];
4   label-offset: 7px;
5   font-fill: black;
6 }

细节

此示例与前一个示例逐行相同,但它添加了一个新属性“Label-Offset”,对于具有单个值的行,该属性被解释为与该行的垂直偏移量。标签沿一条直线绘制,与标签中心点的直线方向平行。

标签后一行

此示例呈现文本标签,使其跟随线条的轮廓。

../../../_images/line_labelfollowingline.png

标签后一行

代码

1 * {
2   stroke: red;
3   label: [name];
4   font-fill: black;
5   label-follow-line: true;
6 }

细节

作为 带默认标签的行 示例显示,默认标签行为不是最佳的。

此示例与 带默认标签的行 示例,但不包括 第5行 如果指定了“标签跟随行”选项,则强制标签严格跟随行。

并非所有标签都可见,部分原因是冲突解决,部分原因是渲染器找不到足够长且“笔直”的线段来绘制标签(默认情况下,不会在急转弯处绘制标签)。

优化标签放置

此示例优化了行的标签放置,以便显示最大数量的标签。

../../../_images/line_optimizedlabel.png

优化标签

代码

1 * {
2   stroke: red;
3   label: [name];
4   font-fill: black;
5   label-follow-line: true;
6   label-max-angle-delta: 90;
7   label-max-displacement: 400;
8   label-repeat: 150;
9 }

细节

此示例与前一个示例类似, 标签后一行 .唯一的区别在于 lines 6-8 . 第6行 设置标签将遵循的最大角度。这会将标签设置为从不弯曲超过90度,以防止标签因明显的曲线或角度而变得难以辨认。 第7行 将标签的最大位移设置为400像素。为了解决与重叠标签的冲突,GeoServer将尝试移动标签,使它们不再重叠。此值设置标签相对于其原始位置的移动距离。最后, 第8行 将标签设置为每150像素重复一次。一个特性通常只接收一个标签,但这可能会导致长行混淆。将标签设置为重复可确保始终在本地标记行。

优化风格标签

此示例改进了 优化标签放置 例子。

../../../_images/line_optimizedstyledlabel_with_halo.png

优化风格标签

代码

 1 * {
 2   stroke: red;
 3   label: [name];
 4   font-family: Arial;
 5   font-weight: bold;
 6   font-fill: black;
 7   font-size: 10;
 8   halo-color: white;
 9   halo-radius: 1;
10   label-follow-line: true;
11   label-max-angle-delta: 90;
12   label-max-displacement: 400;
13   label-repeat: 150;
14 }

细节

此示例与 优化标签放置 .唯一的区别是:

  • 已指定字体系列和粗细

  • 为了使标签更容易阅读,添加了一个白色的“光环”。光环在文本周围绘制一个1像素的白色边框,使其从背景中脱颖而出。

基于属性的线条

此示例根据“类型”(道路类别)属性对线进行不同的样式设置。

../../../_images/line_attributebasedline.png

Attribute-based line

代码

 1 [type = 'local-road'] {
 2   stroke: #009933;
 3   stroke-width: 2;
 4   z-index: 0;
 5 }
 6
 7 [type = 'secondary'] {
 8   stroke: #0055CC;
 9   stroke-width: 3;
10   z-index: 1;
11 }
12
13 [type = 'highway'] {
14   stroke: #FF0000;
15   stroke-width: 6;
16   z-index: 2;
17 }

细节

备注

参考 线条层示例 查看层的属性。为了简化样式,此示例避开了标签,但您可以参考示例 优化风格标签 查看哪些属性对应于哪些点。

在我们虚构的国家里,有三种道路等级,从主干道到高速高速公路:“公路”、“二级公路”和“地方公路”。为了确保以正确的重要性顺序渲染道路,在每个规则中都放置了一个“z-index”属性。

三条规则设计如下:

规则顺序

Rule name / type

Color

Size

1

地方公路

#009933 (绿色)

2

2

第二的

#0055CC (蓝色)

3

3

公路

#FF0000 (红色)

6

Lines 1-5 包含第一个规则,过滤器匹配“type”属性值为“local road”的所有道路。如果此条件适用于特定行,则规则将使其变为深绿色,宽2像素。所有这些线都是先渲染的,因此位于最终地图的底部。

Lines 7-11 匹配“次要”道路,将其涂成深蓝色,宽3像素。如果“z-索引”为1,则在本地道路之后渲染,但在公路下方渲染。

Lines 13-17 匹配“公路”道路,将其涂成6像素宽的红色。因此,这些道路在所有其他道路之上都是最后的痛苦。

基于缩放的线条

这个例子改变了 简单线条 不同缩放级别的样式。

../../../_images/line_zoombasedlinelarge.png

Zoom-based line: Zoomed in

../../../_images/line_zoombasedlinemedium.png

Zoom-based line: Partially zoomed

../../../_images/line_zoombasedlinesmall.png

Zoom-based line: Zoomed out

代码

 1 * {
 2   stroke: #009933;
 3 }
 4
 5 [@sd < 180M] {
 6   stroke-width: 6;
 7 }
 8
 9 [@sd > 180M] [@sd < 360M] {
10   stroke-width: 4;
11 }
12
13 [@sd > 360M] {
14   stroke-width: 2;
15 }

细节

在创建自然外观的地图时,通常需要在更高的缩放级别上使形状更大。此示例根据缩放级别(或更准确地说,缩放分母)更改线条的厚度。比例分母是指地图的比例。比例尺分母为10000表示地图的比例尺为1:10000,以地图投影的单位表示。

备注

确定要使用的适当比例分母(缩放级别)超出了本例的范围。

此样式包含三个规则。三条规则设计如下:

规则顺序

规则名称

比例分母

线条宽度

1

1:180000000或以下

6

2

培养基

1:180000000至1:360000000

4

3

小的

大于1:360000000

2

这些规则的顺序并不重要,因为每个规则中指定的比例不重叠。

第一个规则提供了所有缩放级别使用的笔划颜色,即深灰色,而其他三个规则则利用“@sd”伪属性应用基于当前缩放级别的不同笔划宽度层叠在其上。只能使用“<”和“>”运算符比较“@sd”伪属性,使用任何其他运算符都会导致错误。

这种样式的结果是,当一条线放大时,线的宽度会变大,而当一条线缩小时,线的宽度会变小。

Previous:
Next: 多边形