Google Earth Engineを用いた気象データの取得と分析

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'
});

日別データセットと月別データセットを使用して年平均気温を計算する場合、どちらを選択するかは研究の具体的な要件、必要な精度、およびデータの利用可能性によって異なります。以下に各データセットの使用に関する考慮事項を示します:

日別データを使用する利点:

  1. より高い時間解像度:日別データはより頻繁な観測値を提供し、気温の日変動や異常な状況をより正確に捉えることができます。気候研究やモデル検証など、詳細な時系列が必要なアプリケーションでは、この高頻度データが非常に価値があります。
  2. 柔軟性:日別データから季節平均やその他の非標準的な期間の平均など、異なる時間集計レベルをカスタマイズできます。
  3. 極端な気象イベントの捕捉:熱波や寒波などの短期的な極端な気象イベントを特定・分析するのに役立ち、これらは月平均データではそれほど顕著でない可能性があります。

月別データを使用する利点:

  1. 計算の簡便さ:月別データは既に集計されているため、データ処理の計算負荷が軽減され、長期間の時系列データを迅速に取得・分析できます。
  2. データサイズの管理:日別データよりデータ量が少ないため、特に広域や全球スケールのデータを処理する際に処理速度が向上します。
  3. 適用性:日変動ではなく長期傾向の分析が必要な研究(例:特定の生態系変化研究)では、月別データで十分な場合があります。

データセット選択の決定要因

  • 研究目的:最も重要な考慮事項は研究の具体的な目的です。気温の詳細な時間スケールの変動を理解したい場合や極端なイベントを捕捉したい場合は、日別データがより適しています。長期傾向の評価が目的の場合、月別データで十分かつ処理が容易です。
  • データ処理能力:利用可能な計算リソースとデータ処理能力を考慮します。リソースが限られている場合、月別データの使用が適切かもしれません。
  • データ利用可能性:利用可能なデータタイプによって選択が制限される場合があります。

研究で低い時間解像度が許容され、主に長期傾向に焦点を当てている場合、月別データの使用は合理的な選択です。これにより、データ処理の複雑さとリソース消費を削減しながら、年間および年間を超える気温変動を分析・理解するのに十分な情報を提供できます。

各年の年平均気温を計算するコード例:

// 気温データセットの読み込み - 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年平均風速の計算

  1. 風速データの読み込みERA5 Monthly Aggregatesデータセットを選択し、10m高度のu成分とv成分の風速を読み込みます。
  2. 風速ベクトルの大きさの計算:u成分とv成分の二乗和の平方根を使用して、月ごとの風速ベクトルの大きさを計算します。
  3. 年平均風速の計算:月ごとの風速ベクトルの大きさを年平均風速に変換します。
  4. メッシュデータの読み込み:アップロードしたメッシュデータセットを読み込みます。
  5. メッシュ内平均風速の計算:各メッシュに対してreduceRegionメソッドを使用して、そのメッシュ内の平均風速を計算します。
  6. 可視化とエクスポート: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'
});

年平均降水量の計算手順

  1. 降水量データの読み込みERA5 Monthly Aggregatesデータセットからtotal_precipitationフィールドを選択します。これは月間総降水量を表します。
  2. 年間累積降水量の計算:データセットの月間累積降水量を使用して、年間総降水量を計算します。
  3. メッシュデータの読み込み:アップロードしたメッシュデータセットを読み込みます。
  4. メッシュ内年平均降水量の計算:各メッシュに対してreduceRegionメソッドを使用して、そのメッシュ内の年平均降水量を計算します。
  5. 可視化とエクスポート: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'
});

タグ: GoogleEarthEngine 気象データ リモートセンシング データ分析 ECMWF

7月8日 18:47 投稿