引子#
要求は、海洋要素のデータがあり、データには 12 のチャンネルがあります。12 のチャンネルは、12 の月のデータに対応しています。レイヤーを公開した後、スタイルを使用して特定のチャンネルを選択し、特定の月のデータを表示できます。単純な方法は、12 個のスタイルをコピーすることですが、将来のメンテナンスのために(おそらく自分でメンテナンスする必要があるため)、外部からパラメータを取得し、同じスタイルを使用して異なるチャンネルを選択するための「ダイナミックスタイル」のような方法を探しています。
ここで、自分自身が思い込んでいた小さな落とし穴にはまりました:本番環境では、使用している GeoServer のバージョンが比較的古いです(2.11.x)。自分は最新のドキュメントを見ていたのですが、テストがうまくいかなかったので、2.11 のドキュメントも見ました。ドキュメントには似たような使用法が記載されていましたが、チャンネルの選択時には使用できませんでした。
したがって、この方法は比較的新しいバージョンにのみ適用されます。
レイヤーの公開#
レイヤーの公開は、複数のチャンネルを持つ画像に対して一般的に行われます。
スタイルの設定#
通常、チャンネルの選択は次の形式で行われます1。
<ChannelSelection>
<RedChannel>
<SourceChannelName>1</SourceChannelName>
</RedChannel>
<GreenChannel>
<SourceChannelName>2</SourceChannelName>
</GreenChannel>
<BlueChannel>
<SourceChannelName>3</SourceChannelName>
</BlueChannel>
</ChannelSelection>
スタイルの中で、1、2、3 のチャンネルは、(R、G、B)に対応しています。
単一のチャンネルを選択して表示する場合は、環境変数を取得するために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
名は Function オブジェクトで囲まれており、それはenv
内のm
の値が空の場合にデフォルト値として1
を提供し、m が空でない場合は m の値をchannel
名として使用します。
wms
リクエストに&env=m:2
を追加すると、番号 2 のチャンネルが表示されます。
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 個のスタイルをコピーしました。