Arrays und Array-Images

Arrays in Earth Engine bestehen aus Listen mit Zahlen und Listen von Listen. Der Nesting-Grad bestimmt die Anzahl der Dimensionen. Als einfaches, anschauliches Beispiel betrachten wir das folgende Beispiel für eine Array, die aus den TC-Koeffizienten (tassel cap) von Landsat 8 erstellt wurde (Baig et al., 2014):

// 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],
]);

Auf der Seite Python-Umgebung finden Sie Informationen zur Python API und zur Verwendung von geemap für die interaktive Entwicklung.

import ee
import geemap.core as geemap
# 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],
])

Prüfen Sie mit length(), ob es sich um ein 6 × 6 m großes 2D-Array handelt. Dadurch werden die Längen der einzelnen Achsen zurückgegeben:

// Print the dimensions.
print(coefficients.length()); //    [6,6]

Auf der Seite Python-Umgebung finden Sie Informationen zur Python API und zur Verwendung von geemap für die interaktive Entwicklung.

import ee
import geemap.core as geemap
# Print the dimensions.
display(coefficients.length())  #    [6,6]

Die folgende Tabelle veranschaulicht die Anordnung der Matrixeinträge entlang der 0‑Achse und der 1‑Achse:

1-Achse –>
012345
00,30290,27860,47330,55990,5080,1872
1-0.2941-0,243-0,54240,72760,0713-0,1608
Nullachse20,15110,19730,32830,3407-0,7117− 0,4559
3-0,82390,08490,4396-0,0580,2013-0.2773
4-0,32940,05570,10560,1855-0.43490,8085
50,1079-0,90230,41190,0575-0,02590,0252

Die Indizes links in der Tabelle geben die Positionen entlang der 0-Achse an. Das n-te Element in jeder Liste auf der 0-Achse befindet sich auf der 1-Achse auf der n-ten Position. Beispiel: Der Eintrag an der Koordinate [3, 1] des Arrays ist 0,0849. Angenommen, „Grünheit“ ist die TC-Komponente, die Sie interessieren würde. Sie können die Submatrix für die Grünheit mit slice() abrufen:

// Get the 1x6 greenness slice, display it.
var greenness = coefficients.slice({axis: 0, start: 1, end: 2, step: 1});
print(greenness);

Auf der Seite Python-Umgebung finden Sie Informationen zur Python API und zur Verwendung von geemap für die interaktive Entwicklung.

import ee
import geemap.core as geemap
# Get the 1x6 greenness slice, display it.
greenness = coefficients.slice(axis=0, start=1, end=2, step=1)
display(greenness)

Die 2D-Grünmatrix sollte in etwa so aussehen:

[[-0.2941,-0.243,-0.5424,0.7276,0.0713,-0.1608]]
    

Die Parameter start und end von slice() entsprechen den in der Tabelle angezeigten Indizes der Nullachse (start ist einschließend und end ausschließend).

Array-Bilder

Um ein Grünheitsbild zu erhalten, multiplizieren Sie die Bänder eines Landsat 8-Bildes mit der Grünheitsmatrix. Dazu wandeln Sie zuerst das mehrbandige Landsat-Bild in ein „Array-Bild“ um, bei dem jedes Pixel ein Array von Bandwerten ist. Beispiel:

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

Auf der Seite Python-Umgebung finden Sie Informationen zur Python API und zur Verwendung von geemap für die interaktive Entwicklung.

import ee
import geemap.core as geemap
# 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)

In diesem Beispiel wird image durch toArray() in ein Arraybild umgewandelt, in dem jedes Pixel ein eindimensionaler Vektor ist, dessen Einträge den 6 Werten an den entsprechenden Positionen in den Bändern von image entsprechen. Ein auf diese Weise erstelltes Array-Bild von 1‑dimensionalen Vektoren hat kein Konzept für eine 2‑dimensionale Form. Wenn Sie nur 2D-Vorgänge wie die Matrixmultiplikation ausführen möchten, konvertieren Sie das Bild mit toArray(1) in ein 2D-Array pro Pixel. Jedes Pixel des 2D-Arraybilds enthält eine 6 × 1 Matrix von Bandwerten. Das folgende Beispiel veranschaulicht dies:

var array1D = ee.Array([1, 2, 3]);              // [1,2,3]
var array2D = ee.Array.cat([array1D], 1);     // [[1],[2],[3]]

Auf der Seite Python-Umgebung finden Sie Informationen zur Python API und zur Verwendung von geemap für die interaktive Entwicklung.

import ee
import geemap.core as geemap
array_1d = ee.Array([1, 2, 3])  # [1,2,3]
array_2d = ee.Array.cat([array_1d], 1)  # [[1],[2],[3]]

Der array1D-Vektor variiert entlang der 0-Achse. Das gilt auch für die array2D-Matrix, die aber eine zusätzliche Dimension hat. Wenn Sie toArray(1) auf das Arraybild anwenden, ist das so, als würden Sie cat(bandVector, 1) auf jedes Pixel anwenden. Multiplizieren Sie das 2D-Array-Bild mit einem Bild, bei dem jedes Pixel eine 2D-Matrix mit Grünheitskoeffizienten enthält:

// Do a matrix multiplication: 1x6 times 6x1.
// Cast the greenness Array to an Image prior to multiplication.
var greennessArrayImage = ee.Image(greenness).matrixMultiply(arrayImage2D);

Auf der Seite Python-Umgebung finden Sie Informationen zur Python API und zur Verwendung von geemap für die interaktive Entwicklung.

import ee
import geemap.core as geemap
# 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)

Das Ergebnis ist ein neues Rasterbild, bei dem jedes Pixel die 1 × 1-Matrix ist, die durch die Matrixmultiplikation der 1 × 6-Grünmatrix (links) und der 6 × 1-Bandmatrix (rechts) entsteht. Konvertieren Sie das Bild mit arrayGet() in ein normales, einfarbiges Bild, um es anzuzeigen:

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

Auf der Seite Python-Umgebung finden Sie Informationen zur Python API und zur Verwendung von geemap für die interaktive Entwicklung.

import ee
import geemap.core as geemap
# 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

Hier ist ein vollständiges Beispiel, in dem das gesamte Coefficients-Array verwendet wird, um mehrere Komponenten mit Quasten gleichzeitig zu berechnen und das Ergebnis anzuzeigen:

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

Auf der Seite Python-Umgebung finden Sie Informationen zur Python API und zur Verwendung von geemap für die interaktive Entwicklung.

import ee
import geemap.core as geemap
# 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

Wenn Sie Bänder aus einem Arraybild abrufen, entfernen Sie zuerst die zusätzlichen Dimensionen mit project() und konvertieren Sie es dann mit arrayFlatten() wieder in ein normales Bild. Die Ausgabe sollte in etwa so aussehen:

Bild einer Mütze mit Quasten
Abbildung 1. Komponenten der Bommelmütze: „Helligkeit“ (rot), „Grünheit“ (grün) und „Nässe“ (blau).