はじめに
土壌水分は 農業・水資源管理・干ばつ警戒のカギとなる指標です。作物が受ける水ストレスや流域の保水量を早期に把握できれば、灌漑の最適化とリスク低減が一歩進みます。
本記事では、NASAのSMAP(Soil Moisture Active Passive)衛星のデータを用い、エチオピア全域の2016–2021年の月別土壌水分を可視化し、集計結果をCSVへ自動出力する手順を解説しています。
この記事で学べること
- SMAP データの特性(観測方式・解像度・単位)
- 月次コンポジットの生成とメタデータ付与
- メタデータの抽出と活用方法
-
reduceRegions()
によるポリゴン統計 -
Export.table.toDrive()
によるCSVエクスポート
対象読者
- Google Earth Engineの基本操作を理解している方
- 衛星データを使った環境監視に興味がある方
- 農業・水資源管理分野での応用を考えている方
- データエクスポート機能を活用したい方
本記事は、Udemy講座「Google Earth Engine Mega Course」の内容を参考に、筆者自身の学習過程で得た知見を補足しながら作成しています。
土壌水分について
土壌水分とは?
土壌水分は、土壌中に含まれる水分の量を表す指標です。以下のような分野で重要な役割を果たします。
土壌水分データの活用分野
- 農業管理:作物の水ストレス評価と灌漑計画の最適化
- 干ばつ監視:土壌水分の減少パターンから干ばつの早期検出
- 水資源評価:流域の水収支計算と地下水涵養量の推定
- 洪水予測:土壌の飽和状態から洪水リスクの評価
SMAPについて
SMAPとは?
SMAP(Soil Moisture Active Passive)は、NASAが2015年に打ち上げた土壌水分観測専用の衛星ミッションです。
SMAPは、マイクロ波放射計を使用して地表面から放射される自然のマイクロ波を観測し、表層の土壌水分(表層 0–5 cm)を推定します。この手法により、雲の影響を受けずに全天候での観測が可能となっています。
SMAPの基本情報
項目 | 内容 |
---|---|
正式名称 | NASA_USDA/HSL/SMAP10KM_soil_moisture |
データID | NASA_USDA/HSL/SMAP10KM_soil_moisture |
主な用途 | 表層土壌水分の時系列分析、干ばつ監視 |
空間解像度 | 約 9 km(0.08° グリッド) |
時間解像度 | 日次 |
観測手法 | Lバンドマイクロ波放射計 |
測定深度 | 表層 0–5 cm |
今回使用するデータセット
本記事では以下のデータセットを使用します:
土壌水分データ: NASA_USDA/HSL/SMAP10KM_soil_moisture
項目 | 内容 |
---|---|
データID | NASA_USDA/HSL/SMAP10KM_soil_moisture |
使用バンド |
ssm (表層土壌水分) |
空間解像度 | 約 9 km(0.08° グリッド) |
対象地域 | エチオピア |
対象期間 | 2016〜2021年 |
実装手順
スクリプト全体像
まず、Google Earth EngineのCode Editorに記述するスクリプトの全体像をご紹介します。
このスクリプトをCode Editorにコピー&ペーストすれば実行可能です。
// SMAP土壌水分の月別集約とエクスポート(GEE)
// 1. 国境データを読み込み、エチオピアでフィルタリング
var Countries = ee.FeatureCollection("USDOS/LSIB_SIMPLE/2017");
var roi = Countries.filter(ee.Filter.eq("country_na", "Ethiopia"));
// 2. 年と月の範囲を定義
var years = ee.List.sequence(2016, 2021);
var months = ee.List.sequence(1, 12);
// 3. SMAP土壌水分データセットを読み込み(表層土壌水分、10km)
var coll = ee.ImageCollection("NASA_USDA/HSL/SMAP10KM_soil_moisture")
.filterDate("2016-01-01", "2021-12-31")
.select("ssm");
// 4. 平均土壌水分を可視化
var soilVis = {
min: 0,
max: 28,
palette: ["0300ff", "418504", "efff07", "ff0303"]
};
Map.setCenter(17, 13, 2);
Map.addLayer(coll.mean(), soilVis, "Soil Moisture");
// 5. 各画像に月と年をメタデータとして付与
var smap = coll.map(function(img){
var d = ee.Date(ee.Number(img.get("system:time_start")));
var m = ee.Number(d.get("month"));
var y = ee.Number(d.get("year"));
return img.set({"month": m, "year": y});
});
// 6. 年と月別に月次合成画像を作成
var byYearMonth = ee.ImageCollection.fromImages(
years.map(function(y){
return months.map(function(m){
return smap
.filterMetadata("year", "equals", y)
.filterMetadata("month", "equals", m)
.select("ssm")
.mean()
.set("year", y)
.set("month", m)
.set("date", ee.Date.fromYMD(y, m, 1));
});
}).flatten()
);
// 7. ポリゴン地域ごとの平均土壌水分を計算
var smapEthiopia = byYearMonth.map(function(img){
var features = roi.map(function(f){
return f.set("date", img.get("date"), "month", img.get("month"), "year", img.get("year"));
});
var proj = ee.Image(byYearMonth.first()).projection();
return img.reduceRegions(features, ee.Reducer.mean(), 1000);
}).flatten();
// 8. 結果をCSVとしてエクスポート
var selectors = "month, year, country_na, mean";
Export.table.toDrive({
collection: smapEthiopia,
description: "SMAP_Timeseries",
folder: "earth_engine_data",
fileNamePrefix: "SMAP_Timeseries",
fileFormat: "CSV",
selectors: selectors
});
コードのステップ別解説
ここからは、上記のスクリプトをブロックごとに詳しく解説していきます。
1. 国境データの読み込みと地域設定
このブロックでは、国境データセットを読み込み、分析対象地域(エチオピア)を定義しています。
var Countries = ee.FeatureCollection("USDOS/LSIB_SIMPLE/2017");
var roi = Countries.filter(ee.Filter.eq("country_na", "Ethiopia"));
スクリプト抜粋 | 意味・目的 |
---|---|
ee.FeatureCollection("USDOS/LSIB_SIMPLE/2017") |
世界の国境データセットを読み込み |
.filter(ee.Filter.eq("country_na", "Ethiopia")) |
国名が"Ethiopia"と一致する地域のみを抽出 |
国際境界データセット「LSIB 2017:Large Scale International Boundary Polygons, Simplified」のImageCollection ID等の情報は、Earth Engine Data Catalog上で確認できます。
2. 年月の範囲定義
このブロックでは、分析対象期間の年と月を定義しています。
var years = ee.List.sequence(2016, 2021);
var months = ee.List.sequence(1, 12);
スクリプト抜粋 | 意味・目的 |
---|---|
ee.List.sequence(2016, 2021) |
2016年から2021年までの年のリストを作成 |
ee.List.sequence(1, 12) |
1月から12月までの月のリストを作成 |
3. SMAPデータの読み込みと可視化
このブロックでは、SMAP土壌水分データセットに含まれる特定期間の表層土壌水分(SSM
:Surface Soil Moisture)バンドだけを読み込み、マップ上に表示するよう設定しています。
var coll = ee.ImageCollection("NASA_USDA/HSL/SMAP10KM_soil_moisture")
.filterDate("2016-01-01", "2021-12-31")
.select("ssm");
var soilVis = {
min: 0,
max: 28,
palette: ["0300ff", "418504", "efff07", "ff0303"]
};
Map.setCenter(17, 13, 2);
Map.addLayer(coll.mean().clip(roi), soilVis, "Soil Moisture (2016‑2021)");
スクリプト抜粋 | 意味・目的 |
---|---|
.select("ssm") |
表層土壌水分(Surface Soil Moisture)バンドssm のみを選択 |
soilVis |
スタイル設定の変数名soilVis と設定内容。パラメータ、色の設定(青:土壌水分が低い、赤:土壌水分が高い) |
Map.setCenter(17, 13, 2) |
マップの中心をアフリカ大陸に設定 |
Map.addLayer(coll.mean().clip(roi), soilVis, "") |
Map.addLayer は地図上に可視化する関数。Map.addLayer の詳しい設定はGoogle Earth Engineガイド「画像の可視化」を参照 |
データセットの読み込みに使用するImageCollection IDや、データセットに含まれるバンド名(今回は表層土壌水分バンドssm
)は、Earth Engine Data Catalog上で確認できます。
4. メタデータの付与
このブロックでは、各画像のタイムスタンプから年と月を抽出し、メタデータとして付与しています。
var smap = coll.map(function(img){
var d = ee.Date(ee.Number(img.get("system:time_start")));
var m = ee.Number(d.get("month"));
var y = ee.Number(d.get("year"));
return img.set({"month": m, "year": y});
});
スクリプト抜粋 | 意味・目的 |
---|---|
img.get("system:time_start") |
画像のタイムスタンプを取得 |
ee.Date(ee.Number(...)) |
タイムスタンプをDate型に変換。system:time_start は数値型なので、ee.Date() で変換してから月や年を抽出する必要があります。 |
d.get("month") , d.get("year")
|
日付から月と年を抽出 |
img.set({"month": m, "year": y}) |
抽出した月と年をメタデータとして画像に付与 |
5. 月別データ集約
このブロックでは、年と月の組み合わせごとに画像を集約し、月次平均画像を作成しています。
var byYearMonth = ee.ImageCollection.fromImages(
years.map(function(y){
return months.map(function(m){
return smap
.filterMetadata("year", "equals", y)
.filterMetadata("month", "equals", m)
.select("ssm")
.mean()
.set("year", y)
.set("month", m)
.set("date", ee.Date.fromYMD(y, m, 1));
});
}).flatten()
);
スクリプト抜粋 | 意味・目的 |
---|---|
ee.ImageCollection.fromImages() |
画像のリストから新しいImageCollectionを作成 |
years.map(function(y){...}) |
各年に対してループ処理を実行 |
months.map(function(m){...}) |
各月に対してループ処理を実行 |
.filterMetadata("year", "equals", y) |
指定した年の画像のみをフィルタリング |
.filterMetadata("month", "equals", m) |
指定した月の画像のみをフィルタリング |
.mean() |
フィルタリングされた画像の平均値を計算 |
.flatten() |
ネストしたリストを平坦化(入れ子になっている状態のリストについて、リスト内部のサブリストを取り払い、一列に並べる(フラットにする)操作) |
6. 地域統計の計算
このブロックでは、各月次画像について、エチオピア全体の平均土壌水分を計算します。
前のステップで作成した月平均画像はピクセル値の集合なので、画像全体(=エチオピア全域)に含まれるピクセルを平均し、月ごとの代表的な土壌水分値を算出します。
var smapEthiopia = byYearMonth.map(function(img){
var features = roi.map(function(f){
return f.set("date", img.get("date"), "month", img.get("month"), "year", img.get("year"));
});
var proj = ee.Image(byYearMonth.first()).projection();
return img.reduceRegions(features, ee.Reducer.mean(), 1000);
}).flatten();
スクリプト抜粋 | 意味・目的 |
---|---|
roi.map(function(f){...}) |
各ポリゴンフィーチャーに対してメタデータを付与 |
f.set("date", ..., "month", ..., "year", ...) |
日付、月、年の情報をフィーチャーに追加 |
img.reduceRegions(features, ee.Reducer.mean(), 1000) |
ポリゴン内のピクセル値の平均を計算 |
1000 |
空間解像度(メートル)を指定。SMAPデータの本来の解像度は約10kmですが、ここでは1000m(1km)を指定。より詳細な統計計算ができる反面、計算時間が増加する可能性。 |
7. CSVエクスポート
このブロックでは、計算結果をCSVファイルとしてGoogle Driveにエクスポートします。
var selectors = "month, year, country_na, mean";
Export.table.toDrive({
collection: smapEthiopia,
description: "SMAP_Timeseries",
folder: "earth_engine_data",
fileNamePrefix: "SMAP_Timeseries",
fileFormat: "CSV",
selectors: selectors
});
スクリプト抜粋 | 意味・目的 |
---|---|
selectors |
エクスポートする列名をカンマ区切りで指定(月、年、国名、平均値)。セレクターで指定した列のみがCSVファイルに出力されます。列名は、フィーチャーのプロパティ名と正確に一致させる必要があります。 |
Export.table.toDrive() |
テーブルデータをGoogle Driveにエクスポートする関数 |
description |
エクスポートタスクの説明 |
folder |
保存先フォルダ名 |
fileNamePrefix |
ファイル名のプレフィックス |
fileFormat |
出力ファイル形式(今回はCSV形式) |
実行結果
スクリプトを実行すると、以下のような結果が得られます:
土壌水分分布マップ(2016–2021 年平均)
エチオピア全域の SMAP 表層土壌水分(SSM)を 2016 年 1 月〜2021 年 12 月の期間で平均した地図です。
青〜赤のグラデーションは表層土壌水分量 0 mm から 28 mm を表し、青色が低水分(乾燥地域)、赤色が高水分(湿潤地域)を表します。
解析対象期間と同じ6年分を合成しているため、後続の月次時系列チャートと整合が取れています。
2. 月別土壌水分時系列チャート(2016–2021 年)
エチオピア全域の SMAP 表層土壌水分(SSM)を、2016 年 1 月〜2021 年 12 月まで月ごとに平均してプロットしたチャートです。
乾季(1–3 月)の低水分期と雨季(6–9 月)の高水分期が周期的に現れ、2018 年・2020 年は全体的に湿潤気味であることが読み取れます。
このチャートはスクリプト内で生成した月次コンポジットを ui.Chart
で可視化した例であり、CSV出力や地図レイヤと同じデータに基づいています。
3. CSVファイル
Google Driveのearth_engine_data
フォルダにSMAP_Timeseries.csv
ファイルが出力されます。CSVファイルには、以下の列が含まれています:
-
month
: 月(1-12) -
year
: 年(2016-2021) -
country_na
: 国名(Ethiopia) -
mean
: 平均土壌水分値
まとめ
本記事では、SMAP表層土壌水分 (9 km, 日次) をGEE 上で月次に集約し、特定期間の国全域における表層土壌水分の平均値を算出しました。また、計算結果をCSV形式でエクスポートする手順まで詳しく解説しました。
重要なポイント
1. SMAP土壌水分データ
- SMAPは土壌水分監視において重要なデータセット
- 約9km解像度で全球の表層土壌水分を日次で観測
2. 高度なデータ処理技術
- GEE上でメタデータの抽出と活用ができる
- ネストしたmap()関数で月別集約も可能
- reduceRegions()を使って地域の統計計算(例:国全域)も可能
3. データエクスポート機能
- Export.table.toDrive()により、分析結果をCSV出力
-
selectors
でCSV列(プロパティ)の適切な指定が必要