チュートリアル
Tutorial ImageCollectionのマップ表示(RGB②)
GCOM-C/SGLIの複数バンドデータ(ImageCollection)を使用してRGB画像をマップ表示するまでのチュートリアルとなります。
Google Earth Engine(GEE)にユーザ登録の上、ご利用ください。
GCOM-C/SGLIのデータは、バンドの組み合わせや色指定を変えることで対象物を見やすくすることが出来ます。
例としてJASMES SGLI 準リアルデータと同様の色調整をしたRGB1、RGB2、RGB3の表示方法を記載します。
複数バンドデータ表示の基礎や太陽天頂角補正の有無による違いは、ImageCollectionのマップ表示(RGB①)をご確認ください。
(こちらのチュートリアルでは全て太陽天頂角補正をしています。)
GEEにアップロードされているGCOM-C/SGLIのImageCollectionについては、こちらの一覧もご確認ください。
目次
① GEE上のデータ(ImageCollection)をロードする。
ee.ImageCollection('ImageCollection名')で、ロードすることができます。
GCOM-CのImageCollectionは「'projects/ee-gcomsgli/assets/[プロダクト名]Q'」となります。
以降、L1B(D)を例として記載します。
var imageCollection = ee.ImageCollection('projects/ee-gcomsgli/assets/L1BDQ');
上記では、全期間の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の部分にバンド名が表示されます。必要な物理量のバンド名を確認してください。
③ 必要なバンドを取得する
例としてGCOM-CのWebページでも公開されている以下のRGBを表示するため、ここではVN03、VN05、VN08、VN11、SW02、SW03を取得します。
・RGB1:R:VN08、G:VN05、B:VN03
・RGB2:R:SW03、G:VN11、B:VN08
・RGB3:R:SW03、G:SW02、B:VN11
var VN03=imageCollection.select("Lt_VN03");
var VN05=imageCollection.select("Lt_VN05");
var VN08=imageCollection.select("Lt_VN08");
var VN11=imageCollection.select("Lt_VN11");
var SW02=imageCollection.select("Lt_SW02");
var SW03=imageCollection.select("Lt_SW03");
④ Slope、Offsetの計算
ImageにはDN値が格納されているため、物理量とするために「DN*slope+offset」の計算が必要となります。
Imageのプロパティから、計算に使用するSlope、Offsetの値を確認します。
先ほどのConsoleから、propertiesを開き、Slope、Offsetのプロパティ名を確認してください。
いずれか1つのImageのプロパティを確認すれば問題ありません。
※物理量によって、バンド名とプロパティの命名規則が異なりますのでご注意ください。
mapを使用して、ImageCollection内の全てのImageに、SlopeとOffsetの計算をします。
(例としてVN03とSW02を記載していますが、必要なバンドについてすべて同様に処理してください)
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_SW02_a = SW02.map(function(img){
var SW02_slope = ee.Number.parse(img.get('IRS_SW02_Slope')).float();
var SW02_offset = ee.Number.parse(img.get('IRS_SW02_Offset')).float();
return img.multiply(SW02_slope).add(SW02_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)を使用して、それぞれのバンドに対して以下のように補正を行います。
観測地点の緯度や季節により観測時の太陽高度は異なるため、観測地点における天頂からの太陽の角度(太陽天頂角)を使用し補正することで、見かけ上の違いを低減することが出来ます。(ただし、補正後もデータには大気の影響は含まれています。)
また、そのまま合成するとピクセル値の高い部分の違いや、反対にピクセル値の低い部分の違いを明確にすることができないため、Log10をとることで高い値ならびに低い値の違いを見やすくしています。
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).log10();
var image_VN05_b = image_VN05_a.divide(VNRQ_cos_coz).log10();
var image_VN08_b = image_VN08_a.divide(VNRQ_cos_coz).log10();
var image_VN11_b = image_VN11_a.divide(VNRQ_cos_coz).log10();
var image_SW02_b = image_SW02_a.divide(IRSQ_cos_coz).log10();
var image_SW03_b = image_SW03_a.divide(IRSQ_cos_coz).log10();
※mosaic():ImageCollectionを1枚のImageに合成します(古い順に重ね合わせます)
※multiply():Imageの値をカッコ内の値で乗算します。
※divide():Imageの値をカッコ内の値で除算します。
※log10():10 を底とする対数を計算します。
⑥ 各バンドのImageをRGBに割り当て、ImageCollection作成
以下の通り、RGB1、RGB2、RGB3にそれぞれRGBのバンドを格納したImageCollectionを作成し、マルチバンド画像に変換します。
それぞれ、以下の目的のためバンドの組み合わせを変えています。
RGB1:人の目で見る場合と近い色合いとなります。
RGB2:波長が長い近赤外線を使うことで、RGB1よりも植生があざやかな緑になるように色付けしています。
RGB3:海氷と雲が識別しやすい配色になるように合成した画像です。低層雲がピンク色、高層雲が水色~緑色、海氷・積雪が青色に見えます
var rgb1 = ee.ImageCollection([image_VN08_b, image_VN05_b , image_VN03_b]);
rgb1 = rgb1.toBands().rename(['VN08', 'VN05', 'VN03']);
var rgb2 = ee.ImageCollection([image_SW03_b, image_VN11_b , image_VN08_b]);
rgb2 = rgb2.toBands().rename(['SW03', 'VN11', 'VN08']);
var rgb3 = ee.ImageCollection([image_SW03_b, image_SW02_b , image_VN11_b]);
rgb3 = rgb3.toBands().rename(['SW03', 'SW02', 'VN11']);
※toBands():コレクション内のすべての画像のすべてのバンドを含む単一のマルチバンド画像に変換します。
⑦ 視覚化のパラメータを指定する。
最小値、最大値を指定します。
例として、GCOM-CのWebページで表示している画像(RGB1, RGB2, RGB3)での設定を以下に記載します。
// RGB1
var imageVisParam_rgb1 = {
min: [1.000, 1.224, 1.518],
max: [2.660, 2.753, 2.776]
};
// RGB2
var imageVisParam_rgb2 = {
min: [0, 0, 0],
max: [1.596, 2.404, 2.474]
}
// RGB3
var imageVisParam_rgb3 = {
min: [-0.229, -1.380, 0.002],
max: [1.673, 1.207, 2.476]
}
⑧ マップ上に表示する。
ImageCollection、パラメータ、Image名を指定して、マップ表示します。
マップ表示の際に有効値ピクセル(ピクセル値が65533未満)のみ表示できるよう、「updateMask(VN03.mosaic().lt(65533)」を行います。
Map.addLayer(rgb1.updateMask(VN03.mosaic().lt(65533)), imageVisParam_rgb1, 'RGB1');
Map.addLayer(rgb2.updateMask(VN03.mosaic().lt(65533)), imageVisParam_rgb2, 'RGB2');
Map.addLayer(rgb3.updateMask(VN03.mosaic().lt(65533)), imageVisParam_rgb3, 'RGB3');
⑨ マップの表示位置を指定する。
GCOM-CのImageCollectionは日本域のため、日本付近を指定します。
Map.setCenter(経度, 緯度, ズームレベル);
Map.setCenter(140.0, 40.0, 3);
Scriptの上にある、SaveとRunボタンを実行すると、下のマップにImageCollectionが表示されます。
マップ右側のLayersから表示するImageを選択できます。
RGB1の表示:人の目で見る場合と近い色合い。
RGB2の表示:波長が長い近赤外線を使うことで、RGB1よりも植生があざやかな緑になるように色付け。
RGB3の表示:海氷と雲が識別しやすい配色。低層雲がピンク色、高層雲が水色~緑色、海氷・積雪が青。