引子#
需求是有一幅海洋要素的資料,資料有 12 個channel
,12 個channel
對應 12 個月份的資料。圖層發布後,可以使用樣式選擇相應出 channel,顯示某月的資料。簡單粗暴的方式是複製 12 份style
,為了利於以後的維護 (多半要自己維護),遂想找一種方式類似 “動態樣式” 的東西,可以從外部獲取參數,使用同個style
通過不同的參數選擇不同的channel
。
這裡被自己的自以為是小坑了一下:生產環境用的GeoServer
版本比較低,2.11.x
。自己看文檔的時候看的最新的文檔,測試不行後,又看了2.11
的文檔,文檔裡雖然有類似的用法,但在channal
選擇的時候不可用。
所以這個方式只適用於較新的版本。
圖層發布#
圖層發布,多channel
的影像理論都可以。
設置樣式#
一般的波段融合的channel
select 是這種形式1
<ChannelSelection>
<RedChannel>
<SourceChannelName>1</SourceChannelName>
</RedChannel>
<GreenChannel>
<SourceChannelName>2</SourceChannelName>
</GreenChannel>
<BlueChannel>
<SourceChannelName>3</SourceChannelName>
</BlueChannel>
</ChannelSelection>
style
中 1,2,3 channel
對應 (R,G,B)
。
對於選擇單channel
顯示,使用Function
獲取 “環境變量”,替換默認值
<RasterSymbolizer>
<Opacity>1.0</se:Opacity>
<ChannelSelection>
<GrayChannel>
<SourceChannelName>
<Function name="env">
<ogc:Literal>m</ogc:Literal>
<ogc:Literal>1</ogc:Literal>
</ogc:Function>
</SourceChannelName>
</GrayChannel>
</ChannelSelection>
</RasterSymbolizer>
其中,channel
name 中包裹了一個 Function 對象,它在env
中的m
的值為空時提供1
作為默認值,若 m 非空,則使用m
的值作為 channel
name。
在wms
請求中添加 & env=m:2 即可選擇編號為 2 的channel
顯示。
http://localhost:8083/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=geosolutions:usa&styles=&bbox=-130.85168,20.7052,-62.0054,54.1141&width=768&height=372&srs=EPSG:4326&format=application/openlayers&env=m:2
以下是一個完整的樣式:
<?xml version="1.0" encoding="UTF-8"?>
<StyledLayerDescriptor 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" xsi:schemaLocation="http://www.opengis.net/sld
http://schemas.opengis.net/sld/1.0.0/StyledLayerDescriptor.xsd" version="1.0.0">
<NamedLayer>
<Name>saltsld</Name>
<UserStyle>
<Title>A raster style</Title>
<FeatureTypeStyle>
<Rule>
<RasterSymbolizer>
<Opacity>1.0</Opacity>
<ChannelSelection>
<GrayChannel>
<SourceChannelName><ogc:Function name="env">
<ogc:Literal>m</ogc:Literal>
<ogc:Literal>1</ogc:Literal>
</ogc:Function></SourceChannelName>
</GrayChannel>
</ChannelSelection>
<ColorMap>
<ColorMapEntry color="#0000ff" quantity="28.0"/>
<ColorMapEntry color="#009933" quantity="30.0"/>
<ColorMapEntry color="#ff9900" quantity="32.0" />
<ColorMapEntry color="#ff0000" quantity="34.0"/>
</ColorMap>
</RasterSymbolizer>
</Rule>
</FeatureTypeStyle>
</UserStyle>
</NamedLayer>
</StyledLayerDescriptor>
後話#
最終因為生產環境版本不容易更新,還是自己複製了 12*2 個樣式。