Optymalizacja czasu wykonywania skryptów Google Earth Engine
Google Earth Engine (GEE) to potężna platforma do analizy danych geoprzestrzennych na dużą skalę. Jednak użytkownicy często napotykają problemy z czasem wykonania, nawet jeśli ich skrypty wydają się proste. Skrypt, którego uruchomienie zajmuje kilka minut, może mieć wpływ na produktywność i opóźniać wnioski.
W tym przypadku użytkownik stworzył prosty skrypt do przetwarzania danych z Sentinel i Landsat 8. Pomimo swojej prostoty wykonanie skryptu zajmuje około 3-5 minut. Zrozumienie, dlaczego tak się dzieje i jak zoptymalizować skrypt, jest niezbędne do wydajnego przetwarzania danych.
Wydajność skryptu GEE zależy od kilku czynników, w tym od rozmiaru danych, filtrowania i złożoności obliczeniowej. Skrócenie czasu wykonania wiąże się z identyfikacją wąskich gardeł w skrypcie, takich jak niepotrzebne operacje lub duże zbiory danych, które spowalniają przetwarzanie.
W tym artykule omówione zostaną możliwe przyczyny powolnych czasów wykonywania w GEE i podane zostaną praktyczne wskazówki dotyczące optymalizacji danego skryptu. Wdrażając te strategie, użytkownicy mogą znacznie poprawić szybkość i wydajność zadań związanych z analizą danych geoprzestrzennych.
Rozkaz | Przykład użycia |
---|---|
normalizedDifference() | Ta funkcja służy do obliczania wskaźników, takich jak NDVI, NDWI i NDSI, poprzez obliczenie różnicy między dwoma pasmami podzielonej przez ich sumę. Jest to specyficzne dla analiz teledetekcyjnych, gdzie potrzebne są wskaźniki roślinności, wody i śniegu. |
filterBounds() | Filtruje kolekcję obrazów, aby uwzględnić tylko obrazy przecinające daną geometrię. W tym przypadku ogranicza dane satelitarne do obszaru wokół określonego punktu zainteresowania, dzięki czemu przetwarzanie jest bardziej efektywne poprzez wykluczenie nieistotnych danych. |
filterDate() | To polecenie ogranicza kolekcję obrazów do określonego zakresu dat. W przypadku naszego problemu kluczowa jest analiza różnic między tym samym okresem dla zbiorów danych Sentinel i Landsat. |
addBands() | Dodaje nowe obliczone pasma (takie jak NDVI, NDWI i NDSI) do każdego obrazu w kolekcji. Jest to niezbędne w przypadku stosowania wielu indeksów do tej samej kolekcji obrazów bez tworzenia oddzielnych zbiorów danych. |
unmask() | Wypełnia zamaskowane piksele określoną wartością. W naszym skrypcie służy on do demaskowania stałych obszarów wodnych, zapewniając spójne przetwarzanie danych w całym regionie. |
reduce() | Redukuje kolekcję obrazów przy użyciu określonej funkcji redukującej, takiej jak ee.Reducer.percentile(). W tym przypadku służy do obliczenia 30. percentyla wartości pikseli, optymalizując generowanie obrazu złożonego. |
clip() | Przycina obraz do granic określonego obszaru zainteresowania. Dzięki temu przetwarzane są tylko dane istotne dla danego obszaru, co przyspiesza realizację. |
gt() | To polecenie oznacza „większy niż” i służy do tworzenia obrazów binarnych w oparciu o próg. W tym przypadku identyfikuje obszary, w których występuje woda większa niż 80%. |
map() | Stosuje funkcję do każdego obrazu w kolekcji. W naszym przykładzie stosuje funkcję addIndices do obliczenia NDVI, NDWI i NDSI dla wszystkich obrazów w kolekcji, usprawniając przepływ pracy. |
Optymalizacja skryptów GEE w celu zwiększenia wydajności
Celem dostarczonego skryptu jest wyodrębnienie i przetworzenie zdjęć satelitarnych z dwóch różnych źródeł: Sentinel i Landsat. The Silnik Google Earth (GEE) platforma umożliwia użytkownikom dostęp do ogromnych ilości danych satelitarnych i wykonywanie różnych operacji, takich jak filtrowanie, indeksowanie i wizualizacja. Jedną z kluczowych funkcji używanych w tym skrypcie jest znormalizowana różnica() funkcja, która jest wykorzystywana do obliczania ważnych wskaźników, takich jak NDVI, NDWI i NDSI. Wskaźniki te są kluczowe dla analizy roślinności, wody i pokrywy śnieżnej w określonym regionie. Skrypt rozpoczyna się od zdefiniowania punktu szczególnego i centruje na nim mapę przy użyciu podanych współrzędnych.
Skrypt stosuje wiele filtrów, takich jak filtrData() I filtrGranice(), aby zmniejszyć ilość przetwarzanych danych, skracając w ten sposób czas realizacji. Na przykład, filtrGranice() zapewnia, że uwzględnione zostaną tylko obrazy przecinające obszar zainteresowania, natomiast filtrData() ogranicza obrazy do określonego zakresu dat. Jest to niezbędne do przetwarzania dużych zbiorów danych, takich jak obrazy Sentinel i Landsat, ponieważ minimalizuje obciążenie obliczeniowe. Dodatkowo, filtr dla pokrycia chmur pomaga odrzucić obrazy, które mają zbyt dużo chmur, zapewniając lepszą jakość analizy.
Jednym z ważnych aspektów skryptu jest dodaj pasma() funkcja, która dodaje obliczone wskaźniki (NDVI, NDWI, NDSI) do zobrazowań, udostępniając je do dalszej analizy. Skrypt zawiera również stałą maskę wodną wykorzystującą dane ze zbioru danych JRC Global Surface Water. Maska wodna pomaga w wykluczeniu obszarów o dużym występowaniu wody (powyżej 80%), która w przeciwnym razie mogłaby zafałszować wyniki analizy roślinności i śniegu. Odbywa się to poprzez gt() I zdemaskować() funkcje, które pozwalają skryptowi izolować obszary na podstawie wartości pikseli.
Na koniec skrypt używa metody zmniejszyć() funkcję z reduktorem percentyla, aby wygenerować obraz złożony reprezentujący 30. percentyl wybranych wartości pikseli. Ten złożony obraz jest następnie przycinany do interesującego obszaru i wizualizowany na mapie za pomocą klips() funkcjonować. Parametry wizualne są zdefiniowane zarówno dla kompozytów Sentinel, jak i Landsat, umożliwiając użytkownikowi oglądanie ich przy odpowiednich ustawieniach kolorów. Łącząc różne etapy przetwarzania obrazu, takie jak filtrowanie, maskowanie i generowanie kompozytów, skrypt ten zapewnia skuteczny sposób analizy zdjęć satelitarnych, chociaż można zastosować dalszą optymalizację w celu skrócenia czasu wykonywania.
Optymalizacja wykonywania skryptów Google Earth Engine w celu szybszego przetwarzania
Rozwiązanie to wykorzystuje Google Earth Engine (GEE) z naciskiem na optymalizację wydajności poprzez skrócenie czasu pobierania danych i uproszczenie operacji. JavaScript jest używany jako język skryptowy.
var pointJSP = ee.Geometry.Point([86.465263, 20.168076]);
Map.centerObject(pointJSP, 14);
// Combine date variables for flexibility
var startDate = '2024-02-01';
var endDate = '2024-03-01';
// Function to add NDVI, NDWI, NDSI
var addIndices = function(image) {
var ndvi = image.normalizedDifference(['NIR', 'RED']).rename('NDVI');
var ndwi = image.normalizedDifference(['NIR', 'SWIR1']).rename('NDWI');
var ndsi = image.normalizedDifference(['SWIR1', 'SWIR2']).rename('NDSI');
return image.addBands(ndvi).addBands(ndwi).addBands(ndsi);
};
// Use fewer data points by filtering for cloud-free pixels only once
var sentinel = ee.ImageCollection('COPERNICUS/S2_SR')
.filterBounds(pointJSP)
.filterDate(startDate, endDate)
.filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 30));
Korzystanie z wydajnego przetwarzania danych dla GEE w celu minimalizacji opóźnień skryptów
Rozwiązanie to integruje zoptymalizowaną obsługę danych poprzez połączenie obliczeń wskaźników i progów. JavaScript jest stosowany do przetwarzania Google Earth Engine.
var landsat8 = ee.ImageCollection('LANDSAT/LC08/C01/T1_SR')
.filterBounds(pointJSP)
.filterDate(startDate, endDate)
.filter(ee.Filter.lt('CLOUD_COVER', 30));
// Apply water mask for permanent water areas
var waterMask = ee.Image('JRC/GSW1_4/GlobalSurfaceWater').select('occurrence').gt(80).unmask();
// Add indices to Landsat 8 imagery
var landsatIndices = landsat8.map(addIndices);
var composite = landsatIndices.reduce(ee.Reducer.percentile([30])).clip(pointJSP).mask(waterMask.eq(0));
Map.addLayer(composite, {bands: ['RED', 'GREEN', 'BLUE'], min: 0, max: 3000}, 'Landsat Composite');
Map.addLayer(waterMask, {min: 0, max: 1, palette: ['white', 'blue']}, 'Water Mask', false);
Poprawa wydajności skryptów teledetekcji
Jedną z kluczowych kwestii podczas pracy ze skryptami Google Earth Engine (GEE) jest zapewnienie wydajnej obsługi operacji. Chociaż w analizach środowiskowych powszechne jest korzystanie z dużych zbiorów danych, takich jak Sentinel i Landsat, sama ilość danych może spowolnić wykonywanie skryptu. Jedną z metod poprawy wydajności jest zapewnienie, że przetwarzane są tylko niezbędne dane. Używanie poleceń takich jak filtrGranice() I filtrData() minimalizuje rozmiar zbioru danych, co pomaga usprawnić obliczenia. Wybranie określonych zakresów dat i regionów geograficznych może znacznie skrócić czas realizacji.
Kolejnym aspektem wpływającym na wydajność skryptu GEE jest sposób przetwarzania danych. Przykładowy skrypt wykorzystuje funkcję do obliczania ważnych wskaźników, takich jak NDVI, NDWI i NDSI. Indeksy te dodawane są do zbiorów obrazów w postaci pasm, co pozwala na dokładniejszą analizę. Jednak częstym błędem jest stosowanie takich funkcji do całego zbioru danych bez uprzedniego filtrowania. Ważne jest, aby zastosować takie operacje po filtrowaniu, aby uniknąć niepotrzebnych obliczeń na nieistotnych danych.
Wizualizacja to kolejny element skryptu, który można zoptymalizować. Dodanie zbyt wielu warstw lub skomplikowanych wizualizacji może wydłużyć czas przetwarzania. Skrypt wykorzystuje predefiniowane parametry wizualne do renderowania kompozytów, ale wydajność można poprawić, wyłączając niektóre warstwy, chyba że są one wyraźnie potrzebne. Pomaga to w utrzymaniu lekkości skryptu przy jednoczesnym zachowaniu jego funkcjonalności. Używanie klips() polecenia zapewniają również renderowanie tylko niezbędnego obszaru, co zmniejsza ogólne obciążenie przetwarzaniem.
Często zadawane pytania dotyczące optymalizacji skryptów Google Earth Engine
- Jak poprawić wydajność moich skryptów GEE?
- Zoptymalizuj wykorzystanie filterDate(), filterBounds()i zmniejsz rozmiar zbioru danych przed przetworzeniem.
- Dlaczego uruchomienie mojego skryptu GEE trwa tak długo?
- Duże zbiory danych i złożone obliczenia mogą spowolnić wykonanie. Używać reduce() I clip() ograniczyć przetwarzanie do odpowiednich obszarów.
- Czy mogę zmniejszyć liczbę obrazów przetwarzanych w GEE?
- Tak, poprzez złożenie wniosku filter() dla pokrycia chmur i filterDate() skupić się na konkretnych okresach.
- Jak uprościć obliczenia indeksu w moim skrypcie?
- Użyj funkcji np addBands() aby usprawnić dodawanie wielu indeksów (np. NDVI, NDWI) w jednym kroku.
- Czy można zwizualizować tylko istotne warstwy?
- Tak, wyłącz niepotrzebne warstwy i użyj uproszczonych parametrów wizualizacji Map.addLayer() dla lepszej wydajności.
Końcowe przemyślenia na temat optymalizacji skryptów GEE
Optymalizacja skryptów Google Earth Engine obejmuje wydajną obsługę dużych zbiorów danych, wczesne stosowanie filtrów i ograniczanie niepotrzebnych operacji na danych. Koncentrowanie się na istotnych obszarach, takich jak filtrowanie według data i lokalizacja mogą znacznie skrócić czas przetwarzania.
Dzięki włączeniu funkcji takich jak dodaj pasma a użycie masek progowych w celu wyeliminowania nieistotnych danych umożliwia dalszą poprawę wydajności skryptu. Techniki te mogą usprawnić wykonanie, oferując szybsze wyniki i lepsze wykorzystanie platformy Google Earth Engine.
Źródła i referencje dotyczące optymalizacji skryptów Google Earth Engine
- Ten artykuł powstał przy użyciu treści opartych na oficjalnej dokumentacji Google Earth Engine, która zapewnia wgląd w techniki optymalizacji skryptów. Przewodniki po silniku Google Earth
- Dodatkowe informacje zostały zebrane na forum społeczności GEE, oferującym dyskusje i rozwiązania mające na celu poprawę wydajności w przypadku złożonych skryptów. Społeczność Google Earth Engine
- Najlepsze praktyki w zakresie obsługi dużych zbiorów danych podano w literaturze i samouczkach dotyczących teledetekcji dostępnych pod następującym linkiem. Obserwatorium Ziemi NASA