Google Earth Engine JavaScript の実行を高速化する方法

Google Earth Engine JavaScript の実行を高速化する方法
Google Earth Engine JavaScript の実行を高速化する方法

Google Earth エンジン スクリプトの実行時間の最適化

Google Earth Engine (GEE) は、大規模な地理空間データを分析するための強力なプラットフォームです。ただし、ユーザーは、スクリプトが基本的に見えても、実行時間に関する問題に遭遇することがよくあります。実行に数分かかるスクリプトは、生産性に影響を与え、洞察が遅れる可能性があります。

この場合、ユーザーは Sentinel と Landsat 8 データを処理するための簡単なスクリプトを作成しました。スクリプトは単純ですが、実行には約 3 ~ 5 分かかります。効率的なデータ処理には、この問題が発生する理由とスクリプトの最適化方法を理解することが不可欠です。

GEE スクリプトのパフォーマンスは、データ サイズ、フィルタリング、計算の複雑さなどのいくつかの要因によって決まります。実行時間を短縮するには、処理を遅くする不必要な操作や大規模なデータセットなど、スクリプト内のボトルネックを特定する必要があります。

この記事では、GEE での実行時間が遅い原因を調査し、特定のスクリプトを最適化するための実践的なヒントを提供します。これらの戦略を実装することで、ユーザーは地理空間データ分析タスクの速度とパフォーマンスを大幅に向上させることができます。

指示 使用例
normalizedDifference() この関数は、2 つのバンドの差をそれらの合計で割って計算し、NDVI、NDWI、NDSI などのインデックスを計算するために使用されます。これは、植生、水、雪のインデックスが必要なリモート センシング分析に特有です。
filterBounds() 画像コレクションをフィルタリングして、指定されたジオメトリと交差する画像のみを含めます。この場合、衛星データを定義された対象地点の周囲のエリアに制限し、無関係なデータを除外することで処理をより効率的にします。
filterDate() このコマンドは、イメージの収集を特定の日付範囲に制限します。私たちの問題では、Sentinel データセットと Landsat データセットの同じ期間間の差異を分析することが重要です。
addBands() 新しい計算されたバンド (NDVI、NDWI、NDSI など) をコレクション内の各画像に追加します。これは、個別のデータセットを作成せずに、同じ画像コレクションに複数のインデックスを適用するために不可欠です。
unmask() マスクされたピクセルを指定された値で塗りつぶします。私たちのスクリプトでは、永続的な水域のマスクを解除するために使用され、地域全体でデータが一貫して処理されるようにします。
reduce() ee.Reducer.percentile() などの指定されたリデューサー関数を使用して、イメージ コレクションを縮小します。ここでは、ピクセル値の 30 パーセンタイルを計算し、合成画像の生成を最適化するために使用されます。
clip() 指定された関心領域の境界に画像をクリップします。これにより、その領域に関連するデータのみが処理されるようになり、実行が高速化されます。
gt() このコマンドは「より大きい」を表し、しきい値に基づいてバイナリ イメージを作成するために使用されます。この場合、水の発生率が 80% を超えるエリアが特定されます。
map() コレクション内の各画像に関数を適用します。この例では、addIndices 関数を適用してコレクション内のすべてのイメージの NDVI、NDWI、および NDSI を計算し、ワークフローを合理化します。

効率向上のための GEE スクリプトの最適化

提供されたスクリプトの目的は、Sentinel と Landsat という 2 つの異なるソースから衛星画像を抽出して処理することです。の Google Earth エンジン (GEE) このプラットフォームを使用すると、ユーザーは膨大な量の衛星データにアクセスし、フィルタリング、インデックス付け、視覚化などのさまざまな操作を適用できます。このスクリプトで使用される重要な機能の 1 つは、 正規化された差分() NDVI、NDWI、NDSI などの重要な指標を計算するために使用される関数。これらの指標は、指定された地域の植生、水、積雪を分析するために重要です。スクリプトは、対象地点を定義することから始まり、指定された座標を使用して地図をその中心に配置します。

スクリプトは、次のような複数のフィルターを適用します。 フィルター日付() そして フィルター境界()、処理されるデータ量を削減し、実行時間を短縮します。例えば、 フィルター境界() 対象領域と交差する画像のみが確実に含まれるようにします。 フィルター日付() 画像を特定の日付範囲に限定します。これは計算負荷を最小限に抑えるため、Sentinel や Landsat 画像などの大規模なデータセットを処理する場合に不可欠です。さらに、 フィルター 雲の範囲を考慮すると、雲が多すぎる画像を破棄することができ、より高品質な分析が保証されます。

スクリプトの重要な側面の 1 つは、 addBands() 計算されたインデックス (NDVI、NDWI、NDSI) を画像に追加し、さらなる分析のためにアクセスできるようにする機能です。このスクリプトには、JRC 地球地表水データセットのデータを使用した永続的な水マスクも組み込まれています。ウォーター マスクは、水の出現率が高い (80% 以上) エリアを除外するのに役立ちます。そうしないと、植生と雪の分析結果が歪む可能性があります。これは、 gt() そして アンマスク() この関数を使用すると、スクリプトはピクセル値に基づいて領域を分離できます。

最後に、スクリプトは 減らす() パーセンタイル リデューサーを使用して関数を使用し、選択したピクセル値の 30 パーセンタイルを表す合成画像を生成します。この合成画像は対象領域にクリップされ、 クリップ() 関数。 Sentinel と Landsat コンポジットの両方に対して視覚パラメータが定義されているため、ユーザーは適切なカラー設定でそれらを表示できます。このスクリプトは、フィルタリング、マスキング、合成生成などのさまざまな画像処理ステップを組み合わせることで、衛星画像を分析する効率的な方法を提供しますが、実行時間を短縮するためにさらに最適化を適用することもできます。

Google Earth エンジンのスクリプト実行を最適化して処理を高速化する

このソリューションは、データ取得時間を短縮し、操作を簡素化することでパフォーマンスを最適化することに重点を置いて、Google Earth Engine (GEE) を使用します。スクリプト言語として JavaScript が使用されます。

var pointJSP = ee.Geometry.Point([86.465263, 20.168076]);
Map.centerObject(pointJSP, 14);
// Combine date variables for flexibility
var startDate = '2024-02-01';
var endDate = '2024-03-01';
// Function to add NDVI, NDWI, NDSI
var addIndices = function(image) {
  var ndvi = image.normalizedDifference(['NIR', 'RED']).rename('NDVI');
  var ndwi = image.normalizedDifference(['NIR', 'SWIR1']).rename('NDWI');
  var ndsi = image.normalizedDifference(['SWIR1', 'SWIR2']).rename('NDSI');
  return image.addBands(ndvi).addBands(ndwi).addBands(ndsi);
};
// Use fewer data points by filtering for cloud-free pixels only once
var sentinel = ee.ImageCollection('COPERNICUS/S2_SR')
  .filterBounds(pointJSP)
  .filterDate(startDate, endDate)
  .filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 30));

GEE の効率的なデータ処理を使用してスクリプトの遅延を最小限に抑える

このソリューションは、インデックス計算としきい値を組み合わせることにより、最適化されたデータ処理を統合します。 Google Earth Engineの処理にはJavaScriptが適用されます。

var landsat8 = ee.ImageCollection('LANDSAT/LC08/C01/T1_SR')
  .filterBounds(pointJSP)
  .filterDate(startDate, endDate)
  .filter(ee.Filter.lt('CLOUD_COVER', 30));
// Apply water mask for permanent water areas
var waterMask = ee.Image('JRC/GSW1_4/GlobalSurfaceWater').select('occurrence').gt(80).unmask();
// Add indices to Landsat 8 imagery
var landsatIndices = landsat8.map(addIndices);
var composite = landsatIndices.reduce(ee.Reducer.percentile([30])).clip(pointJSP).mask(waterMask.eq(0));
Map.addLayer(composite, {bands: ['RED', 'GREEN', 'BLUE'], min: 0, max: 3000}, 'Landsat Composite');
Map.addLayer(waterMask, {min: 0, max: 1, palette: ['white', 'blue']}, 'Water Mask', false);

リモートセンシングスクリプトの効率の向上

Google Earth Engine (GEE) スクリプトを使用する場合の重要な考慮事項の 1 つは、操作が効率的に処理されることを確認することです。環境分析では Sentinel や Landsat などの大規模なデータセットを使用するのが一般的ですが、膨大な量のデータによりスクリプトの実行が遅くなる可能性があります。パフォーマンスを向上させる 1 つの方法は、必要なデータのみが処理されるようにすることです。次のようなコマンドを使用する フィルター境界() そして フィルター日付() データセットのサイズを最小限に抑え、計算の合理化に役立ちます。特定の日付範囲と地理的地域を選択すると、実行時間を大幅に短縮できます。

GEE スクリプトのパフォーマンスに影響を与えるもう 1 つの側面は、データの処理方法です。スクリプト例では、関数を使用して NDVI、NDWI、NDSI などの重要なインデックスを計算します。これらのインデックスはバンドとして画像コレクションに追加されるため、より徹底的な分析が可能になります。ただし、よくある間違いは、最初にフィルター処理を行わずにそのような関数をデータセット全体に適用することです。無関係なデータに対する不必要な計算を避けるために、フィルタリング後にこのような操作を適用することが重要です。

視覚化は、最適化できるスクリプトのもう 1 つの要素です。追加するレイヤーや複雑なビジュアライゼーションが多すぎると、処理時間が長くなる可能性があります。スクリプトは事前定義されたビジュアル パラメータを使用してコンポジットをレンダリングしますが、明示的に必要でない限り、特定のレイヤーを無効にすることでパフォーマンスを向上させることができます。これは、機能を維持しながらスクリプトを軽量に保つのに役立ちます。使用する クリップ() また、コマンドを使用すると、必要な領域のみがレンダリングされるため、全体的な処理の負担が軽減されます。

Google Earth エンジン スクリプトの最適化に関するよくある質問

  1. GEE スクリプトのパフォーマンスを向上するにはどうすればよいですか?
  2. の使用を最適化する filterDate()filterBounds()、処理する前にデータセットのサイズを削減します。
  3. GEE スクリプトの実行にこれほど時間がかかるのはなぜですか?
  4. 大規模なデータセットと複雑な計算により、実行が遅くなる可能性があります。使用 reduce() そして clip() 関連する領域への処理を制限するため。
  5. GEE で処理される画像の数を減らすことはできますか?
  6. はい、お申込みいただくことで filter() 雲の範囲と filterDate() 特定の期間に焦点を当てるため。
  7. スクリプト内のインデックス計算を簡略化するにはどうすればよいですか?
  8. 次のような関数を使用します addBands() 複数のインデックス (NDVI、NDWI など) を 1 ステップで追加する作業を効率化します。
  9. 重要なレイヤーだけを視覚化することはできますか?
  10. はい、不要なレイヤーを無効にし、簡素化された視覚化パラメーターを使用します。 Map.addLayer() より良いパフォーマンスのために。

GEE スクリプトの最適化に関する最終的な考え

Google Earth Engine スクリプトの最適化には、大規模なデータセットの効率的な処理、フィルタの早期適用、不必要なデータ操作の削減が含まれます。フィルタリングなどの重要な領域に焦点を当てる 日付 場所によって処理時間を大幅に短縮できます。

などの機能を組み込むことで、 追加バンド また、しきい値マスクを使用して無関係なデータを削除すると、スクリプトのパフォーマンスをさらに向上させることができます。これらの手法により実行が合理化され、より迅速な結果が得られ、Google Earth Engine プラットフォームをより効果的に利用できます。

Google Earth エンジン スクリプトを最適化するためのソースとリファレンス
  1. この記事は、スクリプト最適化手法についての洞察を提供する Google Earth Engine の公式ドキュメントに基づいたコンテンツを使用して作成されました。 Google Earth エンジン ガイド
  2. GEE コミュニティ フォーラムから追加情報が収集され、複雑なスクリプトのパフォーマンスを向上させるためのディスカッションとソリューションが提供されました。 Google Earth エンジン コミュニティ
  3. 大規模なデータセットを処理するためのベスト プラクティスは、リモート センシングの文献と次のリンクから入手できるチュートリアルから参照されました。 NASA地球観測所