Jointures internes

Pour énumérer toutes les correspondances entre les éléments de deux collections, utilisez un ee.Join.inner(). La sortie d'une jointure interne est un FeatureCollection (même si vous associez un ImageCollection à un autre ImageCollection). Chaque élément de la sortie représente une correspondance, où les éléments correspondants sont stockés dans deux propriétés de l'élément. Par exemple, feature.get('primary') est l'élément de la collection principale qui correspond à l'élément de la collection secondaire stocké dans feature.get('secondary'). (Des noms différents pour ces propriétés peuvent être spécifiés en tant qu'arguments de inner(), mais ‘primary’ et ‘secondary’ sont les valeurs par défaut.) Les relations de type un à plusieurs sont représentées par plusieurs éléments géographiques dans la sortie. Si un élément de l'une des collections ne correspond à aucun élément de l'autre, il n'est pas présent dans la sortie.

Les exemples de jointure utilisant des entrées ImageCollection s'appliquent sans modification aux entrées FeatureCollection. Vous pouvez également joindre un FeatureCollection à un ImageCollection et inversement. Prenons l'exemple suivant d'une jointure interne:

Éditeur de code (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);

Configuration de Python

Consultez la page Environnement Python pour en savoir plus sur l'API Python et l'utilisation de geemap pour le développement interactif.

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)

Dans l'exemple précédent, notez que la relation entre les tables est définie dans le filtre, ce qui indique que les champs ‘foo’ et ‘bar’ sont les champs de jointure. Une jointure interne est ensuite spécifiée et appliquée aux collections. Examinez la sortie et observez que chaque correspondance possible est représentée par un Feature.

Pour un exemple concret, considérez la jointure d'objets ImageCollection MODIS. Les données de qualité MODIS sont parfois stockées dans une collection distincte des données d'image. Une jointure interne est donc pratique pour joindre les deux collections afin d'appliquer les données de qualité. Dans ce cas, les heures d'acquisition des images sont identiques. Un filtre d'égalité s'occupe donc de spécifier cette relation entre les deux collections:

Éditeur de code (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);

Configuration de Python

Consultez la page Environnement Python pour en savoir plus sur l'API Python et l'utilisation de geemap pour le développement interactif.

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)

Pour utiliser les images jointes dans la sortie FeatureCollection, map() une fonction de combinaison sur la sortie. Par exemple, les images correspondantes peuvent être empilées de sorte que les bandes de qualité soient ajoutées aux données d'image:

Éditeur de code (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);

Configuration de Python

Consultez la page Environnement Python pour en savoir plus sur l'API Python et l'utilisation de geemap pour le développement interactif.

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)

Bien que cette fonction soit mappée sur un FeatureCollection, le résultat est un ImageCollection. Chaque image de l'ImageCollection générée contient toutes les bandes des images de la collection principale (dans cet exemple, uniquement ‘EVI’) et toutes les bandes de l'image correspondante dans la collection secondaire (les bandes de qualité).