使いやすさの点では、やはり、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);
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
This work is licensed under a Creative Commons Attribution 4.0 International License.
0 件のコメント:
コメントを投稿