2018/06/04

文系のための「Image CollectionからのImageの抽出」

Google Earth Engine において最も基本的なクラスとなるのは、
ImageFeature とよばれるものであり、これらのクラスの集合として、
ImageCollectionFeatureCollection がある。

特に、リモートセンシングを実践するのであれば、
ImageImageCollectiontについては最初に理解する必要がある。
ということで、Google Earth Engine におけるImageImageCollectionについて整理する。

まず、ImageクラスGISにおいてラスターとよばれるデータを格納するクラスであり、
その属性として一つ以上のバンド名称データ型スケール投影情報を持ち、
そのプロパティとしてメタ情報を持つ。

Google Earth EngineのCode Editorで人工衛星の画像を検索すると、
このImage時系列あるいは単なる集合体(Stack)として取得される。
言葉では解りにくいので、とりあえず、Langsat 8 のデータの場合で試してみる。

まず、検索バーで「Landsat 8」と検索し、
USGS Landsat 8 Collection 1 Tier 1 Raw Scenes」を探し、「import」をクリックする。
すると、コードエディタの上部にインポートされる。



とりあえず、インポートされたオブジェクトの名前を「landsat8」に変更しておく。



インポートされたImageCollection全てのLandsat 8のImageを含んでいるが、
全てのImageが含まれている状態は多すぎて(5000以上)何もできない…。
そこで、このImageCollectionからImageを絞りこむ(Filtering)ことにする。

まず、時期については2016年1月1日〜2016年12月31日とし、
検索する場所について平城宮跡が含まれている範囲とする。
ということで、これらの検索条件を変数として設定する。

var beginning = '2016-01-01';
var ending = '2016-12-31';

var heijou = ee.Geometry.Point(135.791605, 34.6881882);

上記の三行では、それぞれ、beginningendingheijou の三つの変数を定義し、
それぞれに初期値を定義している。冒頭のvar変数宣言のための呪文のようなもの。
ちなみに、変数の名前は好きな名前に変えても良いが、日本語は避ける。

さて、冒頭の二行については直観的に理解できると思うが、
最後の行では、少し凝ったことをしている。
詳細については、文系のための「GEEのジオメトリ(1)」を参照。

次に、指定した三つの変数を使って、
インポートしたLandsat8のデータをフィルタリングし、
新しいImageCollectionクラスを「ln8_2016」としてインスタンス化する。

var ln8_2016 = ee.ImageCollection(
                landsat8
                .filterDate(beginning, ending)
                .filterBounds(heijou)
                );

ee.ImageCollectionは「ee」オブジェクトが持つImageCollection()の生成の操作。
そして括弧内では、landsat8というImageCollectionインスタンスに対して、
filterDate()filterBounds()の二つの操作が実行される。

ここで、filterDate()filterBounds()の二つの操作はImageCollectionクラスの操作である。
これらの操作はImageCollectionがインスタンス化された際にも引き継がれ、
インスタンス化されたオブジェクトのデータに対して直接的に実行される。

では、最後に指定された時期と場所で絞りこまれたImageCollectionの中身を確認する。

print("Image Collection:" ,ln8_2016);

一旦、ここまでのスクリプトを表示させておく。
なお、「//」から始まる日本語の部分はコメントとよばれる部分。
プログラムとして実行されるわけではないので、特に書く必要はない



スクリプトエリアの「Run」をクリックすると「Console」に出力内容が表示される。



この結果を実行した結果、37Imageを含むImageCollectionインスタンス化された。
試しに、「▶ 0 :」と書かれている部分をクリックして展開し、
さらに、「▶ properties : 」の部分を展開してみる。

すると、ln8_2016 という ImageCollection の一つ目のImageオブジェクトを取得し、
そのImage オブジェクトに含まれているメタ情報を確認できる。
かなり長いが…この情報をさらに用いて一つのImageオブジェクトのみを抽出してみる。

今回はLandsat 8のメタ情報のうち「CLOUD_COVER」という情報を使用し、
ImageCollectionのデータを並び替え(sort())し、
その最初の一枚を抽出(first())して、Imageインスタンス化する。

var ln8_2016_least_cloud = ee.Image(
                            ln8_2016
                            .sort("CLOUD_COVER")
                            .first()
                            );


print("The Least Cloud Scene in 2016", ln8_2016_least_cloud)

元のlandsat8から直接的に抽出しても結果は同じであるが、ln8_2016から抽出する。
今回は、一枚のImageだけを抽出するので「ee.Image」を使ってインスタンス化する。
すると、Consoleに以下のような情報が表示されるはずである。



以上のようにして、ImageCollectionから一つのImageを抽出することができる。
他にも様々なメタ情報を使うこともできるが、メタ情報ImageCollectionに依存する。
つまり、Landsat 8以外の場合はメタ情報が異なる可能性があるので確認が必要である。

0 件のコメント:

コメントを投稿