はじめに
Google Earth Engine(以後、GEE)は、衛星画像などの地理空間情報を分析・可視化できるプラットフォームです。GEE上で提供されている600を超える衛星画像や地理空間データセットを使って様々な分析や可視化を行うことが可能です。
本記事では、降水量データセット「CHIRPS (Climate Hazards Group InfraRed Precipitation with Station data)」を使用して、ゾーン統計という手法によって、アフリカ各国の年間降水量を算出する手順を解説します。
算出結果をCSVファイルとしてGoogle Driveにエクスポートする手順も紹介しているので、エクセル上での分析やグラフ作成にも利用できます。
この記事で学べること
- GEEでアフリカ各国の国境データを読み込む方法
- CHIRPSの日別降水量データを年間合計降水量に集計する方法
- 各国の行政境界内で年間降水量の平均値を計算する「ゾーン統計」の実行方法
- 計算結果をGoogle Drive上にCSV形式でエクスポートする方法
今回出力したCSVデータの結果を使って、Matplotlibやpandasで以下の表を作成しました。
対象読者
- GEEで特定の地域ごとの統計量を計算したい方
- 気象データや降水量データを扱いたい方
- GEEの計算結果を外部ファイル(CSV)として出力したい方
CHIRPSとは?
今回使用するデータセットは、CHIRPS(Climate Hazards Group InfraRed Precipitation with Station data) という降水量データです。
CHIRPSは、「衛星からの観測データ」と、世界各地の地上で実際に測られた「雨量データ」を組み合わせて作られた降水量データです。
30年分以上のデータが蓄積されているため、気候変動分析や干ばつモニタリングなどの長期的な分析に向いています。
CHIRPSとGSMaPの比較
降水量データとしては、日本の気象庁が提供するJMA GSMaP(Global Satellite Mapping of Precipitation)というものもあります。それぞれの違いや特徴は以下の通りです。
特徴 | CHIRPS (Climate Hazards Group InfraRed Precipitation with Station data) |
GSMaP (Global Satellite Mapping of Precipitation) |
---|---|---|
開発機関 | 米国地質調査所 (USGS) 、カリフォルニア大学 (UCSB) | 宇宙航空研究開発機構 (JAXA) |
使用データ源 | 衛星赤外データ + 地上観測所データを統合 | 複数の衛星(受動マイクロ波放射計、赤外線放射計など)データ |
空間解像度 | 0.05° x 0.05° (約 5 km四方) | 0.1° x 0.1° (約 10 km四方) |
時間解像度 | 日次、5日、10日、月次など | 1時間、日次、月次 |
データ期間 | 1981年〜現在 | 2000年3月〜現在 (GSMaPのプロダクトによる) |
強み | - 長期データ - 地上観測データ統合による高精度 季節パターンと空間分布 |
- 高い時間解像度 (1時間データ) - リアルタイム性 - 広範な衛星データ利用による全球カバー |
主な用途 | 干ばつモニタリング、農業計画、長期的な水資源管理、気候変動研究 | 短時間豪雨監視、洪水予報、水循環モデル、気象災害監視 |
これらの特性から、今回のアフリカ大陸における各国の年間降水量の分析では、CHIRPSを使用しました。
ゾーン統計とは?
ゾーン統計とは、特定の領域(ゾーン)内にあるラスターデータ(グリッドデータ)の統計量(平均値、合計値、最大値、最小値など)を計算する手法です。
例えば、以下のような分析に活用できます。
- 行政区画ごとの平均気温や降水量の算出
- 森林伐採エリア内の植生指数の平均値の把握
- 特定の土地利用タイプにおける標高の統計量の計算
GEEでは、reduceRegions()
という関数を使ってゾーン統計を実行します。
これは、統計量を計算したい領域を定義するベクターデータ(ee.FeatureCollection
)と、ラスターデータ(ee.Image
)とを組み合わせて行います。
使用するデータ
-
行政境界データ: USDOS/LSIB_SIMPLE/2017
- 米国国務省が提供する、簡略化された国際境界ポリゴンデータセット。今回はアフリカ大陸の国境データとして利用します。
- Google Earth Engineデータカタログ: USDOS/LSIB_SIMPLE/2017
-
降水量データ: UCSB-CHG/CHIRPS/DAILY
- CHIRPSは、衛星からの観測データと世界各地の地上で実際に測られた雨量データを統合した降水量データ。
- Google Earth Engineデータカタログ: UCSB-CHG/CHIRPS/DAILY
手順
まずは、GEEのCode Editorに記述するスクリプトの全体像をご紹介します。このコードを貼り付ければすぐに実行できます。その後、各ステップについて詳しく解説していきます。
スクリプト全体像
// script.js — CHIRPS Annual Rainfall by Country in Africa
// 1. Load African country boundaries
// アフリカ大陸の国境データを読み込み、地図に表示
var roi = ee.FeatureCollection("USDOS/LSIB_SIMPLE/2017")
.filter(ee.Filter.eq("wld_rgn", "Africa")); // 世界地域が"Africa"の国をフィルタリング
Map.addLayer(roi, {}, "Countries"); // 国境レイヤーを地図に追加
Map.centerObject(roi, 4); // 地図の中心をアフリカに設定し、ズームレベルを"4"に
// 2. Load CHIRPS Daily Precipitation Data (2023)
// CHIRPS日別降水量データセットを読み込み、2023年のデータにフィルタリング
var chirps = ee.ImageCollection("UCSB-CHG/CHIRPS/DAILY")
.select("precipitation") // "precipitation"バンドを選択
.filterDate("2023-01-01", "2024-01-01"); // 2023年1月1日から2024年1月1日までのデータにフィルタリング
// 3. Reduce daily images to annual total precipitation
// 日別画像を年間合計降水量に集計(各ピクセルで合計値を計算)
var annualChirps = chirps.reduce(ee.Reducer.sum()); // コレクション内の全画像の合計を計算
Map.addLayer(annualChirps.clip(roi), { // 年間降水量レイヤーを地図に追加(アフリカの境界でクリップ)
min: 0,
max: 3500,
palette: [ // 降水量に応じたカラーパレット
"000096", "0064ff", "00b4ff", "33db80", "9beb4a",
"ffeb00", "ffb300", "ff6400", "eb1e00", "af0000"
]
}, "Annual Rainfall (mm)");
// 4. Compute average rainfall per country (zonal statistics)
// 各国ごとの平均降水量を計算(ゾーン統計)
var zonalCountry = annualChirps.reduceRegions({ // 画像のピクセル値をフィーチャコレクションの各フィーチャ内で集計
collection: roi, // 集計対象のフィーチャコレクション(アフリカ各国)
reducer: ee.Reducer.mean(), // 集計方法として平均値(mean)を指定
scale: 5000 // CHIRPSの解像度(約0.05度)に対応する約5kmに相当するスケールとして5000を指定
});
// 5. Export result to CSV on Google Drive
// 結果をGoogle DriveにCSV形式でエクスポート
Export.table.toDrive({ // テーブルデータをGoogle Driveにエクスポートするタスクを作成
collection: zonalCountry, // エクスポートするフィーチャコレクション
description: "CHIRPS_Annual_Rainfall_By_Country", // タスクの説明(Google Drive上のファイル名にもなる)
folder: "ee_data", // エクスポート先のGoogle Driveフォルダ名
fileFormat: "CSV", // ファイル形式をCSVに指定
selectors: ["country_na", "mean"] // エクスポートするプロパティ(列)を指定
});
コードのステップ別解説
ここからは、上記のスクリプトをブロックごとに詳しく解説してきます。
1. アフリカ各国の行政境界データを読み込む
アフリカ大陸に属する全ての国の行政境界データをGEEのデータカタログから読み込みます。このデータが、ゾーン統計における「ゾーン(領域)」となります。
// 1. Load African country boundaries
var roi = ee.FeatureCollection("USDOS/LSIB_SIMPLE/2017")
.filter(ee.Filter.eq("wld_rgn", "Africa"));
Map.addLayer(roi, {}, "Countries");
Map.centerObject(roi, 4);
スクリプト抜粋 | 意味・目的 |
---|---|
var roi = ee.FeatureCollection("USDOS/LSIB_SIMPLE/2017").filter(ee.Filter.eq("wld_rgn", "Africa")) |
USDOS/LSIB_SIMPLE/2017 はGEEが提供する国際境界データセットです。このデータセットから、wld_rgn (世界地域)プロパティがAfrica であるフィーチャ(国境ポリゴン)をフィルタリングし、roi (Region of Interest: 関心領域)として設定します。 |
Map.addLayer(roi, {}, "Countries") |
読み込んだroi (アフリカ各国の境界)をGEEの地図上に表示します。 |
Map.centerObject(roi, 4) |
地図の中心をroi (アフリカ大陸全体)に設定し、ズームレベルを「4」に設定します。これにより、アフリカ大陸全体が画面に収まるように表示されます。 |
2. CHIRPS日別降水量データを読み込む
CHIRPSデータセットから、分析対象とする期間(今回は2023年)の日別降水量データを読み込みます。
// 2. Load CHIRPS Daily Precipitation Data (2023)
var chirps = ee.ImageCollection("UCSB-CHG/CHIRPS/DAILY")
.select("precipitation")
.filterDate("2023-01-01", "2024-01-01");
スクリプト抜粋 | 意味・目的 |
---|---|
var chirps = ee.ImageCollection("UCSB-CHG/CHIRPS/DAILY") |
CHIRPS日別降水量データセットをImageCollection として読み込み、chirps という変数に格納します。 |
.select("precipitation") |
chirps データセットには複数のバンドが含まれているため、ここでは降水量を示すprecipitation バンドのみを選択します。 |
.filterDate("2023-01-01", "2024-01-01") |
2023年1月1日から2024年1月1日までの期間(つまり2023年1年間)のデータのみをフィルタリングします。 |
3. 日別降水量を年間合計降水量に集計する
読み込んだ日別降水量データは、日ごとの画像が集まったもの(ImageCollection
)になっています。この日別画像の集合を年間合計降水量を示す1つのラスタ画像(ee.Image
)に変換します。年間合計降水量は、各ピクセルで合計値を計算して集計します。
// 3. Reduce daily images to annual total precipitation
var annualChirps = chirps.reduce(ee.Reducer.sum());
Map.addLayer(annualChirps.clip(roi), {
min: 0,
max: 3500,
palette: [ // 降水量に応じたカラーパレット
"000096", "0064ff", "00b4ff", "33db80", "9beb4a",
"ffeb00", "ffb300", "ff6400", "eb1e00", "af0000"
]
}, "Annual Rainfall (mm)");
スクリプト抜粋 | 意味・目的 |
---|---|
var annualChirps = chirps.reduce(ee.Reducer.sum()) |
chirps コレクション内の全ての日別画像に対して、ee.Reducer.sum() (合計値を計算するレデューサー)を適用します。これにより、各ピクセルにおいて2023年1年間の降水量の合計値が計算され、annualChirps という1枚の画像が生成されます。 |
Map.addLayer(annualChirps.clip(roi), { ... }, "Annual Rainfall (mm)") |
計算されたannualChirps (年間合計降水量)をGEEの地図上に表示します。clip(roi) でアフリカ大陸の境界で画像を切り抜き、min /max とpalette で降水量に応じた色分けを設定しています。 |
4. 各国ごとの平均降水量を計算する(ゾーン統計)
いよいよ今回の記事のテーマである、ゾーン統計を実行します。
ステップ3で作成した年間合計降水量画像(annualChirps
)に対して、ステップ1で読み込んだアフリカ各国の行政境界(roi
)をゾーンとして、各国ごとの平均降水量を計算します。
// 4. Compute average rainfall per country (zonal statistics)
var zonalCountry = annualChirps.reduceRegions({
collection: roi,
reducer: ee.Reducer.mean(),
scale: 5000
});
スクリプト抜粋 | 意味・目的 |
---|---|
var zonalCountry = annualChirps.reduceRegions({ ... }) |
annualChirps 画像に対してreduceRegions() 関数を適用します。この関数は、指定されたフィーチャコレクション(roi )の各フィーチャ(国)の領域内で、画像内のピクセル値を、指定したポリゴン領域ごとに統計処理(ここでは平均)します。 |
collection: roi |
統計量を計算する対象となる領域(ゾーン)を定義します。今回はroi (アフリカ各国の行政境界)を指定します。 |
reducer: ee.Reducer.mean() |
各ゾーン内でピクセル値をどのように集計するかを指定します。ここではee.Reducer.mean() (平均値)を指定しているため、各国の領域内の年間降水量の平均値が計算されます。 |
scale: 5000 |
ゾーン統計を実行する際のピクセルサイズ(解像度)をメートル単位で指定します。CHIRPSデータのネイティブ解像度(0.05度、約5km)に合わせて5000 メートルに設定しています。このscale パラメータは、計算精度と処理速度に影響を与えます。 |
reduceRegions()
とreduceRegion()
の違い
GEEにはreduceRegions()
と似た関数でreduceRegion()
というものもあります。
-
ee.Image.reduceRegions()
: 複数のフィーチャ(ポリゴン) に対して、それぞれゾーン統計を実行し、結果をFeatureCollection
として返します。今回の「アフリカ各国の降水量」のように、複数の国や地域ごとに統計量を計算したい場合に非常に便利です。 -
ee.Image.reduceRegion()
: 単一のフィーチャ(ポリゴン) に対してのみゾーン統計を実行し、結果をDictionary
として返します。特定の1つの国や地域についてのみ統計量を知りたい場合に利用します。
今回のスクリプトでは、アフリカの全ての国について統計量を計算するため、reduceRegions()
を使用しています。
5. 結果をGoogle DriveにCSV形式でエクスポートする
計算された各国の平均降水量データは、GEEのメモリ上にFeatureCollection
として存在します。これをPCで利用できるように、Google DriveにCSVファイルとして出力します。
// 5. Export result to CSV on Google Drive
Export.table.toDrive({
collection: zonalCountry,
description: "CHIRPS_Annual_Rainfall_By_Country",
folder: "ee_data",
fileFormat: "CSV",
selectors: ["country_na", "mean"]
});
スクリプト抜粋 | 意味・目的 |
---|---|
Export.table.toDrive({ ... }) |
FeatureCollection をGoogle Driveにテーブル形式でエクスポートするためのタスクを作成します。 |
collection: zonalCountry |
エクスポートする対象のFeatureCollection として、ステップ4で計算したzonalCountry を指定します。 |
description: "CHIRPS_Annual_Rainfall_By_Country" |
Google Driveに保存されるファイルの名前(説明)を設定します。この名前がタスク名にもなります。 |
folder: "ee_data" |
エクスポート先のGoogle Drive内のフォルダ名を指定します。指定したフォルダが存在しない場合は自動的に作成されます。 |
fileFormat: "CSV" |
エクスポートするファイルの形式をCSV (カンマ区切り形式)に指定します。他にもGeoJSON , KML , SHP などが選択可能です。 |
selectors: ["country_na", "mean"] |
エクスポートする列(プロパティ)を指定します。country_na は国名、mean は計算された平均降水量(reducer: ee.Reducer.mean() の結果)の列です。これにより、不要な情報を含まず、必要なデータだけを抽出できます。 |
6. エクスポートタスクの実行
以上のスクリプトをGoogle Earth Code Editor上に入力して実行します。実行は、GEE Code Editorの中央画面にある「Run」をクリックします。
スクリプトを実行すると、GEE Code Editorの画面右側にある「Tasks」タブに、作成されたタスクが表示されます。タスク名の横にある「Run」ボタンをクリックします。表示されるダイアログで設定を確認し、ダイアログ内の「RUN」ボタンをクリックすると、エクスポート処理が開始されます。
タスクが完了すると、指定したGoogle DriveのフォルダにCSVファイルが保存されます。
実行結果
スクリプトを実行し、エクスポートタスクを完了すると、GEEの地図上では、アフリカ大陸の年間降水量の分布が表示されます。
また、Google Drive上にCSVファイルが保存されます。このCSVファイルを開くと、アフリカ各国の国名と、それぞれの年間平均降水量(mm)が一覧で表示されています。
country_na | mean |
---|---|
Algeria | 123.45 |
Angola | 876.54 |
... | ... |
Zimbabwe | 654.32 |
このCSVファイルのデータを使えば、以下のような各国の年間降水量(mm)をグラフ化することができます。
まとめ
本記事では、Google Earth Engineを使って、CHIRPS降水量データからアフリカ各国の年間平均降水量を算出し、その結果をCSVファイルとしてエクスポートする一連のプロセスを解説しました。
- ゾーン統計を使えば、特定の領域内のラスターデータの統計量を計算することができる。
-
ee.Image.reduceRegions()
関数を使用することで、複数のフィーチャ(国や地域など)に対して一括で統計量を計算できる。 -
Export.table.toDrive()
関数を使えば、計算結果のテーブルデータをGoogle Driveに簡単にCSV形式で出力し、グラフ作成などに利用できる。
このゾーン統計の概念と手法は、降水量データだけでなく、植生指数、気温、標高など、様々なラスターデータに応用可能です。ぜひ試してみてください。
参考文献
- Udemy Course: Google Earth Engine Mega Course
- Google Earth Engine Data Catalog: CHIRPS Daily: Climate Hazards Group InfraRed Precipitation with Station data
- Google Earth Engine Data Catalog: USDOS/LSIB_SIMPLE/2017: Large Scale International Boundary Polygons, Simplified