文章版權由作者李曉暉和博客園共有,若轉載請於明顯處標明出處:http://www.cnblogs.com/naaoveGIS/。
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> |
效果:
3.2圖片填充
3.2.1結構
…PolygonSymbolizer |
|
……Fill |
|
………GraphicFill |
|
…………Graphic |
|
……………ExternalGraphic |
|
………………OnlineResource |
圖片來源 |
………………Format |
圖片格式 |
……………Size |
大小 |
3.2.2示例
帶有使用圖片填充的多邊形
SLD:
<FeatureTypeStyle> <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> |
效果:
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>
|
效果:
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> |
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不僅支持對矢量圖層的渲染,還支持對柵格圖層的渲染。在以后的章節中我會跟大家繼續一起探討。
-----歡迎轉載,但保留版權,請於明顯處標明出處:http://www.cnblogs.com/naaoveGIS/
如果您覺得本文確實幫助了您,可以微信掃一掃,進行小額的打賞和鼓勵,謝謝 ^_^