Earth Engine は、計算を行う際に地図投影法を気にする必要がほとんどないように設計されています。スケールと同様に、計算が行われるプロジェクションは「プル」ベースで決定されます。具体的には、出力プロジェクションで入力がリクエストされます。出力は、関数パラメータ(crs など)、コードエディタと geemap マップ オブジェクト(マップ メルカトル(EPSG:3857)投影法を使用)、または reproject() 呼び出しから決定できます。コードエディタまたは geemap で画像を表示すると、入力は地図メルカトル図法でリクエストされます。正弦波投影法で投影された MODIS 画像に対して、次のオペレーションを考えてみましょう。
コードエディタ(JavaScript)
// The input image has a SR-ORG:6974 (sinusoidal) projection. var image = ee.Image('MODIS/061/MOD13A1/2014_05_09').select(0); // Normalize the image and add it to the map. var rescaled = image.unitScale(-2000, 10000); var visParams = {min: 0.15, max: 0.7}; Map.addLayer(rescaled, visParams, 'Rescaled');
import ee import geemap.core as geemap
Colab(Python)
# The input image has a SR-ORG:6974 (sinusoidal) projection. image = ee.Image('MODIS/061/MOD13A1/2014_05_09').select(0) # Normalize the image and add it to the map. rescaled = image.unitScale(-2000, 10000) vis_params = {'min': 0.15, 'max': 0.7} m = geemap.Map() m.add_layer(rescaled, vis_params, 'Rescaled') m
このコードサンプルのオペレーションの順序を図 1 に示します。入力の投影は出力によって決まります。具体的には、コードエディタの地図表示の maps mercator 投影です。この投影は、一連のオペレーションを逆方向に伝播し、入力が地図のズームレベルによって決定される縮尺でメルカトル図法でリクエストされるようにします。
Earth Engine では、投影法は座標参照系(CRS または多くのメソッドの crs パラメータ)で指定されます。画像の投影を確認するには、projection() を呼び出します。
コードエディタ(JavaScript)
var image = ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_044034_20140318').select(0); print('Projection, crs, and crs_transform:', image.projection()); print('Scale in meters:', image.projection().nominalScale());
import ee import geemap.core as geemap
Colab(Python)
image = ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_044034_20140318').select(0) display('Projection, crs, and crs_transform:', image.projection()) display('Scale in meters:', image.projection().nominalScale())
projection() によって返された ee.Projection で nominalScale() を呼び出すと、画像のネイティブ解像度を判断できます。ネイティブ解像度は、画像ピラミッドの最下位レベルの公称ピクセル スケール(メートル単位)です。画像の各バンドは異なるスケールや投影を持つことができるため、他のバンドと同じ投影を持たないバンドが少なくとも 1 つ含まれる画像で projection() を呼び出すと、次のようなエラーが表示されることがあります。
デフォルトのプロジェクション
特定の投影で計算を行う必要がある場合を除き、通常は投影を指定する必要はありません。出力が曖昧な場合にのみ、Earth Engine で投影法やスケールの指定が必要になります。曖昧さは、異なる投影法で画像を含む ImageCollection を縮小すること(つまり、合成を作成すること)によって生じる可能性があります。異なる投影法で入力された画像を合成またはモザイク処理した画像には、デフォルトの投影法(1 度のスケールの WGS84)が設定されます。次に例を示します。
コードエディタ(JavaScript)
var collection = ee.ImageCollection('LANDSAT/LC08/C02/T1_TOA'); var mosaic = collection.filterDate('2018-01-01', '2019-01-01').mosaic(); print(mosaic.projection());
import ee import geemap.core as geemap
Colab(Python)
collection = ee.ImageCollection('LANDSAT/LC08/C02/T1_TOA') mosaic = collection.filterDate('2018-01-01', '2019-01-01').mosaic() display(mosaic.projection())
このような画像を計算で使用しようとすると、次のようなエラーが表示されることがあります。
通常、1 度のスケールでの集計は望ましくないため、Earth Engine は出力の完全な仕様を提供するよう促すメッセージを表示します。
ユーザーはこのような動作を混乱し、投影情報が「失われた」のではないかと心配することがよくありますが、ピクセルは実際に必要になるまで計算されません(詳細)。その時点で、合成の計算方法を指定したリクエストに常に伴う出力投影があります。
ほとんどのユースケースでは、投影がないことは問題ではなく、実際には貴重な最適化です。これにより、完全な解像度の計算が完了するのを待つことなく、任意のズームレベルで結果をプレビューできます。ただし、出力はズームレベルによって異なる場合があります。
最適化された表示画像が十分でない場合は、次のセクションで説明するように、出力を再投影することで、特定の投影法での計算を強制できます。
再投影
reproject() メソッドを使用すると、特定のプロジェクションでオペレーションを強制的に実行できます。reproject() を使用すると、reproject() 呼び出しで指定されたプロジェクションで入力がリクエストされます。reproject() 呼び出しの前のコード内の計算は、指定されたプロジェクションで行われます。たとえば、特定のプロジェクションで複合を強制的に生成するには:
コードエディタ(JavaScript)
// Some projection that is suitable for your area of interest. var proj = ee.Projection(...); var output = collection.reduce(...).reproject(proj);
import ee import geemap.core as geemap
Colab(Python)
# Some projection that is suitable for your area of interest. proj = ee.Projection(...) output = collection.reduce(...).reproject(proj)
固定プロジェクションが必要なケースには、次のようなものがあります。
- 勾配の計算(
ee.Terrain.gradientやee.Terrain.slopeなど)。 reduceResolution: 高解像度のピクセルを低解像度に集約する場合に使用します。(詳しくは、解像度を下げるをご覧ください)。
reproject() を使用する必要がある場合を除き、使用を避けるべき理由はいくつかあります。たとえば、何かを再投影して地図に追加するとします。reproject() 呼び出しで指定したスケールが地図のズームレベルよりもはるかに小さい場合、Earth Engine は非常に小さなスケールで、非常に広い空間範囲にわたってすべての入力をリクエストします。これにより、一度に要求されるデータが多すぎてエラーが発生する可能性があります。
最終的な出力が reproject() 呼び出しで指定された投影法と異なる場合、別の再投影が行われます。これも、コードで reproject() を使用する際に注意すべき理由の一つです。次の例では、MODIS 画像を最初に WGS84 に再投影してから、コードエディタの地図に表示するために maps mercator に再投影します。
コードエディタ(JavaScript)
// The input image has a SR-ORG:6974 (sinusoidal) projection. var image = ee.Image('MODIS/061/MOD13A1/2014_05_09').select(0); // Operations *before* the reproject call will be done in the projection // specified by reproject(). The output results in another reprojection. var reprojected = image .unitScale(-2000, 10000) .reproject('EPSG:4326', null, 500); Map.addLayer(reprojected, {min: 0.15, max: 0.7}, 'Reprojected');
import ee import geemap.core as geemap
Colab(Python)
# The input image has a SR-ORG:6974 (sinusoidal) projection. image = ee.Image('MODIS/061/MOD13A1/2014_05_09').select(0) # Operations *before* the reproject call will be done in the projection # specified by reproject(). The output results in another reprojection. reprojected = image.unitScale(-2000, 10000).reproject('EPSG:4326', None, 500) m = geemap.Map() m.add_layer(reprojected, {'min': 0.15, 'max': 0.7}, 'Reprojected') m
図 2 は、この単純な再投影の例に対応するオペレーションのフローを示しています。最初の再投影は、reproject() 呼び出しで指定されているように、明示的です。2 回目の再投影は暗黙的に行われ、地図に結果を表示するために Earth Engine によって自動的に実行されます。また、使用するプロジェクションに関する情報がリクエストから入力に伝播されることも確認してください。