Proyecciones

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 de forma "extraíble". Específicamente, las entradas se solicitan en la proyección de salida. El resultado se puede determinar a partir de un parámetro de función (p.ej., crs), el editor de código y los objetos de mapa de geemap (que tienen una proyección maps Mercator (EPSG:3857)) o con una llamada a reproject(). Cuando se muestran imágenes en el editor de código o en geemap, las entradas se solicitan en mapas de Mercator. Considera la siguiente operación simple en una imagen MODIS, que tiene una proyección sinusoidal:

// 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');

Consulta la página Entorno de Python para obtener información sobre la API de Python y el uso de geemap para el desarrollo interactivo.

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

El orden de las operaciones de esta muestra de código se diagrama en la Figura 1. Ten en cuenta que la proyección de la entrada está determinada por el resultado, 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 mapas Mercator, a una escala determinada por el nivel de zoom del mapa.

proyección
Figura 1: Diagrama de flujo de operaciones correspondientes a la visualización de una imagen de MODIS en el mapa del Editor de código. Las proyecciones (lado izquierdo del diagrama de flujo) de cada operación se determinan a partir del resultado. Las líneas curvas indican el flujo de información a la reubicación: específicamente, la proyección y escala de salida.

En Earth Engine, las proyecciones se especifican mediante un sistema de referencia de coordenadas (CRS o el parámetro crs de muchos métodos). Para verificar la proyección de una imagen, llama a projection() en ella:

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

Consulta la página Entorno de Python para obtener información sobre la API de Python y el uso de geemap para el desarrollo interactivo.

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

Ten en cuenta que, si llamas a nominalScale() en el ee.Projection que muestra 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. Debido a 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 tiene 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 el procesamiento se realice en una proyección específica, por lo general, no es necesario especificar una. Solo en el caso de los resultados ambiguos, Earth Engine requerirá que especifiques una proyección o 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 compuesto o un mosaico de imágenes de entrada con diferentes proyecciones tendrá la proyección predeterminada, que es WGS84 con escala de 1 grado. Por ejemplo:

var collection = ee.ImageCollection('LANDSAT/LC08/C02/T1_TOA');
var mosaic = collection.filterDate('2018-01-01', '2019-01-01').mosaic();
print(mosaic.projection());

Consulta la página Entorno de Python para obtener información sobre la API de Python y el uso de geemap para el desarrollo interactivo.

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 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 te recuerda que debes proporcionar una especificación completa para el resultado.

A menudo, los usuarios encuentran este comportamiento confuso y se preocupan 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) y, en ese momento, siempre hay una proyección de salida que acompaña a la solicitud que especifica 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 procesamiento de resolución completa. Sin embargo, esto significa que el resultado puede aparecer diferente en diferentes niveles de zoom.

Si la imagen de visualización optimizada no es suficiente, se puede forzar el procesamiento en una proyección específica volviendo a proyectar el resultado, como se describe en la siguiente sección.

Reproyección

Puedes forzar que las operaciones se realicen en una proyección específica con el método reproject(). El uso de reproject() genera 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 que se produzca un compuesto en una proyección específica, haz lo siguiente:

// Some projection that is suitable for your area of interest.
var proj = ee.Projection(...);
var output = collection.reduce(...).reproject(proj);

Consulta la página Entorno de Python para obtener información sobre la API de Python y el uso de geemap para el desarrollo interactivo.

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)

Estos son algunos casos que requieren una proyección fija:

Existen varios motivos por los que debes evitar usar reproject(), a menos que sea absolutamente necesario. Por ejemplo, supongamos que vuelves a proyectar algo y lo agregas al mapa. Si la escala que especificaste en la llamada a 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 en un área espacial muy amplia. Esto puede provocar que se soliciten demasiados datos a la vez y se genere un error.

Si el resultado final está en una proyección diferente a la especificada en la llamada a reproject(), se producirá otra reubicación. Esta es otra razón para tener cuidado con el uso de reproject() en tu código. Considera el siguiente ejemplo, que obliga a que la imagen de MODIS se vuelva a proyectar primero a WGS84 y, luego, a maps mercator para mostrarse en el mapa del editor de código:

// 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');

Consulta la página Entorno de Python para obtener información sobre la API de Python y el uso de geemap para el desarrollo interactivo.

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

En la Figura 2, se diagrama el flujo de operaciones que corresponde a este ejemplo simple de reproyección. Ten en cuenta que la primera reubicación es explícita, como se especifica en la llamada a reproject(). La segunda reubicación es implícita y la realiza Earth Engine 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 a la entrada.

reproyección
Figura 2: Diagrama de flujo de operaciones correspondientes a la reubicación de una imagen de MODIS en el mapa del editor de código. Las líneas curvas indican el flujo de información a las reproyecciones: específicamente, la escala y la proyección de salida.