Внутренние соединения

Чтобы перечислить все совпадения между элементами двух коллекций, используйте ee.Join.inner() . Результатом внутреннего соединения является FeatureCollection (даже если одно ImageCollection объединяется с другим ImageCollection ). Каждый объект в выходных данных представляет собой совпадение, при этом совпадающие элементы хранятся в двух свойствах объекта. Например, feature.get('primary') — это элемент в основной коллекции, который соответствует элементу из вторичной коллекции, хранящейся в feature.get('secondary') . (Различные имена для этих свойств могут быть указаны в качестве аргументов для inner() , но значения по умолчанию — 'primary' и 'secondary' ). Отношения «один-ко-многим» представлены в выходных данных несколькими функциями. Если элемент в любой коллекции не имеет совпадения, он отсутствует в выходных данных.

Примеры объединения с использованием входных данных ImageCollection применяются без изменений к входным данным FeatureCollection . Также возможно присоединить FeatureCollection к ImageCollection и наоборот. Рассмотрим следующий игрушечный пример внутреннего соединения:

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

Настройка Python

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

import ee
import geemap.core as geemap

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

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

Обратите внимание, что в предыдущем примере связь между таблицами определяется в фильтре, который указывает, что поля 'foo' и 'bar' являются полями соединения. Затем указывается внутреннее соединение и применяется к коллекциям. Проверьте выходные данные и обратите внимание, что каждое возможное совпадение представлено как одна Feature .

В качестве мотивированного примера рассмотрим объединение объектов MODIS ImageCollection . Данные о качестве MODIS иногда хранятся в отдельной коллекции от данных изображения, поэтому внутреннее объединение удобно для объединения двух коллекций с целью применения данных о качестве. В этом случае время получения изображения идентично, поэтому фильтр равенства выполняет задание по указанию связи между двумя коллекциями:

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

Настройка Python

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

import ee
import geemap.core as geemap

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

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

Чтобы использовать объединенные изображения в выходной FeatureCollection , map() функцию объединения к выходным данным. Например, совпадающие изображения можно объединить так, чтобы к данным изображения добавлялись полосы качества:

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

Настройка Python

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

import ee
import geemap.core as geemap

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

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

Хотя эта функция отображается на FeatureCollection , результатом является ImageCollection . Каждое изображение в результирующей ImageCollection имеет все полосы изображений в основной коллекции (в этом примере только 'EVI' ) и все полосы соответствующего изображения во вторичной коллекции (полосы качества).