现有一个shp格式的道路注记文件,用点来表示注记的位置,属性表中保存每个点对应的字,在QGIS中打开如下图所示

GeoServer中使用样式化图层描述符(sld)给WMS加注记-LMLPHP

它的属性表如下

GeoServer中使用样式化图层描述符(sld)给WMS加注记-LMLPHP

现需要把道路数据和它的注记发布为WMS服务,通过GeoServer直接发布服务的话会显示默认的样式,这个版本中(2.6.2)默认情况下点用红色的方块表示,无法表示注记信息。因此需要使用样式化图层描述符(sld)来设置样式,本质就是个XML文件。

首先可以从这里http://docs.geoserver.org/stable/en/user/styling/sld/cookbook/points.html#point-with-styled-label下载一个sld文件的模板,在此基础上修改。注意不要在浏览器窗口中复制,要不然会漏了XML文件头。文件内容如下

<?xml version="1.0" encoding="ISO-8859-1"?>
<StyledLayerDescriptor version="1.0.0"
xsi:schemaLocation="http://www.opengis.net/sld StyledLayerDescriptor.xsd"
xmlns="http://www.opengis.net/sld"
xmlns:ogc="http://www.opengis.net/ogc"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<NamedLayer>
<Name>Point with styled label</Name>
<UserStyle>
<Title>GeoServer SLD Cook Book: Point with styled label</Title>
<FeatureTypeStyle>
<Rule>
<PointSymbolizer>
<Graphic>
<Mark>
<WellKnownName>circle</WellKnownName>
<Fill>
<CssParameter name="fill">#FF0000</CssParameter>
</Fill>
</Mark>
<Size>6</Size>
</Graphic>
</PointSymbolizer>
<TextSymbolizer>
<Label>
<ogc:PropertyName>name</ogc:PropertyName>
</Label>
<Font>
<CssParameter name="font-family">Arial</CssParameter>
<CssParameter name="font-size">12</CssParameter>
<CssParameter name="font-style">normal</CssParameter>
<CssParameter name="font-weight">bold</CssParameter>
</Font>
<LabelPlacement>
<PointPlacement>
<AnchorPoint>
<AnchorPointX>0.5</AnchorPointX>
<AnchorPointY>0.0</AnchorPointY>
</AnchorPoint>
<Displacement>
<DisplacementX>0</DisplacementX>
<DisplacementY>5</DisplacementY>
</Displacement>
</PointPlacement>
</LabelPlacement>
<Fill>
<CssParameter name="fill">#000000</CssParameter>
</Fill>
</TextSymbolizer>
</Rule>
</FeatureTypeStyle>
</UserStyle>
</NamedLayer>
</StyledLayerDescriptor>

代码的含义很容易理解,都是字面意思。PropertyName标签要改成对应的属性字段名字,对照第二个图这里是TEXTSTRING,大小写也要一致。加注记的话就不需要PointSymbolizer了,可以把size改为0,或者把透明度改为0,加一个css参数,name是opacity.字体这里要注意,使用英文字体的话如果注记是汉字会出现乱码,这里改为宋体。另外在GeoServer中新建Stores的时候也要把编码方式设置成g2312,GeoServer中的geotools插件对中文的支持不是很好,很容易出现乱码问题。最重要的地方是PointPlacement标签,它决定了注记相对于点的位置,AnchorPoint标签设置注记和点的交点,X为0.5意味着点在标签的水平方向的中部,Y为0意味着点和标签的底部在垂直方向上是对齐的。Displacement标签就相当于offset偏移量,这里水平方向上偏移0像素,垂直方向偏移5个像素。因此设置注记的话改成0.5 0.5 0 0就比较合适。除了手动修改上面的代码外也可以用QGIS、uDig等开源GIS软件自定义好样式后再导出。

接下来在GeoServer里添加这个自定义的样式,点左边“数据”中的“styles”,然后添加新的样式,如下图

GeoServer中使用样式化图层描述符(sld)给WMS加注记-LMLPHP

先选择文件,再upload,工作区不选也行,这样可以用到所用的工作区。最后提交。找到已经发布的图层,点开找到“发布”那一栏,把默认的样式改成刚才定义的那个就好了。

GeoServer中使用样式化图层描述符(sld)给WMS加注记-LMLPHP

然后去layer preview那里预览一下就可以看到效果。这里是自己调用Openlayers写的程序,把底下的道路网也加载进来,好看看效果怎么样

GeoServer中使用样式化图层描述符(sld)给WMS加注记-LMLPHP

更多细节可以去下载sld的那个链接里查看,里面有详细的cookbook

转载请注明作者和出处。xiaoyi14,http://www.cnblogs.com/xiaoyi14/p/roadannotation.html

05-07 15:23