공지사항:
2025년 4월 15일 전에 Earth Engine 사용을 위해 등록된 모든 비상업용 프로젝트는 Earth Engine 액세스를 유지하기 위해
비상업용 자격 요건을 인증해야 합니다.
내부 조인
컬렉션을 사용해 정리하기
내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요.
두 컬렉션의 요소 간에 일치하는 항목을 모두 열거하려면 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 및 대화형 개발을 위한 geemap
사용에 관한 자세한 내용은
Python 환경 페이지를 참고하세요.
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’
가 조인 필드임을 나타냅니다. 그런 다음 내부 조인이 지정되고 컬렉션에 적용됩니다. 출력을 검사하고 가능한 각 일치가 하나의 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 및 대화형 개발을 위한 geemap
사용에 관한 자세한 내용은
Python 환경 페이지를 참고하세요.
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()
을 사용합니다. 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 및 대화형 개발을 위한 geemap
사용에 관한 자세한 내용은
Python 환경 페이지를 참고하세요.
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’
만 해당)의 이미지에 있는 모든 밴드와 보조 컬렉션의 일치하는 이미지에 있는 모든 밴드(품질 밴드)가 있습니다.
달리 명시되지 않는 한 이 페이지의 콘텐츠에는 Creative Commons Attribution 4.0 라이선스에 따라 라이선스가 부여되며, 코드 샘플에는 Apache 2.0 라이선스에 따라 라이선스가 부여됩니다. 자세한 내용은 Google Developers 사이트 정책을 참조하세요. 자바는 Oracle 및/또는 Oracle 계열사의 등록 상표입니다.
최종 업데이트: 2025-07-25(UTC)
[null,null,["최종 업데이트: 2025-07-25(UTC)"],[[["\u003cp\u003e\u003ccode\u003eee.Join.inner()\u003c/code\u003e is used to find all matches between elements in two collections, producing a \u003ccode\u003eFeatureCollection\u003c/code\u003e as output.\u003c/p\u003e\n"],["\u003cp\u003eEach feature in the output \u003ccode\u003eFeatureCollection\u003c/code\u003e represents a match, with 'primary' and 'secondary' properties holding the matching elements.\u003c/p\u003e\n"],["\u003cp\u003eFilters define the relationship between collections for the join, such as matching image timestamps or specific feature properties.\u003c/p\u003e\n"],["\u003cp\u003eThe output \u003ccode\u003eFeatureCollection\u003c/code\u003e can be processed further, for instance by combining matched images into a single image with \u003ccode\u003emap()\u003c/code\u003e.\u003c/p\u003e\n"],["\u003cp\u003eInner joins can be applied to \u003ccode\u003eImageCollection\u003c/code\u003e and \u003ccode\u003eFeatureCollection\u003c/code\u003e inputs, enabling operations like merging MODIS image and quality data.\u003c/p\u003e\n"]]],["To enumerate matches between two collections, use `ee.Join.inner()`, which outputs a `FeatureCollection`. Each feature represents a match, storing elements from the primary and secondary collections in properties named 'primary' and 'secondary'. Use `ee.Filter.equals()` to define how collections match. The `innerJoin.apply()` joins collections. Matching elements that are not present in the filter will not appear in the output. Joined features can be merged into an `ImageCollection` by mapping a function that combines matched images.\n"],null,["# Inner Joins\n\nTo enumerate all matches between the elements of two collections, use an\n`ee.Join.inner()`. The output of an inner join is a\n`FeatureCollection` (even if joining one `ImageCollection`\nto another `ImageCollection`). Each feature in the output represents a\nmatch, where the matching elements are stored in two properties of the feature. For\nexample, `feature.get('primary')` is the element in the primary collection\nthat matches the element from the secondary collection stored in\n`feature.get('secondary')`. (Different names for these properties can be\nspecified as arguments to `inner()`, but `'primary'` and\n`'secondary'` are the defaults). One-to-many relationships are represented\nby multiple features in the output. If an element in either collection doesn't have a\nmatch, it is not present in the output.\n\nJoin examples using `ImageCollection` inputs apply without modification to\n`FeatureCollection` inputs. It is also possible to join a\n`FeatureCollection` to an `ImageCollection` and vice versa. Consider\nthe following toy example of inner join:\n\n### Code Editor (JavaScript)\n\n```javascript\n// Create the primary collection.\nvar primaryFeatures = ee.FeatureCollection([\n ee.Feature(null, {foo: 0, label: 'a'}),\n ee.Feature(null, {foo: 1, label: 'b'}),\n ee.Feature(null, {foo: 1, label: 'c'}),\n ee.Feature(null, {foo: 2, label: 'd'}),\n]);\n\n// Create the secondary collection.\nvar secondaryFeatures = ee.FeatureCollection([\n ee.Feature(null, {bar: 1, label: 'e'}),\n ee.Feature(null, {bar: 1, label: 'f'}),\n ee.Feature(null, {bar: 2, label: 'g'}),\n ee.Feature(null, {bar: 3, label: 'h'}),\n]);\n\n// Use an equals filter to specify how the collections match.\nvar toyFilter = ee.Filter.equals({\n leftField: 'foo',\n rightField: 'bar'\n});\n\n// Define the join.\nvar innerJoin = ee.Join.inner('primary', 'secondary');\n\n// Apply the join.\nvar toyJoin = innerJoin.apply(primaryFeatures, secondaryFeatures, toyFilter);\n\n// Print the result.\nprint('Inner join toy example:', toyJoin);\n```\nPython setup\n\nSee the [Python Environment](/earth-engine/guides/python_install) page for information on the Python API and using\n`geemap` for interactive development. \n\n```python\nimport ee\nimport geemap.core as geemap\n```\n\n### Colab (Python)\n\n```python\n# Create the primary collection.\nprimary_features = ee.FeatureCollection([\n ee.Feature(None, {'foo': 0, 'label': 'a'}),\n ee.Feature(None, {'foo': 1, 'label': 'b'}),\n ee.Feature(None, {'foo': 1, 'label': 'c'}),\n ee.Feature(None, {'foo': 2, 'label': 'd'}),\n])\n\n# Create the secondary collection.\nsecondary_features = ee.FeatureCollection([\n ee.Feature(None, {'bar': 1, 'label': 'e'}),\n ee.Feature(None, {'bar': 1, 'label': 'f'}),\n ee.Feature(None, {'bar': 2, 'label': 'g'}),\n ee.Feature(None, {'bar': 3, 'label': 'h'}),\n])\n\n# Use an equals filter to specify how the collections match.\ntoy_filter = ee.Filter.equals(leftField='foo', rightField='bar')\n\n# Define the join.\ninner_join = ee.Join.inner('primary', 'secondary')\n\n# Apply the join.\ntoy_join = inner_join.apply(primary_features, secondary_features, toy_filter)\n\n# Print the result.\ndisplay('Inner join toy example:', toy_join)\n```\n\nIn the previous example, notice that the relationship between the tables is defined in the\nfilter, which indicates that fields `'foo'` and `'bar'` are the\njoin fields. An inner join is then specified and applied to the collections. Inspect\nthe output and observe that each possible match is represented as one\n`Feature`.\n\nFor a motivated example, consider joining MODIS `ImageCollection` objects. MODIS\nquality data are sometimes stored in a separate collection from the image data, so an\ninner join is convenient for joining the two collections in order to apply the quality\ndata. In this case, the image acquisition times are identical, so an equals filter\nhandles the job of specifying this relationship between the two collections:\n\n### Code Editor (JavaScript)\n\n```javascript\n// Make a date filter to get images in this date range.\nvar dateFilter = ee.Filter.date('2014-01-01', '2014-02-01');\n\n// Load a MODIS collection with EVI data.\nvar mcd43a4 = ee.ImageCollection('MODIS/MCD43A4_006_EVI')\n .filter(dateFilter);\n\n// Load a MODIS collection with quality data.\nvar mcd43a2 = ee.ImageCollection('MODIS/006/MCD43A2')\n .filter(dateFilter);\n\n// Define an inner join.\nvar innerJoin = ee.Join.inner();\n\n// Specify an equals filter for image timestamps.\nvar filterTimeEq = ee.Filter.equals({\n leftField: 'system:time_start',\n rightField: 'system:time_start'\n});\n\n// Apply the join.\nvar innerJoinedMODIS = innerJoin.apply(mcd43a4, mcd43a2, filterTimeEq);\n\n// Display the join result: a FeatureCollection.\nprint('Inner join output:', innerJoinedMODIS);\n```\nPython setup\n\nSee the [Python Environment](/earth-engine/guides/python_install) page for information on the Python API and using\n`geemap` for interactive development. \n\n```python\nimport ee\nimport geemap.core as geemap\n```\n\n### Colab (Python)\n\n```python\n# Make a date filter to get images in this date range.\ndate_filter = ee.Filter.date('2014-01-01', '2014-02-01')\n\n# Load a MODIS collection with EVI data.\nmcd43a4 = ee.ImageCollection('MODIS/MCD43A4_006_EVI').filter(date_filter)\n\n# Load a MODIS collection with quality data.\nmcd43a2 = ee.ImageCollection('MODIS/006/MCD43A2').filter(date_filter)\n\n# Define an inner join.\ninner_join = ee.Join.inner()\n\n# Specify an equals filter for image timestamps.\nfilter_time_eq = ee.Filter.equals(\n leftField='system:time_start', rightField='system:time_start'\n)\n\n# Apply the join.\ninner_joined_modis = inner_join.apply(mcd43a4, mcd43a2, filter_time_eq)\n\n# Display the join result: a FeatureCollection.\ndisplay('Inner join output:', inner_joined_modis)\n```\n\nTo make use of the joined images in the output `FeatureCollection`,\n`map()` a combining function over the output. For example, the matching\nimages can be stacked together such that the quality bands are added to the image data:\n\n### Code Editor (JavaScript)\n\n```javascript\n// Map a function to merge the results in the output FeatureCollection.\nvar joinedMODIS = innerJoinedMODIS.map(function(feature) {\n return ee.Image.cat(feature.get('primary'), feature.get('secondary'));\n});\n\n// Print the result of merging.\nprint('Inner join, merged bands:', joinedMODIS);\n```\nPython setup\n\nSee the [Python Environment](/earth-engine/guides/python_install) page for information on the Python API and using\n`geemap` for interactive development. \n\n```python\nimport ee\nimport geemap.core as geemap\n```\n\n### Colab (Python)\n\n```python\n# Map a function to merge the results in the output FeatureCollection.\njoined_modis = inner_joined_modis.map(\n lambda feature: ee.Image.cat(\n feature.get('primary'), feature.get('secondary')\n )\n)\n\n# Print the result of merging.\ndisplay(\"Inner join, merged 'bands':\", joined_modis)\n```\n\nAlthough this function is mapped over a `FeatureCollection`, the result is an\n`ImageCollection`. Each image in the resultant `ImageCollection`\nhas all the bands of the images in the primary collection (in this example just\n`'EVI'`) and all the bands of the matching image in the secondary collection\n(the quality bands)."]]