【Python】Google Earth Engineを用いた地形情報タイムラプスの作り方【GEE】

【Python】Google Earth Engineを用いた地形情報タイムラプスの作り方【GEE】

Pythonで地形情報のタイムラプスを作りたいと思ったことはありませんか?タイムラプスとは、複数の画像をコマ送りにして動画化する手法です。衛星画像を利用したタイムラプスは、地理の教科書に載っていたアラル海の縮小や氷河の後退などに利用されています。

今回はGoogle Earth Engine(以下、GEE)を利用したPythonでのタイムラプス作成方法について紹介します。
タイムラプスが作成できれば、地形情報の変化が視覚的に捉えられるようになります。

動作検証済み環境

macOS Monterey(12.6.1), python3.10.7

タイムラプスとは?

先ほども触れましたが、タイムラプスは複数の画像を動画化することで、時系列変化を視覚的に扱う手法です。植物の葉の成長や開花などで目にしたことも多いのではないでしょうか。また、アラル海の縮小や氷河の後退など年単位で起きている変化にも利用されます。このようにタイムラプスは時間スケールが大きい事象の変化に対してよく利用されます。

GEEではでいくつかの場所がタイムラプスとして公開されています。こちらのサイトにアクセスするとこのような画像が表示されます。画面下の赤枠で囲ったバーで年代を選択したり、タイムラプスの再生が行えます。今選択されているのはアラスカの氷河後退のタイムラプスで1984年から2020年の衛星画像が使用されています。

1984年(左)と2020年(右)を比較すると確かに白で写っている氷河の面積が減少していることがわかります。

タイムラプス作成の実装方法

それでは、Pythonを用いたタイムラプスの作成方法について紹介します。

下記のコードをgee_timelapse.pyという名前でDesktop/labcode/python/geeディレクトリに保存します。

import ee

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

# 観測地点の設定
geometry = ee.Geometry.Polygon(
    [[-175.438010,-20.514222], [-175.438010,-20.604650],[ -175.339343,-20.604650],[-175.339343,-20.514222]])

# ImageCollectionの選択
collection_l8 = ee.ImageCollection('LANDSAT/LC08/C02/T1_TOA')
collection_l9 = ee.ImageCollection('LANDSAT/LC09/C02/T1_TOA')

# Imagecollectionの結合
collection = collection_l8.merge(collection_l9).sort('system:time_start')

# 日付範囲の設定
collection = collection.filterDate('2021-11-01','2022-02-28')

# Landsatのパス/ロウ設定
path = collection.filter(ee.Filter.eq('WRS_PATH', 70))
pathrow = path.filter(ee.Filter.eq('WRS_ROW', 74))

# 表示させるバンドの選択
bands = pathrow.select(['B4', 'B3', 'B2'])

# 画像データを8 bitに変換する関数
def convertBit(image):
    return image.multiply(512).uint8()

# 画像データの8 bit化    
output = bands.map(convertBit)

# 動画データとして出力する条件の設定
output_viedo = ee.batch.Export.video.toDrive(
    output, description='Tonga_eruption', dimensions = 720, framesPerSecond = 2, region=geometry, maxFrames=10000)

# 動画データ出力の実行
process = ee.batch.Task.start(output_viedo)

プログラムを実行する

ターミナルを開き、

$ cd Desktop/labcode/python/gee

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

$ python gee_timelapse.py

実行結果

GEEに登録しているGoogleアカウントのDrive上の~/MyDrive/ というディレクトリにTonga_eruption.mp4というファイルができていれば成功です。

次にmp4ファイルの内容確認を行います。Tonga_eruption.mp4を開くと以下のような動画が幼児されます。これは、トンガのフンガ・トンガ=フンガ・ハアパイ島の2021年11月~2022年2月のLandsat8/9で撮影された画像をタイムラプスとして出力したものです。

日本でもニュースになりましたが、この島では2022年1月15日に海底火山の大規模な噴火が起きました。その結果、島が2つに分断されてしまいました。もともとこの島は2014~2015年の噴火でフンガ・トンガ島とフンガ・ハアパイ島が地続きになって出来たようで、今回の噴火で2014年以前の状態に戻ったともいえそうです。 

コードの解説

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

import ee

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

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

# 観測地点の設定
geometry = ee.Geometry.Polygon(
    [[-175.438010,-20.514222], [-175.438010,-20.604650],[ -175.339343,-20.604650],[-175.339343,-20.514222]])

# ImageCollectionの選択
collection_l8 = ee.ImageCollection('LANDSAT/LC08/C02/T1_TOA')
collection_l9 = ee.ImageCollection('LANDSAT/LC09/C02/T1_TOA')

2-3行目で観測地点の座標をgeometryという変数に代入します。

6-7行目でLandsat8とLandsat9のImageCollectionをそれぞれ変数に代入していきます。

# Imagecollectionの結合
collection = collection_l8.merge(collection_l9).sort('system:time_start')

# 日付範囲の設定
collection = collection.filterDate('2021-11-01','2022-02-28')

2行目の.mergeでLandsat8とLandsat9のImageCollectionを結合します。

さらに.sort('system:time_start')で日付順に並び変えます。この処理がないと、Landsat8の後にLandsat9の画像が来るようなタイムラプスになってしまうので正しく時系列が追えなくなってしまいます。

# Landsatのパス/ロウ設定
path = collection.filter(ee.Filter.eq('WRS_PATH', 70))
pathrow = path.filter(ee.Filter.eq('WRS_ROW', 74))

# 表示させるバンドの選択
bands = pathrow.select(['B4', 'B3', 'B2'])

Landsatシリーズの観測衛星は、観測地点をパス/ロウというタイル状に分類しています。そのため、2-3行目の処理を入れることでタイムラプス作成に利用してたい地点の絞り込みが行えます。

パス/ロウはアメリカ地質調査所(USGS)の以下のページで検索できます。
https://landsat.usgs.gov/landsat_acq#convertPathRow

# 画像データを8 bitに変換する関数
def convertBit(image):
    return image.multiply(512).uint8()

# 画像データの8 bit化    
output = bands.map(convertBit)

# 動画データとして出力する条件の設定
output_viedo = ee.batch.Export.video.toDrive(
    output, description='Tonga_eruption', dimensions = 720, framesPerSecond = 2, region=geometry, maxFrames=10000)

# 動画データ出力の実行
process = ee.batch.Task.start(output_viedo)

ここでは動画の出力設定を行っています。

2-3行目の関数ではImageCollectionの画像データを8bitに変換する関数を設定します。GEEの衛星画像データはee.batch.Export.video.toDriveで出力する場合、0-255の8 bitデータである必要があります。Landsat8/9は16 bitの画像であるため、この関数を利用して8 bitに変換します。

9-10行目で出力する動画の設定を行います。dimensionsで動画の縦横のピクセルサイズ、framesPerSecondでフレームレート、maxFramesで出力する最大画像数を設定しています。13行目で処理を実行することでGoogle Drive上に動画データが出力されます。

最後に

GEEを利用したタイムラプスの作成方法について紹介しました。タイムラプスそのものは見せる用途の場合が多いかもしれませんが、視覚情報として一つのデータにすることは直感的に情報をとらえるのに役立ちます。ぜひ、いろいろな場所で試してもらえればと思います。

コメントを残す

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