Uniones Save-Best

Para guardar solo la mejor coincidencia para cada elemento de una colección, usa un ee.Join.saveBest(). La unión saveBest() funciona de una manera equivalente a la unión saveAll(), excepto por cada elemento de la colección primary, ya que guarda el elemento de la colección secondary con la mejor coincidencia. Se descartan los elementos que no coinciden en la colección principal. Supongamos que la intención es encontrar una imagen meteorológica más cercana en el tiempo a cada imagen de Landsat en la colección primary. Para realizar esta unión, se debe redefinir ee.Filter para una sola condición de unión (los filtros combinados no funcionarán con saveBest(), ya que es ambiguo cómo combinar las clasificaciones de varios subfiltros):

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: GRIDMET meteorological data
var gridmet = ee.ImageCollection('IDAHO_EPSCOR/GRIDMET');

// Define a max difference filter to compare timestamps.
var maxDiffFilter = ee.Filter.maxDifference({
  difference: 2 * 24 * 60 * 60 * 1000,
  leftField: 'system:time_start',
  rightField: 'system:time_start'
});

// Define the join.
var saveBestJoin = ee.Join.saveBest({
  matchKey: 'bestImage',
  measureKey: 'timeDiff'
});

// Apply the join.
var landsatMet = saveBestJoin.apply(primary, gridmet, maxDiffFilter);

// Print the result.
print(landsatMet);

Configuración de Python

Consulta la página Entorno de Python para obtener información sobre la API de Python y el uso de geemap para el desarrollo interactivo.

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: GRIDMET meteorological data
gridmet = ee.ImageCollection('IDAHO_EPSCOR/GRIDMET')

# Define a max difference filter to compare timestamps.
max_diff_filter = ee.Filter.maxDifference(
    difference=2 * 24 * 60 * 60 * 1000,
    leftField='system:time_start',
    rightField='system:time_start',
)

# Define the join.
save_best_join = ee.Join.saveBest(matchKey='bestImage', measureKey='timeDiff')

# Apply the join.
landsat_met = save_best_join.apply(primary, gridmet, max_diff_filter)

# Print the result.
display(landsat_met)

Ten en cuenta que una unión saveBest() define el nombre de la propiedad con la que se almacenará la mejor coincidencia (‘bestImage’) y el nombre de la propiedad con la que se almacenará la calidad de la métrica de coincidencia (‘timeDiff’). La inspección de los resultados indica que se agregó una imagen DAYMET coincidente a la propiedad bestImage para cada escena de Landsat en la colección primary. Cada una de estas imágenes de DAYMET tiene la propiedad timeDiff que indica la diferencia de tiempo en milisegundos entre la imagen de DAYMET y la de Landsat, que será la mínima entre las imágenes de DAYMET que superen la condición del filtro.