2. Sentinel-2による関心領域の表示

とりあえず絵を見てみましょう

google earth engine(以下GEE)はクラウド上でスクリプト実行が可能で、そのためにはここへ行きます。https://code.earthengine.google.com/

以下のような画面が表示されればOKです。真ん中(New Script)でJavaScriptによるスクリプト入力、左はスクリプト/関数などのドキュメント/テーブルやラスタなどの管理画面、右は出力画面です。下半分にはマップが表示されます。デフォルトだとGoogle Mapが表示されており、Google Earth Engineのロゴの右にある検索窓に地名を入れればマップがそこへジャンプします。マップは、むろんドラッグやホイール操作で移動することもできます。

ではさっそく衛星データを探してみましょう。今回は、近年伐採が増加しているカンボジアの森林地帯を対象とします。

検索窓にSentinel-2と入力してみてください。Sentinel-2は中分解能(10~60 m)の可視・近赤外データを提供するESAの光学センサです。比較的高い空間分解能でありながら、複数の衛星で隊列を組んで観測するコンステレーションという技術によって、赤道上回帰日数5日という高頻度観測を実現しています。

2019年1月現在では、Sentinel-2のLevel-1Cプロダクトが使えるので、それを選択しましょう。

データサマリーも同時に表示してくれるので便利ですね。

  • 「10000でスケーリングされたUINT16のTOA反射率」が13個のスペクトルバンドにわけて格納されている

  • クラウドマスクはQA60という品質保証バンドに入っている

  • 青、緑、赤、NIR、SWIR(よく使うバンド)はそれぞれB2, B3, B4, B8, B12(またはB11)に相当

などのことがわかります。

「Import」ボタンを押すと、スクリプトに勝手に以下の行が追加されたと思います。

これによってimageCollectionという変数にSentinel-2データが「ImageCollection」型で格納されたことになります。意味がわからないと思います。説明します。

GEEではデータを扱うのに独自の型(コンテナとよばれる)が用意されています。ある日の(全バンド画像をまとめた)データ1セットについてはImage型、複数の時系列データをまとめたものはImageCollection型と言われます。こうしたGEE独自の型変数に対して、GEE独自の関数を適用することで解析を行うことになります[1]。プログラミングに慣れた人には、同じ効果をもつ以下の書き方のほうがわかりやすいかもしれません:

文字列で指定したのはGEEのImageCollection IDというやつで、ローカルでいうところのディレクトリみたいなものです(最初のデータサマリーページに記載されています)。ee.ImageCollection() なるコンストラクタでこれをImageCollection型として読み、imageCollectionという変数に入れた、というのが、先ほど行われたことの実態です。

imageCollectionが変数名だと何かと混乱すると思うので、クリックして名前を変更しておきましょう:

変数名をSentinel2としておきました。このImageCollectionがどんなものなのか、もう少し詳しく見てみようと思いますが、対象地域を絞らないとデータ数が膨大なため、カンボジアに絞りましょう。以下のスクリプトを、真ん中のスクリプト窓に入力してください。

ee.なんとかというのがたくさん出てきますが、GEEが用意した関数のようなものだと思ってください。ee.Geometry.Rectangleは矩形ポリゴンの作成、ee.Geometry.Pointは点データを作成します。これらをそれぞれ、変数region, pointに代入しています。今回は、regionが対象地域(矩形)、pointが対象地域中心の緯度経度座標になります。filterBoundsはImageCollection型のもつメソッドで、該当するregionにかかる画像だけを抜き出して新しいImageCollectionを作ってくれます。pointを指定してもOKです。

「メソッド」という言葉に慣れていない方は、「オブジェクト指向」などでググってみてください。

ちなみに、こうしたポリゴンや点は、描画領域の左上にある「マーカーを追加」や「図形を描画」で手動で作成しスクリプトにインポートすることも可能です(第4章で紹介します)。

さて、Runボタンを押しますと、左側のConsoleタブにprint結果が表示されます。

この例に限らず、新しいオブジェクトを作ったらとりあえずprint() しておくとデバッグに非常に役立ちますので、覚えておきましょう。

さて、datasetはImageCollection型で、191の要素をもちます。つまり該当する範囲がこれまでに191回撮影されているということです。矢印を押下して展開し、さらにfeature項目を展開すると、具体的にどういうImageが入っているのかが見られます。上の例では

0: Image COPERNICUS/S2/20150810T03136...

と始まっていますので、2015/08/10のImageが最初のようですね。これはImage IDで、先にImageCollection IDについて述べたときと同様、直接指定してインポートすることもできます。

時期を指定するにはどうすればいいでしょうか。たとえば、Sentinel-2Bが打ち上げられてコンステレーションが始まった2017/03/07以降のデータに注目してみたい、とか。

こうです:

要素数がさっきより減ったと思います。対象期間(2017/03/07〜2018/12/31)のデータだけが抽出されました。

ここから色々と処理を加えたいところですが、その前に何はともあれ絵を表示してみたいですよね。そこで、このdatasetに対して、「バンドごと・ピクセルごとに、時系列のmedianをとる」ことでとりあえず1枚の絵にし、描画してみます。

  • 1行目はメディアンを取るところ。ImageCollection型には時系列統計をとるメソッドが標準装備されているので大変便利です。結果はImage型になります。

  • 2行目は描画中心とズームレベル(0~24)を指定しています。数字が小さくなるほど広域表示になります。例によってregionのかわりにpointを指定してもOK。

  • 3行目で、描画するImage、カラースケール、レイヤ名を指定しています。引数のディクショナリではカラースケールだけでなく、使用するバンド(RGB)も割り当てます。ここでは赤チャンネルをB4, 緑チャンネルをB3, 青チャンネルをB2に指定しているので、いわゆるトゥルーカラー画像になります。

何やらガスって見えるのは、雲のせいです。雲マスクをかける方法については次回やります。

以上のスクリプトを最小の行数で書くと次のようになります。

4行です。オブジェクト指向のいいところが出てる感じですね。

今後のために、saveボタンを押して、スクリプト名をSentinel2_Cambodiaとでもして保存しておきましょう。保存せずに、ブラウザを閉じたり、他のページに移動したり、他のスクリプトの編集を始めたりすると、現在の編集内容が消えてしまうので気をつけてください。

[1] クラウドを通した並列計算を実現するために作られているこうした独自コンテナが、GEEの強みでもあり弱みでもあります。何が弱みかというと、たとえば、JavascriptやPythonの「普通の」変数やメソッドと組み合わせたいときに、少々アクロバティックなことをやらないとできない、などの事態が発生します。これについては5章で後述します。