Earth Engine está diseñado para que rara vez tengas que preocuparte por las proyecciones de mapas cuando realices cálculos. Al igual que con la escala, la proyección en la que se realizan los cálculos se determina según un método de "extracción". Específicamente, las entradas se solicitan en la proyección de salida. La salida se puede determinar a partir de un parámetro de función (p.ej., crs), objetos de mapa de Code Editor y geemap (que tienen una proyección mercator (EPSG:3857) de mapas) o con una llamada a reproject(). Cuando muestras imágenes en el editor de código o en geemap, las entradas se solicitan en proyección de Mercator de mapas. Considera la siguiente operación en una imagen de MODIS, que tiene una proyección sinusoidal:
Editor de código (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
En la Figura 1, se muestra el orden de las operaciones de esta muestra de código. Ten en cuenta que la proyección de la entrada se determina por la salida, específicamente la proyección Mercator de Maps de la visualización del mapa en el Editor de código. Esta proyección se propaga a través de la secuencia de operaciones de modo que las entradas se soliciten en Mercator de mapas, en una escala determinada por el nivel de zoom del mapa.
En Earth Engine, las proyecciones se especifican con un sistema de referencia de coordenadas (SRC o el parámetro crs de muchos métodos). Puedes verificar la proyección de una imagen llamando a projection() en ella:
Editor de código (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())
Ten en cuenta que, si llamas a nominalScale() en el ee.Projection que devuelve projection(), puedes determinar la resolución nativa de la imagen. La resolución nativa es la escala nominal de píxeles en metros del nivel más bajo de la pirámide de imágenes. Dado que cada banda de una imagen puede tener una escala o proyección diferente, si llamas a projection() en una imagen con al menos una banda que no tenga la misma proyección que las demás, es posible que veas un error como el siguiente:
La proyección predeterminada
A menos que necesites que tu cálculo se realice en una proyección específica, generalmente no es necesario especificar una proyección. Solo para el resultado ambiguo, Earth Engine requerirá que especifiques una proyección o una escala. La ambigüedad puede deberse a la reducción de un ImageCollection que contiene imágenes con diferentes proyecciones (es decir, crear un compuesto). Una imagen que sea un mosaico o una composición de imágenes de entrada con diferentes proyecciones tendrá la proyección predeterminada, que es WGS84 con una escala de 1 grado.
Por ejemplo:
Editor de código (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 intentas usar una imagen como esta en un cálculo, es posible que veas un error como el siguiente:
Por lo general, no se desea ni se pretende una agregación a escala de 1 grado, por lo que Earth Engine muestra este recordatorio útil para proporcionar una especificación completa del resultado.
Los usuarios suelen confundirse con este comportamiento y preocuparse por la información de proyección "perdida", pero los píxeles no se calculan hasta que se necesitan (obtén más información). En ese momento, siempre hay una proyección de salida que acompaña a la solicitud que especificó cómo calcular el compuesto.
En la gran mayoría de los casos de uso, no tener una proyección no es un problema y, de hecho, es una optimización valiosa, ya que permite obtener una vista previa de los resultados en cualquier nivel de zoom sin tener que esperar a que se complete el cálculo de resolución completa. Sin embargo, sí significa que el resultado puede verse diferente en distintos niveles de zoom.
Si la imagen de pantalla optimizada no es suficiente, se puede forzar el cálculo en una proyección específica reproyectando el resultado, como se describe en la siguiente sección.
Proyección
Puedes forzar que las operaciones se realicen en una proyección específica con el método reproject(). El uso de reproject() hace que se soliciten las entradas en la proyección especificada en la llamada a reproject().
Los cálculos en tu código antes de la llamada a reproject() se realizarán en la proyección especificada. Por ejemplo, para forzar la producción de un compuesto en una proyección específica, haz lo siguiente:
Editor de código (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)
Estos son algunos casos que requieren una proyección fija:
- Calcular gradientes (p. ej.,
ee.Terrain.gradientoee.Terrain.slope) reduceResolution, para cuando quieras agregar píxeles de mayor resolución a una resolución más baja. (Obtén más información para reducir la resolución).
Existen varios motivos por los que debes evitar usar reproject(), a menos que sea absolutamente necesario. Por ejemplo, supongamos que reproyectas algo y lo agregas al mapa. Si la escala que especificaste en la llamada reproject() es mucho más pequeña que el nivel de zoom del mapa, Earth Engine solicitará todas las entradas a una escala muy pequeña y en una extensión espacial muy amplia. Esto puede generar que se soliciten demasiados datos a la vez y provocar un error.
Si el resultado final se encuentra en una proyección diferente de la especificada en la llamada a reproject(), se producirá otra reproyección. Este es otro motivo para tener cuidado al usar reproject() en tu código. Considera el siguiente ejemplo, que obliga a que la imagen de MODIS se reproyecte primero a WGS84 y, luego, a proyección de Mercator de Maps para que se muestre en el mapa del Editor de código:
Editor de código (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
En la Figura 2, se diagrama el flujo de operaciones correspondiente a este ejemplo de reproyección simple. Ten en cuenta que la primera reproyección es explícita, como se especifica en la llamada a reproject(). La segunda reproyección es implícita y Earth Engine la realiza automáticamente para mostrar el resultado en el mapa. También observa que la información sobre qué proyección usar se propaga desde la solicitud hasta la entrada.