チュートリアル
Tutorial ImageCollectionのマップ表示(RGB①)
GCOM-C/SGLIの複数バンドデータ(ImageCollection)を使用してRGB画像をマップ表示するまでのチュートリアルです。
Google Earth Engine(GEE)にユーザ登録の上、ご利用ください。
GEE用に色を調整したRGB(R:VN08,G:VN05,B:VN03)の表示方法となります。
その他の色調整、バンドの組み合わせで表示した例についてはImageCollectionのマップ表示(RGB②)をご確認ください。
GEEにアップロードされているGCOM-C/SGLIのImageCollectionについては、こちらの一覧もご確認ください。
目次
① GEE上のデータ(ImageCollection)をロードする。
ee.ImageCollection('ImageCollection名')で、ロードすることができます。
GCOM-CのImageCollectionは「'projects/ee-gcomsgli/assets/[プロダクト名]Q'」となります。
以降、L1B(D)を例として記載します。
上記では、全期間のImageCollectionとなるため、必要な期間に絞り込みます。
ee.ImageCollectionとつなげて「.filterDate('開始日', '終了日')」を記載します。日付は「yyyy-mm-ddThh:mm:ss」形式とします。
var imageCollection = ee.ImageCollection('projects/ee-gcomsgli/assets/L1BDQ')
.filterDate('2022-11-01T00:00:00', '2022-11-01T23:59:59');
② ImageCollectionの情報を取得する。
printで、ImageCollectionの情報確認します。
print('All metadata:', imageCollection);
Scriptの上にある、SaveとRunボタンを実行後、Consoleの部分にバンド名が表示されます。必要な物理量のバンド名を確認してください。
③ 必要なバンドを取得する
RGBを表示するため、ここではVN03、VN05、VN08を取得します。
・RGB:R:VN08、G:VN05、B:VN03
var VN03 = imageCollection.select("Lt_VN03");
var VN05 = imageCollection.select("Lt_VN05");
var VN08 = imageCollection.select("Lt_VN08");
④ Slope、Offsetの計算
ImageにはDN値が格納されているため、物理量とするために「DN*slope+offset」の計算が必要となります。
Imageのプロパティから、計算に使用するSlope、Offsetの値を確認します。
先ほどのConsoleから、propertiesを開き、Slope、Offsetのプロパティ名を確認してください。
いずれか1つのImageのプロパティを確認すれば問題ありません。
※物理量によって、バンド名とプロパティの命名規則が異なりますのでご注意ください。
mapを使用して、ImageCollection内の全てのImageに、SlopeとOffsetの計算をします。
(必要なバンド(VN03, VN05, VN08)についてすべて同様に処理してください)
var image_VN03_a = VN03.map(function(img){
var VN03_slope = ee.Number.parse(img.get('VNR_VN03_Slope')).float();
var VN03_offset = ee.Number.parse(img.get('VNR_VN03_Offset')).float();
return img.multiply(VN03_slope).add(VN03_offset);
}).mosaic();
var image_VN05_a = VN03.map(function(img){
var VN05_slope = ee.Number.parse(img.get('VNR_VN05_Slope')).float();
var VN05_offset = ee.Number.parse(img.get('VNR_VN05_Offset')).float();
return img.multiply(VN05_slope).add(VN05_offset);
}).mosaic();
var image_VN08_a = VN03.map(function(img){
var VN08_slope = ee.Number.parse(img.get('VNR_VN08_Slope')).float();
var VN08_offset = ee.Number.parse(img.get('VNR_VN08_Offset')).float();
return img.multiply(VN08_slope).add(VN08_offset);
}).mosaic();
※[ImageCollection].map(function(img){ 処理 }):ImageCollection内の全てに{}内の処理をします。
()内の変数名imgが{}内の処理をする際のImage名となります。
returnで処理後のImageCollectionを、変数image_XXXXに返します。
※ee.Image.get('プロパティ名'):プロパティ名を指定し、プロパティの値を取得します。
※ee.Number.parse(プロパティの値).float():プロパティの値は文字列のため、数値(float)に変換して取得します。
※ee.Image.multiply(slope):プロパティから取得したSlopeの値をImageの各値に乗算します。
※ee.Image.add(offset):プロパティから取得したOffsetの値をImageの各値に加算します。
⑤ 太陽天頂角の補正
太陽天頂角(Solar Zenith Angle)を使用して、それぞれのバンドに対して以下のように補正を行います。
観測地点の緯度や季節により観測時の太陽高度は異なるため、観測地点における天頂からの太陽の角度(太陽天頂角)を使用し補正することで、見かけ上の違いを低減することが出来ます。(ただし、補正後もデータには大気の影響は含まれています。)
var Solar_zenith1 = imageCollection.select("Solar_zenith_angle");
//DN to degree, and degree to radian
var Solar_zenith = Solar_zenith1.mosaic().multiply(0.01).multiply(Math.PI).divide(180);
//Solar Zenith Angle Correction
var VNRQ_cos_coz = Solar_zenith.cos();
var IRSQ_cos_coz = Solar_zenith.cos();
var image_VN03_b = image_VN03_a.divide(VNRQ_cos_coz);
var image_VN05_b = image_VN05_a.divide(VNRQ_cos_coz);
var image_VN08_b = image_VN08_a.divide(VNRQ_cos_coz);
※mosaic():ImageCollectionを1枚のImageに合成します(古い順に重ね合わせます)
※multiply():Imageの値をカッコ内の値で乗算します。
※divide():Imageの値をカッコ内の値で除算します。
※log10():10 を底とする対数を計算します。
⑥ 各バンドのImageをRGBに割り当て、ImageCollection作成
以下の通り、R,G,Bに対応するバンドを格納したImageCollectionを作成し、マルチバンド画像に変換します。
そのまま合成するとピクセル値の高い部分の違いや、反対にピクセル値の低い部分の違いを明確にすることができないため、Log10をとることで高い値ならびに低い値の違いを見やすくしています。
(rgb_aは太陽天頂角補正なし、rgb_bは太陽天頂角補正あり)
var rgb_a = ee.ImageCollection([image_VN08_a.log10(), image_VN05_a.log10() , image_VN03_a.log10()]);
rgb_a = rgb_a.toBands().rename(['VN08', 'VN05', 'VN03']);
var rgb_b = ee.ImageCollection([image_VN08_b.log10(), image_VN05_b.log10() , image_VN03_b.log10()]);
rgb_b = rgb_b.toBands().rename(['VN08', 'VN05', 'VN03']);
※log10():10 を底とする対数を計算します。
※toBands():コレクション内のすべての画像のすべてのバンドを含む単一のマルチバンド画像に変換します。
⑦ 視覚化のパラメータを指定する。
最小値、最大値を指定します。
例として、GEE用に色を調整したRGBの設定を以下に記載します。
// RGB (VN08, VN05, VN03)
var imageVisParam_rgb = {
min: [1.25,1.58,1.78],
max: [2.6,2.6,2.5],
gamma: 1.8
}
⑧ マップ上に表示する。
ImageCollection、パラメータ、Image名を指定して、マップ表示します。
マップ表示の際に有効値ピクセル(ピクセル値が65533未満)のみ表示できるよう、「updateMask(VN03.mosaic().lt(65533)」を行います。
Map.addLayer(rgb_a.updateMask(VN03.mosaic().lt(65533)), imageVisParam_rgb, 'RGB');
Map.addLayer(rgb_b.updateMask(VN03.mosaic().lt(65533)), imageVisParam_rgb, 'RGB(SZA補正)');
⑨ マップの表示位置を指定する。
GCOM-CのImageCollectionは日本域のため、日本付近を指定します。
Map.setCenter(経度, 緯度, ズームレベル);
Map.setCenter(140.0, 40.0, 3);
Scriptの上にある、SaveとRunボタンを実行すると、下のマップにImageCollectionが表示されます。
マップ右側のLayersから表示するImageを選択できます。
Map.addLayerを実行した順に重なるため、Run実行直後は太陽天頂角補正済みのRGBが表示されています。
マップ上右上の「Layers」からレイヤの表示・非表示や透過率等を指定することが出来ます。
下はLayerを指定して太陽天頂角補正なしのRGBを表示した例となります。
太陽天頂角補正無しの場合は高緯度で暗くなっており、太陽天頂角補正によりその差が少なくなることが確認できます。