チュートリアル

Tutorial Image指定 GeoTiFFダウンロード

GCOM-C/SGLIの単バンドデータ(ImageCollection)のプロパティを利用したImageの絞り込みと、GEE上のデータを保存する方法のチュートリアルです。
具体的には、1か月分のGCOM-Cデータ(ImageCollection)の内で、無効値が少ないImageを調べ、マップ表示とデータの保存を行います。
今回使用するGCOM-Cデータは、クロロフィルa濃度(CHLA)という水質に関連したものです。また九州の有明海周辺を関心領域とします。

Google Earth Engine(GEE)にユーザ登録の上、ご利用ください。(サンプルスクリプト)
GEEにアップロードされているGCOM-C/SGLIのImageCollectionについては、こちらの一覧もご確認ください。

① 関心領域とデータの前処理関数を定義する

まず、今回の関心領域(有明海周辺)をポリゴンで設定します。今回はコード上で関心領域の4隅の緯度経度を指定してポリゴンを作成していますが、CodeEditor下部分のマップ画面でもポリゴンの作成ができます。


var geometry = ee.Geometry.Polygon(
        [[[129.95, 32.10],
          [130.65, 32.10],
          [130.65, 33.25],
          [129.95, 33.25],
          [129.95, 32.10]]], null, false);
              

次に、CHLAに適用する前処理関数を定義します。
この関数で「QAフラグでのマスク」・「Slope, Offsetの計算」・「関心領域内の有効値ピクセル数のカウント」を行います。
以下のコードの内2行目から17行目はチュートリアル「ImageCollectionのマップ表示」の内容と同様のため、詳細はこちらをご覧ください。


function preprocessing_chla(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();
  
  var img_cor             = img_mask.multiply(slope).add(offset).log10();
 
  // 
  var valid_count     = img_cor.clip(geometry).reduceRegion({
                                            reducer  : ee.Reducer.count(),
                                            geometry : geometry,
                                            scale    : 250
                                            });
  
  // 
  img_cor              = img_cor.set('VALID_COUNT',  valid_count.getNumber('CHLA'));
  img_cor              = img_cor.set('system:index', CHLA.get('system:index'));
      
  return img_cor;
}
              

コード20行目:
「QAフラグでのマスク」・「Slope, Offsetの計算」を行ったCHLAのImageを関心領域で切り出します。

コード21行目~25行目:
GEE上の機能を適用して、関心領域内で有効値ピクセル数をカウントさせます。

コード28行目:
上記のコードでカウントした有効ピクセル数を、Imageのプロパティに加えます。

コード29行目:
前処理前のCHLAのImageのプロパティの内 'system:index'を、前処理済みのImageのプロパティに加えます。

ee.Image.clip:地物などの範囲にImageを切り出しします。
ee.Image.reducerRegion:GEEのReducerをImage(特定の領域)に適用させます。
ee.Reducer.count():GEEのReducer の1つで、nullでないピクセル数をカウントします。
ee.Image.set:Imageにプロパティを追加します。

② 前処理関数をImageCollectionに適用する

まずGEE上のデータをロードします。今回はGCOM-CのCHLAをロードしますが、この時点で観測日時が2023年12月1日から2023年12月31日のデータ・観測された領域が関心領域を含むものに絞り込みます。
このロードしたImageCollectionに①で定義したpreprocessing_chla関数を適用します。


var imageCollection = ee.ImageCollection('projects/ee-gcomsgli/assets/CHLAQ')
                        .filterBounds(geometry)
                        .filterDate('2023-12-01T00:00:00', '2023-12-31T23:59:59');
                        

var imgCHLA = imageCollection.map(preprocessing_chla);
              

ee.ImageCollection.filterBounds:ImageCollectionの内、引数で与えた地理情報の領域と交差する部分があるImageのみ絞り込みます。

③ ImageCollectionのプロパティを1項目ごとにリストで表示する

②で前処理関数を適用したImageCollectionのプロパティを確認します。今回は全てのプロパティではなく「system:index」と「VALID_COUNT」のみを表示します。以下のコードを実行すると、Console部分にプロパティの内容が表示されます。


print(imgCHLA.aggregate_array('system:index'));
print(imgCHLA.aggregate_array('VALID_COUNT'));
              

ee.ImageCollection.aggregate_array:ImageCollection内のImageに付属するプロパティの内、引数で指定したプロパティの情報を表示させます。

④ プロパティの情報をもとに、ImageCollection内のImageを絞り込む

③で表示させたプロパティの内容をもとに今回は有効値ピクセル数のしきい値を50000ピクセルとし、関心領域内の有効値ピクセルが50000ピクセル以上のImageに絞り込みます。
また、絞り込み後のImageCollectionについても「system:index」と「VALID_COUNT」を表示させます。


var imgCHLA_filtered = imgCHLA.filter(ee.Filter.gte('VALID_COUNT', 50000));

print(imgCHLA_filtered.aggregate_array('system:index'));
print(imgCHLA_filtered.aggregate_array('VALID_COUNT'));
            

絞り込み後のImageCollectionのプロパティを確認すると、「system:index」が” GC1SG1_20231213_061_CHLAD_0911”であるImageが、今回ロードしたImageの中で一番有効値ピクセル数が多いことが分かります。(64268 ピクセル)

⑤ Image単位のデータ呼び出しとマップ表示

④で調べた内容をもとに、「system:index」が” GC1SG1_20231213_061_CHLAD_0911”であるImageをImage単位で新たにロードし、①で定義したpreprocessing_chla関数を適用します。
※「system:index」の語尾はシーン番号の範囲のため、アップロード状況により変わる可能性があります。
サンプルスクリプトでエラーが出る場合は、お手数ですが実際の内容を④ の結果よりご確認の上スクリプトを修正してください。
例の「GC1SG1_20231213_061_CHLAD_0911」ではシーン09〜11の範囲のデータとなっています。

preprocessing_chla関数を適用後、マップ表示します。マップ表示のためのコードはチュートリアル「 ImageCollectionのマップ表示」の内容と同様のため、詳細はこちらをご覧ください。


var imgCHLA_20231213 = preprocessing_chla(
                       ee.Image('projects/ee-gcomsgli/assets/CHLAQ/GC1SG1_20231213_061_CHLAD_0911')
                       );

// Visualization parameters
var imageVisParam = {
  "bands"    : ["CHLA"],
  "min"      : -1.0,
  "max"      : 1.0,
  "palette"  : ["003BD5","0080D5","00ABAB","00C36A","00D212","0EDF00","21EB00","37F400","58F600","79F800"]
};


// Show on map
Map.addLayer(imgCHLA_20231213, imageVisParam, 'CHLA');

// Map display position
Map.centerObject(geometry, 9);
            

⑥ データをダウンロードする。

⑤で表示させたデータをGEE上以外でも使用できるよう保存します。以下のコードを実行すると、Console上にデータをダウンロードするためのURLが表示されるため、このURLからデータをダウンロードします。


print(imgCHLA_20231213.float().getDownloadURL({
                              name  : "GC1SG1_20231213_061_CHLAD_0911",
                              region: geometry,
                              scale : 250
                             })
     )
            

ee.Image.getDownloadURL:GEE上のImageを、GeotiffもしくはNumpy形式でダウンロードできるURLを入手します。ただし、ダウンロードできるデータの容量に制限があります。またImage内の「No Data」の情報を保持するために、使用時には対象のImageを「float()」等、データ型に合わせて明示的にキャストすることを推奨します。