Prognozy

Earth Engine jest tak zaprojektowany, że podczas wykonywania obliczeń rzadko musisz martwić się projekcjami map. Podobnie jak w przypadku skali, projekcja, w której wykonywane są obliczenia, jest określana na podstawie „wyciągania”. W szczególności dane wejściowe są wymagane w projekcji wyjściowej. Wyjście może być określone na podstawie parametru funkcji (np. crs), obiektów mapy w Edytorze kodu i geemap (które mają projekcję maps mercator (EPSG:3857)) lub wywołania reproject(). Gdy wyświetlasz obrazy w Edytorze kodu lub w geemap, dane wejściowe są pobierane w formacie maps mercator. Rozważ wykonanie tej prostej operacji na obrazie MODIS, który ma sinusoidalną projekcję:

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

Informacje o interfejsie Python API i o używaniu pakietu geemap do programowania interaktywnego znajdziesz na stronie Python Environment.

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

Kolejność operacji w tym przykładowym kodzie jest przedstawiona na rysunku 1. Pamiętaj, że projekcja danych wejściowych jest określana przez dane wyjściowe, a w szczególności przez projekcję Map Mercator mapy wyświetlanej w Edytorze kodu. Ta projekcja jest propagowana z powrotem przez sekwencję operacji, tak aby dane wejściowe były pobierane w systemie Mercator, 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 przepływu danych) każdego działania są określane na podstawie danych wyjściowych. Krzywe linie wskazują przepływ informacji do ponownej projekcji: konkretnie do projekcji i skali wyjściowej.

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

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

Informacje o interfejsie Python API i o używaniu pakietu geemap do programowania interaktywnego znajdziesz na stronie Python Environment.

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

Pamiętaj, że wywołanie metody nominalScale() zwracanej przez metodę ee.Projection zwracaną przez metodę projection() pozwala określić natywną rozdzielczość obrazu. Natywne rozdzielczości to nominalna skala pikseli w metrach na najniższym poziomie piramidy obrazu. Każdy pasek obrazu może mieć inną skalę lub inną projekcję, więc jeśli wywołasz funkcję projection() na obrazie, na którym co najmniej jeden pasek ma inną projekcję niż pozostałe, możesz zobaczyć taki błąd:

projekcja domyślna,

Ogólnie nie musisz określać projekcji, chyba że chcesz, aby obliczenia były wykonywane w konkretnej projekcji. Earth Engine wymaga określenia projekcji lub skali tylko w przypadku niejednoznacznych danych wyjściowych. Niejednoznaczność może wynikać z zmniejszenia ImageCollection zawierającego obrazy z różnymi projekcjami (czyli tworzenia kompozycji). Obraz, który jest złożonym obrazem lub mozaiką obrazów wejściowych z różnymi projekcjami, będzie miał domyślną projekcję WGS84 z 1-stopniową skalą. Na przykład:

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

Informacje o interfejsie Python API i o używaniu pakietu geemap do programowania interaktywnego znajdziesz na stronie Python Environment.

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

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

Zazwyczaj agregacja na skali 1-stopniowej nie jest pożądana ani zamierzona, dlatego Earth Engine przypomina o konieczności podania pełnej specyfikacji danych wyjściowych.

Użytkownicy często uważają to zachowanie za mylące i martwią się o „utracone” informacje dotyczące projekcji. Jednak piksele są obliczane dopiero wtedy, gdy są potrzebne (więcej informacji). W tym momencie zawsze dołączana jest projekcja wyjściowa, która określa sposób obliczania kompozycji.

W większości przypadków brak projekcji nie stanowi problemu, a w zasadzie jest nawet przydatną optymalizacją, ponieważ umożliwia podgląd wyników na dowolnym poziomie powiększenia bez konieczności oczekiwania na zakończenie obliczeń w pełnej rozdzielczości. Oznacza to jednak, że wynik może wyglądać inaczej przy różnych poziomach powiększenia.

Jeśli z jakiegoś powodu zoptymalizowany obraz wyświetlania nie jest wystarczający, można wymusić obliczenia w określonej projekcji, ponownie przeprojektowując dane wyjściowe w sposób opisany w następującej sekcji.

Przeprojektowanie

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

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

Informacje o interfejsie Python API i o używaniu pakietu geemap do programowania interaktywnego znajdziesz na stronie Python Environment.

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)

Oto kilka przypadków, w których wymagana jest projekcja statyczna:

Istnieje kilka powodów, dla których nie należy używać reproject(), chyba że jest to absolutnie konieczne. Załóżmy na przykład, że przeprojektujesz coś i dodasz to do mapy. Jeśli skala podana w wywołaniu funkcji reproject() jest znacznie mniejsza niż poziom powiększenia mapy, Earth Engine będzie wysyłać żądania dotyczące wszystkich danych wejściowych w bardzo małej skali na bardzo dużym obszarze. Może to spowodować, że zostanie przesłana zbyt duża ilość danych naraz, co może doprowadzić do błędu.

Jeśli wynik jest w innej projekcji niż określona w wywołaniu funkcji reproject(), zostanie wykonana kolejna projekcja. To kolejny powód, dla którego należy ostrożnie używać w kodzie wartości reproject(). Rozważ ten przykład, w którym obraz MODIS jest najpierw przeprojektowywany na WGS84, a potem na Mapy Mercator, aby można go było wyświetlić na mapie w Edytorze kodu:

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

Informacje o interfejsie Python API i o używaniu pakietu geemap do programowania interaktywnego znajdziesz na stronie Python Environment.

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

Rysunek 2 przedstawia przepływ operacji odpowiadający temu prostemu przykładowi ponownej projekcji. Pamiętaj, że pierwsza ponowna projekcja jest jawna, zgodnie z wywołaniem funkcji reproject(). Druga projekcja jest niejawna i jest wykonywana automatycznie przez Earth Engine w celu wyświetlenia wyniku na mapie. Zwróć też uwagę, że informacje o projekcji, której należy użyć, są przekazywane z żądania do danych wejściowych.

ponowne przeprojektowanie
Rysunek 2. Schemat blokowy operacji odpowiadających ponownemu rzutowaniu obrazu MODIS na mapie w Edytorze kodu Krzywe linie wskazują przepływ informacji do ponownych projekcji, a precyzyjniej do projekcji i skali wyjściowej.