Earth Engine は、計算時に地図投影を気にする必要がほとんどないように設計されています。スケールと同様に、計算が行われる投影は「プル」ベースで決定されます。具体的には、入力は出力投影でリクエストされます。出力は、関数パラメータ(crs
など)、Code Editor と geemap マップ オブジェクト(地図 Mercator(EPSG:3857)投影を使用)、または reproject()
呼び出しで決定できます。Code Editor または geemap で画像を表示すると、入力は 地図メルカトルでリクエストされます。正弦投影の MODIS 画像に対する次の簡単な操作について考えてみましょう。
// 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
# 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 に示します。入力のプロジェクションは、出力、特に Code Editor の地図表示の 地図メルカトル 投影によって決まります。この投影は、地図のズームレベルによって決まるスケールで、地図の Mercator で入力がリクエストされるように、オペレーションの順序に沿って伝播されます。

Earth Engine では、投影は座標参照システム(CRS、または多くのメソッドの crs
パラメータ)で指定されます。画像の投影を確認するには、画像に対して projection()
を呼び出します。
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
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()
を呼び出すと、次のようなエラーが表示されることがあります。
デフォルトの投影
特定の投影で計算を行う必要がある場合を除き、通常は投影を指定する必要はありません。プロジェクションやスケールを指定する必要があるのは、出力があいまいな場合のみです。投影が異なる画像を含む ImageCollection
を縮小すると(つまり、合成を作成すると)、あいまいさが生じる可能性があります。異なる投影の入力画像を合成またはモザイクした画像には、デフォルトの投影(1 度スケールの WGS84)が適用されます。次に例を示します。
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
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()
呼び出しの前のコード内の計算は、指定された投影で実行されます。たとえば、特定のプロジェクションで合成を強制的に生成するには、次のようにします。
// 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
# 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 に再投影して、Code Editor マップに表示します。
// 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
# 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 によって自動的に実行されます。また、使用する投影に関する情報がリクエストから入力に伝播されることにも注目してください。
