GeoServer 多波段影像使用同个样式

引子

需求是有一幅海洋要素的数据,数据有12个channel,12个channel对应12个月份的数据。图层发布后,可以使用样式选择相应出channel,显示某月的数据。简单粗暴的方式是复制12份style,为了利于以后的维护(多半要自己维护),遂想找一种方式类似“动态样式”的东西,可以从外部获取参数,使用同个style通过不同的参数选择不同的channel

这里被自己的自以为是小坑了一下:生产环境用的GeoServer版本比较低,2.11.x。自己看文档的时候看的最新的文档,测试不行后,又看了2.11的文档,文档里虽然有类似的用法,但在channal选择的时候不可用。

所以这个方式只适用于较新的版本。

图层发布

图层发布,多channel的影像理论都可以。

设置样式

一般的波段融合的channel select是这种形式1

 1<ChannelSelection>
 2  <RedChannel>
 3    <SourceChannelName>1</SourceChannelName>
 4  </RedChannel>
 5  <GreenChannel>
 6    <SourceChannelName>2</SourceChannelName>
 7  </GreenChannel>
 8  <BlueChannel>
 9    <SourceChannelName>3</SourceChannelName>
10  </BlueChannel>
11</ChannelSelection>

style中1,2,3 channel对应 (R,G,B)

对于选择单channel显示,使用Function获取“环境变量”,替换默认值

 1<RasterSymbolizer>
 2  <Opacity>1.0</se:Opacity>
 3  <ChannelSelection>
 4    <GrayChannel>
 5      <SourceChannelName>
 6            <Function name="env">
 7             <ogc:Literal>m</ogc:Literal>
 8             <ogc:Literal>1</ogc:Literal>
 9          </ogc:Function>
10      </SourceChannelName>
11    </GrayChannel>
12  </ChannelSelection>
13</RasterSymbolizer>

其中,channel name 中包裹了一个Function对象,它在env中的m的值为空时候提供1作为默认值,若m非空,则使用m的值作为 channel name。

wms请求中添加&env=m:2 即可选择编号为2的channel显示。

1http://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

以下是一个完整的样式:

 1<?xml version="1.0" encoding="UTF-8"?>
 2<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
 3http://schemas.opengis.net/sld/1.0.0/StyledLayerDescriptor.xsd" version="1.0.0">
 4  <NamedLayer>
 5    <Name>saltsld</Name>
 6    <UserStyle>
 7      <Title>A raster style</Title>
 8      <FeatureTypeStyle>
 9        <Rule>
10          <RasterSymbolizer>
11            <Opacity>1.0</Opacity>
12            <ChannelSelection>
13                <GrayChannel>
14                        <SourceChannelName><ogc:Function name="env">
15                    <ogc:Literal>m</ogc:Literal>
16                    <ogc:Literal>1</ogc:Literal>
17            </ogc:Function></SourceChannelName>
18                </GrayChannel>
19        </ChannelSelection>
20            <ColorMap>
21           <ColorMapEntry color="#0000ff" quantity="28.0"/>
22           <ColorMapEntry color="#009933" quantity="30.0"/>
23           <ColorMapEntry color="#ff9900" quantity="32.0" />
24           <ColorMapEntry color="#ff0000" quantity="34.0"/>
25 </ColorMap>
26          </RasterSymbolizer>
27        </Rule>
28      </FeatureTypeStyle>
29    </UserStyle>
30  </NamedLayer>
31</StyledLayerDescriptor>
32
33

9月

3月

后话

最终因为生产环境版本不容易更新,还是自己复制了12*2个样式。


  1. GeoServer : RasterSymbolizer ↩︎

Last edited : 2022-04-26 19:01

Link content :)