Earth Engine est conçu pour que vous n'ayez que rarement à vous soucier des projections cartographiques lorsque vous effectuez des calculs. Comme pour l'échelle, la projection dans laquelle les calculs ont lieu est déterminée sur une base "pull". Plus précisément, les entrées sont demandées dans la projection de sortie. La sortie peut être déterminée à partir d'un paramètre de fonction (par exemple, crs), d'objets de carte Code Editor et geemap (qui ont une projection maps mercator (EPSG:3857)) ou avec un appel reproject(). Lorsque vous affichez des images dans l'éditeur de code ou dans geemap, les entrées sont demandées dans maps mercator. Prenons l'exemple de l'opération suivante sur une image MODIS, qui a une projection sinusoïdale :
Éditeur de code (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
L'ordre des opérations pour cet exemple de code est illustré dans la figure 1. Notez que la projection de l'entrée est déterminée par la sortie, en particulier la projection maps mercator de l'affichage de la carte dans l'éditeur de code. Cette projection se propage à travers la séquence d'opérations de sorte que les entrées sont demandées dans les cartes Mercator, à une échelle déterminée par le niveau de zoom de la carte.
Dans Earth Engine, les projections sont spécifiées par un système de référence de coordonnées (CRS ou paramètre crs de nombreuses méthodes). Vous pouvez vérifier la projection d'une image en appelant projection() :
Éditeur de code (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())
Notez qu'en appelant nominalScale() sur le ee.Projection renvoyé par projection(), vous pouvez déterminer la résolution native de l'image. La résolution native correspond à l'échelle nominale en mètres des pixels du niveau le plus bas de la pyramide d'images. Étant donné que chaque bande d'une image peut avoir une échelle et/ou une projection différentes, si vous appelez projection() sur une image comportant au moins une bande qui n'a pas la même projection que les autres, vous pouvez voir une erreur comme celle-ci :
Projection par défaut
Sauf si vous avez besoin que votre calcul ait lieu dans une projection spécifique, il n'est généralement pas nécessaire de spécifier une projection. Earth Engine ne vous demandera de spécifier une projection et/ou une échelle que pour les résultats ambigus. L'ambiguïté peut résulter de la réduction d'un ImageCollection contenant des images avec des projections différentes (c'est-à-dire créer une image composite). Une image composite ou une mosaïque d'images d'entrée avec différentes projections aura la projection par défaut, qui est WGS84 avec une échelle de 1 degré.
Exemple :
Éditeur de code (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())
Si vous essayez d'utiliser une image de ce type dans un calcul, vous pouvez rencontrer une erreur telle que :
En général, une agrégation à l'échelle de 1 degré n'est pas souhaitée ni prévue. Earth Engine vous rappelle donc de fournir une spécification complète pour la sortie.
Les utilisateurs trouvent souvent ce comportement déroutant et s'inquiètent des informations de projection "perdues". Toutefois, les pixels ne sont pas réellement calculés tant qu'ils ne sont pas nécessaires (en savoir plus). À ce moment-là, il existe toujours une projection de sortie qui accompagne la requête et qui spécifie comment calculer la composition.
Dans la grande majorité des cas d'utilisation, l'absence de projection ne pose pas de problème et constitue même une optimisation intéressante, car elle permet de prévisualiser les résultats à n'importe quel niveau de zoom sans avoir à attendre la fin du calcul de la résolution complète. Toutefois, cela signifie que le résultat peut apparaître différemment à différents niveaux de zoom.
Si l'image optimisée ne suffit pas, le calcul dans une projection spécifique peut être forcé en reprojetant la sortie, comme décrit dans la section suivante.
Reprojection
Vous pouvez forcer l'exécution des opérations dans une projection spécifique avec la méthode reproject(). L'utilisation de reproject() entraîne la demande des entrées dans la projection spécifiée dans l'appel reproject().
Les calculs effectués dans votre code avant l'appel reproject() seront effectués dans la projection spécifiée. Par exemple, pour forcer la production d'un composite dans une projection spécifique :
Éditeur de code (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)
Voici quelques cas qui nécessitent une projection fixe :
- Calcul des gradients (par exemple,
ee.Terrain.gradientouee.Terrain.slope). reduceResolution, lorsque vous souhaitez agréger des pixels de résolution supérieure en résolution inférieure. (En savoir plus sur la réduction de la résolution)
Il existe plusieurs raisons pour lesquelles vous devriez éviter d'utiliser reproject(), sauf si vous en avez absolument besoin. Supposons, par exemple, que vous reprojettiez un élément et que vous l'ajoutiez à la carte. Si l'échelle que vous avez spécifiée dans l'appel reproject() est beaucoup plus petite que le niveau de zoom de la carte, Earth Engine demandera toutes les entrées à une très petite échelle, sur une très grande étendue spatiale. Cela peut entraîner une demande de trop de données à la fois et générer une erreur.
Si le résultat final est dans une projection différente de celle spécifiée dans l'appel reproject(), cela entraînera une autre reprojection. C'est une autre raison d'être prudent quant à l'utilisation de reproject() dans votre code. Considérez l'exemple suivant, qui force la reprojection de l'image MODIS d'abord en WGS84, puis en maps mercator pour l'affichage dans la carte de l'éditeur de code :
Éditeur de code (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
La figure 2 illustre le flux d'opérations correspondant à cet exemple simple de reprojection. Notez que la première reprojection est explicite, comme spécifié dans l'appel reproject(). La deuxième reprojection est implicite. Elle est effectuée automatiquement par Earth Engine pour afficher le résultat sur la carte. Notez également que les informations sur la projection à utiliser sont propagées de la requête à l'entrée.