ArcMap中配置的地图,可以使用ArcGIS Server直接发布为带样式的图层,因为样式文件并不存储在shp中,而是存储在mxd中,所以在使用GeoServer发布shp文件的时候,就会丢失了样式,但是借助于SLD配置文件,可以让GeoServer发布带样式的地图,就可以使用诸如Opernlayer加载Geoserver发布的WMS了。
1.手动编辑
也就是手写SLD文件,这个也是有一定的规则的,写好了就可以,相关内容可以见参考文章。
2.ArcMap2SLD生成SLD
这个也是借助于插件ArcMap2SLD,但是我没有实验成功,因为我安装的是ArcGIS 10.7,这个ArcMap2SLD插件在2017年就不再维护了。
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等。可以编辑多个规则,就可以实现同一个图层里面,不同的属性显示不同的样式了。
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> </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>
|
图片部分缺失
在使用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> <se:ExternalGraphic> <se:OnlineResource xlink:type="simple" xlink:href="images/Trap-0.svg?fill=%23f3a6b2&fill-opacity=1&outline=%23232323&outline-opacity=1&outline-width=0"/> <se:Format>image/svg+xml</se:Format> </se:ExternalGraphic> <se:ExternalGraphic> <se:OnlineResource xlink:type="simple" xlink:href="images/Trap-0.svg"/> <se:Format>image/svg+xml</se:Format> </se:ExternalGraphic> <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> <se:ExternalGraphic> <se:OnlineResource xlink:type="simple" xlink:href="images/Trap-0.svg?fill=%23d5b43c&fill-opacity=1&outline=%23232323&outline-opacity=1&outline-width=0"/> <se:Format>image/svg+xml</se:Format> </se:ExternalGraphic> <se:ExternalGraphic> <se:OnlineResource xlink:type="simple" xlink:href="images/Trap-0.svg"/> <se:Format>image/svg+xml</se:Format> </se:ExternalGraphic> <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/ ,需要将这个节点删除。