4.4. 点¶
YSLD造型之旅的下一站是点的表示。
点符号学回顾:
点仅用于表示位置,不形成形状。线条的视觉宽度不会随比例而变化。
SLD使用 PointSymbolizer 记录如何绘制线条形状。
点的标签定位到点位置。
由于点本身没有固有的形状,因此重点放在用适当的符号标记位置上。
参考文献:
YSLD Reference Point symbolizer (用户手册YSLD参考)
Point (用户手册SLD参考)
这个练习利用了 ne:populated_places
层。
导航到 风格 页。
点击 Add a new style 并选择以下选项:
姓名:
point_example
工作区:
No workspace
格式:
YSLD
选择 point 从
Generate a default style
下拉并单击 generate .将初始的ysld定义替换为以下内容并单击 apply :
symbolizers: - point: symbols: - mark: shape: circle stroke-width: 1
并使用 Layer Preview 选项卡以预览结果。
4.4.1. 作记号¶
这个 点 符号控制点数据的显示。点用强制属性表示 mark .
SLD标准提供了与点符号一起使用的“众所周知”符号: circle
, square
, triangle
, arrow
, cross
, star
和 x
.
将样式使用的符号更改为正方形:
symbolizers: - point: symbols: - mark: shape: square stroke-width: 1
地图预览:
在继续之前,我们将使用过滤器将显示的数据量减少到合理的水平。
rules: - filter: ${SCALERANK < '1'} scale: [min, max] symbolizers: - point: symbols: - mark: shape: square stroke-width: 1
备注
符号 已缩进到 规则
使图像更加清晰:
其他属性可用于控制标记的演示文稿:
这个 size 属性用于控制符号大小。
这个 旋转 属性控制方向,接受以度为单位的输入。
同时尝试这两种设置:
rules: - filter: ${SCALERANK < '1'} scale: [min, max] symbolizers: - point: size: 8 rotation: 45.0 symbols: - mark: shape: square stroke-width: 1
结果在每个位置用菱形标记:
这个 mark 属性提供用于设置点符号样式的参数。我们换个 fill-color 变成灰色。
rules: - filter: ${SCALERANK < '1'} scale: [min, max] symbolizers: - point: size: 8 rotation: 45.0 symbols: - mark: shape: square stroke-color: 'black' stroke-width: 1 fill-color: 'gray'
将标记更新为带黑色轮廓的灰色正方形。
您可以添加更多的符号来应用其他点样式。
使用这种方法,标记可以由多个符号组成,每个符号都有自己的设置:
rules: - filter: ${SCALERANK < '1'} scale: [min, max] symbolizers: - point: size: 16 symbols: - mark: shape: square stroke-color: 'black' stroke-width: 1 fill-color: 'red' - point: size: 14 rotation: 45.0 symbols: - mark: shape: cross stroke-color: 'white' stroke-width: 1 fill-color: 'black'
产生有趣的复合符号效果:
4.4.2. 图解的¶
符号也可以由外部图形提供,
这项技术是用最初的 airport.svg
YSLD示例。
要使用外部图形,需要两条信息。
url 属性定义为 url 对图像的引用。
格式 属性用于告诉呈现引擎期望的文件格式
此技术用于引用放置在Styles目录中的文件。
rules: - filter: ${SCALERANK < '1'} scale: [min, max] symbolizers: - point: symbols: - external: url: file:/path/to/geoserver/data_dir/styles/port.svg format: image/svg
在每个位置绘制所提供的形状:
财产 url 参考也可用于参考外部图像。我们可以使用geoserver徽标。
rules: - filter: ${SCALERANK < '1'} scale: [min, max] symbolizers: - point: size: 16 symbols: - external: url: http://localhost:8080/geoserver/web/wicket/resource/org.geoserver.web.GeoServerBasePage/img/logo.png format: image/png
如地图预览所示。
4.4.3. 标签¶
标签现在已经熟悉我们的经验线串和多边形。
这个 text 符号 标签 属性是标记点位置所必需的。
替换
point_example
包括以下内容:rules: - filter: ${SCALERANK < '1'} scale: [min, max] symbolizers: - point: symbols: - mark: shape: circle stroke-color: 'black' stroke-width: 1 fill-color: 'gray' - text: label: ${NAME} fill-color: 'gray' placement: point
确认结果
Layer Preview
预览。每个标签都是从提供的点开始绘制的——这是不幸的,因为它确保每个标签将与使用的符号重叠。为了解决这个限制,我们将使用ysld控件来放置标签:
锚 提供两个值,表示标签相对于起始标签位置的对齐方式。
取代 用于提供使用和X和Y偏移的初始位移。对于点,建议使用此偏移调整符号所用区域的标签位置。
备注
财产 锚 定义相对于由结果标签形成的边界框的定位点位置。定位点位置将捕捉到由点位置和位移偏移生成的标签位置。
同时使用这两个工具,我们可以将标签置于符号下方的中心,注意所用的位移提供了符号尺寸所需区域之外的偏移量。
rules: - filter: ${SCALERANK < '1'} scale: [min, max] symbolizers: - point: size: 10 symbols: - mark: shape: circle stroke-color: 'black' stroke-width: 1 fill-color: 'gray' - text: label: ${NAME} fill-color: 'black' placement: point anchor: [0.5, 1.0] displacement: [0, -12]
每个标签现在都放在标记下面。
剩下的一个问题是标签和符号之间的重叠。
geoserver提供了一个特定于供应商的参数,允许符号参与标签冲突解决,防止标签重叠任何符号。这严重限制了可用于贴标签的区域,最好与最大位移供应商选择结合使用。
x-labelObstacle vendor参数要求渲染引擎避免在指示符号的顶部绘制标签。这适用于点符号。
x-maxDisplacement vendor参数为渲染引擎提供冲突解决期间允许其移动标签的最大距离。这适用于文本符号。
x-spaceAround vendor参数告诉渲染引擎提供地图上标签之间的最小距离,确保它们不会重叠。这适用于文本符号。
更新我们的示例以使用这些设置:
rules: - filter: ${SCALERANK < '1'} scale: [min, max] symbolizers: - point: size: 10 symbols: - mark: shape: circle stroke-color: 'black' stroke-width: 1 fill-color: 'gray' x-labelObstacle: true - text: label: ${NAME} fill-color: 'black' placement: point anchor: [0.5, 1.0] displacement: [0, -12] x-maxDisplacement: 100 x-spaceAround: 2
使图像更加清晰:
4.4.4. 动感造型¶
我们会很快使用 标尺 根据@scale filters选择内容。
define: &point size: 6 symbols: - mark: shape: circle stroke-color: 'black' stroke-width: 1 fill-color: 'gray' rules: - filter: ${SCALERANK < '7'} scale: ['4000000.0', '8000000.0'] symbolizers: - point: <<: *point - filter: ${SCALERANK < '5'} scale: ['8000000.0', '1.7E7'] symbolizers: - point: <<: *point - filter: ${SCALERANK < '4'} scale: ['1.7E7', '3.5E7'] symbolizers: - point: <<: *point - filter: ${SCALERANK < '3'} scale: ['3.5E7', '7.0E7'] symbolizers: - point: <<: *point - filter: ${SCALERANK < '2'} scale: ['7.0E7', '1.4E8'] symbolizers: - point: <<: *point - filter: ${SCALERANK < '1'} scale: ['1.4E8', max] symbolizers: - point: <<: *point - scale: [min, '4000000.0'] symbolizers: - point: <<: *point
点击 Apply 更新 Layer Preview 在每一步之后。
备注
这个ysld利用了 定义 避免重复点符号内容多次。作为一个例子, scale: [min, '4000000.0'] 规则,与 define: 导致以下属性集合:
- scale: [min, '4000000.0'] symbolizers: - point: size: 6 symbols: - mark: shape: circle stroke-color: 'black' stroke-width: 1 fill-color: 'gray'
要添加标签,我们必须在每个比例过滤器中同时使用点和文本符号。
define: &point size: 6 symbols: - mark: shape: circle stroke-color: 'black' stroke-width: 1 fill-color: 'gray' define: &label label: ${NAME} fill-color: 'black' font-family: Arial font-size: 10 font-style: normal font-weight: normal placement: point rules: - filter: ${SCALERANK < '7'} scale: ['4000000.0', '8000000.0'] symbolizers: - point: <<: *point - text: <<: *label - filter: ${SCALERANK < '5'} scale: ['8000000.0', '1.7E7'] symbolizers: - point: <<: *point - text: <<: *label - filter: ${SCALERANK < '4'} scale: ['1.7E7', '3.5E7'] symbolizers: - point: <<: *point - text: <<: *label - filter: ${SCALERANK < '3'} scale: ['3.5E7', '7.0E7'] symbolizers: - point: <<: *point - text: <<: *label - filter: ${SCALERANK < '2'} scale: ['7.0E7', '1.4E8'] symbolizers: - point: <<: *point - text: <<: *label - filter: ${SCALERANK < '1'} scale: ['1.4E8', max] symbolizers: - point: <<: *point - text: <<: *label - scale: [min, '4000000.0'] symbolizers: - point: <<: *point - text: <<: *label
我们将使用 取代 和 锚 将标签放置在每个符号的上方。
将以下两行添加到 label 定义:
define: &label label: ${NAME} fill-color: 'black' font-family: Arial font-size: 10 font-style: normal font-weight: normal placement: point anchor: [0.5, 0] displacement: [0, 6]
对特定于供应商的参数进行一点处理,可以防止标签与每个符号发生冲突,同时使渲染引擎在允许重新定位标签的范围内具有一定的灵活性。
将以下供应商选项添加到 label 定义:
define: &label label: ${NAME} fill-color: 'black' font-family: Arial font-size: 10 font-style: normal font-weight: normal placement: point anchor: [0.5, 0] displacement: [0, 6] x-maxDisplacement: 90 x-spaceAround: 2
将以下供应商选项添加到 point 定义:
define: &point size: 6 symbols: - mark: shape: circle stroke-color: 'black' stroke-width: 1 fill-color: 'gray' x-labelObstacle: true
现在我们已经清楚地标记了我们的城市,放大到您熟悉的区域,我们可以逐个查看符号的变化。
我们使用前面的表达式来生成适当的标签。表达式也可用于许多其他属性设置。
这个
ne:populated_places
图层提供了几个特定的属性,以使样式更简单:SCALERANK :我们已使用此属性控制显示的详细程度
LABELRANK :用于解决冲突的提示,允许重要城市(如首都)标记,即使它们靠近较大的邻居。
FEATURECLA :用于表示不同类型的城市。我们查一下 Admin-0 capital 城市。
我们要做的第一件事就是计算点 size 使用快速表达式:
${10-(SCALERANK/2)}
此表达式的大小应介于5和9之间,并且需要同时应用于这两个点 size 和标签 取代 .
我们可以手动为geoserver提供标签优先级,而不是解决标签冲突的“先到先服务”默认值。为每个标签计算所提供的表达式,如果发生冲突,则以优先级最高的标签为准。
labelrank属性从1到10,在用作地理服务器标签优先级之前需要翻转:
${10 - LABELRANK}
此表达式将产生介于0和10之间的值,并将用于 优先 .
define: &point size: ${10-(SCALERANK/2)} symbols: - mark: shape: circle stroke-color: 'black' stroke-width: 1 fill-color: 'gray' x-labelObstacle: true define: &label label: ${NAME} fill-color: 'black' font-family: Arial font-size: 10 font-style: normal font-weight: normal placement: point anchor: [0.5, 0] displacement: [0, '${''10'' - SCALERANK / ''2''}'] priority: ${'10' - LABELRANK} x-maxDisplacement: 90 x-spaceAround: 2
接下来我们可以使用
FEATURECLA
检查首都。在顶部添加首都城市的筛选器 规则 名单:
- filter: ${SCALERANK < '2' AND FEATURECLA = 'Admin-0 capital'} scale: ['7.0E7', max] name: capitals symbolizers: - point: symbols: - mark: shape: star stroke-color: 'black' stroke-width: 1 fill-color: 'gray' - text: label: ${NAME} fill-color: 'gray' placement: point - filter: ${FEATURECLA = 'Admin-0 capital'} scale: [min, '7.0E7'] name: capitals symbolizers: - point: symbols: - mark: shape: star stroke-color: 'black' stroke-width: 1 fill-color: 'gray' - text: label: ${NAME} fill-color: 'gray' placement: point
更新人口稠密的地方过滤器以忽略首都:
- filter: ${SCALERANK < '7' AND FEATURECLA <> 'Admin-0 capital'} scale: ['4000000.0', '8000000.0'] symbolizers: - point: <<: *point - text: <<: *label - filter: ${SCALERANK < '5' AND FEATURECLA <> 'Admin-0 capital'} scale: ['8000000.0', '1.7E7'] symbolizers: - point: <<: *point - text: <<: *label - filter: ${SCALERANK < '4' AND FEATURECLA <> 'Admin-0 capital'} scale: ['1.7E7', '3.5E7'] symbolizers: - point: <<: *point - text: <<: *label - filter: ${SCALERANK < '3' AND FEATURECLA <> 'Admin-0 capital'} scale: ['3.5E7', '7.0E7'] symbolizers: - point: <<: *point - text: <<: *label - filter: ${SCALERANK < '2' AND FEATURECLA <> 'Admin-0 capital'} scale: ['7.0E7', '1.4E8'] symbolizers: - point: <<: *point - text: <<: *label - filter: ${SCALERANK < '1' AND FEATURECLA <> 'Admin-0 capital'} scale: ['1.4E8', max] symbolizers: - point: <<: *point - text: <<: *label - scale: [min, '4000000.0'] symbolizers: - point: <<: *point - text: <<: *label
如果您想检查您的工作,最终文件在这里:
point_example.ysld
4.4.5. 奖金¶
4.4.5.1. 挑战几何位置¶
这个 mark 属性可用于呈现任何几何内容。
挑战: 通过使用 mark 财产。
备注
回答 discussed 在工作簿的末尾。
4.4.5.2. 探索动态符号化¶
我们做了大量的工作来设置过滤器,以便在首都的星和圆之间进行选择。
这种方法在单独应用时非常简单:
rules: - filter: ${FEATURECLA = 'Admin-0 capital'} scale: [min, max] symbolizers: - point: symbols: - mark: shape: star stroke-color: 'black' stroke-width: 1 fill-color: 'gray' - filter: ${FEATURECLA <> 'Admin-0 capital'} scale: [min, max] symbolizers: - point: symbols: - mark: shape: circle stroke-color: 'black' stroke-width: 1 fill-color: 'gray'
当与检查另一个属性或检查@scale(如我们的示例中所示)结合使用时,这种方法可能很快导致许多规则难以保持直线。
仔细看看,
shape
实际上可以用字符串表示:rules: - filter: ${FEATURECLA = 'Admin-0 capital'} scale: [min, max] symbolizers: - point: symbols: - mark: shape: 'star' stroke-color: 'black' stroke-width: 1 fill-color: 'gray'
在SLD中表示为:
<sld:PointSymbolizer> <sld:Graphic> <sld:Mark> <sld:WellKnownName>star</sld:WellKnownName> <sld:Fill/> <sld:Stroke/> </sld:Mark> </sld:Graphic> </sld:PointSymbolizer>
GeoServer认识到SLD标记和外部图形的这种局限性,并为动态符号化提供了机会。
这是通过在传递给符号或url的字符串中嵌入一个小的cql表达式来实现的。此子表达式与 ${{ }} 如图所示:
- point: symbols: - mark: shape: ${if_then_else(equalTo(FEATURECLA,'Admin-0 capital'),'star','circle')}
在SLD中表示为:
<sld:PointSymbolizer> <sld:Graphic> <sld:Mark> <sld:WellKnownName>${if_then_else(equalTo(FEATURECLA,'Admin-0 capital'),'star','circle')}</sld:WellKnownName> <sld:Fill/> <sld:Stroke/> </sld:Mark> </sld:Graphic> </sld:PointSymbolizer>
挑战: 使用此方法重写 动感造型 例子。
备注
回答 provided 在工作簿的末尾。
4.4.5.3. 挑战层组¶
使用A 图层组 探索符号学如何一起工作以形成地图。
东北:东北1
NE:州政府
NE:人口密集的地方
在这里帮助开始工作的方式是
ne:states_provinces_shp
:symbolizers: - polygon: stroke-color: 'black' stroke-width: 0.25 stroke-opacity: 0.5 fill-color: 'white' fill-opacity: 0.05 - polygon: stroke-color: 'black' stroke-width: 0.25 stroke-opacity: 0.5 fill-color: ${Recode(mapcolor9,'1','#8dd3c7','2','#ffffb3','3','#bebada','4','#fb8072','5','#80b1d3','6','#fdb462','7','#b3de69','8','#fccde5','9','#d9d9d9')} fill-opacity: 0.5
这个背景比较繁忙,必须注意确保符号和标签都清晰可见。
挑战: 在这个繁忙的背景下,尽你所能地为居住区设计风格。
下面是一个带有灵感标签的示例:
备注
回答 provided 在工作簿的末尾。
4.4.5.4. 探索真正的字体¶
除了图像格式,geoserver还可以使用其他类型的图形,例如真字体:
symbolizers: - point: symbols: - mark: shape: ttf://Webdings#0x0064 stroke-color: 'blue' stroke-width: 1
其他字体已放入
styles
目录可供使用。
4.4.5.5. 浏览自定义图形¶
GeoServer渲染引擎允许Java开发人员勾引额外的符号支持。
geoserver使用此工具提供用于填充图案的形状。社区扩展允许使用简单的自定义形状甚至图表。
使用WKT几何图形表示添加了对自定义图形的支持。
symbolizers: - point: symbols: - mark: shape: wkt://MULTILINESTRING((-0.25 -0.25, -0.125 -0.25), (0.125 -0.25, 0.25 -0.25), (-0.25 0.25, -0.125 0.25), (0.125 0.25, 0.25 0.25)) stroke-color: 'blue' stroke-width: 1