2018/12/29

文系のための「SENTINEL-2」

GEEでは様々なデータを検索し、使用することができる。
使いやすさの点では、やはり、Landsat シリーズであるが、
解像度が低いという問題がある。

そこで、今回はもう少し解像度が高い地球観測衛星を使ってみる。

実は、商用衛星を含めると解像度の高い人工衛星は色々と存在するが、
Google Earth Engine の中で使えるものに限ると、
Sentinel-2の衛星画像が最も使い勝手が良いように思える。

Sentinel-2は欧州宇宙機関(ESA: European Space Agency)という機関による
コペルニクス計画」という地球観測研究を支えている人工衛星であり、
植生、地質、水域、海岸線などのモニタリングに用いられている。

Sentinel-2は2015年6月23日に打ち上げられた「Sentinel-2A」と、
2017年3月7日に打ち上げられた「Sentinel-2B」との二機で構成され、
5日周期でマルチスペクトル画像を取得することができる。

Sentinel-2によって得られたデータは13バンドのマルチスペクトルであり、
空間解像度はバンドごとに異なっているが、可視領域近赤外については、
10m 解像度の画像を得ることができる。かなり使えそうである。

…ということで、早速、使ってみることにする。

GEEでこのセンサーで取得されたデータを使用するためには、
Code Editor の検索バーで「Sentinel-2」と検索し、RASTERS の項目から
現れた候補の中から「Sentinel-2 MSI: MultiSpectral Instrument, Level-1C」を選ぶ。



現れた候補をクリックすると、このデータセットの説明を見ることができる。
内容を確認できたら「Import」ボタンを押すと、
Code Editor に「imageCollection」という名前でインポートされる。

インポート名はそのままでも良いが、変数は解りやすい方が良い。
ということで、今回は規定の「imageCollection」という変数を
sentinel_2」という変数名に変更しておくことにする。

では、さっそく、Sentinel-2の画像を扱ってみる。
Landsat の場合と同様に、最初に使用する画像を絞り込む。
今回はメタデータによるフィルタリングを試してみる。

var s2_filtered = ee.ImageCollection(sentinel_2
  .filterMetadata("CLOUDY_PIXEL_PERCENTAGE","not_greater_than",5)
);

メタデータの内容を使ってフィルタリングを行うには、
filterMetadata(要素名, 演算子, 値) オペレーションを使用し、
条件に当てはまる画像のみを抽出することができる。

今回の場合、検索メタデータの要素名が「CLOUDY_PIXEL_PERCENTAGE」 で、
演算子が 「not_greater_than」、値が「5」となっているので、
雲量比率が5%未満の画像のみを抽出せよ」という意味になる。

検索メタデータは扱う衛星画像(あるいは画像)によって異なるため、
データをインポートする前に説明を読み、
事前に使えそうなメタデータの要素を確認しておくことが重要である。

ちなみに、使用できる演算子は以下の通り…。

  • "equals"(条件に等しい)
  • "less_than"(条件より小さい)
  • "greater_than"(条件より大きい)
  • "not_equals"(条件に等しくない)
  • "not_less_than"(条件より小さくない)
  • "not_greater_than"(条件より大きくない)
  • "starts_with"(条件を開始とする)
  • "ends_with"(条件を終了とする)
  • "not_starts_with"(条件を開始としない)
  • "not_ends_with"(条件を終了としない)
  • "contains"(条件を含む)
  • "not_contains"(条件を含まない)

この辺りの処理の意味が解れば、メタデータの重要性が解るであろう。
上手く組み合わせることで、効率的に必要な画像を探し出し、
抽出された画像のみを使った分析を行うことができる。

今回の場合はシンプル・コンポジション画像を構築することにする。
Landsat の場合には特別の関数が用意されていたが、
Sentinel-2の画像を用いる際にはちょっとした工夫が必要となる。

とりあえず、以下のようにする。

var s2_filtered_med = s2_filtered.reduce(ee.Reducer.median());

ここでは、メタデータで抽出された ImageCollection (s2_filtered)に対し、
reduce()というオペレーションを実行している。
実行している内容は ee.Reducer.median() である。

要するに、ImageCollection として集められた画像から中央値(Median)を抽出する。
もちろん、中央値以外にも様々な演算子が存在しているが、
参考までによく使いそうな演算子を挙げておく。

  • ee.Reducer.sum():合計値を返す。
  • ee.Reducer.mean():算術平均を返す。
  • ee.Reducer.median():中央値を返す。
  • ee.Reducer.min():最小値を返す。
  • ee.Reducer.max():最大値を返す。
  • ee.Reducer.minMax():最小値と最大値を返す。
  • ee.Reducer.variance():分散を返す。
  • ee.Reducer.stdDev():標準偏差を返す。
  • ee.Reducer.count():Nullでない値の値の数を返す。
  • ee.Reducer.first():最初の入力の値を返す。
  • ee.Reducer.last():最後の入力の値を返す。

さて、この処理の結果をConsoleで確認してみる。

print(s2_filtered_med);



結果をみてみると、各バンドの名前の後ろに_median」とついている。
Reducerを使って処理を行うと、バンド名の後ろに演算子の名前がつく。
Reducerを実行したい場合には Console に出力して確認することが重要である。

そして、最後にSentinel-2をマップ上に表示する。

Map.addLayer(s2_filtered_med,
  {
    bands: ['B4_median', 'B3_median', 'B2_median'], 
    min: 0,
    max: 2500
  },'Composite_Med'
);

最終的に表示された画像をみてみると、確かにLandsatの画像よりも細かい。

https://code.earthengine.google.com/f0e45f6d71181e0e2a8f1ef4664c7064


Creative Commons License
This work is licensed under a Creative Commons Attribution 4.0 International License.

0 件のコメント:

コメントを投稿