Per enumerare tutte le corrispondenze tra gli elementi di due raccolte, utilizza un
ee.Join.inner()
. L'output di un join interno è un
FeatureCollection
(anche se unisci un ImageCollection
a un altro ImageCollection
). Ogni elemento nell'output rappresenta una
corrispondenza, in cui gli elementi corrispondenti sono memorizzati in due proprietà dell'elemento. Ad esempio, feature.get('primary')
è l'elemento della raccolta principale corrispondente all'elemento della raccolta secondaria memorizzato in feature.get('secondary')
. È possibile specificare nomi diversi per queste proprietà come argomenti di inner()
, ma ‘primary’
e ‘secondary’
sono i valori predefiniti. Le relazioni one-to-many sono rappresentate
da più elementi nell'output. Se un elemento di una delle raccolte non ha una corrispondente, non è presente nell'output.
Gli esempi di join che utilizzano input ImageCollection
si applicano senza modifiche agli input FeatureCollection
. È anche possibile unire un
FeatureCollection
a un ImageCollection
e viceversa. Considera
il seguente esempio pratico di join interno:
Editor di codice (JavaScript)
// Create the primary collection. var primaryFeatures = ee.FeatureCollection([ ee.Feature(null, {foo: 0, label: 'a'}), ee.Feature(null, {foo: 1, label: 'b'}), ee.Feature(null, {foo: 1, label: 'c'}), ee.Feature(null, {foo: 2, label: 'd'}), ]); // Create the secondary collection. var secondaryFeatures = ee.FeatureCollection([ ee.Feature(null, {bar: 1, label: 'e'}), ee.Feature(null, {bar: 1, label: 'f'}), ee.Feature(null, {bar: 2, label: 'g'}), ee.Feature(null, {bar: 3, label: 'h'}), ]); // Use an equals filter to specify how the collections match. var toyFilter = ee.Filter.equals({ leftField: 'foo', rightField: 'bar' }); // Define the join. var innerJoin = ee.Join.inner('primary', 'secondary'); // Apply the join. var toyJoin = innerJoin.apply(primaryFeatures, secondaryFeatures, toyFilter); // Print the result. print('Inner join toy example:', toyJoin);
import ee import geemap.core as geemap
Colab (Python)
# Create the primary collection. primary_features = ee.FeatureCollection([ ee.Feature(None, {'foo': 0, 'label': 'a'}), ee.Feature(None, {'foo': 1, 'label': 'b'}), ee.Feature(None, {'foo': 1, 'label': 'c'}), ee.Feature(None, {'foo': 2, 'label': 'd'}), ]) # Create the secondary collection. secondary_features = ee.FeatureCollection([ ee.Feature(None, {'bar': 1, 'label': 'e'}), ee.Feature(None, {'bar': 1, 'label': 'f'}), ee.Feature(None, {'bar': 2, 'label': 'g'}), ee.Feature(None, {'bar': 3, 'label': 'h'}), ]) # Use an equals filter to specify how the collections match. toy_filter = ee.Filter.equals(leftField='foo', rightField='bar') # Define the join. inner_join = ee.Join.inner('primary', 'secondary') # Apply the join. toy_join = inner_join.apply(primary_features, secondary_features, toy_filter) # Print the result. display('Inner join toy example:', toy_join)
Nell'esempio precedente, tieni presente che la relazione tra le tabelle è definita nel
filtro, il che indica che i campi ‘foo’
e ‘bar’
sono i
campi di join. Viene quindi specificato e applicato alle raccolte un join interno. Esamina
l'output e osserva che ogni possibile corrispondenza è rappresentata come un
Feature
.
Per un esempio motivato, prendi in considerazione l'unione di oggetti MODIS ImageCollection
. I dati sulla qualità MODIS
a volte vengono archiviati in una raccolta separata dai dati delle immagini, pertanto un join interno è utile per unire le due raccolte al fine di applicare i dati sulla qualità. In questo caso, i tempi di acquisizione delle immagini sono identici, quindi un filtro uguale
gestisce il compito di specificare questa relazione tra le due raccolte:
Editor di codice (JavaScript)
// Make a date filter to get images in this date range. var dateFilter = ee.Filter.date('2014-01-01', '2014-02-01'); // Load a MODIS collection with EVI data. var mcd43a4 = ee.ImageCollection('MODIS/MCD43A4_006_EVI') .filter(dateFilter); // Load a MODIS collection with quality data. var mcd43a2 = ee.ImageCollection('MODIS/006/MCD43A2') .filter(dateFilter); // Define an inner join. var innerJoin = ee.Join.inner(); // Specify an equals filter for image timestamps. var filterTimeEq = ee.Filter.equals({ leftField: 'system:time_start', rightField: 'system:time_start' }); // Apply the join. var innerJoinedMODIS = innerJoin.apply(mcd43a4, mcd43a2, filterTimeEq); // Display the join result: a FeatureCollection. print('Inner join output:', innerJoinedMODIS);
import ee import geemap.core as geemap
Colab (Python)
# Make a date filter to get images in this date range. date_filter = ee.Filter.date('2014-01-01', '2014-02-01') # Load a MODIS collection with EVI data. mcd43a4 = ee.ImageCollection('MODIS/MCD43A4_006_EVI').filter(date_filter) # Load a MODIS collection with quality data. mcd43a2 = ee.ImageCollection('MODIS/006/MCD43A2').filter(date_filter) # Define an inner join. inner_join = ee.Join.inner() # Specify an equals filter for image timestamps. filter_time_eq = ee.Filter.equals( leftField='system:time_start', rightField='system:time_start' ) # Apply the join. inner_joined_modis = inner_join.apply(mcd43a4, mcd43a2, filter_time_eq) # Display the join result: a FeatureCollection. display('Inner join output:', inner_joined_modis)
Per utilizzare le immagini unite nell'output FeatureCollection
,
map()
una funzione di combinazione sull'output. Ad esempio, le immagini corrispondenti possono essere impilate in modo che le bande di qualità vengano aggiunte ai dati delle immagini:
Editor di codice (JavaScript)
// Map a function to merge the results in the output FeatureCollection. var joinedMODIS = innerJoinedMODIS.map(function(feature) { return ee.Image.cat(feature.get('primary'), feature.get('secondary')); }); // Print the result of merging. print('Inner join, merged bands:', joinedMODIS);
import ee import geemap.core as geemap
Colab (Python)
# Map a function to merge the results in the output FeatureCollection. joined_modis = inner_joined_modis.map( lambda feature: ee.Image.cat( feature.get('primary'), feature.get('secondary') ) ) # Print the result of merging. display("Inner join, merged 'bands':", joined_modis)
Sebbene questa funzione sia mappata su un FeatureCollection
, il risultato è un
ImageCollection
. Ogni immagine in ImageCollection
risultante contiene tutte le bande delle immagini nella raccolta principale (in questo esempio solo
‘EVI’
) e tutte le bande dell'immagine corrispondente nella raccolta secondaria
(le bande di qualità).