Google Earth Engine (GEE) プラットフォームを使用して、特定地域の5kmメッシュ気象データを2000年から2022年までの期間で取得する方法について解説します。
1. メッシュデータの準備
まず、対象地域のメッシュデータをGEEにアップロードする必要があります。一般的にはGeoJSONまたはShapefile形式に変換し、GEEのコードエディタからアップロードします。
2. 気温データセットの選択
次に、適切な気温データセットを選択します。全球の日均気温を提供するERA5 Daily Aggregatesが一般的に使用されます。
3. 期間の設定
分析期間として2000年から2022年までを設定します。
4. 年平均気温の計算
年単位の平均気温が必要なため、データセットを年単位で集計します。
5. メッシュデータとの結合
アップロードしたメッシュデータをフィーチャコレクションとして使用し、年平均気温データをメッシュ単位で集計します。
6. 結果のエクスポート
最後に、計算結果をGoogle Driveにエクスポートするか、GEE上で直接可視化します。
実装例:2000-2022年の年平均気温の計算
// 気温データセットの読み込み
var climateData = ee.ImageCollection('ECMWF/ERA5/DAILY')
.select('mean_2m_air_temperature')
.filterDate('2000-01-01', '2022-12-31');
// 年平均気温の計算
var annualTemp = climateData.map(function(img) {
var time = ee.Date(img.get('system:time_start'));
var yr = time.get('year');
return img.set('year', yr);
}).reduce(ee.Reducer.mean());
// メッシュデータの読み込み
var meshAreas = ee.FeatureCollection('users/gardenq2000/Shanxi/Shanxi49N');
// 各メッシュの年平均気温を計算
var meshTempResults = meshAreas.map(function(area) {
var avgTemp = annualTemp.reduceRegion({
reducer: ee.Reducer.mean(),
geometry: area.geometry(),
scale: 5000,
maxPixels: 1e9
});
return area.set(avgTemp);
});
// 結果の可視化
Map.addLayer(meshTempResults, {color: 'FF0000'}, 'メッシュ平均気温');
Map.centerObject(meshAreas, 6);
// Google Driveへのデータエクスポート
Export.table.toDrive({
collection: meshTempResults,
description: 'メッシュ平均気温_2000_2022',
fileFormat: 'CSV'
});
日別データセットと月別データセットを使用して年平均気温を計算する場合、どちらを選択するかは研究の具体的な要件、必要な精度、およびデータの利用可能性によって異なります。以下に各データセットの使用に関する考慮事項を示します:
日別データを使用する利点:
- より高い時間解像度:日別データはより頻繁な観測値を提供し、気温の日変動や異常な状況をより正確に捉えることができます。気候研究やモデル検証など、詳細な時系列が必要なアプリケーションでは、この高頻度データが非常に価値があります。
- 柔軟性:日別データから季節平均やその他の非標準的な期間の平均など、異なる時間集計レベルをカスタマイズできます。
- 極端な気象イベントの捕捉:熱波や寒波などの短期的な極端な気象イベントを特定・分析するのに役立ち、これらは月平均データではそれほど顕著でない可能性があります。
月別データを使用する利点:
- 計算の簡便さ:月別データは既に集計されているため、データ処理の計算負荷が軽減され、長期間の時系列データを迅速に取得・分析できます。
- データサイズの管理:日別データよりデータ量が少ないため、特に広域や全球スケールのデータを処理する際に処理速度が向上します。
- 適用性:日変動ではなく長期傾向の分析が必要な研究(例:特定の生態系変化研究)では、月別データで十分な場合があります。
データセット選択の決定要因
- 研究目的:最も重要な考慮事項は研究の具体的な目的です。気温の詳細な時間スケールの変動を理解したい場合や極端なイベントを捕捉したい場合は、日別データがより適しています。長期傾向の評価が目的の場合、月別データで十分かつ処理が容易です。
- データ処理能力:利用可能な計算リソースとデータ処理能力を考慮します。リソースが限られている場合、月別データの使用が適切かもしれません。
- データ利用可能性:利用可能なデータタイプによって選択が制限される場合があります。
研究で低い時間解像度が許容され、主に長期傾向に焦点を当てている場合、月別データの使用は合理的な選択です。これにより、データ処理の複雑さとリソース消費を削減しながら、年間および年間を超える気温変動を分析・理解するのに十分な情報を提供できます。
各年の年平均気温を計算するコード例:
// 気温データセットの読み込み - ERA5月別集計データ
var climateMonthlyData = ee.ImageCollection('ECMWF/ERA5/MONTHLY')
.select('mean_2m_air_temperature')
.filterDate('2000-01-01', '2022-12-31');
// メッシュデータの読み込み
var meshAreas = ee.FeatureCollection('users/gardenq2000/Shanxi/Shanxi49N');
// 各年の平均気温を計算し、辞書に保存
var firstYear = 2000;
var lastYear = 2022;
var yearlyMeshTemperatures = meshAreas.map(function(area) {
var yearlyFeatures = ee.FeatureCollection(ee.List.sequence(firstYear, lastYear).map(function(yr) {
var yearStart = ee.Date.fromYMD(yr, 1, 1);
var yearEnd = yearStart.advance(1, 'year');
var yearFiltered = climateMonthlyData.filterDate(yearStart, yearEnd);
// 各年のデータセットが空でないか確認
var hasData = yearFiltered.size().gt(0);
var avgTemp = ee.Algorithms.If(hasData,
yearFiltered.mean().reduceRegion({
reducer: ee.Reducer.mean(),
geometry: area.geometry(),
scale: 5000,
maxPixels: 1e9
}),
ee.Dictionary({'mean_2m_air_temperature': null})
);
return ee.Feature(null, {
'year': yr,
'avg_temperature': ee.Dictionary(avgTemp).get('mean_2m_air_temperature', null)
});
}));
return yearlyFeatures;
}).flatten();
// 結果の可視化(特定の年を選択して表示)
var displayData = yearlyMeshTemperatures.filter(ee.Filter.eq('year', 2000));
Map.addLayer(displayData, {color: 'FF0000'}, '2000年メッシュ平均気温');
Map.centerObject(meshAreas, 6);
// Google Driveへのデータエクスポート
Export.table.toDrive({
collection: yearlyMeshTemperatures,
description: '年別メッシュ平均気温_2000_2022',
fileFormat: 'CSV'
});
2000-2022年平均風速の計算
- 風速データの読み込み:
ERA5 Monthly Aggregatesデータセットを選択し、10m高度のu成分とv成分の風速を読み込みます。 - 風速ベクトルの大きさの計算:u成分とv成分の二乗和の平方根を使用して、月ごとの風速ベクトルの大きさを計算します。
- 年平均風速の計算:月ごとの風速ベクトルの大きさを年平均風速に変換します。
- メッシュデータの読み込み:アップロードしたメッシュデータセットを読み込みます。
- メッシュ内平均風速の計算:各メッシュに対して
reduceRegionメソッドを使用して、そのメッシュ内の平均風速を計算します。 - 可視化とエクスポート:GEEマップに処理結果レイヤーを追加し、データをGoogle Driveにエクスポートします。
// 風速データセットの読み込み - ERA5月別集計データ
var windData = ee.ImageCollection('ECMWF/ERA5/MONTHLY')
.select('u_component_of_wind_10m', 'v_component_of_wind_10m')
.filterDate('2000-01-01', '2022-12-31');
// 月ごとの風速量の計算
var monthlyWindMagnitude = windData.map(function(img) {
var uComponent = img.select('u_component_of_wind_10m');
var vComponent = img.select('v_component_of_wind_10m');
// 風速ベクトルの大きさを計算
return img.expression(
'sqrt(u*u + v*v)',
{
'u': uComponent,
'v': vComponent
}
).rename('wind_magnitude')
.copyProperties(img, ['system:time_start']);
});
// 年平均風速の計算
var annualWindSpeed = monthlyWindMagnitude.reduce(ee.Reducer.mean());
// メッシュデータの読み込み
var meshAreas = ee.FeatureCollection('users/gardenq2000/Shanxi/Shanxi49N');
// 各メッシュの年平均風速を計算
var meshWindResults = meshAreas.map(function(area) {
var avgWind = annualWindSpeed.reduceRegion({
reducer: ee.Reducer.mean(),
geometry: area.geometry(),
scale: 5000, // データ精度に応じて適切に調整
maxPixels: 1e9 // 計算エラーを避けるため最大ピクセル処理量を増加
});
return area.set(avgWind);
});
// 結果の可視化
Map.addLayer(meshWindResults, {color: '0000FF'}, 'メッシュ平均風速');
Map.centerObject(meshAreas, 6);
// Google Driveへのデータエクスポート
Export.table.toDrive({
collection: meshWindResults,
description: 'メッシュ平均風速_2000_2022_月別データ使用',
fileFormat: 'CSV'
});
年平均降水量の計算手順
- 降水量データの読み込み:
ERA5 Monthly Aggregatesデータセットからtotal_precipitationフィールドを選択します。これは月間総降水量を表します。 - 年間累積降水量の計算:データセットの月間累積降水量を使用して、年間総降水量を計算します。
- メッシュデータの読み込み:アップロードしたメッシュデータセットを読み込みます。
- メッシュ内年平均降水量の計算:各メッシュに対して
reduceRegionメソッドを使用して、そのメッシュ内の年平均降水量を計算します。 - 可視化とエクスポート:GEEマップに処理結果レイヤーを追加し、データをGoogle Driveにエクスポートします。
// 降水量データセットの読み込み - ERA5月別集計データ
var rainfallData = ee.ImageCollection('ECMWF/ERA5/MONTHLY')
.select('total_precipitation')
.filterDate('2000-01-01', '2022-12-31');
// 年間累積降水量の計算
var annualRainfall = rainfallData.map(function(img) {
var date = ee.Date(img.get('system:time_start'));
var yr = date.get('year');
return img.set('year', yr);
}).reduce(ee.Reducer.sum());
// メッシュデータの読み込み
var meshAreas = ee.FeatureCollection('users/gardenq2000/Shanxi/Shanxi49N');
// 各メッシュの年平均降水量を計算
var meshRainfallResults = meshAreas.map(function(area) {
var avgRainfall = annualRainfall.reduceRegion({
reducer: ee.Reducer.mean(),
geometry: area.geometry(),
scale: 5000, // データ精度に応じて適切に調整
maxPixels: 1e9 // 計算エラーを避けるため最大ピクセル処理量を増加
});
return area.set(avgRainfall);
});
// 結果の可視化
Map.addLayer(meshRainfallResults, {color: '0000FF'}, 'メッシュ平均降水量');
Map.centerObject(meshAreas, 6);
// Google Driveへのデータエクスポート
Export.table.toDrive({
collection: meshRainfallResults,
description: 'メッシュ平均降水量_2000_2022_月別データ使用',
fileFormat: 'CSV'
});