BigQuery SQL で Google Earth Engine の衛星画像を解析
Google Cloud Japan Team
※この投稿は米国時間 2022 年 10 月 5 日に、Google Cloud blog に投稿されたものの抄訳です。
Google Earth Engine(GEE)は、10 年以上も研究や行政機関で利用され続けてきた革新的なプロダクトです。Google Cloud は最近、商用利用としての GEE の一般提供をスタートしました。このブログ投稿では、BigQuery の SQL 内から GEE を活用する方法を紹介します。これにより SQL ユーザーは、Earth Engine 内の膨大なデータにアクセスし、価値を得ることが可能となります。
ここでは Cloud Functions を使用して、各組織の SQL ユーザーが Google Earth Engine のコンピューティングとデータカタログの能力を活用できるようにしていきます。地球の観測データの膨大なライブラリを分析に活用する方法に関心のある SQL ユーザーの方は、本ブログの続きをぜひご覧ください。
開始前に、30 秒ほどで済みますので、ユースケースに合わせて地理空間に関する情報を設定していきましょう。BigQuery は、ベクトルデータの操作に長けています。ベクトルデータとは、ポイントやポリゴンなど、テーブルに当てはめることができるものを指します。PostGIS 構文を使用するため、これまで空間 SQL を使用していたユーザーも、安心して BigQuery を使用できます。
BigQuery では、Analytics Hub 内の 175 以上の公開データセットを利用することが可能です。BigQuery で分析を行った後は、GeoViz、データポータル、Carto、Looker といったツールを使用して分析情報を可視化できます。
Earth Engine はラスター解析や画像解析、特に衛星画像の解析向けに設計されています。70 PB 以上の衛星画像を有する GEE は、地表の変化を検出し、傾向をマッピングして、変動を数値化するために利用されています。GEE は、その多様な地理空間データセットと簡単に使用できるアプリケーション プログラミング インターフェース(API)から、土地のより効率的な使用を目的とした、衛星画像からの分析情報の抽出に広く使用されています。
これら 2 つのプロダクトを併用することで、ベクトル データセットとラスター データセットの両方を取り入れて分析を拡充し、GEE の 70 PB と BigQuery の 175 以上のデータセットから分析情報を組み合わせることが可能です。たとえば、この投稿では、GEE カタログ内の Landsat 衛星画像から気温と植生のデータを取得する Cloud Functions の関数を作成するのですが、それらすべてを BigQuery の SQL から行っていきます。BigQuery から Earth Engine にデータを移行する方法については、こちらの投稿で紹介しています。
今回の例では農業に焦点を当てていますが、このメソッドはご自身の関連深いどの分野にも応用することが可能です。
さっそく始めましょう
最新テクノロジーの導入により、農業は変化しています。GPS や衛星画像などのテクノロジーの普及により、研究者や農家はより多くの情報を獲得し、農業リソースをモニタリングし管理できます。衛星画像は畑の生育状況を画像で追跡するうえで、信頼のおけるソースとなります。
現在、農業ツールで使用されている画像分析で一般的なものとしては、正規化植生指標(NDVI)があります。NDVI は植物の健康状態を計測し、-1 から +1 の範囲で数値として視覚的に表示します。マイナスの数値は水や湿気を示しています。反対に NDVI の数値が高い場合は、植生の林冠密度が高いことを示しています。画像と収穫高には高い相関関係があるため、種まきの計画を決定する際などに、天候データのような他のデータと併せて画像を使用することもできます。
農業のエンジニアであれば、管理するすべての農場や畑で作物の健康状態を強く意識しているはずです。作物が健康であればあるほど収穫高が向上し、農場としての収益も高まります。ここでは、管理するすべての畑をマッピングし、その座標を BQ で利用できるものと仮定します。では、すべての畑の NDVI と月別の平均気温を計算して作物の健康状態を確認し、予期せぬ NDVI の下落が生じていた場合には必要な対応が取れるようにしていきます。そこで問題となるのは、どうやって SQL だけを使用して畑の NDVI と気温の情報を BigQuery に取り込むのかということです。
GEE のすぐに使える Landsat 8 画像を使用すると、地球上の任意の地点の NDVI を計算することが可能です。同様に、一般公開されている世界の陸地表面の月ごとの気候データセットである ERA5 を使用して、任意の地点の平均気温を計算することができます。
アーキテクチャ
Cloud Functions の関数は、BigQuery で SQL コマンドを充実させることができる強力なツールです。今回のケースでは、Cloud Functions の関数内で GEE スクリプトをラップして、BigQuery の SQL から関数を直接呼び出します。まずは始める前に、環境の設定をしていきます。
環境の設定
先に進む前に、環境の設定が必要です。
課金を有効にした Google Cloud プロジェクトが必要です(注: Cloud Functions の関数の実行に請求先アカウントが必要であるため、今回の例は BigQuery サンドボックス内では実行できません)。
使用する GCP ユーザーが Earth Engine にアクセスでき、サービス アカウントの作成とロールの割り当てができることを確認します。Earth Engine へは Earth Engine サインアップから登録できます。使用する GCP ユーザーとしてアクセスできること、Earth Engine のコードエディタが表示できることを実際に確認してください。
ここまで進めると、Earth Engine と BigQuery が有効となり、作業を行う準備が整います。では、環境を設定し Cloud Functions の関数を定義していきます。
1. GCP でプロジェクトを作成したら、コンソール上で選択し、Cloud Shell をクリックします。
2. Cloud Shell 上で、このデモに必要なシェル スクリプトとアセットを含む git リポジトリをクローニングします。Cloud Shell 上で以下のコマンドを実行します。
3. config.sh を編集します。任意のエディタで config.sh の変数を更新し、GCP プロジェクトを反映させます。
4. setup_sa.sh を実行します。認証するように求められるので、“n” を選択して既存の認証を使用します。
4. シェル スクリプトが問題なく実行されると、以下の画像のように、新たに作成されたサービス アカウントが表示されます。
5. 前のステップで <PROJECT_NUMBER>-compute@developer.gserviceaccount.com という形式でサービス アカウント(SA)が作成されたので、EE SA サインアップから Earth Engine にこの SA を登録します。上記のスクリーンショットの最後の部分を確認すると、SA 名が表示されています。
以下のスクリーンショットは、SA を登録する際のサインアップ過程を示しています。
6. deploy_cf.sh を実行します。デプロイが完了するまでに約 10 分ほどかかります。
これで BigQuery 内のプロジェクトに、gee というデータセット、land_coords というテーブル、get_poly_ndvi_month 関数、get_poly_temp_month 関数が作成されます。
また、以下に示すように、Cloud Shell にはサンプルクエリ出力も表示されます。
7. Cloudshell で以下のコマンドを実行していきます。
次のように表示されます。
上の画像と似た出力が得られた場合、正常に Landsat 画像に対し SQL が実行できたということになります。
ここで BigQuery のコンソールに移動すると、このような画面が表示されます。
新しい外部接続である us.gcf-ee-conn、2 つの外部ルーティンである get_poly_ndvi_month と get_poly_temp_month、新しいテーブルである land_coords が表示されます。
次に Cloud functions のコンソールに移動すると、2 つの新しい関数、polyndvicf-gen2 と polytempcf-gen2 が以下のように表示されます。
これで環境の準備が整いました。それでは、BQ コンソールに移動してクエリを実行しましょう。以下のクエリは、land_coords のテーブルに保存されたすべての畑のポリゴンの、2020 年 7 月時点での NDVI と気温を算出するものです。
出力結果は次のようになります。
ユーザーが BQ でクエリを実行すると、関数 get_poly_ndvi_month と get_poly_temp_month が、Cloud Functions の関数である polyndvicf-gen2 と polytempcf-gen2 に対するリモート呼び出しをトリガーし、GEE 上のスクリプトが開始されます。GEE からの結果は BQ コンソールにストリーミングで戻され、ユーザーに表示されます。
次のステップ
ここまでくると、このデータをデータポータルか Geoviz のマップにプロットし、ユーザーに公開できるようになります。
これでデータが BigQuery 内に準備できましたので、このデータを BigQuery 内の非公開データセットやその他の一般公開データセットと組み合わせ、BigQuery ML を使用して ML モデルを構築し、作物の収穫高や種まきの計画の予測が立てられるようになります。
まとめ
ここで紹介した例では、ユーザーが Cloud Functions の関数内で GEE の機能をラップする方法を実演しており、それにより SQL だけを使用して GEE が実行できるようになります。今回説明した方法を行う際には、GEE スクリプトを書ける人が必要です。メリットとしては、一度、スクリプトを書いてしまえば、SQL を使用するすべてのデータ アナリスト、データ サイエンティスト、データ エンジニアが、BigQuery UI や API から直接、GEE の膨大な量の衛星画像を計算に使用できるようになります。
また、データや結果が BigQuery にあれば、そのデータを BigQuery 内のその他のテーブルや Analytics Hub を通じて利用できるデータと結合することもできます。さらに、この方法であれば、ユーザーは GEE データを地理空間関数や BQML などのその他の機能と組み合わせることも可能となります。将来的には、その他の BigQuery の機能にも使用例を拡大していこうと考えています。
最後までお読みいただきありがとうございました。BigQuery から Earth Engine へデータを移行する方法の詳細については、こちらのブログ投稿をご覧ください。この投稿では、主にインドネシアにある自社のパーム油サプライ チェーンを把握しようと試みる架空の消費財企業が、サステナブルな調達を実現するためのソリューションについて概要を説明しています。
謝辞: 貴重なフィードバックをくれた David Gibson と Chao Shen に感謝します。
- カスタマー エンジニア Ankur Wahi
- Google Cloud 地理空間リード Chad W. Jennings