1. 程式人生 > >GeoServer中使用SLD樣式

GeoServer中使用SLD樣式

1 背景

我們在ArcMap中可以直接通過symbol功能對圖層進行定製化配圖。但是,如果我們將配好圖的shp圖層在GeoServer中釋出時,會發現圖層樣式完全丟失了。其實原因很簡單,用ArcMap配好的圖層,其樣式檔案並不是儲存在shp中,而是儲存在mxd或者msd中。

那麼如何才能讓GeoServer釋出的圖層也能達到定製化配圖的效果呢?

2 SLD簡介

SLD是風格化圖層描述器(Styled Layer Descriptor)的簡稱,是2005年OGC提出的一個標準,這個標準在一定條件下允許WMS伺服器對地圖視覺化的表現形式進行擴充套件。在沒有SLD之前,只能使用一些已經在伺服器上規定好的樣式來對地圖進行視覺化。而當使用了實現了SLD標準之後,它允許我們從客戶端來對地圖進行定義自己的樣式,分級顯示等操作,極大的擴充套件了地圖視覺化的靈活性。

該SLD-規範是採用XML定義地圖顯示樣式,通過自定義SLD來配置地圖圖層渲染的視覺化風格,可以設定過濾器,自定義圖例等。rule是SLD最重要的一個元素,因為她允許根據給定的某個引數(使用過濾器)對資料集進行分類,所有的與分類有關的重要引數都必須在rule元素中設定。

對於使用SLD來進行地圖的自定義樣式,則必須結合使用SE(Symbology Encoding)這個標準。SE是OGC的另一個標準,這個也是基於XML模式定義的,這個標準允許我們自定義不同的符號樣式來表達地圖上不同的要素。SLD檔案使用這種語言,這樣在地圖渲染時地圖服務可以解釋由使用者定義的樣式。

SLD文件的元素架構如下:

                       

一個SLD樣式文件一般包含一個部分,而最重要的如下:

FeatureTypeStyle:這一部分是整個樣式文件的根節點,並說明什麼是它的樣式將被應用的特徵型別。FeatureTypeStyle包含一個或者多個Rule元素,Rule元素允許有條件的對映。

RULE(規則):規則是根據屬性條件和地圖比例尺來對要素進行分組渲染,一般RULE中只允許渲染一種型別的要素,即點,線,面等其中的一種,但是可以和註記同時使用。

Symbolizer(符號):Symbolizer指定資料應該如何視覺化,在1.0的標準中包含五忠型別的Symbolizer,分別是PointSymbolizer(點符號)、LineSymbolizer(線符號)、PloygonSymbolizer(面符號)、TextSymbolizer(註記)、RasterSymbolizer(柵格)。

通過SLD可以設定的不僅僅是簡單的顏色和厚度。點可以設定成常用的形狀,如圓形,方形,星形,甚至可以是自定義的圖片圖形或文字來指定;線可以渲染成虛線或者點虛線等,多邊形可以填充自定義的平鋪影象,樣式可以基於資料的屬性給定,以至於要素能夠

被渲染成不同的風格。

常用引數說明:

符號

含義

<Name>

樣式名稱

<FeatureTypeStyle>

要素樣式

<Rule>

規則

<ogc:Filter>

過濾器

<ogc:PropertyIsBetween>

用來定義在兩個屬性值之間的過濾器

<ogc:PropertyIsLessThan>

用來定義在小於某個屬性值的過濾器

<ogc:PropertyIsGreaterThan>

用來定義在大於某個屬性值的過濾器

<ogc:PropertyName>

屬性欄位名

<ogc:Literal>

屬性值

<PointSymbolizer>

點標記器

<LineSymbolizer>

線標記器

<PolygonSymbolizer>

面標記器

<CssParameter   name="fill">

填充顏色

<CssParameter   name="font-family">

字型

<CssParameter   name="font-style">

字型樣式

<CssParameter   name="font-size">

字型大小

3 以polygon圖層為例,詳細講解

3.1基本顏色填充

3.1.1 結構

PolygonSymbolizer

……Fill

填充

………CssParameter  name="fill"

顏色

………CssParameter  name="fill-opacity"

透明度

……Stroke

邊界

………CssParameter  name="stroke"

顏色

………CssParameter  name="stroke-width"

寬度

3.1.2示例

帶有邊界透明的多邊形

SLD:

<FeatureTypeStyle>     <Rule>         <PolygonSymbolizer>         <Fill>          <CssParameter   name="fill">#AAAAAA</CssParameter>          <CssParameter   name="fill-opacity">0.5</CssParameter>        </Fill>        <Stroke>         <CssParameter   name="stroke">#000000</CssParameter>         <CssParameter   name="stroke-width">1</CssParameter>       </Stroke>      </PolygonSymbolizer>     </Rule>    </FeatureTypeStyle>

效果:

 

3.2圖片填充

3.2.1結構

PolygonSymbolizer

……Fill

………GraphicFill

…………Graphic

……………ExternalGraphic

………………OnlineResource

圖片來源

………………Format

圖片格式

……………Size

大小

3.2.2示例

帶有使用圖片填充的多邊形

SLD:

<FeatureTypeStyle>     <Rule>        <PolygonSymbolizer>

            <Fill>

              <GraphicFill>

                <Graphic>

                    <ExternalGraphic>

                     <OnlineResource xlink:type="simple"   xlink:href="20101.gif" />

                   <Format>image/gif</Format>

                    </ExternalGraphic>

                    <Size>20</Size>

                </Graphic>

              </GraphicFill>

            </Fill>

            <Stroke>

              <CssParameter   name="stroke">#000000</CssParameter>

              <CssParameter   name="stroke-width">1</CssParameter>

            </Stroke>

        </PolygonSymbolizer>

  </Rule>    </FeatureTypeStyle>

效果:

 

3.3註記顯示

3.2.1結構

TextSymbolizer

……Label

………ogc:PropertyName

註記的屬性欄位名稱

……Font

字型

………CssParameter  name="font-family"

字型型別

………CssParameter  name="font-size"

字型大小

………CssParameter  name="font-style"

字型樣式

………CssParameter  name="font-weight"

字型加粗

……LabelPlacement

註記的位置

………PointPlacement

註記點位置

…………AnchorPoint

……………AnchorPointX

……………AnchorPointY

…………Displacement

……………Displacement X

……………Displacement Y

…………Rotation

設定旋轉角度

……Fill

填充

………CssParameter  name="fill"

填充顏色

3.2.2示例

帶有註記的填充色透明的多邊形

SLD:

 <TextSymbolizer>          <Label>              <ogc:PropertyName>COMNAME</ogc:PropertyName>          </Label>          <Font>              <CssParameter name="font-family">微軟雅黑</CssParameter>              <CssParameter name="font-size">15</CssParameter>              <CssParameter name="font-style">normal</CssParameter>              <CssParameter name="font-weight">bold</CssParameter>          </Font>          <LabelPlacement>              <PointPlacement>                   <AnchorPoint>                <AnchorPointX>0.5</AnchorPointX>                <AnchorPointY>0.5</AnchorPointY>                </AnchorPoint>              </PointPlacement>          </LabelPlacement>          <Fill>              <CssParameter name="fill">#FF5226</CssParameter>          </Fill>          <VendorOption name="followLine">true</VendorOption>     </TextSymbolizer> 

效果:

 

3.4 分屬性渲染

3.4.1結構

PolygonSymbolizer

……Rule

………Filter

………PolygonSymbolizer

………TextSymbolizer

3.4.2示例

根據屬性欄位值範圍用不同顏色渲染。

SLD:

<FeatureTypeStyle>

<Rule>

<Name>SmallCOMM</Name>

<Title>Less Than 510104024008</Title>

<ogc:Filter>

<ogc:PropertyIsLessThan>

<ogc:PropertyName>COMID</ogc:PropertyName>

<ogc:Literal>510104024008</ogc:Literal>

</ogc:PropertyIsLessThan>

</ogc:Filter>

<PolygonSymbolizer>

  <Fill>

 <CssParameter   name="fill">#66FF66</CssParameter>

 </Fill>

 </PolygonSymbolizer>

</Rule>

<Rule>

<Name>MediumCOMM</Name>

<Title>510104024008 to 510104024011</Title>

<ogc:Filter>

<ogc:And>

<ogc:PropertyIsGreaterThanOrEqualTo>

<ogc:PropertyName>COMID</ogc:PropertyName>

<ogc:Literal>510104024008</ogc:Literal>

</ogc:PropertyIsGreaterThanOrEqualTo>

<ogc:PropertyIsLessThan>

<ogc:PropertyName>COMID</ogc:PropertyName>

<ogc:Literal>510104024011</ogc:Literal>

</ogc:PropertyIsLessThan>

</ogc:And>

</ogc:Filter>

<PolygonSymbolizer>

<Fill>

<CssParameter name="fill">#33CC33</CssParameter>

</Fill>

</PolygonSymbolizer>

</Rule>

<Rule>

<Name>LargeCOMM</Name>

<Title>Greater Than 510104024011</Title>

<ogc:Filter>

<ogc:PropertyIsGreaterThan>

<ogc:PropertyName>COMID</ogc:PropertyName>

<ogc:Literal>510104024011</ogc:Literal>

</ogc:PropertyIsGreaterThan>

</ogc:Filter>

<PolygonSymbolizer>

<Fill>

<CssParameter name="fill">#009900</CssParameter>

</Fill>

</PolygonSymbolizer>

</Rule>

</FeatureTypeStyle>

效果:

                       

在SLD中還根據3.3的註記寫法,增加了註記的顯示。

3.5分級渲染

3.5.1結構

PolygonSymbolizer

……Rule

………MinScaleDenominator

………MaxScaleDenominator

………PolygonSymbolizer

………TextSymbolizer

3.5.2示例

通過設定不同比例尺時的顯示顏色,展示不同的效果。

SLD:

<FeatureTypeStyle>

<Rule>

<Name>Large</Name>

<MaxScaleDenominator>5746</MaxScaleDenominator>

<PolygonSymbolizer>

<Fill>

<CssParameter name="fill">#CCCCCC</CssParameter>

</Fill>

<Stroke>

<CssParameter name="stroke">#000000</CssParameter>

<CssParameter name="stroke-width">7</CssParameter>

</Stroke>

</PolygonSymbolizer>

</Rule>

<Rule>

<Name>Medium</Name>

<MinScaleDenominator>5746</MinScaleDenominator>

<MaxScaleDenominator>12000</MaxScaleDenominator>

<PolygonSymbolizer>

<Fill>

<CssParameter name="fill">#0000CC</CssParameter>

</Fill>

<Stroke>

<CssParameter name="stroke">#000000</CssParameter>

<CssParameter name="stroke-width">4</CssParameter>

</Stroke>

</PolygonSymbolizer>

</Rule>

<Rule>

<Name>Small</Name>

<MinScaleDenominator>12000</MinScaleDenominator>

<PolygonSymbolizer>

<Fill>

<CssParameter name="fill">#0000CC</CssParameter>

</Fill>

<Stroke>

<CssParameter name="stroke">#000000</CssParameter>

<CssParameter name="stroke-width">1</CssParameter>

</Stroke>

</PolygonSymbolizer>

</Rule>

</FeatureTypeStyle>

效果圖:

 

4 注意

4.1 註記渲染時某些註記未顯示

初始時,某個要素的註記無法顯示:

 

放大後其又可以出現:

 

出現這種情況,往往是因為註記顯示的地方在另外一個要素下面。

解決方法比較簡單,利用LabelPalcement元素調整註記顯示的地方便可解決。例如:

 <LabelPlacement>          <PointPlacement>            <AnchorPoint>                <AnchorPointX>0.5</AnchorPointX>                <AnchorPointY>0.5</AnchorPointY>            </AnchorPoint>          </PointPlacement>        </LabelPlacement>

4.2 中文出現亂碼

出現這樣的情況,一般是SLD中未進行正確的格式編碼賦值。

首先將編碼改成GB2312。例如:

<?xml version="1.0" encoding="GB2312"?>

如果發現還是亂碼,則很有可能是目前字型不支援中文。

例如當字型是Arial時,不支援中文:

<CssParameter name="font-family">Arial</CssParameter>

將字型改成微軟雅黑,則註記不再重現亂碼:

<CssParameter name="font-family">微軟雅黑</CssParameter>

5 總結

對Point和Line圖層的SLD檔案編寫,其格式和內容與Polygon大體相似,不再累述。GeoServer不僅支援對向量圖層的渲染,還支援對柵格圖層的渲染。在以後的章節中我會跟大家繼續一起探討。