Lapisan transisi air menangkap perubahan antara tiga kelas kemunculan air (bukan air, air musiman, dan air permanen) serta dua kelas tambahan untuk air fana (permanen fana dan musiman fana).
Bagian tutorial ini akan:
- menambahkan lapisan peta untuk memvisualisasikan transisi air,
- membuat pengurang yang dikelompokkan untuk menjumlahkan luas setiap kelas transisi dalam region-of-interest yang ditentukan, dan
- membuat diagram yang merangkum area berdasarkan kelas transisi.
Visualisasi Dasar
Di bagian Asset List pada skrip, tambahkan pernyataan berikut yang membuat
objek citra band tunggal bernama transition:
Editor Kode (JavaScript)
var transition = gsw.select('transition');
Gambar GSW berisi metadata tentang nomor dan nama 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 kelas transisi:
Editor Kode (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 | Permanen baru | |
| 3 | Hilang permanen | |
| 4 | Musiman | |
| 5 | Musiman baru | |
| 6 | Musiman yang hilang | |
| 7 | Musiman menjadi permanen | |
| 8 | Permanen hingga musiman | |
| 9 | Sementara permanen | |
| 10 | Musiman sementara |
Merangkum Area menurut Kelas Transisi
Di bagian ini, kita akan menggunakan alat poligon geometri sekali lagi untuk menentukan region-of-interest. 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 dalam dokumen 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.
Editor Kode (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, dengan band pertama berisi informasi area dalam satuan meter persegi (dihasilkan oleh metode
ee.Image.pixelArea
), dan band kedua berisi informasi kelas transisi.
Kemudian, kami meringkas transisi kelas dalam region yang diinginkan (roi) menggunakan metode
ee.Image.reduceRegion
dan
pengurang yang dikelompokkan
yang berfungsi untuk menjumlahkan area dalam setiap kelas transisi:
Editor Kode (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
memperluas hierarki beberapa tingkat untuk melihat data ringkasan area.
Meskipun objek reduction_results berisi informasi tentang area
yang dicakup oleh setiap kelas transisi, objek ini tidak terlalu 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, pertama-tama kita ekstrak daftar kelas transisi dengan area sebagai berikut:
Editor Kode (JavaScript)
var roi_stats = ee.List(reduction_results.get('groups'));
Hasil dari pengurang 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 pengurang yang dikelompokkan dari kamus tersebut dan mentransmisikan
hasilnya ke jenis data
ee.List, sehingga kita dapat mengakses kamus individual.
Untuk menggunakan fungsi diagram Editor Kode, kita akan membuat FeatureCollection yang berisi informasi yang diperlukan. Untuk melakukannya, pertama-tama kita buat dua kamus pencarian dan dua fungsi bantuan. Kode yang membuat kamus pencarian dapat ditempatkan di bagian atas bagian "Calculations" sebagai berikut:
Editor Kode (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".
Editor Kode (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 (berisi area dan
kelas transisi air) dan menampilkan Fitur yang sesuai untuk pembuatan diagram.
Fungsi createPieChartSliceDictionary membuat daftar warna yang
sesuai dengan class transisi, menggunakan format yang diharapkan oleh diagram lingkaran.
Selanjutnya, kita akan menerapkan fungsi createFeature ke setiap kamus dalam
daftar (roi_stats), menggunakan
ee.List.map
untuk menerapkan fungsi bantuan ke setiap elemen daftar.
Editor Kode (JavaScript)
var transition_fc = ee.FeatureCollection(roi_stats.map(createFeature)); print('transition_fc', transition_fc);
Setelah memiliki FeatureCollection yang berisi atribut yang ingin ditampilkan di diagram, kita dapat membuat objek diagram dan mencetaknya ke konsol.
Editor Kode (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:
Editor Kode (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)', });
Demikianlah tutorial tentang set data Global Surface Water. Perhatikan bahwa tutorial ini telah menunjukkan cara menggunakan tiga lapisan data (kemunculan, intensitas perubahan, dan transisi) yang tersedia di set data Global Surface Water. Anda dapat membaca tentang lapisan data lain yang tersedia di Panduan Pengguna Data (v2).
Selamat menganalisis.