Das Speichern von Joins ist eine Möglichkeit, 1:n-Beziehungen in Earth Engine darzustellen.
Im Gegensatz zu einem inner join werden bei einem speichernden Join Übereinstimmungen aus der Sammlung secondary
als benanntes Attribut der Features in der Sammlung primary
gespeichert. Wenn Sie alle Übereinstimmungen speichern möchten, verwenden Sie ein ee.Join.saveAll()
. Bei einer 1:n-Beziehung werden mit einem saveAll()
-Join alle übereinstimmenden Features als ee.List
gespeichert. Nicht übereinstimmende Elemente in der primary
-Sammlung werden gelöscht. Angenommen, Sie benötigen alle MODIS-Bilder, die innerhalb von zwei Tagen nach jedem Landsat-Bild in einer Sammlung aufgenommen wurden. In diesem Beispiel wird dazu ein saveAll()
-Join verwendet:
// 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: MODIS imagery. var modSecondary = ee.ImageCollection('MODIS/006/MOD09GA') .filterDate('2014-03-01', '2014-07-01'); // Define an allowable time difference: two days in milliseconds. var twoDaysMillis = 2 * 24 * 60 * 60 * 1000; // Create a time filter to define a match as overlapping timestamps. var timeFilter = ee.Filter.or( ee.Filter.maxDifference({ difference: twoDaysMillis, leftField: 'system:time_start', rightField: 'system:time_end' }), ee.Filter.maxDifference({ difference: twoDaysMillis, leftField: 'system:time_end', rightField: 'system:time_start' }) ); // Define the join. var saveAllJoin = ee.Join.saveAll({ matchesKey: 'terra', ordering: 'system:time_start', ascending: true }); // Apply the join. var landsatModis = saveAllJoin.apply(primary, modSecondary, timeFilter); // Display the result. print('Join.saveAll:', landsatModis);
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: MODIS imagery. mod_secondary = ee.ImageCollection('MODIS/006/MOD09GA').filterDate( '2014-03-01', '2014-07-01' ) # Define an allowable time difference: two days in milliseconds. two_days_millis = 2 * 24 * 60 * 60 * 1000 # Create a time filter to define a match as overlapping timestamps. time_filter = ee.Filter.Or( ee.Filter.maxDifference( difference=two_days_millis, leftField='system:time_start', rightField='system:time_end', ), ee.Filter.maxDifference( difference=two_days_millis, leftField='system:time_end', rightField='system:time_start', ), ) # Define the join. save_all_join = ee.Join.saveAll( matchesKey='terra', ordering='system:time_start', ascending=True ) # Apply the join. landsat_modis = save_all_join.apply(primary, mod_secondary, time_filter) # Display the result. display('Join.saveAll:', landsat_modis)
In diesem Beispiel ist die secondary
MODIS-Sammlung aus Effizienzgründen vorab so gefiltert, dass sie chronologisch mit der primary
Landsat-Sammlung übereinstimmt. Um die Aufnahmezeit von Landsat mit der MODIS-Kompositzeit zu vergleichen, die einen täglichen Bereich hat, werden die Endpunkte der Bildzeitstempel verglichen. Die Zusammenführung wird mit dem Namen der Property definiert, mit der die Liste der Übereinstimmungen für jedes Landsat-Bild (‘terra’
) gespeichert wird, und einem optionalen Parameter, um die Liste der Übereinstimmungen nach der Property system:time_start
zu sortieren.
Die Prüfung des Ergebnisses zeigt, dass den Bildern in der primären Sammlung die Eigenschaft terra
hinzugefügt wurde, in der eine Liste der übereinstimmenden MODIS-Bilder gespeichert ist.