Le unioni salvate sono un modo per rappresentare le relazioni one-to-many in Earth Engine.
A differenza di un join interno, un join di salvataggio memorizza le corrispondenze della raccolta
secondary
come proprietà denominata delle funzionalità nella raccolta
primary
. Per salvare tutte queste corrispondenze, utilizza un
ee.Join.saveAll()
. Se esiste una relazione one-to-many, un join saveAll()
memorizza tutte le funzionalità corrispondenti come un ee.List
. Gli elementi non corrispondenti nella raccolta primary
vengono
eliminati. Ad esempio, supponiamo che sia necessario acquisire tutte le immagini MODIS acquisite
entro due giorni da ogni immagine Landsat di una raccolta. Questo esempio utilizza un join
saveAll()
a questo scopo:
Editor di codice (JavaScript)
// 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
Colab (Python)
# 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 questo esempio, tieni presente che la raccolta secondary
MODIS è prefiltrata in modo da essere simile dal punto di vista cronologico alla raccolta primary
Landsat per motivi di efficienza. Per
confrontare l'ora di acquisizione di Landsat con l'ora composita di MODIS, che ha un intervallo giornaliero,
il filtro confronta i punti di terminazione dei timestamp delle immagini. L'unione è definita con il
nome della proprietà utilizzata per memorizzare l'elenco delle corrispondenze per ogni immagine Landsat
(‘terra’
) e il parametro facoltativo per ordinare l'elenco delle corrispondenze in base alla proprietà
system:time_start
L'ispezione del risultato indica che alle immagini all'interno della raccolta principale è stata aggiunta la proprietà terra
che memorizza un elenco delle immagini MODIS corrispondenti.