Transisi Kelas Air

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:

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

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

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.

Kelas Transisi dengan ROI
Gambar 11. Delta Sungai Mekong di Vietnam, dengan region-of-interest yang dibuat menggunakan alat gambar poligon di 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.

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.

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

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.

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

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.