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不僅支援對向量圖層的渲染,還支援對柵格圖層的渲染。在以後的章節中我會跟大家繼續一起探討。