引子#
要求は海洋要素のデータがあり、そのデータには 12 のchannel
があり、12 のchannel
は 12 ヶ月のデータに対応しています。レイヤーを公開した後、スタイルを使用して対応するchannel
を選択し、特定の月のデータを表示できます。簡単な方法は 12 のstyle
をコピーすることですが、将来的なメンテナンスを考慮して(ほとんど自分でメンテナンスする必要があるため)、外部からパラメータを取得し、同一のstyle
を使用して異なるchannel
を選択できる「動的スタイル」のような方法を探しました。
ここで自分の思い込みに少しハマってしまいました:本番環境で使用しているGeoServer
のバージョンがかなり古く、2.11.x
です。ドキュメントを見ているときは最新のドキュメントを見ていたため、テストがうまくいかなかった後、2.11
のドキュメントを再度確認しました。ドキュメントには似たような使い方がありましたが、channel
の選択時には使用できませんでした。
したがって、この方法は新しいバージョンにのみ適用されます。
レイヤー公開#
レイヤーの公開は、多channel
の画像理論的には可能です。
スタイル設定#
一般的なバンド融合のchannel
選択はこの形式です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
名の中に Function オブジェクトが包まれており、env
のm
の値が空のときにデフォルト値として1
を提供します。もしm
が空でなければ、m
の値をchannel
名として使用します。
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>ラスタースタイル</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 のスタイルをコピーしました。