目錄
geoserver的WMS服務支持url參數上傳sld_body來動態定義訪問圖層的樣式,本文以GetMap以及GetLegendGraphic爲例進行說明。
要點
- 一定要注意樣式格式的正確性,樣式不能有縮進,否則容易報錯
- 圖層名稱一定要在UserLayer裏的Name體現
- 樣式文本不要過大,url有字數上限
- 儘量使用程序生成需要的樣式文本,不要自行編輯
使用
取標準樣式
先從geoserver取下來標準的polygon樣式,目的是保證格式正確性,標準樣式如下:
<?xml version="1.0" encoding="UTF-8"?>
<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">
<!-- a Named Layer is the basic building block of an SLD document -->
<NamedLayer>
<Name>default_polygon</Name>
<UserStyle>
<!-- Styles can have names, titles and abstracts -->
<Title>Default Polygon</Title>
<Abstract>A sample style that draws a polygon</Abstract>
<!-- FeatureTypeStyles describe how to render different features -->
<!-- A FeatureTypeStyle for rendering polygons -->
<FeatureTypeStyle>
<Rule>
<Name>rule1</Name>
<Title>Gray Polygon with Black Outline</Title>
<Abstract>A polygon with a gray fill and a 1 pixel black outline</Abstract>
<PolygonSymbolizer>
<Fill>
<CssParameter name="fill">#AAAAAA</CssParameter>
</Fill>
<Stroke>
<CssParameter name="stroke">#000000</CssParameter>
<CssParameter name="stroke-width">1</CssParameter>
</Stroke>
</PolygonSymbolizer>
</Rule>
</FeatureTypeStyle>
</UserStyle>
</NamedLayer>
</StyledLayerDescriptor>
修改爲自定義規則
將Rule部分修改或擴充多個,以滿足自身需求爲準,舉例:
<Rule>
<Name>rule1</Name>
<Title>my title</Title>
<Filter>
<And>
<PropertyIsGreaterThanOrEqualTo>
<PropertyName>key</PropertyName>
<Literal>1</Literal>
</PropertyIsGreaterThanOrEqualTo>
<PropertyIsLessThan>
<PropertyName>key</PropertyName>
<Literal>5</Literal>
</PropertyIsLessThan>
</And>
</Filter>
<PolygonSymbolizer>
<Fill>
<CssParameter name="fill">#00ff00</CssParameter>
<CssParameter name="fill-opacity">1.0</CssParameter>
</Fill>
<Stroke/>
</PolygonSymbolizer>
</Rule>
GetMap使用
URL調用方式
記得要將sld_body轉換URLEncode,同時不需要寫layer參數。
http://localhost:8080/geoserver/wms?SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&FORMAT=image%2Fpng&TRANSPARENT=true&sld_body=<StyledLayerDescriptor%20xmlns%3D"http%3A%2F%2Fwww.opengis.net%2Fsld"%20xmlns%3Aogc%3D"http%3A%2F%2Fwww.opengis.net%2Fogc"%20xmlns%3Axlink%3D"http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink"%20xmlns%3Axsi%3D"http%3A%2F%2Fwww.w3.org%2F2001%2FXMLSchema-instance"%20version%3D"1.0.0"%20xsi%3AschemaLocation%3D"http%3A%2F%2Fwww.opengis.net%2Fsld%20StyledLayerDescriptor.xsd"><NamedLayer><Name>layer<%2FName><UserStyle><FeatureTypeStyle><Rule><Name>rule1<%2FName><Title>title<%2FTitle><Filter><PropertyIsLessThan><PropertyName>key<%2FPropertyName><Literal>5<%2FLiteral><%2FPropertyIsLessThan><%2FFilter><PolygonSymbolizer><Fill><CssParameter%20name%3D"fill">%23ff0000<%2FCssParameter><CssParameter%20name%3D"fill-opacity">1.0<%2FCssParameter><%2FFill><Stroke%2F><%2FPolygonSymbolizer><%2FRule><%2FFeatureTypeStyle><%2FUserStyle><%2FNamedLayer><%2FStyledLayerDescriptor>&WIDTH=256&HEIGHT=256&SRS=EPSG%3A4326&STYLES=&BBOX=106.171875%2C21.796875%2C106.5234375%2C22.1484375
Openlayers調用方式
同樣不需要寫layer參數。
var sld = '你的樣式文本';
var wms = new ol.layer.Tile({
source: new ol.source.TileWMS({
url: 'http://localhost:8080/geoserver/wms',
params: {'VERSION': '1.1.1', sld_body: sld}
})
});
GetLegendGraphic使用
這裏要寫layer參數,因爲是必填的。
http://localhost:8080/geoserver/wms?REQUEST=GetLegendGraphic&VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&sld_body=你的樣式文本
訪問報錯問題
一般都是sld_body引起的,建議先用標準的樣式進行測試,逐步修改樣式,使用XML格式化網站進行測試。