Beste Joins speichern

Wenn Sie für jedes Element in einer Sammlung nur die beste Übereinstimmung speichern möchten, verwenden Sie eine ee.Join.saveBest(). Der saveBest()-Join funktioniert auf die gleiche Weise wie der saveAll()-Join, mit der Ausnahme, dass für jedes Element in der primary-Sammlung das Element aus der secondary-Sammlung mit der besten Übereinstimmung gespeichert wird. Nicht übereinstimmende Elemente in der primären Sammlung werden gelöscht. Angenommen, Sie möchten ein meteorologisches Bild finden, das zeitlich am nächsten an jedem Landsat-Bild in der Sammlung primary liegt. Um diese Zusammenführung auszuführen, muss ee.Filter für eine einzelne Zusammenführungsbedingung neu definiert werden. Kombinierte Filter funktionieren mit saveBest() nicht, da nicht eindeutig ist, wie Ränge aus mehreren untergeordneten Filtern kombiniert werden sollen:

// Load a primary collection: Landsat imagery.
var primary = ee.ImageCollection('LANDSAT/LC08/C02/T1_TOA')
    .filterDate('2014-04-01', '2014-06-01')
    .filterBounds(ee.Geometry.Point(-122.092, 37.42));

// Load a secondary collection: GRIDMET meteorological data
var gridmet = ee.ImageCollection('IDAHO_EPSCOR/GRIDMET');

// Define a max difference filter to compare timestamps.
var maxDiffFilter = ee.Filter.maxDifference({
  difference: 2 * 24 * 60 * 60 * 1000,
  leftField: 'system:time_start',
  rightField: 'system:time_start'
});

// Define the join.
var saveBestJoin = ee.Join.saveBest({
  matchKey: 'bestImage',
  measureKey: 'timeDiff'
});

// Apply the join.
var landsatMet = saveBestJoin.apply(primary, gridmet, maxDiffFilter);

// Print the result.
print(landsatMet);

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 primary collection: Landsat imagery.
primary = (
    ee.ImageCollection('LANDSAT/LC08/C02/T1_TOA')
    .filterDate('2014-04-01', '2014-06-01')
    .filterBounds(ee.Geometry.Point(-122.092, 37.42))
)

# Load a secondary collection: GRIDMET meteorological data
gridmet = ee.ImageCollection('IDAHO_EPSCOR/GRIDMET')

# Define a max difference filter to compare timestamps.
max_diff_filter = ee.Filter.maxDifference(
    difference=2 * 24 * 60 * 60 * 1000,
    leftField='system:time_start',
    rightField='system:time_start',
)

# Define the join.
save_best_join = ee.Join.saveBest(matchKey='bestImage', measureKey='timeDiff')

# Apply the join.
landsat_met = save_best_join.apply(primary, gridmet, max_diff_filter)

# Print the result.
display(landsat_met)

Bei einem saveBest()-Join wird der Name der Property definiert, mit der die beste Übereinstimmung (‘bestImage’) und der Name der Property gespeichert werden, mit der der Gütemesswert für die Übereinstimmung (‘timeDiff’) gespeichert wird. Die Ergebnisse zeigen, dass der Property bestImage für jede Landsat-Szene in der primary-Sammlung ein übereinstimmendes DAYMET-Bild hinzugefügt wurde. Jedes dieser DAYMET-Bilder hat die Eigenschaft timeDiff, die die Zeitdifferenz in Millisekunden zwischen dem DAYMET-Bild und dem Landsat-Bild angibt. Dieser Wert ist der kleinste unter den DAYMET-Bildern, die die Bedingung im Filter erfüllen.