As junções de salvamento são uma maneira de representar relações de um para muitos no Earth Engine.
Ao contrário de uma junção interna, uma união de economias armazena correspondências da
coleção secondary
como uma propriedade nomeada dos recursos na
coleção primary
. Para salvar todas essas correspondências, use um
ee.Join.saveAll()
. Se houver uma relação de um para muitos, um
saveAll()
vai armazenar todos os recursos correspondentes como um
ee.List
. Os elementos não correspondentes na coleção primary
são
descartados. Por exemplo, suponha que seja necessário receber todas as imagens do MODIS adquiridas
em até dois dias após cada imagem do Landsat em uma coleção. Este exemplo usa uma união saveAll()
para essa finalidade:
Editor de código (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)
Neste exemplo, a coleção MODIS secondary
é pré-filtrada para ser cronologicamente semelhante à coleção Landsat primary
para fins de eficiência. Para comparar o horário de aquisição do Landsat com o horário composto do MODIS, que tem um intervalo diário, o filtro compara os pontos finais dos carimbos de data/hora da imagem. A mesclagem é definida com o nome da propriedade usada para armazenar a lista de correspondências de cada imagem Landsat (‘terra’
) e o parâmetro opcional para classificar a lista de correspondências pela propriedade system:time_start
.
A inspeção do resultado indica que as imagens na coleção principal têm a propriedade terra
adicionada, que armazena uma lista das imagens MODIS correspondentes.