Tablice w Earth Engine są tworzone z list liczb i list list. Liczba wymiarów zależy od stopnia zagnieżdżenia. Aby rozpocząć od prostego,
uzasadnionego przykładu, rozważ ten przykład Array
utworzonego na podstawie współczynników Landsat 8 tasseled cap (TC) (Baig et al., 2014):
Edytor kodu (JavaScript)
// Create an Array of Tasseled Cap coefficients. var coefficients = ee.Array([ [0.3029, 0.2786, 0.4733, 0.5599, 0.508, 0.1872], [-0.2941, -0.243, -0.5424, 0.7276, 0.0713, -0.1608], [0.1511, 0.1973, 0.3283, 0.3407, -0.7117, -0.4559], [-0.8239, 0.0849, 0.4396, -0.058, 0.2013, -0.2773], [-0.3294, 0.0557, 0.1056, 0.1855, -0.4349, 0.8085], [0.1079, -0.9023, 0.4119, 0.0575, -0.0259, 0.0252], ]);
import ee import geemap.core as geemap
Colab (Python)
# Create an Array of Tasseled Cap coefficients. coefficients = ee.Array([ [0.3029, 0.2786, 0.4733, 0.5599, 0.508, 0.1872], [-0.2941, -0.243, -0.5424, 0.7276, 0.0713, -0.1608], [0.1511, 0.1973, 0.3283, 0.3407, -0.7117, -0.4559], [-0.8239, 0.0849, 0.4396, -0.058, 0.2013, -0.2773], [-0.3294, 0.0557, 0.1056, 0.1855, -0.4349, 0.8085], [0.1079, -0.9023, 0.4119, 0.0575, -0.0259, 0.0252], ])
Upewnij się, że jest to tablica 2D o wymiarach 6 x 6, używając funkcji length()
, która zwróci długości każdej osi:
Edytor kodu (JavaScript)
// Print the dimensions. print(coefficients.length()); // [6,6]
import ee import geemap.core as geemap
Colab (Python)
# Print the dimensions. display(coefficients.length()) # [6,6]
Poniższa tabela przedstawia rozmieszczenie elementów macierzy wzdłuż osi 0 i osi 1:
1-axis -> | |||||||
---|---|---|---|---|---|---|---|
0 | 1 | 2 | 3 | 4 | 5 | ||
0 | 0,3029 | 0,2786 | 0,4733 | 0,5599 | 0,508 | 0,1872 | |
1 | -0,2941 | -0,243 | -0,5424 | 0,7276 | 0,0713 | -0,1608 | |
oś 0 | 2 | 0,1511 | 0,1973 | 0,3283 | 0,3407 | -0,7117 | -0,4559 |
3 | -0,8239 | 0,0849 | 0,4396 | -0,058 | 0,2013 | -0,2773 | |
4 | -0,3294 | 0,0557 | 0,1056 | 0,1855 | -0,4349 | 0,8085 | |
5 | 0,1079 | -0,9023 | 0,4119 | 0,0575 | -0,0259 | 0,0252 |
Indeksy po lewej stronie tabeli wskazują pozycje na osi 0. Element o numerze n na osi 0 jest na pozycji n na osi 1. Na przykład wpis w komórce [3, 1] tablicy ma wartość 0,0849. Załóżmy, że „zieloność” to interesujący nas komponent TC. Podmacierz zielonego możesz uzyskać za pomocą funkcji slice()
:
Edytor kodu (JavaScript)
// Get the 1x6 greenness slice, display it. var greenness = coefficients.slice({axis: 0, start: 1, end: 2, step: 1}); print(greenness);
import ee import geemap.core as geemap
Colab (Python)
# Get the 1x6 greenness slice, display it. greenness = coefficients.slice(axis=0, start=1, end=2, step=1) display(greenness)
Dwowymiarowa matryca zielonego zabarwienia powinna wyglądać mniej więcej tak:
[[-0.2941,-0.243,-0.5424,0.7276,0.0713,-0.1608]]
Zwróć uwagę, że parametry start
i end
funkcji slice()
odpowiadają indeksom osi 0 wyświetlanym w tabeli (start
jest domkniętą, a end
– otwartą wartością).
Obrazy tablicy
Aby uzyskać obraz zieleni, pomnóż pasma obrazu Landsat 8 przez matrycę zieleni. W tym celu najpierw przekonwertuj wielopasmowy obraz Landsat na „obraz tablicowy”, w którym każdy piksel jest Array
wartości pasm. Na przykład:
Edytor kodu (JavaScript)
// Load a Landsat 8 image, select the bands of interest. var image = ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_044034_20140318') .select(['B2', 'B3', 'B4', 'B5', 'B6', 'B7']); // Make an Array Image, with a 1-D Array per pixel. var arrayImage1D = image.toArray(); // Make an Array Image with a 2-D Array per pixel, 6x1. var arrayImage2D = arrayImage1D.toArray(1);
import ee import geemap.core as geemap
Colab (Python)
# Load a Landsat 8 image, select the bands of interest. image = ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_044034_20140318').select( ['B2', 'B3', 'B4', 'B5', 'B6', 'B7'] ) # Make an Array Image, with a 1-D Array per pixel. array_image_1d = image.toArray() # Make an Array Image with a 2-D Array per pixel, 6x1. array_image_2d = array_image_1d.toArray(1)
W tym przykładzie toArray()
konwertuje image
na obraz tablicy, w którym każdy piksel jest wektorem jednowymiarowym, a jego elementy odpowiadają 6 wartościom na odpowiednich pozycjach w pasmach image
. Tablica
obraz wektorów jednowymiarowych utworzonych w ten sposób nie ma wymiaru 2D. Aby wykonywać operacje 2D, takie jak mnożenie macierzy, przekonwertuj obraz na tablicę dwuwymiarową dla każdego piksela za pomocą funkcji toArray(1)
. W każdym pikselu obrazu tablicy 2D znajduje się macierz 6 x 1 wartości pasma. Aby to zilustrować, rozważ ten przykład zabawki:
Edytor kodu (JavaScript)
var array1D = ee.Array([1, 2, 3]); // [1,2,3] var array2D = ee.Array.cat([array1D], 1); // [[1],[2],[3]]
import ee import geemap.core as geemap
Colab (Python)
array_1d = ee.Array([1, 2, 3]) # [1,2,3] array_2d = ee.Array.cat([array_1d], 1) # [[1],[2],[3]]
Zwróć uwagę, że wektor array1D
zmienia się wzdłuż osi 0. Tabela array2D
też to umożliwia, ale ma dodatkową wymiar. Wywołanie funkcji toArray(1)
na obrazie tablicy jest podobne do wywołania funkcji cat(bandVector, 1)
na każdym pikselu. Korzystając z obrazu tablicy dwuwymiarowej, wykonaj lewym mnożeniu przez obraz, w którym każdy piksel zawiera dwuwymiarową macierz współczynników zielonego:
Edytor kodu (JavaScript)
// Do a matrix multiplication: 1x6 times 6x1. // Cast the greenness Array to an Image prior to multiplication. var greennessArrayImage = ee.Image(greenness).matrixMultiply(arrayImage2D);
import ee import geemap.core as geemap
Colab (Python)
# Do a matrix multiplication: 1x6 times 6x1. # Cast the greenness Array to an Image prior to multiplication. greenness_array_image = ee.Image(greenness).matrixMultiply(array_image_2d)
W efekcie powstaje nowy obraz tablicy, w którym każdy piksel jest tablicą 1 x 1, która jest wynikiem mnożenia tablicy 1 x 6 (po lewej) i tablicy pasm 6 x 1 (po prawej). Aby wyświetlić obraz, przekonwertuj go na zwykły obraz jednopasmowy za pomocą narzędzia arrayGet()
:
Edytor kodu (JavaScript)
// Get the result from the 1x1 array in each pixel of the 2-D array image. var greennessImage = greennessArrayImage.arrayGet([0, 0]); // Display the input imagery with the greenness result. Map.setCenter(-122.3, 37.562, 10); Map.addLayer(image, {bands: ['B5', 'B4', 'B3'], min: 0, max: 0.5}, 'image'); Map.addLayer(greennessImage, {min: -0.1, max: 0.13}, 'greenness');
import ee import geemap.core as geemap
Colab (Python)
# Get the result from the 1x1 array in each pixel of the 2-D array image. greenness_image = greenness_array_image.arrayGet([0, 0]) # Display the input imagery with the greenness result. m = geemap.Map() m.set_center(-122.3, 37.562, 10) m.add_layer(image, {'bands': ['B5', 'B4', 'B3'], 'min': 0, 'max': 0.5}, 'image') m.add_layer(greenness_image, {'min': -0.1, 'max': 0.13}, 'greenness') m
Oto pełny przykład, który używa całego tablicowego ciągu współczynników do jednoczesnego obliczenia wielu komponentów funkcji czapki z pomponem i wyświetlenia wyniku:
Edytor kodu (JavaScript)
// Define an Array of Tasseled Cap coefficients. var coefficients = ee.Array([ [0.3029, 0.2786, 0.4733, 0.5599, 0.508, 0.1872], [-0.2941, -0.243, -0.5424, 0.7276, 0.0713, -0.1608], [0.1511, 0.1973, 0.3283, 0.3407, -0.7117, -0.4559], [-0.8239, 0.0849, 0.4396, -0.058, 0.2013, -0.2773], [-0.3294, 0.0557, 0.1056, 0.1855, -0.4349, 0.8085], [0.1079, -0.9023, 0.4119, 0.0575, -0.0259, 0.0252], ]); // Load a Landsat 8 image, select the bands of interest. var image = ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_044034_20140318') .select(['B2', 'B3', 'B4', 'B5', 'B6', 'B7']); // Make an Array Image, with a 1-D Array per pixel. var arrayImage1D = image.toArray(); // Make an Array Image with a 2-D Array per pixel, 6x1. var arrayImage2D = arrayImage1D.toArray(1); // Do a matrix multiplication: 6x6 times 6x1. var componentsImage = ee.Image(coefficients) .matrixMultiply(arrayImage2D) // Get rid of the extra dimensions. .arrayProject([0]) .arrayFlatten( [['brightness', 'greenness', 'wetness', 'fourth', 'fifth', 'sixth']]); // Display the first three bands of the result and the input imagery. var vizParams = { bands: ['brightness', 'greenness', 'wetness'], min: -0.1, max: [0.5, 0.1, 0.1] }; Map.setCenter(-122.3, 37.562, 10); Map.addLayer(image, {bands: ['B5', 'B4', 'B3'], min: 0, max: 0.5}, 'image'); Map.addLayer(componentsImage, vizParams, 'components');
import ee import geemap.core as geemap
Colab (Python)
# Define an Array of Tasseled Cap coefficients. coefficients = ee.Array([ [0.3029, 0.2786, 0.4733, 0.5599, 0.508, 0.1872], [-0.2941, -0.243, -0.5424, 0.7276, 0.0713, -0.1608], [0.1511, 0.1973, 0.3283, 0.3407, -0.7117, -0.4559], [-0.8239, 0.0849, 0.4396, -0.058, 0.2013, -0.2773], [-0.3294, 0.0557, 0.1056, 0.1855, -0.4349, 0.8085], [0.1079, -0.9023, 0.4119, 0.0575, -0.0259, 0.0252], ]) # Load a Landsat 8 image, select the bands of interest. image = ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_044034_20140318').select( ['B2', 'B3', 'B4', 'B5', 'B6', 'B7'] ) # Make an Array Image, with a 1-D Array per pixel. array_image_1d = image.toArray() # Make an Array Image with a 2-D Array per pixel, 6x1. array_image_2d = array_image_1d.toArray(1) # Do a matrix multiplication: 6x6 times 6x1. components_image = ( ee.Image(coefficients) .matrixMultiply(array_image_2d) # Get rid of the extra dimensions. .arrayProject([0]) .arrayFlatten( [['brightness', 'greenness', 'wetness', 'fourth', 'fifth', 'sixth']] ) ) # Display the first three bands of the result and the input imagery. viz_params = { 'bands': ['brightness', 'greenness', 'wetness'], 'min': -0.1, 'max': [0.5, 0.1, 0.1], } m = geemap.Map() m.set_center(-122.3, 37.562, 10) m.add_layer(image, {'bands': ['B5', 'B4', 'B3'], 'min': 0, 'max': 0.5}, 'image') m.add_layer(components_image, viz_params, 'components') m
Pamiętaj, że podczas pobierania pasm z obrazu tablicowego najpierw pozbądź się dodatkowych wymiarów za pomocą polecenia project()
, a następnie przekonwertuj obraz z powrotem na zwykły za pomocą polecenia arrayFlatten()
. Dane wyjściowe powinny wyglądać mniej więcej tak:
