Чтобы сохранить только лучшее совпадение для каждого элемента коллекции, используйте 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);
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, соответствующих условию в фильтре.