Inner Joins

Wenn Sie alle Übereinstimmungen zwischen den Elementen zweier Sammlungen auflisten möchten, verwenden Sie einen ee.Join.inner(). Die Ausgabe eines inneren Joins ist ein FeatureCollection, auch wenn eine ImageCollection mit einer anderen ImageCollection verknüpft wird. Jedes Element in der Ausgabe stellt eine Übereinstimmung dar, wobei die übereinstimmenden Elemente in zwei Eigenschaften des Elements gespeichert werden. feature.get('primary') ist beispielsweise das Element in der primären Sammlung, das mit dem Element aus der sekundären Sammlung übereinstimmt, das in feature.get('secondary') gespeichert ist. (Andere Namen für diese Properties können als Argumente für inner() angegeben werden, ‘primary’ und ‘secondary’ sind jedoch die Standardwerte.) 1:n-Beziehungen werden in der Ausgabe durch mehrere Elemente dargestellt. Wenn ein Element in einer der Sammlungen keine Übereinstimmung hat, ist es nicht in der Ausgabe enthalten.

Beispiele für Zusammenführungen mit ImageCollection-Eingängen gelten ohne Änderung für FeatureCollection-Eingänge. Es ist auch möglich, eine FeatureCollection mit einer ImageCollection zu verbinden und umgekehrt. Betrachten Sie das folgende Beispiel für einen inneren Join:

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

Auf der Seite Python-Umgebung finden Sie Informationen zur Python API und zur Verwendung von geemap für die interaktive Entwicklung.

import ee
import geemap.core as geemap
# 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)

Beachten Sie im vorherigen Beispiel, dass die Beziehung zwischen den Tabellen im Filter definiert ist. Das bedeutet, dass die Felder ‘foo’ und ‘bar’ die Zusammenführungsfelder sind. Anschließend wird ein innerer Join angegeben und auf die Sammlungen angewendet. Sehen Sie sich die Ausgabe an. Jede mögliche Übereinstimmung wird durch einen Feature dargestellt.

Ein Beispiel für ein sinnvolles Beispiel wäre das Zusammenführen von MODIS-ImageCollection-Objekten. MODIS-Qualitätsdaten werden manchmal in einer separaten Sammlung von den Bilddaten gespeichert. Daher ist ein innerer Join eine praktische Möglichkeit, die beiden Sammlungen zu verknüpfen, um die Qualitätsdaten anzuwenden. In diesem Fall sind die Aufnahmezeiten der Bilder identisch. Daher wird diese Beziehung zwischen den beiden Sammlungen mit einem Gleichheitsfilter angegeben:

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

Auf der Seite Python-Umgebung finden Sie Informationen zur Python API und zur Verwendung von geemap für die interaktive Entwicklung.

import ee
import geemap.core as geemap
# 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)

Wenn Sie die zusammengeführten Bilder in der Ausgabe verwenden möchten, FeatureCollection, map() eine Kombinationsfunktion über die Ausgabe. Die übereinstimmenden Bilder können beispielsweise so übereinander gelegt werden, dass die Qualitätsbänder den Bilddaten hinzugefügt werden:

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

Auf der Seite Python-Umgebung finden Sie Informationen zur Python API und zur Verwendung von geemap für die interaktive Entwicklung.

import ee
import geemap.core as geemap
# 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)

Obwohl diese Funktion einem FeatureCollection zugeordnet ist, ist das Ergebnis ein ImageCollection. Jedes Bild in der resultierenden ImageCollection hat alle Bänder der Bilder in der primären Sammlung (in diesem Beispiel nur ‘EVI’) und alle Bänder des übereinstimmenden Bildes in der sekundären Sammlung (die Qualitätsbänder).