물 전환 레이어는 물 발생의 세 가지 클래스 (물 아님, 계절성 물, 영구적인 물) 간의 변화와 함께 일시적인 물 (일시적인 영구 및 일시적인 계절)에 대한 두 가지 추가 클래스를 포착합니다.
튜토리얼의 이 섹션에서는 다음을 수행합니다.
- 물 전환을 시각화하는 지도 레이어를 추가합니다.
- 지정된 관심 영역 내에서 각 전환 클래스의 영역을 합산하기 위한 그룹화된 리듀서를 만듭니다.
- 전환 클래스별로 영역을 요약하는 차트를 만듭니다.
기본 시각화
스크립트의 애셋 목록 섹션에서 transition
라는 단일 밴드 이미지 객체를 만드는 다음 문을 추가합니다.
코드 편집기 (JavaScript)
var transition = gsw.select('transition');
GSW 이미지에는 전환 클래스 번호와 이름에 관한 메타데이터와 전환 클래스 스타일 지정용 기본 팔레트가 포함되어 있습니다. 전환 레이어가 지도에 추가되면 이러한 시각화 매개변수가 자동으로 사용됩니다.
스크립트의 지도 레이어 섹션 하단에 전환 클래스를 표시하는 새 지도 레이어를 추가하는 다음 문을 추가합니다.
코드 편집기 (JavaScript)
Map.setCenter(105.26, 11.2134, 9); // Mekong River Basin, SouthEast Asia Map.addLayer({ eeObject: transition, name: 'Transition classes (1984-2015)', });
스크립트를 실행하면 전환 레이어가 표시됩니다.

전환 클래스의 맵 키는 다음과 같습니다.
값 | 기호 | 라벨 |
---|---|---|
0 | 물 아님 | |
1 | 영구 | |
2 | 새 영구 | |
3 | 영구 손실 | |
4 | 계절별 | |
5 | 새 시즌 | |
6 | 시즌성 손실 | |
7 | 시즌성에서 영구로 | |
8 | 영구에서 시즌으로 | |
9 | 임시 영구 | |
10 | 휘발성 시즌 |
전환 클래스별 영역 요약
이 섹션에서는 다시 한번 기하학적 다각형 도구를 사용하여 관심 영역을 정의합니다. 새 위치를 분석하려면 먼저 그린 원래 다각형을 선택하고 삭제하여 결합된 영역의 결과가 표시되지 않도록 해야 합니다. 지오메트리 수정 방법에 대한 자세한 내용은 코드 편집기 문서의 지오메트리 도구 섹션을 참고하세요.
이 예에서는 메콩강 삼각주 내에 새 다각형을 그립니다.

이미지의 일부가 차지하는 면적을 계산하기 위해 ee.Image.pixelArea 메서드를 사용하여 각 픽셀의 크기를 제곱미터로 식별하는 추가 밴드를 전환 이미지 객체에 추가합니다.
코드 편집기 (JavaScript)
var area_image_with_transition_class = ee.Image.pixelArea().addBands(transition);
결과 이미지 객체 (area_image_with_transition_class
)는 2밴드 이미지로, 첫 번째 밴드에는 제곱미터 단위의 영역 정보(
ee.Image.pixelArea
code>
메서드로 생성됨)가 포함되고 두 번째 밴드에는 전환 클래스 정보가 포함됩니다.
그런 다음
ee.Image.reduceRegion
메서드와 각 전환 클래스 내의 영역을 합산하는 역할을 하는
그룹화된 리듀서
를 사용하여 관심 영역 (roi
) 내의 클래스 전환을 요약합니다.
코드 편집기 (JavaScript)
var reduction_results = area_image_with_transition_class.reduceRegion({ reducer: ee.Reducer.sum().group({ groupField: 1, groupName: 'transition_class_value', }), geometry: roi, scale: 30, bestEffort: true, }); print('reduction_results', reduction_results);
이제 콘솔 탭 출력에 reduction_results
이 표시됩니다. 지역 요약 데이터를 보려면 트리를 몇 단계 확장해야 합니다.

reduction_results
객체에는 각 전환 클래스에서 다루는 영역에 관한 정보가 포함되어 있지만 읽기가 쉽지는 않습니다. 다음 섹션에서는 결과를 더 쉽게 볼 수 있도록 하겠습니다.
요약 차트 만들기
이 섹션에서는 결과를 더 잘 요약하기 위해 차트를 만듭니다. 시작하려면 먼저 다음과 같이 영역이 있는 전환 클래스 목록을 추출합니다.
코드 편집기 (JavaScript)
var roi_stats = ee.List(reduction_results.get('groups'));
그룹화된 리듀서 (reduction_results
)의 결과는 사전 목록이 포함된 사전입니다.
목록에는 각 전환 클래스에 대한 사전이 하나씩 있습니다.
이러한 문은
ee.Dictionary.get
메서드를 사용하여 그룹화된 리듀서 결과를 해당 사전에서 추출하고 결과를 ee.List 데이터 유형으로 변환하므로 개별 사전에 액세스할 수 있습니다.
코드 편집기의 차트 작성 기능을 사용하기 위해 필요한 정보가 포함된 FeatureCollection을 빌드합니다. 이를 위해 먼저 두 개의 조회 사전과 두 개의 도우미 함수를 만듭니다. 조회 사전을 만드는 코드는 다음과 같이 '계산' 섹션의 상단에 배치할 수 있습니다.
코드 편집기 (JavaScript)
////////////////////////////////////////////////////////////// // Calculations ////////////////////////////////////////////////////////////// // Create a dictionary for looking up names of transition classes. var lookup_names = ee.Dictionary.fromLists( ee.List(gsw.get('transition_class_values')).map(numToString), gsw.get('transition_class_names') ); // Create a dictionary for looking up colors of transition classes. var lookup_palette = ee.Dictionary.fromLists( ee.List(gsw.get('transition_class_values')).map(numToString), gsw.get('transition_class_palette') );
lookup_names
사전은 전환 클래스 값을 이름과 연결하고 lookup_palette
사전은 전환 클래스 값을 색상 정의와 연결합니다.
두 도우미 함수는 '도우미 함수'라는 새 코드 섹션에 배치할 수 있습니다.
코드 편집기 (JavaScript)
////////////////////////////////////////////////////////////// // Helper functions ////////////////////////////////////////////////////////////// // Create a feature for a transition class that includes the area covered. function createFeature(transition_class_stats) { transition_class_stats = ee.Dictionary(transition_class_stats); var class_number = transition_class_stats.get('transition_class_value'); var result = { transition_class_number: class_number, transition_class_name: lookup_names.get(class_number), transition_class_palette: lookup_palette.get(class_number), area_m2: transition_class_stats.get('sum') }; return ee.Feature(null, result); // Creates a feature without a geometry. } // Create a JSON dictionary that defines piechart colors based on the // transition class palette. // https://developers.google.com/chart/interactive/docs/gallery/piechart function createPieChartSliceDictionary(fc) { return ee.List(fc.aggregate_array("transition_class_palette")) .map(function(p) { return {'color': p}; }).getInfo(); } // Convert a number to a string. Used for constructing dictionary key lists // from computed number objects. function numToString(num) { return ee.Number(num).format(); }
createFeature
함수는 영역과 물 전환 클래스가 포함된 사전을 가져와 차트에 적합한 Feature를 반환합니다.
createPieChartSliceDictionary
함수는 파이 차트에서 예상하는 형식을 사용하여 전환 클래스에 해당하는 색상 목록을 만듭니다.
다음으로 ee.List.map을 사용하여 목록의 각 요소에 도우미 함수를 적용하여 목록 (roi_stats
)의 각 사전에 createFeature
함수를 적용합니다.
코드 편집기 (JavaScript)
var transition_fc = ee.FeatureCollection(roi_stats.map(createFeature)); print('transition_fc', transition_fc);
이제 차트에 표시할 속성이 포함된 FeatureCollection이 있으므로 차트 객체를 만들어 콘솔에 출력할 수 있습니다.
코드 편집기 (JavaScript)
// Add a summary chart. var transition_summary_chart = ui.Chart.feature.byFeature({ features: transition_fc, xProperty: 'transition_class_name', yProperties: ['area_m2', 'transition_class_number'] }) .setChartType('PieChart') .setOptions({ title: 'Summary of transition class areas', slices: createPieChartSliceDictionary(transition_fc), sliceVisibilityThreshold: 0 // Don't group small slices. }); print(transition_summary_chart);
slices
옵션은 원형 차트 슬라이스가 전환 클래스에 정의된 기본 팔레트 (이전 지도 키 표에 표시됨)를 사용하도록 색상을 지정합니다.
sliceVisibilityThreshold
옵션을 사용하면 작은 슬라이스가 '기타' 카테고리로 그룹화되지 않습니다.
결과 차트는 그림 13과 비슷해야 합니다.

최종 스크립트
이 섹션의 전체 스크립트는 다음과 같습니다.
코드 편집기 (JavaScript)
////////////////////////////////////////////////////////////// // Asset List ////////////////////////////////////////////////////////////// var gsw = ee.Image('JRC/GSW1_0/GlobalSurfaceWater'); var occurrence = gsw.select('occurrence'); var change = gsw.select("change_abs"); var transition = gsw.select('transition'); var roi = ee.Geometry.Polygon( [[[105.531921, 10.412183], [105.652770, 10.285193], [105.949401, 10.520218], [105.809326, 10.666006]]]); ////////////////////////////////////////////////////////////// // Constants ////////////////////////////////////////////////////////////// var VIS_OCCURRENCE = { min: 0, max: 100, palette: ['red', 'blue'] }; var VIS_CHANGE = { min: -50, max: 50, palette: ['red', 'black', 'limegreen'] }; var VIS_WATER_MASK = { palette: ['white', 'black'] }; ////////////////////////////////////////////////////////////// // Helper functions ////////////////////////////////////////////////////////////// // Create a feature for a transition class that includes the area covered. function createFeature(transition_class_stats) { transition_class_stats = ee.Dictionary(transition_class_stats); var class_number = transition_class_stats.get('transition_class_value'); var result = { transition_class_number: class_number, transition_class_name: lookup_names.get(class_number), transition_class_palette: lookup_palette.get(class_number), area_m2: transition_class_stats.get('sum') }; return ee.Feature(null, result); // Creates a feature without a geometry. } // Create a JSON dictionary that defines piechart colors based on the // transition class palette. // https://developers.google.com/chart/interactive/docs/gallery/piechart function createPieChartSliceDictionary(fc) { return ee.List(fc.aggregate_array("transition_class_palette")) .map(function(p) { return {'color': p}; }).getInfo(); } // Convert a number to a string. Used for constructing dictionary key lists // from computed number objects. function numToString(num) { return ee.Number(num).format(); } ////////////////////////////////////////////////////////////// // Calculations ////////////////////////////////////////////////////////////// // Create a dictionary for looking up names of transition classes. var lookup_names = ee.Dictionary.fromLists( ee.List(gsw.get('transition_class_values')).map(numToString), gsw.get('transition_class_names') ); // Create a dictionary for looking up colors of transition classes. var lookup_palette = ee.Dictionary.fromLists( ee.List(gsw.get('transition_class_values')).map(numToString), gsw.get('transition_class_palette') ); // Create a water mask layer, and set the image mask so that non-water areas // are transparent. var water_mask = occurrence.gt(90).mask(1); // Generate a histogram object and print it to the console tab. var histogram = ui.Chart.image.histogram({ image: change, region: roi, scale: 30, minBucketWidth: 10 }); histogram.setOptions({ title: 'Histogram of surface water change intensity.' }); print(histogram); // Summarize transition classes in a region of interest. var area_image_with_transition_class = ee.Image.pixelArea().addBands(transition); var reduction_results = area_image_with_transition_class.reduceRegion({ reducer: ee.Reducer.sum().group({ groupField: 1, groupName: 'transition_class_value', }), geometry: roi, scale: 30, bestEffort: true, }); print('reduction_results', reduction_results); var roi_stats = ee.List(reduction_results.get('groups')); var transition_fc = ee.FeatureCollection(roi_stats.map(createFeature)); print('transition_fc', transition_fc); // Add a summary chart. var transition_summary_chart = ui.Chart.feature.byFeature({ features: transition_fc, xProperty: 'transition_class_name', yProperties: ['area_m2', 'transition_class_number'] }) .setChartType('PieChart') .setOptions({ title: 'Summary of transition class areas', slices: createPieChartSliceDictionary(transition_fc), sliceVisibilityThreshold: 0 // Don't group small slices. }); print(transition_summary_chart); ////////////////////////////////////////////////////////////// // Initialize Map Location ////////////////////////////////////////////////////////////// // Uncomment one of the following statements to center the map on // a particular location. // Map.setCenter(-90.162, 29.8597, 10); // New Orleans, USA // Map.setCenter(-114.9774, 31.9254, 10); // Mouth of the Colorado River, Mexico // Map.setCenter(-111.1871, 37.0963, 11); // Lake Powell, USA // Map.setCenter(149.412, -35.0789, 11); // Lake George, Australia Map.setCenter(105.26, 11.2134, 9); // Mekong River Basin, SouthEast Asia // Map.setCenter(90.6743, 22.7382, 10); // Meghna River, Bangladesh // Map.setCenter(81.2714, 16.5079, 11); // Godavari River Basin Irrigation Project, India // Map.setCenter(14.7035, 52.0985, 12); // River Oder, Germany & Poland // Map.setCenter(-59.1696, -33.8111, 9); // Buenos Aires, Argentina // Map.setCenter(-74.4557, -8.4289, 11); // Ucayali River, Peru ////////////////////////////////////////////////////////////// // Map Layers ////////////////////////////////////////////////////////////// Map.addLayer({ eeObject: water_mask, visParams: VIS_WATER_MASK, name: '90% occurrence water mask', shown: false }); Map.addLayer({ eeObject: occurrence.updateMask(occurrence.divide(100)), name: "Water Occurrence (1984-2015)", visParams: VIS_OCCURRENCE, shown: false }); Map.addLayer({ eeObject: change, visParams: VIS_CHANGE, name: 'occurrence change intensity', shown: false }); Map.addLayer({ eeObject: transition, name: 'Transition classes (1984-2015)', });
이것으로 전 세계 지표수 데이터 세트에 관한 튜토리얼을 마칩니다. 이 튜토리얼에서는 전역 지표수 데이터 세트에서 사용할 수 있는 데이터 레이어 중 3개 (발생, 변화 강도, 전환)만 사용하는 방법을 보여주었습니다. 데이터 사용자 가이드 (v2)에서 사용할 수 있는 다른 데이터 레이어에 관해 알아볼 수 있습니다.
감사합니다.