Projections

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), objets cartographiques de l'éditeur de code et de geemap (qui ont une projection Mercator de cartes (EPSG:3857)), ou avec un appel reproject(). Lorsque vous affichez des images dans l'éditeur de code ou geemap, les entrées sont demandées dans Mercator de cartes. Considérez 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');

Configuration de Python

Consultez la page Environnement Python pour en savoir plus sur l'API Python et sur l'utilisation geemap pour le développement interactif.

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é à la figure 1. Note que la projection de l'entrée est déterminée par la sortie, en particulier la projection Mercator de cartes de l'affichage cartographique dans l' éditeur de code. Cette projection se propage dans la séquence d'opérations de sorte que les entrées sont demandées dans Mercator de cartes, à une échelle déterminée par le niveau de zoom de la carte.

projection
Figure 1. Organigramme des opérations correspondant à l'affichage d'une image MODIS dans la carte de l'éditeur de code. Les projections (à gauche de l'organigramme) de chaque opération sont déterminées à partir de la sortie. Les lignes courbes indiquent le flux d'informations vers la reprojection : plus précisément, la projection et l'échelle de sortie.

Dans Earth Engine, les projections sont spécifiées par un système de référence de coordonnées (CRS ou le crs paramètre de nombreuses méthodes). Vous pouvez vérifier la projection d'une image en appelant projection() sur celle-ci :

É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());

Configuration de Python

Consultez la page Environnement Python pour en savoir plus sur l'API Python et sur l'utilisation geemap pour le développement interactif.

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 ee.Projection renvoyé par projection(), vous pouvez déterminer la résolution native de l'image. La résolution native est l'échelle de pixels nominale 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, vous pouvez voir une erreur semblable à celle-ci :

Projection par défaut

Sauf si vous avez besoin que votre calcul se produise dans une projection spécifique, il n'est généralement pas nécessaire de spécifier une projection. Ce n'est que pour les sorties ambiguës qu'Earth Engine vous demandera de spécifier une projection et/ou une échelle. L'ambiguïté peut résulter de la réduction d'une ImageCollection contenant des images avec des projections différentes (c'est-à-dire la création d'une composition). Une image qui est une composition ou une mosaïque d'images d'entrée avec des projections différentes aura la projection par défaut, qui est WGS84 avec une échelle de 1 degré. Si cette projection par défaut ne convient pas à votre analyse (par exemple, si elle est trop grossière ou si vous devez éviter les artefacts de rééchantillonnage dans les calculs en aval, comme l'analyse du terrain), vous pouvez définir une autre valeur par défaut à l'aide de image.setDefaultProjection(crs). Cela garantit que si Earth Engine doit choisir une projection pour un calcul impliquant l'image, il utilisera celle spécifiée, plutôt que WGS84 à l'é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());

Configuration de Python

Consultez la page Environnement Python pour en savoir plus sur l'API Python et sur l'utilisation geemap pour le développement interactif.

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 comme celle-ci dans un calcul, vous pouvez voir une erreur semblable à celle-ci :

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" . Toutefois, les pixels ne sont pas calculés tant qu'ils ne sont pas nécessaires (en savoir plus). À ce stade, il existe toujours une projection de sortie qui accompagne la requête spécifiant 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 en pleine résolution Toutefois, cela signifie que la sortie peut apparaître différemment à différents niveaux de zoom.

Si l'image d'affichage 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 à l'aide de la reproject() méthode. L'utilisation de reproject() entraîne la demande des entrées étant demandé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'une composition 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);

Configuration de Python

Consultez la page Environnement Python pour en savoir plus sur l'API Python et sur l'utilisation geemap pour le développement interactif.

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.gradient ou ee.Terrain.slope).
  • reduceResolution, lorsque vous souhaitez agréger des pixels de résolution supérieure pixels en résolution inférieure. (En savoir plus sur la réduction de la résolution).

Les fonctions du package ee.Terrain (par exemple, slope, aspect, hillshade) calculent les valeurs en fonction des pixels voisins et sont sensibles aux artefacts de rééchantillonnage introduits lors de la reprojection. Lorsque la projection du calcul diffère de la projection native du MNT, le rééchantillonnage par défaut du voisin le plus proche peut créer des motifs artificiels dans la sortie. Pour de meilleurs résultats, effectuez l'analyse du terrain dans la projection native du MNT. Si vous utilisez une ImageCollection de tuiles MNT, créez une mosaïque et utilisez setDefaultProjection() avec la projection native de la collection pour vous assurer que l'analyse s'exécute sur la grille appropriée, comme décrit dans la section Projection par défaut.

Il existe plusieurs raisons pour lesquelles vous devez éviter d'utiliser reproject() sauf si vous en avez absolument besoin. Supposons, par exemple, que vous reprojetiez quelque chose 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 large étendue spatiale. Cela peut entraîner une demande de données beaucoup trop importante à la fois et générer une erreur.

Si la sortie finale se trouve dans une projection différente de celle spécifiée dans le reproject() appel, 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 vers WGS84, puis vers Mercator de cartes 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');

Configuration de Python

Consultez la page Environnement Python pour en savoir plus sur l'API Python et sur l'utilisation geemap pour le développement interactif.

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 exemple. Notez que la première reprojection est explicite, comme spécifié dans l' reproject() appel. 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.

reprojection
Figure 2. Organigramme des opérations correspondant à la reprojection d'une image MODIS dans la carte de l'éditeur de code. Les lignes courbes indiquent le flux d'informations vers les reprojections : plus précisément, la projection et l'échelle de sortie.