GSW 데이터 세트에는 지표수 데이터를 다양한 방식으로 표시하는 여러 데이터 레이어가 포함되어 있습니다. 1984년 3월부터 2015년 10월까지의 전체 기간 동안 지표수가 발생한 위치와 빈도를 요약한 물 발생 레이어를 시각화하는 것부터 시작합니다.
튜토리얼의 이 섹션에서는 다음을 수행합니다.
- 지표수 발생을 시각화하기 위한 지도 레이어를 추가합니다.
- 지도 레이어의 값을 쿼리하는 방법을 보여줍니다.
- 시각화를 개선하기 위해 맞춤 스타일을 추가합니다.
- 기준값을 사용하여 이진 워터 마스크 레이어를 만듭니다.
- 세계의 흥미로운 부분을 지도 중앙에 배치하고
- 스크립트를 더 읽기 쉽고 유지 관리하기 쉽도록 리팩터링하는 방법을 보여줘.
기본 시각화 만들기
먼저 다음 문을 코드 편집기에 복사합니다.
코드 편집기 (JavaScript)
var gsw = ee.Image('JRC/GSW1_0/GlobalSurfaceWater'); var occurrence = gsw.select('occurrence'); Map.addLayer(occurrence);
첫 번째 문은 GSW 데이터 세트의 Earth Engine 이미지 객체를 참조하고 gsw
이라는 변수에 저장합니다.
두 번째 문은 GSW 데이터 세트의 단일 레이어를 선택하고 occurrence
라는 변수에 저장합니다.
세 번째 문은 발생 이미지를 코드 편집기의 대화형 지도에 추가합니다.
코드 편집기의 '실행' 버튼을 클릭하면 몇 초 후 해안선을 따라 회색으로 표시된 지도가 표시됩니다(그림 1 참고).

대부분의 지역에서 GSW 데이터 세트는 투명하게 표시됩니다. Landsat 이미지가 수집되지 않았거나 (예: 해양 지역) 32년 동안의 관측에서 물이 감지되지 않은 위치는 마스크 처리되기 때문입니다.
값 검사
물 발생 레이어의 값을 탐색하려면 코드 편집기의 인스펙터 탭을 사용합니다. 먼저 인스펙터 탭을 클릭한 다음 지도를 클릭하여 위치를 선택합니다. 인스펙터 탭에는 클릭한 위치에 있는 각 레이어에 관한 정보가 표시됩니다.

위의 예에서 value
이라는 레이어의 값은 98입니다. 단위는 백분율 포인트이므로 위치가 물로 덮여 있는 것으로 분류된 시간은 약 98% 입니다.
이 값은
데이터 사용자 가이드 (v2)
에 설명된 대로 계절적 변동에 대해 정규화된 각 월별 지표수 발생 값의 평균입니다.
리팩터링을 통한 코드 개선
스크립트에는 두 개의 문장만 포함되어 있지만, 최종 스크립트를 시간이 지남에 따라 더 쉽게 읽고 유지할 수 있도록 코드를 리팩터링할 수 있습니다.
현재 Map.addLayer()
문은 지도에 표시할 Earth Engine 이미지 객체인 occurrence
이라는 단일 인수를 전달합니다. 하지만 Map.addLayer()
메서드를 사용하면 추가 인수를 전달할 수도 있습니다. 사용 가능한 인수를 빠르게 확인하려면 여는 괄호 뒤에 커서를 놓고 '코드 추천 표시' 단축키를 눌러 addLayer
메서드의 도움말 문서를 표시합니다. (단축키는 메뉴 도움말 -> 단축키를 선택하여 볼 수 있습니다.)

단축키를 보면 Map.addLayer
에 전달할 수 있는 인수가 5개 있습니다. eeObject
, visParams
, name
, shown
, opacity
입니다.
현재 스크립트에서는 첫 번째 인수 eeObject
로 해석되는 단일 변수 occurrence
를 전달하고 있습니다.
변수 객체와 레이어 이름을 지정하는 추가 인수를 모두 전달하려면 아래와 같이
JSON 데이터 구조
내에서 메서드로 전달되는 '명명된 인수' (eeObject
및 name
)를 사용하도록 코드를 리팩터링하면 됩니다.
코드 편집기 (JavaScript)
Map.addLayer({eeObject: occurrence, name: 'Water Occurrence (1984-2015)'});
리팩터링 변경 후에도 코드가 여전히 작동하는지 확인하기 위해 코드를 다시 실행합니다. 결과 지도는 변경되지 않은 상태로 유지됩니다.
시각화 매개변수 추가
다음으로 물이 회색으로 표시되도록 하는 기본 시각화 매개변수를 개선합니다. VIS_OCCURRENCE
변수를 만드는 새 문을 추가하고 addLayer 메서드에 추가 인수로 전달합니다.
코드 편집기 (JavaScript)
var VIS_OCCURRENCE = { min: 0, max: 100, palette: ['red', 'blue'] };
코드 편집기 (JavaScript)
Map.addLayer({ eeObject: occurrence.updateMask(occurrence.divide(100)), name: 'Water Occurrence (1984-2015)', visParams: VIS_OCCURRENCE });
JSON 구조 VIS_OCCURRENCE
에 저장된 시각화 매개변수는 최솟값 0% 에 빨간색을 사용하고 최댓값 100%에 파란색을 사용해야 함을 나타냅니다.
.updateMask(occurrence.divide(100))
를 추가하면 발생 값에 따라 픽셀의 불투명도/투명도가 설정됩니다.
스크립트를 다시 실행하고 스타일 변경으로 수정된 결과를 확인합니다.

이제 물 영역이 파란색으로 표시됩니다. 이렇게 표시되면 성공적으로 진행하고 있는 것입니다.
임계값 레이어 만들기
물 발생 이미지에는 0~100% 범위의 값을 사용하여 물이 예상되는 빈도에 관한 정보가 포함됩니다. 하지만 특정 발생 비율(즉, 임계값)을 기반으로 이진 물 레이어('물' 대 '물 아님')를 정의하는 것이 유용한 경우가 많습니다. 이 간단한 바이너리 레이어는 다른 GSW 레이어를 배치할 수 있는 깨끗한 배경 레이어로 사용됩니다. 이 임계값 레이어는 물과 물이 아닌 부분을 구분하는 임계값 90% 를 사용하는 다음 문을 사용하여 만들 수 있습니다.
먼저 워터 마스크의 스타일 지정 정보를 저장할 새 시각화 변수 VIS_WATER_MASK
를 정의합니다.
코드 편집기 (JavaScript)
var VIS_WATER_MASK = { palette: ['white', 'black'] };
그런 다음 크거나 같음 비교 연산자 .gt(90)
를 사용하여 물 마스크 레이어를 계산한 다음 .unmask()
메서드를 사용하여 이전에 마스크 처리된 영역을 0으로 설정합니다.
코드 편집기 (JavaScript)
// Create a water mask layer, and set the image mask so that non-water areas // are opaque. var water_mask = occurrence.gt(90).unmask(0);
마지막으로 레이어를 지도에 추가합니다. 이 레이어가 다른 모든 레이어 아래에 렌더링되도록 하려면 다른 Map.addLayer
문 앞에 다음 문을 배치하세요.
코드 편집기 (JavaScript)
Map.addLayer({ eeObject: water_mask, visParams: VIS_WATER_MASK, name: '90% occurrence water mask' });

전 세계의 흥미로운 지역으로 이동
팬과 확대/축소를 통해 세계를 탐색하는 것은 재미있지만 세계는 넓고 때로는 특정 위치로 바로 이동하는 것이 도움이 됩니다. 다음은 지표수 측면에서 흥미로운 위치의 작은 샘플을 제공하는 일련의 문입니다. 한 번에 하나의 문만 주석 해제하면 스크립트가 실행될 때 해당 위치로 이동합니다.
코드 편집기 (JavaScript)
// Uncomment one of the following statements to center the map. // 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
이는 흥미로운 위치의 작은 샘플일 뿐입니다. 직접 추가하셔도 됩니다.
다시 리팩터링
GSW 데이터 세트의 다음 레이어로 넘어가기 전에 코드 리팩터링을 조금 더 진행하겠습니다. 특히 유사한 문을 함께 그룹화하고 애셋, 상수, 계산, 지도 중앙 배치, 지도 레이어 추가를 위한 섹션으로 코드를 나누는 주석을 추가합니다.
다음은 최종 리팩터링된 스크립트입니다.
코드 편집기 (JavaScript)
////////////////////////////////////////////////////////////// // Asset List ////////////////////////////////////////////////////////////// var gsw = ee.Image('JRC/GSW1_0/GlobalSurfaceWater'); var occurrence = gsw.select('occurrence'); ////////////////////////////////////////////////////////////// // Constants ////////////////////////////////////////////////////////////// var VIS_OCCURRENCE = { min: 0, max: 100, palette: ['red', 'blue'] }; var VIS_WATER_MASK = { palette: ['white', 'black'] }; ////////////////////////////////////////////////////////////// // Calculations ////////////////////////////////////////////////////////////// // Create a water mask layer, and set the image mask so that non-water areas // are opaque. var water_mask = occurrence.gt(90).unmask(0); ////////////////////////////////////////////////////////////// // Initialize Map Location ////////////////////////////////////////////////////////////// // Uncomment one of the following statements to center the map. // 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 });
다음 섹션에서는 시간 경과에 따른 물 발생 변화를 살펴봅니다.