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');
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.
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());
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());
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);
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:
- Obliczanie gradientów (np.
ee.Terrain.gradientlubee.Terrain.slope). reduceResolution, gdy chcesz agregować piksele o wyższej rozdzielczości w piksele o niższej rozdzielczości. (Więcej informacji o zmniejszaniu rozdzielczości).
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');
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.