チュートリアル
Tutorial ImageCollectionのマップ表示
GCOM-C/SGLIの単バンドデータ(ImageCollection)を使用してマップ表示するまでのチュートリアルとなります。
具体的には、クロロフィルa濃度(CHLA)という水質に関連したGCOM-CデータをGEE上でロード(呼び出し)・表示する手順を説明します。
Google Earth Engine(GEE)にユーザ登録の上、ご利用ください。(サンプルスクリプト)
GEEにアップロードされているGCOM-C/SGLIのImageCollectionについては、こちらの一覧もご確認ください。
目次
① GEE上のデータ(ImageCollection)をロードする。
ee.ImageCollection('ImageCollection名')で、ロードすることができます。
GCOM-CのImageCollectionは「'projects/ee-gcomsgli/assets/[プロダクト名]Q'」となります。
以降、CHLAを例として記載します。
上記では、全期間のImageCollectionとなるため、必要な期間に絞り込みます。
ee.ImageCollectionとつなげて「.filterDate('開始日', '終了日')」を記載します。日付は「yyyy-mm-ddThh:mm:ss」形式とします。
var imageCollection = ee.ImageCollection('projects/ee-gcomsgli/assets/CHLAQ')
.filterDate('2022-11-01T00:00:00', '2022-11-07T23:59:59');
② ImageCollectionの情報を取得する。
printで、ImageCollectionの情報確認します。
print('All metadata:', imageCollection);
Scriptの上にあるSaveとRunボタンを実行後、Consoleの部分にバンド名が表示されます。必要な物理量のバンド名を確認してください。
③ QAフラグでのマスクとSlope, Offsetの計算
QAフラグでのマスクとSlope, Offsetの計算について、コードを以下に示します。
Imageに格納されたQAフラグの値で、Image内の品質の悪い画素をマスクすることが出来ます。
QAフラグはbit毎に品質の情報を示し、「Mask_for_statistics」と「QA_flag」でAND演算を行い、統計値算出に使用する画素を判別します。
またImageにはDN値が格納されているため、物理量とするために「DN*slope+offset」の計算が必要となります。
「map」を使用することで、ImageCollection内の全てのImageに上記の処理をします。
var imgCHLA = imageCollection.map(function(img){
var CHLA = img.select("CHLA");
var QA_flag = img.select("QA_flag");
// QA flag
var QA_ErrDN = ee.Number.parse(QA_flag.get('IWP_QA_flag_Error_DN'));
// Mask
var Mask_for_statistics = ee.Number.parse(CHLA.get('CHLA_Mask_for_statistics')).int();
var img_mask = CHLA.updateMask(QA_flag.bitwiseAnd(Mask_for_statistics).eq(0));
// Slope、Offset
var slope = ee.Number.parse(img.get('CHLA_Slope')).float();
var offset = ee.Number.parse(img.get('CHLA_Offset')).float();
return img.multiply(slope).add(offset).log10();
});
コード2行目 :
②で確認したバンド名で、imgからCHLAとQAフラグをそれぞれ取得します。
コード5行目 :
CHLAからMask_for_statistics、QA_flagからQA_ErrDNを取得します。
プロパティ名は②の出力結果の「properties」から確認してください。
※物理量によって、バンド名とプロパティの命名規則が異なりますのでご注意ください。
コード9行目 :
bitのAND演算はGoogle Earth engineではbitwiseAndを使用します。
bitwiseAndの結果でuppdareMaskすることで、品質の悪い画素をマスクします。
コード11行目 :
Imageのプロパティから計算に使用するSlope、Offsetの値を取得します。
②の出力結果の「properties」を開き、下の画像のようにSlope、Offsetのプロパティ名を確認してください。
いずれか1つのImageのプロパティを確認すれば問題ありません。
※物理量によって、バンド名とプロパティの命名規則が異なりますのでご注意ください。
コード13行目 :
物理量によってはlogでの表示の方が適している場合があるので、必要な場合はここで計算します。
※[ImageCollection].map(function(img){ 処理 }):ImageCollection内の全てに{}内の処理をします。
()内の変数名imgが{}内の処理をする際のImage名となります。
returnで処理後のImageCollectionを、変数CHLAに返します。
※ee.Number.parse(プロパティの値).int():プロパティの値は文字列のため、数値(int)に変換して取得します。
※img.get('プロパティ名'):Consoleで確認したプロパティ名を指定し、プロパティの値を取得します。
※ee.Number.parse(プロパティの値).float():プロパティの値は文字列のため、数値(float)に変換して取得します。
※ee.Image.get('プロパティ名'):プロパティ名を指定し、プロパティの値を取得します。
※ee.Image.multiply(slope):プロパティから取得したSlopeの値をImageの各値に乗算します。
※ee.Image.add(offset):プロパティから取得したOffsetの値をImageの各値に加算します。
※log10():
10 を底とする対数を計算します。
④ 視覚化のパラメータを指定する。
バンド名、最小値、最大値、カラーパレットを指定します。
var imageVisParam = {
"bands" : ["CHLA"],
"min" : -1.0,
"max" : 1.0,
"palette" : ["003BD5","0080D5","00ABAB","00C36A","00D212","0EDF00","21EB00","37F400","58F600","79F800"]
};
⑤ マップ上に表示する。
ImageCollection、パラメータ、物理量名を指定して、マップ表示します。
Map.addLayer(imgCHLA, imageVisParam, 'CHLA');
⑥ マップの表示位置を指定する。
GCOM-CのImageCollectionは日本域のため、日本付近を指定します。
Map.setCenter(経度, 緯度, ズームレベル);
Map.setCenter(140.0, 40.0, 3);
サイズの大きいImageCollectionの場合は表示が遅くなりますが、以下の通りImageCollectionが中心になるように指定することも出来ます。 Map.centerObject(オブジェクト(ImageCollection)名,ズームレベル);
Map.centerObject(imgCHLA,3);
Scriptの上にある、SaveとRunボタンを実行すると、下のマップにImageCollectionが表示されます。
⑦ カラーバーを表示する。
マップ表示に使用したカラーパレットを使用してカラーバーを作成することが出来ます。
以下では一例としてマップ左下に横向きのカラーバーを表示する手順を記載します。適宜カスタマイズをしてください。
流れとしては、色付きのバーの部分、バーの下に表示する数値ラベル、バーの上に表示するタイトルをそれぞれ作成していき、ui.Panelでそれらをまとめて配置、最後にマップ上の位置を設定したui.Panelをマップに追加します。
bbox、min、maxで色の刻みの指定、dimensionsでカラーバーの色部分の大きさの指定(横px×縦px)をします。
palleteはマップ表示で使用したimageVisParamのpaletteを使用します。「.palette」でimageVisParamの中のpaletteを指定します。
// ColorBarの色とサイズを設定
var colorBarParam = {
bbox : [0, 0, 50, 0.1],
dimensions : '200x20',
format : 'png',
min : 0,
max : 50,
palette : imageVisParam.palette,
};
カラーバーを作成します。
以下の例では横向きのカラーバーを作成しています。imageのselect('longitude')をlatitudeとすると縦となります。
paramは先ほど指定したcolorBarParamとします。
styleは位置や余白などを設定できるため、適宜調整を行ってください。
// 横向きのColorBarを作成
var colorBar = ui.Thumbnail({
image : ee.Image.pixelLonLat().select('longitude').int(),
params : colorBarParam,
style : {position: 'bottom-left', stretch: 'horizontal', margin: '0px 0px', maxHeight: '24px'},
});
※ui.Thumbnail:引数にImageを渡してサムネイル画像を作成します。
※ee.Image.pixelLonLat:longitude' と 'latitude' という名前の 2 つのバンドを持つ画像を作成します。
今回の場合はlongitudeを指定することで横向きの画像としています。
ui.Panelを使用してui.Labelを複数まとめて横に並べていくことで、カラーバーの下に表示する数値ラベルを作成します。
以下の例ではマップ表示にも使用したimageVisParamからmaxとminを取得して両端に表示するようにしています。
// ColorBarの数値ラベル
var legendLabels = ui.Panel({
widgets : [
ui.Label(imageVisParam.min, {margin: '4px 0px'}),
ui.Label('',{margin: '4px 0px', textAlign: 'center', stretch: 'horizontal'}),
ui.Label(imageVisParam.max, {margin: '4px 0px'})
],
layout : ui.Panel.Layout.flow('horizontal')
});
※ui.Panel:LabelやThumbnailなど他のウィジェットを保持できるウィジェットです。
パネルを使用して、ウィジェットを組み合わせて配置することが出来ます。
※ui.Label:テキストのラベルを作成するウィジェットです。{}内ではCSSのようにスタイルを設定しています。
ui.Labelでカラーバーの上部に表示するタイトルを作成します。
以下の例では、物理量名と単位を表示し、タイトルと分かりやすいようにfontWeight: 'bold'で太字にしています
// ColorBarのタイトルの設定
var legendTitle = ui.Label({
value : 'CHLA[mg/m^3]',
style : {fontWeight: 'bold', margin:'4px'}
});
上で作成したColorBar、タイトルをまとめたPanel(legendPanel)を作成します。
それぞれ「stretch: 'horizontal'」等で横幅いっぱいに指定したため、追加した順に縦に並ぶ形となります。
上記legendPanelをstyle設定したPanel(colorBarPanel)に追加することでマップ上の位置(position)や周りの余白(padding)を設定します。
パネル(ウィジェット関連)をマップに表示する場合は、Map.addを使用します。
(マップではなくConsoleに表示する場合は、マップ上の位置指定前のlegendPanelをprintで表示することも出来ます。)
// 上で作成したColorBar、タイトルをまとめたPanelを作成
var legendPanel = ui.Panel([legendTitle, colorBar, legendLabels]);
// マップ上のColorBarの位置を指定
var colorBarPanel = ui.Panel({
style: {
position : 'bottom-left',
padding : '8px 15px'
}
});
//print(legendPanel);
colorBarPanel.add(legendPanel);
// ColorBarをマップ追加
Map.add(colorBarPanel);
※Map.add:マップにウィジェットなどのアイテムを追加します。
コンソール(画面右上)に表示すると以下のようになります。