Transisi Kelas Air

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:

  1. menambahkan lapisan peta untuk memvisualisasikan transisi air,
  2. membuat reducer yang dikelompokkan untuk menjumlahkan area setiap class transisi dalam region of interest yang ditentukan, dan
  3. 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.

Kelas Transisi Air Permukaan
Gambar 10. Screenshot delta Sungai Mekong, yang menunjukkan variasi luas dalam transisi kelas air permukaan.

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.

Kelas Transisi dengan ROI
Gambar 11. Delta Sungai Mekong di Vietnam, dengan area yang diminati dibuat menggunakan alat gambar poligon Editor Kode.

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.pixelAreacode> ), 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.

Hasil Pengurangan yang Dikelompokkan
Gambar 12. Output tab konsol, yang menampilkan hasil pengurangan yang dikelompokkan.

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.

Diagram ringkasan class transisi air
Gambar 13. Diagram yang meringkas ukuran relatif class transisi air.

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.