Prognozy

Earth Engine został zaprojektowany tak, aby podczas obliczeń rzadko trzeba było się martwić o projekcje map. Podobnie jak w przypadku skali, projekcja, w której wykonywane są obliczenia, jest określana na podstawie „pobierania”. Dane wejściowe są żądane w projekcji wyjściowej. Dane wyjściowe mogą być określane na podstawie parametru funkcji (np. crs), obiektów mapy w Edytorze kodu i geemap (które mają projekcję maps Mercatora (EPSG:3857)), lub za pomocą wywołania reproject(). Gdy wyświetlasz obrazy w Edytorze kodu lub geemap, dane wejściowe są żądane w projekcji Mercatora. Rozważmy następującą operację na obrazie MODIS, który ma projekcję sinusoidalną:

Edytor kodu (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');

Konfiguracja Pythona

Informacje o interfejsie API dla Pythona oraz o używaniu geemap do interaktywnego programowania znajdziesz na stronie środowiska Python.

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

Kolejność operacji w tym przykładowym kodzie przedstawia rysunek 1. Pamiętaj że projekcja danych wejściowych jest określana przez dane wyjściowe, a konkretnie przez projekcję Mercatora wyświetlaną w Edytorze kodu. Ta projekcja jest propagowana wstecz przez sekwencję operacji, tak że dane wejściowe są żądane w projekcji Mercatora w skali określonej przez poziom powiększenia mapy.

projekcja,
Rysunek 1. Schemat blokowy operacji odpowiadających wyświetlaniu obrazu MODIS na mapie w Edytorze kodu. Projekcje (po lewej stronie schematu blokowego) każdej operacji są określane na podstawie danych wyjściowych. Zakrzywione linie wskazują przepływ informacji do reprojekcji, a konkretnie projekcji wyjściowej i skali.

W Earth Engine projekcje są określane przez układ współrzędnych (CRS lub parametr crs wielu metod). Projekcję obrazu możesz sprawdzić, wywołując na nim funkcję projection() na nim:

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

Konfiguracja Pythona

Informacje o interfejsie API dla Pythona oraz o używaniu geemap do interaktywnego programowania znajdziesz na stronie środowiska Python.

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

Pamiętaj, że wywołując nominalScale() na ee.Projection zwróconym przez projection(), możesz określić natywną rozdzielczość obrazu. Rozdzielczość natywna to nominalna skala pikseli w metrach na najniższym poziomie piramidy obrazu. Ponieważ każde pasmo obrazu może mieć inną skalę lub projekcję, jeśli wywołasz projection() na obrazie z co najmniej 1 pasmem, które nie ma takiej samej projekcji jak pozostałe, może pojawić się błąd podobny do tego:

Projekcja domyślna

Jeśli nie musisz, aby obliczenia były wykonywane w określonej projekcji, na ogół nie musisz jej określać. Tylko w przypadku niejednoznacznych danych wyjściowych Earth Engine wymaga określenia projekcji lub skali. Niejednoznaczność może wynikać z redukowania ImageCollection zawierającego obrazy o różnych projekcjach (czyli tworzenia kompozycji). Obraz, który jest a kompozycją lub mozaiką obrazów wejściowych o różnych projekcjach, będzie miał projekcję domyślną , czyli WGS84 w skali 1 stopnia. Jeśli ta projekcja domyślna nie jest odpowiednia do analizy (np. jest zbyt gruba lub musisz zapobiec artefaktom ponownego próbkowania w dalszych obliczeniach, takich jak analiza terenu), możesz ustawić inną projekcję domyślną za pomocą image.setDefaultProjection(crs). Dzięki temu, jeśli Earth Engine będzie musiał wybrać projekcję do obliczeń z udziałem obrazu, użyje określonej projekcji, a nie WGS84 w skali 1 stopnia. Na przykład:

Edytor kodu (JavaScript)

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

Konfiguracja Pythona

Informacje o interfejsie API dla Pythona oraz o używaniu geemap do interaktywnego programowania znajdziesz na stronie środowiska Python.

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

Jeśli spróbujesz użyć takiego obrazu w obliczeniach, może pojawić się błąd podobny do tego:

Na ogół agregacja w skali 1 stopnia nie jest pożądana ani zamierzona, dlatego Earth Engine wyświetla to przyjazne przypomnienie, aby podać pełną specyfikację danych wyjściowych.

Użytkownicy często uważają to zachowanie za mylące i martwią się „utratą” informacji o projekcji, ale piksele nie są obliczane, dopóki nie są potrzebne (więcej informacji). W takim przypadku zawsze występuje projekcja wyjściowa, która towarzyszy żądaniu określającemu sposób obliczania kompozycji.

W zdecydowanej większości przypadków brak projekcji nie stanowi problemu i jest cenną optymalizacją, ponieważ umożliwia wyświetlanie podglądu wyników na dowolnym poziomie powiększenia bez konieczności czekania na zakończenie obliczeń w pełnej rozdzielczości. Oznacza to jednak, że dane wyjściowe mogą wyglądać inaczej na różnych poziomach powiększenia.

Jeśli zoptymalizowany obraz wyświetlany jest niewystarczający, można wymusić obliczenia w określonej projekcji, ponownie projektując dane wyjściowe zgodnie z opisem w następnej sekcji.

Ponowne projektowanie

Możesz wymusić wykonywanie operacji w określonej projekcji za pomocą metody reproject(). Użycie reproject() powoduje, że dane wejściowe są żądane w projekcji określonej w wywołaniu reproject(). Obliczenia w kodzie przed wywołaniem reproject() będą wykonywane w określonej projekcji. Aby na przykład wymusić utworzenie kompozycji w określonej projekcji:

Edytor kodu (JavaScript)

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

Konfiguracja Pythona

Informacje o interfejsie API dla Pythona oraz o używaniu geemap do interaktywnego programowania znajdziesz na stronie środowiska Python.

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)

Oto kilka przypadków, w których wymagana jest stała projekcja:

Funkcje w pakiecie ee.Terrain (np. slope, aspect, hillshade) obliczają wartości na podstawie sąsiednich pikseli i są wrażliwe na artefakty ponownego próbkowania wprowadzone podczas reprojekcji. Gdy projekcja obliczeń różni się od projekcji natywnej DEM's domyślne ponowne próbkowanie najbliższego sąsiada może tworzyć sztuczne wzorce w danych wyjściowych. Aby uzyskać najlepsze wyniki, przeprowadź analizę terenu w projekcji natywnej DEM. Jeśli pracujesz z ImageCollection kafelków DEM, utwórz mozaikę i użyj setDefaultProjection() z projekcją natywną kolekcji, aby analiza była przeprowadzana na prawidłowej siatce, zgodnie z opisem w sekcji Projekcja domyślna.

Jest kilka powodów, dla których należy unikać używania reproject(), chyba że jest to absolutnie konieczne. Załóżmy na przykład, że ponownie projektujesz coś i dodajesz to do mapy. Jeśli skala określona w wywołaniu reproject() jest znacznie mniejsza niż poziom powiększenia mapy, Earth Engine zażąda wszystkich danych wejściowych w bardzo małej skali na bardzo dużym obszarze. Może to spowodować zażądanie zbyt dużej ilości danych naraz i doprowadzić do błędu.

Jeśli dane wyjściowe będą miały inną projekcję niż ta określona w wywołaniu reproject(), spowoduje to kolejną reprojekcję. To kolejny powód, dla którego należy zachować ostrożność podczas używania reproject() w kodzie. Rozważmy ten przykład, który wymusza najpierw ponowne zaprojektowanie obrazu MODIS do WGS84, a następnie ponowne zaprojektowanie go do projekcji Mercatora w celu wyświetlenia na mapie w Edytorze kodu:

Edytor kodu (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');

Konfiguracja Pythona

Informacje o interfejsie API dla Pythona oraz o używaniu geemap do interaktywnego programowania znajdziesz na stronie środowiska Python.

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

Rysunek 2 przedstawia schemat blokowy operacji odpowiadających temu prostemu przykładowi reprojekcji przykład. Pamiętaj, że pierwsza reprojekcja jest jawna, zgodnie z wywołaniem reproject() Druga reprojekcja jest niejawna i wykonywana automatycznie przez Earth Engine w celu wyświetlenia wyniku na mapie. Zwróć też uwagę, że informacje o tym, jakiej projekcji użyć, są propagowane wstecz od żądania do danych wejściowych.

reprojektowanie
Rysunek 2. Schemat blokowy operacji odpowiadających reprojekcji obrazu MODIS na mapie w Edytorze kodu. Zakrzywione linie wskazują przepływ informacji do reprojekcji, a konkretnie projekcji wyjściowej i skali.