2 つのコレクションの要素間のすべての一致を列挙するには、ee.Join.inner()
を使用します。内側結合の出力は FeatureCollection
です(1 つの ImageCollection
を別の ImageCollection
に結合する場合でも同様です)。出力の各特徴は一致を表します。一致する要素は、特徴の 2 つのプロパティに保存されます。たとえば、feature.get('primary')
は、feature.get('secondary')
に保存されているセカンダリ コレクションの要素と一致するプライマリ コレクションの要素です。(これらのプロパティに異なる名前を inner()
の引数として指定できますが、デフォルトは ‘primary’
と ‘secondary’
です)。1 対多の関係は、出力内の複数の特徴で表されます。どちらかのコレクションの要素に一致するものがない場合、その要素は出力に含まれません。
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);
import ee import geemap.core as geemap
Colab(Python)
# 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’
が結合フィールドであることを示しています。次に、内部結合を指定してコレクションに適用します。出力を調べて、考えられる各一致が 1 つの Feature
として表されていることを確認します。
具体的な例として、MODIS ImageCollection
オブジェクトの結合について考えてみましょう。MODIS 品質データは画像データとは別のコレクションに保存されていることがあるため、品質データを適用するために 2 つのコレクションを結合する場合は、内部結合が便利です。この場合、画像の取得時間は同じであるため、2 つのコレクション間のこの関係を指定するのは等価フィルタです。
コードエディタ(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);
import ee import geemap.core as geemap
Colab(Python)
# 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);
import ee import geemap.core as geemap
Colab(Python)
# 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’
のみ)と、セカンダリ コレクション内の一致する画像のすべてのバンド(品質バンド)が含まれています。