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

 

 

 

 

 
        

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM