【Python】GEEで衛星画像データをダウンロードする方法【GEE】

【Python】GEEで衛星画像データのダウンロードする方法【GEE】

Google Earth Engine(以下GEE)は衛星データの取得から解析までクラウド上の操作で完結することができます。しかし、ローカルの環境でGIS系のソフトを利用した解析や、JavaScriptやPython以外の言語で解析を行う場合など、元データを手元に置いておきたい場合があるかもしれません。

今回はGEEで解析に利用した衛星画像データをダウンロードする方法を紹介します。
元データが手元にあれば、GIS系のソフトを利用してGUIベースの直感的な操作が可能になり、Pythonのパッケージよりも自由な描画が行えるようになります。

動作検証済み環境

macOS Monterey(12.6.1), python3.10.7, QGIS 2.8.0

GEEから衛星画像データをダウンロードする方法:シェープファイルから衛星データを収集してみる

GEEについてはこちらの記事でも紹介していますが、Googleのクラウドを経由し、様々な機関の人工衛星データが利用できるメリットが存在します。さらにGEEのAPIを利用すればクラウド上で解析が完結し画像データをダウンロードする機会があまり発生しません。

そのため、元データをローカル環境で解析を行う場合、別途ダウンロードしてくる必要がありますが、GEEからは直接ローカル環境にダウンロードすることが出来ないため、一度クラウドのストレージ上に保存する必要があります。

エクスポート先に指定可能なストレージはGoogle Drive、Google Storage、GEE assetのいずれかになります。
GEEにはこれらのストレージにエクスポートするためのAPIが存在するため、それを利用したダウンロード方法について紹介します。

衛星画像データをGoogle Drive上に保存する

今回はPythonのAPIを利用して、GoogleDrive上に衛星データをエクスポートします。
下記のコードをgee_todrive.pyという名前でDesktop/labcode/python/geeディレクトリに保存します。

import ee

# GEEの認証
# ee.Authenticate()
ee.Initialize()

# 雲に覆われているピクセルの補正処理関数
def cloudMasking(image):
    qa = image.select('QA60')
    cloudBitMask = 1 << 10
    cirrusBitMask = 1 << 11
    mask = qa.bitwiseAnd(cloudBitMask).eq(0) and qa.bitwiseAnd(cirrusBitMask).eq(0)
    return image.updateMask(mask).divide(10000)

# 衛星データをGoogleDriveにエクスポートする関数
def ImageExport(image,description,folder,region,scale):
    task = ee.batch.Export.image.toDrive(image=image,description=description,folder=folder,region=region,scale=scale)
    task.start()

# 緯度経度、データを扱う衛星の設定
rect_region = ee.Geometry.Rectangle([139.91809844970703,35.547311987963084, 139.66129302978516,35.746512259918504])
sentinel2 = ee.ImageCollection('COPERNICUS/S2_SR_HARMONIZED').filterBounds(rect_region).filter(
    ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE',20)).filterDate('2022-01-01', '2022-01-31').map(cloudMasking)

s2_detail = sentinel2.getInfo()
for i in s2_detail['features']:
    s2_name = i['properties']['system:index']
    forimage = ee.Image('COPERNICUS/S2_SR_HARMONIZED/'+s2_name).select(['B2','B3','B4','B8','B11','B12'])
    ImageExport(forimage.reproject(crs='EPSG:4326',scale=10),s2_name,'gee_data',rect_region,10)

プログラムを実行する

ターミナルを開き、

$ cd Desktop/labcode/python/gee

と入力し、ディレクトリを移動します。あとは以下のコマンドを実行するだけです。( $マークは無視してください)

$ python gee_todrive.py

実行結果

GEEに登録しているGoogleアカウントのDrive上に~/MyDrive/gee_data というディレクトリが作成され、中に20220102T013051_20220102T013047_T54SUE.tif20220112T013031_20220112T013025_T54SUE.tifというtifファイルが格納されていればエクスポート成功です。

次にtifファイルの内容確認を行います。tifファイルは必要に応じてGoogleDriveからローカル環境にダウンロードします。今回は~/Desktop/labcode/python/geeにダウンロードします。

ダウンロードしたtifファイルはGeoTIFFというフォーマットで位置情報が埋め込まれています。そのままではサイズ量も大きく開けない場合があるので、QGISというソフトウェアで内容の確認を行います。

QGISのダウンロード

QGISはGIS解析が行えるフリーソフトウェアです。以下のサイトからmacOS版のインストーラーをダウンロードします。
https://qgis.org/ja/site/forusers/download.html

インストール画面では「Agree」を押します。

次に下記の画面が表示されるので、QGIS.appをApplicationsにドラッグします。

QGISのインストールが完了したら、QGISを開きます。開くと以下のような画面が表示されます。
先ほどのプログラムでエクスポートしたtifファイルを赤枠の中にドラッグします。

20220107T013039_20220107T013637_T54SUE.tifをドラッグしてみました。すると以下のようにお台場あたりを中心とした東京の画像が表示されます。

しかし、RGB合成に使用されている衛星画像のバンドが一致していないため、青白く表示されてしまっています。そのため、少し手直ししてあげる必要があります。
まず、左下の枠のtifファイル名をダブルクリックします。

次に以下のようなウィンドウが表示されるので、左のバーで「シンポロジ」を選択します。するとRGB合成に使用されているバンド情報が表示されます。Sentinel-2の場合、赤色はB4、青色はB2に対応しますが、今の設定では赤と青が逆の設定になっていることが分かります。ここを修正し、OKを押します。

次のように表示されれば成功です。

中央下あたりが赤茶色に色合いが変化しているのが分かります。Google Mapなどと比較してあげると埠頭のクレーンや羽田空港の滑走路横の芝が該当しそうです。

コードの解説

上に書いたソースコードで重要なところを解説をしていきます。

import ee

# GEEの認証
# ee.Authenticate()
ee.Initialize()

今回使用するGEEのライブラリをインポートし、GEEのセッションの初期化を行います。

# 雲に覆われているピクセルの補正処理関数
def cloudMasking(image):
    qa = image.select('QA60')
    cloudBitMask = 1 << 10
    cirrusBitMask = 1 << 11
    mask = qa.bitwiseAnd(cloudBitMask).eq(0) and qa.bitwiseAnd(cirrusBitMask).eq(0)
    return image.updateMask(mask).divide(10000)

Sentinel-2用の雲補正関数を定義します。詳細はこちらの記事を参照してください。

# 衛星データをGoogleDriveにエクスポートする関数
def ImageExport(image,description,folder,region,scale):
    task = ee.batch.Export.image.toDrive(image=image,description=description,folder=folder,region=region,scale=scale)
    task.start()

衛星データをGoogleDriveNiエクスポートする関数を定義します。ee.batch.Export.image.toDriveで保存する画像イメージと名前、フォルダ、保存する地域、スケールを設定し、task.start()で処理を開始します。

# 緯度経度、データを扱う衛星の設定
rect_region = ee.Geometry.Rectangle([139.91809844970703,35.547311987963084, 139.66129302978516,35.746512259918504])
sentinel2 = ee.ImageCollection('COPERNICUS/S2_SR_HARMONIZED').filterBounds(rect_region).filter(
    ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE',20)).filterDate('2022-01-01', '2022-01-31').map(cloudMasking)

# ImageCollectionの詳細情報
s2_detail = sentinel2.getInfo()

# 衛星画像データのエクスポート
for i in s2_detail['features']:
    s2_name = i['properties']['system:index'] # 衛星画像データのデータ名の抽出
    forimage = ee.Image('COPERNICUS/S2_SR_HARMONIZED/'+s2_name).select(['B2','B3','B4','B8','B11','B12']) # 衛星画像データからB2, B3, B4, B8, B11, B12データを抽出
    ImageExport(forimage.reproject(crs='EPSG:4326',scale=10),s2_name,'test',rect_region,10)

2~4行目で収集する画像の位置情報、衛星情報、日付情報の設定を行います。

7行目でSentinel-2の詳細情報を設定し、10~13行目で衛星画像をエクスポートしていきます。

最後に

GEEで解析に利用した衛星画像データの元データのダウンロード方法について紹介しました。衛星データは容量が大きくGEE経由でダウンロードする機会は多くないかもしれませんが、QGISなどのGIS系ソフトと組み合わせることで画像描画に関しては自由度が増します。ぜひ、試してもらえればと思います。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です