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 la base d'un "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
), de l'éditeur de code et des objets de carte geemap (qui ont une projection mercator (EPSG:3857)), ou à l'aide d'un appel reproject()
. Lorsque vous affichez des images dans l'éditeur de code ou dans geemap, des entrées sont demandées dans maps mercator. Prenons l'exemple de l'opération simple suivante sur une image MODIS, qui présente une projection sinusoïdale:
// 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
L'ordre des opérations de 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 Mercator de Maps de l'affichage de la carte dans l'éditeur de code. Cette projection se propage à rebours dans la séquence d'opérations de sorte que les entrées soient demandées dans le système de projection Mercator de Maps, à 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 coordonnées de référence (CRS ou paramètre crs
de nombreuses méthodes). Vous pouvez vérifier la projection d'une image en appelant projection()
dessus:
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())
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 des pixels en mètres 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, une erreur peut s'afficher:
Projection par défaut
Sauf si vous souhaitez que votre calcul se produise 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 sorties ambiguës. Une ambiguïté peut résulter de la réduction d'un ImageCollection
contenant des images avec des projections différentes (c'est-à-dire de la création d'un composite). Une image composite ou une mosaïque d'images d'entrée avec des projections différentes aura la projection par défaut, à savoir WGS84 avec une échelle de 1 degrés.
Exemple :
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())
Si vous essayez d'utiliser une image de ce type dans un calcul, un message d'erreur semblable à celui-ci peut s'afficher:
En règle générale, 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", mais les pixels ne sont pas réellement calculés tant qu'ils ne sont pas nécessaires (en savoir plus). À ce stade, une projection de sortie accompagne toujours la requête qui spécifie comment calculer le composite.
Dans la grande majorité des cas d'utilisation, l'absence de projection n'est pas un problème et constitue même une optimisation intéressante, car elle permet d'afficher un aperçu des résultats à n'importe quel niveau de zoom sans avoir à attendre la fin du calcul de la résolution complète. Cela signifie toutefois que la sortie peut apparaître différente à différents niveaux de zoom.
Si l'image d'affichage optimisée n'est pas suffisante, 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 les opérations à être effectuées dans une projection spécifique à l'aide de 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 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:
// 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)
Voici quelques cas qui nécessitent une projection fixe:
- Calcul des gradients (par exemple,
ee.Terrain.gradient
ouee.Terrain.slope
). reduceResolution
, lorsque vous souhaitez agréger des pixels de résolution supérieure à une résolution inférieure. (En savoir plus sur la réduction de la résolution)
Évitez d'utiliser reproject()
, sauf si vous en avez absolument besoin. Supposons, par exemple, que vous reprojetiez 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 à 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 une erreur.
Si la sortie finale est dans une projection différente de celle spécifiée dans l'appel reproject()
, une autre reprojection sera effectuée. C'est une autre raison de faire preuve de prudence lors de l'utilisation de reproject()
dans votre code. Prenons l'exemple suivant, qui force l'image MODIS à être d'abord reprojetée sur WGS84, puis sur maps mercator pour s'afficher sur la carte de l'éditeur de code:
// 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
La figure 2 illustre le flux d'opérations correspondant à cet exemple de reprojection simple. Notez que la première reprojection est explicite, comme spécifié dans l'appel reproject()
. La deuxième reprojection est implicite, effectuée automatiquement par Earth Engine afin d'afficher le résultat sur la carte. Notez également que les informations sur la projection à utiliser se propagent de la requête à l'entrée.
