Сохранить все соединения

Сохранение соединений — это один из способов представления отношений «один ко многим» в Earth Engine. В отличие от внутреннего соединения , сохраняющее соединение сохраняет совпадения из secondary коллекции как именованное свойство объектов в primary коллекции. Чтобы сохранить все такие совпадения, используйте ee.Join.saveAll() . Если существует связь «один ко многим», соединение saveAll() сохраняет все соответствующие функции как ee.List . Несовпадающие элементы в primary коллекции удаляются. Например, предположим, что необходимо получить все изображения MODIS, полученные в течение двух дней для каждого изображения Landsat в коллекции. В этом примере для этой цели используется соединение saveAll() :

Редактор кода (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: MODIS imagery.
var modSecondary = ee.ImageCollection('MODIS/006/MOD09GA')
    .filterDate('2014-03-01', '2014-07-01');

// Define an allowable time difference: two days in milliseconds.
var twoDaysMillis = 2 * 24 * 60 * 60 * 1000;

// Create a time filter to define a match as overlapping timestamps.
var timeFilter = ee.Filter.or(
  ee.Filter.maxDifference({
    difference: twoDaysMillis,
    leftField: 'system:time_start',
    rightField: 'system:time_end'
  }),
  ee.Filter.maxDifference({
    difference: twoDaysMillis,
    leftField: 'system:time_end',
    rightField: 'system:time_start'
  })
);

// Define the join.
var saveAllJoin = ee.Join.saveAll({
  matchesKey: 'terra',
  ordering: 'system:time_start',
  ascending: true
});

// Apply the join.
var landsatModis = saveAllJoin.apply(primary, modSecondary, timeFilter);

// Display the result.
print('Join.saveAll:', landsatModis);

Настройка 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: MODIS imagery.
mod_secondary = ee.ImageCollection('MODIS/006/MOD09GA').filterDate(
    '2014-03-01', '2014-07-01'
)

# Define an allowable time difference: two days in milliseconds.
two_days_millis = 2 * 24 * 60 * 60 * 1000

# Create a time filter to define a match as overlapping timestamps.
time_filter = ee.Filter.Or(
    ee.Filter.maxDifference(
        difference=two_days_millis,
        leftField='system:time_start',
        rightField='system:time_end',
    ),
    ee.Filter.maxDifference(
        difference=two_days_millis,
        leftField='system:time_end',
        rightField='system:time_start',
    ),
)

# Define the join.
save_all_join = ee.Join.saveAll(
    matchesKey='terra', ordering='system:time_start', ascending=True
)

# Apply the join.
landsat_modis = save_all_join.apply(primary, mod_secondary, time_filter)

# Display the result.
display('Join.saveAll:', landsat_modis)

В этом примере обратите внимание, что secondary коллекция MODIS предварительно фильтруется, чтобы быть хронологически похожей на primary коллекцию Landsat для повышения эффективности. Чтобы сравнить время сбора данных Landsat с составным временем MODIS, которое имеет дневной диапазон, фильтр сравнивает конечные точки временных меток изображения. Соединение определяется именем свойства, используемого для хранения списка совпадений для каждого изображения Landsat ( 'terra' ), и необязательным параметром для сортировки списка совпадений по свойству system:time_start

Проверка результата показывает, что изображения в основной коллекции имеют добавленное свойство terra , в котором хранится список соответствующих изображений MODIS.