xiaoyi14

导航

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

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

它的属性表如下

现需要把道路数据和它的注记发布为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”,然后添加新的样式,如下图

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

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

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

 

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

 

 

 

 


 

posted on 2017-05-12 18:54  xiaoyi14  阅读(5317)  评论(0编辑  收藏  举报