Geoserver自定义图层样式

标签: 无 分类: 未分类 创建时间:2021-02-04 01:47:42 更新时间:2025-01-17 10:39:22

ArcMap中配置的地图,可以使用ArcGIS Server直接发布为带样式的图层,因为样式文件并不存储在shp中,而是存储在mxd中,所以在使用GeoServer发布shp文件的时候,就会丢失了样式,但是借助于SLD配置文件,可以让GeoServer发布带样式的地图,就可以使用诸如Opernlayer加载Geoserver发布的WMS了。

1.手动编辑

也就是手写SLD文件,这个也是有一定的规则的,写好了就可以,相关内容可以见参考文章。

参考文章:
1.Geoserver设置style (这是Geoserver中设置SLD的规则,可以仔细的看一看)
2.geoserver 基本操作—— Qgis、Arcgis 中导出 se 样式文件的配置 (这个要订阅才能看,订阅还是挺贵的)
3.用GeoTools实现shp+sld导出图片 (这个是使用代码进行sld导出图片)

2.ArcMap2SLD生成SLD

这个也是借助于插件ArcMap2SLD,但是我没有实验成功,因为我安装的是ArcGIS 10.7,这个ArcMap2SLD插件在2017年就不再维护了。

参考文章:
1.ArcGIS对SLD样式的支持 (这里也是说了使用ArcMap插件ArcMap2SLD对SLD进行导出的操作)
2.ArcMap2SLD (ArcGIS导出SLD文件 )

3.QGIS生成SLD

(1) 加载shp文件

(2) 打开图层的样式设置
选择左下角的图层样式菜单,打开样式设置属性框,设置需要的样式

(3) 导出sld
选择菜单栏的Layer->Layer Properties菜单,打开图层属性菜单,然后选择下方的Style下拉按钮,然后选择Save Style,选择保存的格式为SLD文件,就好了。

(4) 配置规则
qgis中,还可以配置不同的属性使用不同的样式,打开样式配置对话框,选择Rule-based,添加新的规则

Filter中添加需要的条件,比如这里配置了type=’site’(注意,这里要用英文状态下的单引号),也就是字段type,值为site的记录,应用的规则。

在规则的下方的Symbol的Marker下,可以设置点的样式,可以选择简单样式、图片、以及SVG等。可以编辑多个规则,就可以实现同一个图层里面,不同的属性显示不同的样式了。

参考文章:
1.使用qgis生成SLD样式
2.QGIS中文操作手册(3-4)QGIS编辑图层属性 (这里简单的说明如何编辑图层的属性)
3. 用户指南 » 14. 使用矢量数据 » 14.5. 编辑 (QGIS如何编辑)

4.Geoserver指定style

(1) 新建Style
登录geoserver之后,选择右侧的style菜单,选择新建Style,创建一个新的图层样式

(2) 上传sld文件
选择导出的sld文件,然后上传,保存。

(3) 编辑图层
发布图层时,选择图层的Public,拉到下面,找到 Default Style,选择自己刚刚新建的样式就可以了。

(4) 预览
点击geoserver的左侧Layer Preview菜单,选择需要查看的图层,点击后面的 Select One,可以选择WMS格式的png进行渲染查看,地址类似于这样的地址:http://localhost:8080/geoserver/zsjm/wms?service=WMS&version=1.1.0&request=GetMap&layers=zsjm%3Astation&bbox=113.49347688000012%2C22.553700606000064%2C113.56958616600002%2C22.575238755000044&width=768&height=330&srs=EPSG%3A4490&styles=&format=image%2Fpng

5.sld中加载图片

在qgis中,无法直接使用png格式的图片,即生成的sld中使用
(1) 将图片复制到对应工作区的style文件夹中,如我在hdxs的工作区下新增style,图片路径如下:/opt/apache-tomcat-8.5.54/webapps/geoserver/data/workspaces/giswork/styles

(2) 新增styles,sld代码如下:图片路径配置在标签下
如果图片相对于GeoServer安装目录/data/workspaces/styles 的相对路径。例如 xlink:href=“images/famen.png” ,那么就需要把图片放在/data/workspaces/giswork/styles/images文件夹下

(3) 修改qgis生成的sld文件的相关内容,将OnlineResource节点的xlink:href=””,改成想对目录。

(4) 如果是图片的话,qgis导出的样式不支持,可以将

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<!--原始内容-->
<?xml version="1.0" encoding="UTF-8"?>
<StyledLayerDescriptor xmlns="http://www.opengis.net/sld" xmlns:ogc="http://www.opengis.net/ogc" xsi:schemaLocation="http://www.opengis.net/sld http://schemas.opengis.net/sld/1.1.0/StyledLayerDescriptor.xsd" xmlns:se="http://www.opengis.net/se" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.1.0">
<NamedLayer>
<se:Name>trap_20210205_1815</se:Name>
<UserStyle>
<se:Name>trap_20210205_1815</se:Name>
<se:FeatureTypeStyle>
<se:Rule>
<se:Name>Single symbol</se:Name>
<se:PointSymbolizer>
<!--QgsMarkerSymbolLayer RasterMarker not implemented yet-->
</se:PointSymbolizer>
</se:Rule>
</se:FeatureTypeStyle>
</UserStyle>
</NamedLayer>
</StyledLayerDescriptor>


<!--改为-->
<?xml version="1.0" encoding="UTF-8"?>
<StyledLayerDescriptor xmlns="http://www.opengis.net/sld" xmlns:ogc="http://www.opengis.net/ogc" xsi:schemaLocation="http://www.opengis.net/sld http://schemas.opengis.net/sld/1.1.0/StyledLayerDescriptor.xsd" xmlns:se="http://www.opengis.net/se" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.1.0">
<NamedLayer>
<se:Name>trap_20210205_1815</se:Name>
<UserStyle>
<se:Name>trap_20210205_1815</se:Name>
<se:FeatureTypeStyle>
<se:Rule>
<se:Name>Single symbol</se:Name>
<se:PointSymbolizer>
<se:Graphic>
<se:ExternalGraphic>
<se:OnlineResource xlink:type="simple" xlink:href="images/Trap-0.png"/>
<se:Format>image/png</se:Format>
</se:ExternalGraphic>
<se:Size>36px</se:Size>
</se:Graphic>
</se:PointSymbolizer>
</se:Rule>
</se:FeatureTypeStyle>
</UserStyle>
</NamedLayer>
</StyledLayerDescriptor>

参考文章:
1.GeoServer sld加载图片style (有图片相对目录的引用说明)
2.sld样式中加载图片 (这里加载了网络图片,并且有一些截图说明)

图片部分缺失

在使用geoserver发布成WMS的时候,会出现图片的右半部何下半部分缺失,这个问题,无论是使用图片,还是使用svg,都会遇到。

注意
(1) 使用qgis自带的svg其实没有问题,所以可能需要将透明边框去掉。
(2) 还有就是如果你定义了Marker的宽高是36px,那么你将图片进行旋转之后,就有可能出现被切掉的情况,也就是图片本来的大小是36px,你旋转了90度,那么对于长方形来说,就有可能宽高不再是36了。
(3) 当使用svg格式的时候,如果图形有空白,或者是定义的宽高和图形本身的宽高不匹配,就会导致图形无法定位到中心点上或者是图形超出sld定义的宽高的部分被截断。

Parsing failed for Graphic: java.lang.ClassCastException: java.lang.String cannot be cast to org.opengis.filter.expression.Expression

这个问题出现在设置多个规则的情况下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
<?xml version="1.0" encoding="UTF-8"?>
<StyledLayerDescriptor xmlns="http://www.opengis.net/sld" xsi:schemaLocation="http://www.opengis.net/sld http://schemas.opengis.net/sld/1.1.0/StyledLayerDescriptor.xsd" version="1.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:se="http://www.opengis.net/se" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ogc="http://www.opengis.net/ogc">
<NamedLayer>
<se:Name>trap_20210205_1037</se:Name>
<UserStyle>
<se:Name>trap_20210205_1037</se:Name>
<se:FeatureTypeStyle>

<!--这条规则没有问题,复制多少次都没有问题-->
<se:Rule>
<se:Name>d</se:Name>
<ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">
<ogc:PropertyIsEqualTo>
<ogc:PropertyName>NAME</ogc:PropertyName>
<ogc:Literal>疏水阀1</ogc:Literal>
</ogc:PropertyIsEqualTo>
</ogc:Filter>
<se:PointSymbolizer>
<se:Graphic>
<!--Parametric SVG-->
<se:ExternalGraphic>
<se:OnlineResource xlink:type="simple" xlink:href="images/Trap-0.svg?fill=%23f3a6b2&amp;fill-opacity=1&amp;outline=%23232323&amp;outline-opacity=1&amp;outline-width=0"/>
<se:Format>image/svg+xml</se:Format>
</se:ExternalGraphic>
<!--Plain SVG fallback, no parameters-->
<se:ExternalGraphic>
<se:OnlineResource xlink:type="simple" xlink:href="images/Trap-0.svg"/>
<se:Format>image/svg+xml</se:Format>
</se:ExternalGraphic>
<!--Well known marker fallback-->
<se:Mark>
<se:WellKnownName>square</se:WellKnownName>
<se:Fill>
<se:SvgParameter name="fill">#f3a6b2</se:SvgParameter>
</se:Fill>
<se:Stroke>
<se:SvgParameter name="stroke">#232323</se:SvgParameter>
<se:SvgParameter name="stroke-width">0.5</se:SvgParameter>
</se:Stroke>
</se:Mark>
<se:Size>36</se:Size>
<se:Displacement>
<se:DisplacementX>9</se:DisplacementX>
<se:DisplacementY>0</se:DisplacementY>
</se:Displacement>
</se:Graphic>
</se:PointSymbolizer>
</se:Rule>


<!--这条规则有问题,只有这一条规则的时候也是有问题的-->
<se:Rule>
<se:Name>ds</se:Name>
<ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">
<ogc:PropertyIsEqualTo>
<ogc:PropertyName>NAME</ogc:PropertyName>
<ogc:Literal>疏水阀2</ogc:Literal>
</ogc:PropertyIsEqualTo>
</ogc:Filter>
<se:PointSymbolizer>
<se:Graphic>
<!--Parametric SVG-->
<se:ExternalGraphic>
<se:OnlineResource xlink:type="simple" xlink:href="images/Trap-0.svg?fill=%23d5b43c&amp;fill-opacity=1&amp;outline=%23232323&amp;outline-opacity=1&amp;outline-width=0"/>
<se:Format>image/svg+xml</se:Format>
</se:ExternalGraphic>
<!--Plain SVG fallback, no parameters-->
<se:ExternalGraphic>
<se:OnlineResource xlink:type="simple" xlink:href="images/Trap-0.svg"/>
<se:Format>image/svg+xml</se:Format>
</se:ExternalGraphic>
<!--Well known marker fallback-->
<se:Mark>
<se:WellKnownName>square</se:WellKnownName>
<se:Fill>
<se:SvgParameter name="fill">#d5b43c</se:SvgParameter>
</se:Fill>
<se:Stroke>
<se:SvgParameter name="stroke">#232323</se:SvgParameter>
<se:SvgParameter name="stroke-width">0.5</se:SvgParameter>
</se:Stroke>
</se:Mark>
<se:Size>32</se:Size>
<se:Rotation/>
<se:Displacement>
<se:DisplacementX>13</se:DisplacementX>
<se:DisplacementY>-15</se:DisplacementY>
</se:Displacement>
</se:Graphic>
</se:PointSymbolizer>
</se:Rule>

</se:FeatureTypeStyle>
</UserStyle>
</NamedLayer>
</StyledLayerDescriptor>

经过文件比较,我发现了第一条规则中,多加了一个额外的节点 se:Rotation/ ,需要将这个节点删除。

小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。