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