Сохранить-лучшие соединения

Чтобы сохранить только лучшее совпадение для каждого элемента коллекции, используйте ee.Join.saveBest() . Функция соединения saveBest() аналогична функции соединения saveAll() , за исключением того, что для каждого элемента в primary коллекции сохраняется элемент из secondary коллекции, имеющий наилучшее соответствие. Несовпадающие элементы в основной коллекции удаляются. Предположим, что намерение состоит в том, чтобы найти метеорологическое изображение, наиболее близкое по времени к каждому изображению Landsat в primary коллекции. Чтобы выполнить это соединение, ee.Filter должен быть переопределен для одного условия соединения (комбинированные фильтры не будут работать с saveBest() , поскольку неясно, как объединять ранги из нескольких подфильтров):

Редактор кода (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);

Настройка Python

См. страницу «Среда Python» для получения информации об API Python и использовании geemap для интерактивной разработки.

import ee
import geemap.core as geemap

Колаб (Питон)

# 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)

Обратите внимание, что соединение saveBest() определяет имя свойства, в котором будет храниться наилучшее совпадение ( 'bestImage' ), и имя свойства, в котором будет храниться качество метрики совпадения ( 'timeDiff' ). Проверка результатов показывает, что соответствующее изображение DAYMET было добавлено в свойство bestImage для каждой сцены Landsat в primary коллекции. Каждое из этих изображений DAYMET имеет свойство timeDiff указывающее разницу во времени в миллисекундах между изображением DAYMET и изображением Landsat, которая будет минимальной среди изображений DAYMET, соответствующих условию в фильтре.