Simpan Semua Join

Menyimpan join adalah salah satu cara untuk merepresentasikan hubungan one-to-many di Earth Engine. Tidak seperti inner join, join penyimpanan menyimpan kecocokan dari koleksi secondary sebagai properti bernama dari fitur dalam koleksi primary. Untuk menyimpan semua kecocokan tersebut, gunakan ee.Join.saveAll(). Jika ada hubungan satu-ke-banyak, join saveAll() akan menyimpan semua fitur yang cocok sebagai ee.List. Elemen yang tidak cocok dalam koleksi primary akan dihapus. Misalnya, Anda perlu mendapatkan semua citra MODIS yang diperoleh dalam waktu dua hari dari setiap citra Landsat dalam koleksi. Contoh ini menggunakan join saveAll() untuk tujuan tersebut:

Editor Kode (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);

Penyiapan Python

Lihat halaman Lingkungan Python untuk mengetahui informasi tentang Python API dan penggunaan geemap untuk pengembangan interaktif.

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

Dalam contoh ini, perhatikan bahwa koleksi MODIS secondary difilter terlebih dahulu agar secara kronologis mirip dengan koleksi Landsat primary untuk efisiensi. Untuk membandingkan waktu akuisisi Landsat dengan waktu gabungan MODIS, yang memiliki rentang harian, filter membandingkan endpoint stempel waktu gambar. Penggabungan ditentukan dengan nama properti yang digunakan untuk menyimpan daftar kecocokan untuk setiap gambar Landsat (‘terra’) dan parameter opsional untuk mengurutkan daftar kecocokan menurut properti system:time_start

Pemeriksaan hasil menunjukkan bahwa gambar dalam koleksi utama memiliki properti terra tambahan yang menyimpan daftar gambar MODIS yang cocok.