Lapisan transisi air merekam perubahan antara tiga kelas kejadian air (bukan air, air musiman, dan air permanen) beserta dua kelas tambahan untuk air sementara (permanen sementara dan musiman sementara).
Bagian tutorial ini akan:
- menambahkan lapisan peta untuk memvisualisasikan transisi air,
- membuat reducer yang dikelompokkan untuk menjumlahkan area setiap class transisi dalam region of interest yang ditentukan, dan
- buat diagram yang meringkas area menurut class transisi.
Visualisasi Dasar
Di bagian Daftar Aset skrip, tambahkan pernyataan berikut yang membuat
objek gambar band tunggal bernama transition
:
Code Editor (JavaScript)
var transition = gsw.select('transition');
Gambar GSW berisi metadata tentang nama dan nomor class transisi, serta palet default untuk menata gaya class transisi. Saat lapisan transisi ditambahkan ke peta, parameter visualisasi ini akan digunakan secara otomatis.
Di bagian bawah bagian Lapisan Peta pada skrip Anda, tambahkan pernyataan berikut yang menambahkan lapisan peta baru yang menampilkan class transisi:
Code Editor (JavaScript)
Map.setCenter(105.26, 11.2134, 9); // Mekong River Basin, SouthEast Asia Map.addLayer({ eeObject: transition, name: 'Transition classes (1984-2015)', });
Saat Anda menjalankan skrip, lapisan transisi akan ditampilkan.

Kunci peta untuk class transisi adalah:
Nilai | Simbol | Label |
---|---|---|
0 | Bukan air | |
1 | Permanen | |
2 | Baru permanen | |
3 | Hilang permanen | |
4 | Musiman | |
5 | Musiman baru | |
6 | Kehilangan musiman | |
7 | Musiman menjadi permanen | |
8 | Permanen ke musiman | |
9 | Permanen sementara | |
10 | Musiman ephemeral |
Merangkum Area menurut Class Transisi
Di bagian ini, kita akan menggunakan alat poligon geometri sekali lagi untuk menentukan wilayah yang diminati. Jika ingin menganalisis lokasi baru, Anda harus memilih dan menghapus poligon asli yang Anda gambar terlebih dahulu agar tidak mendapatkan hasil dari area gabungan. Lihat bagian Alat geometri pada dokumentasi Editor Kode untuk mengetahui informasi tentang cara mengubah geometri.
Untuk contoh ini, kita akan menggambar poligon baru di dalam delta Sungai Mekong.

Untuk menghitung area yang dicakup oleh bagian-bagian gambar, kita akan menambahkan band tambahan ke objek gambar transisi yang mengidentifikasi ukuran setiap piksel dalam meter persegi menggunakan metode ee.Image.pixelArea.
Code Editor (JavaScript)
var area_image_with_transition_class = ee.Image.pixelArea().addBands(transition);
Objek gambar yang dihasilkan (area_image_with_transition_class
) adalah gambar dua band di mana band pertama berisi informasi area dalam satuan meter persegi (dihasilkan oleh metode
ee.Image.pixelArea
code>
), dan band kedua berisi informasi kelas transisi.
Kemudian, kita meringkas transisi kelas dalam area yang diminati (roi
) menggunakan
metode
ee.Image.reduceRegion
dan
penggabung yang dikelompokkan
yang berfungsi untuk menjumlahkan area dalam setiap kelas transisi:
Code Editor (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);
Output tab konsol kini menampilkan reduction_results
. Perhatikan bahwa Anda
harus meluaskan hierarki beberapa tingkat untuk melihat data ringkasan area.

Meskipun objek reduction_results
berisi informasi tentang area yang tercakup oleh setiap class transisi, informasi tersebut tidak mudah dibaca. Di bagian berikutnya, kita akan mempermudah melihat hasilnya.
Membuat Diagram Ringkasan
Di bagian ini, kita akan membuat diagram untuk meringkas hasil dengan lebih baik. Untuk memulai, kita akan mengekstrak terlebih dahulu daftar class transisi dengan area sebagai berikut:
Code Editor (JavaScript)
var roi_stats = ee.List(reduction_results.get('groups'));
Hasil reducer yang dikelompokkan (reduction_results
) adalah kamus yang berisi
daftar kamus.
Ada satu kamus dalam daftar untuk setiap class transisi.
Pernyataan ini menggunakan metode
ee.Dictionary.get
untuk mengekstrak hasil reducer yang dikelompokkan dari kamus tersebut dan mengonversi
hasil ke jenis data
ee.List, sehingga kita dapat mengakses setiap kamus.
Untuk memanfaatkan fungsi pembuatan diagram Code Editor, kita akan membuat FeatureCollection yang berisi informasi yang diperlukan. Untuk melakukannya, pertama-tama kita membuat dua kamus pencarian dan dua fungsi bantuan. Kode yang membuat kamus pencarian dapat ditempatkan di bagian atas bagian "Calculations" sebagai berikut:
Code Editor (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') );
Kamus lookup_names
mengaitkan nilai class transisi dengan
namanya, sedangkan kamus lookup_palette
mengaitkan nilai class
transisi dengan definisi warna.
Kedua fungsi bantuan dapat ditempatkan di bagian kode baru yang disebut "Fungsi bantuan".
Code Editor (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(); }
Fungsi createFeature
menggunakan kamus (yang berisi area dan
class transisi air) dan menampilkan Fitur yang cocok untuk pembuatan diagram.
Fungsi createPieChartSliceDictionary
membuat daftar warna yang
sesuai dengan class transisi, menggunakan format yang diharapkan oleh diagram pai.
Selanjutnya, kita akan menerapkan fungsi createFeature
ke setiap kamus dalam
daftar (roi_stats
), menggunakan
ee.List.map
untuk menerapkan fungsi helper ke setiap elemen daftar.
Code Editor (JavaScript)
var transition_fc = ee.FeatureCollection(roi_stats.map(createFeature)); print('transition_fc', transition_fc);
Sekarang setelah memiliki FeatureCollection yang berisi atribut yang ingin ditampilkan di diagram, kita dapat membuat objek diagram dan mencetaknya ke konsol.
Code Editor (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);
Opsi slices
mewarnai irisan diagram lingkaran sehingga menggunakan
palet default yang ditentukan untuk class transisi (ditampilkan sebelumnya dalam tabel kunci peta).
Opsi sliceVisibilityThreshold
mencegah irisan kecil dikelompokkan
bersama ke dalam kategori "lainnya".
Diagram yang dihasilkan akan terlihat seperti yang ditunjukkan pada Gambar 13.

Skrip Akhir
Seluruh skrip untuk bagian ini adalah:
Code Editor (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)', });
Bagian ini mengakhiri tutorial tentang set data Global Surface Water. Perhatikan bahwa tutorial ini telah menunjukkan cara menggunakan tiga lapisan data (kejadian, intensitas perubahan, dan transisi) yang tersedia dalam set data Global Surface Water. Anda dapat membaca lapisan data lain yang tersedia di Panduan Pengguna Data (v2).
Selamat menganalisis.