Su Sınıfı Geçişi

Su geçiş katmanı, üç su varlığı sınıfı (su olmayan, mevsimsel su ve kalıcı su) arasındaki değişikliklerin yanı sıra geçici su için iki ek sınıfı (geçici kalıcı ve geçici mevsimsel) yakalar.

Eğitimin bu bölümünde şunlar ele alınacaktır:

  1. su geçişini görselleştirmek için harita katmanı ekleme,
  2. Belirli bir ilgi alanı içindeki her geçiş sınıfının alanını toplamak için gruplandırılmış bir indirgeyici oluşturun ve
  3. Alanı geçiş sınıfına göre özetleyen bir grafik oluşturun.

Temel Görselleştirme

Senaryonun Asset List (Öğe Listesi) bölümüne, transition adlı tek bantlı bir görüntü nesnesi oluşturan aşağıdaki ifadeyi ekleyin:

Kod Düzenleyici (JavaScript)

var transition = gsw.select('transition');

GSW görüntüleri, geçiş sınıfı numaraları ve adlarıyla ilgili meta veriler ve geçiş sınıflarını stillendirmek için varsayılan bir palet içerir. Geçiş katmanı haritaya eklendiğinde bu görselleştirme parametreleri otomatik olarak kullanılır.

Senaryonuzun Harita Katmanları bölümünün alt kısmına, geçiş sınıflarını gösteren yeni bir harita katmanı ekleyen aşağıdaki ifadeyi ekleyin:

Kod Düzenleyici (JavaScript)

Map.setCenter(105.26, 11.2134, 9);     // Mekong River Basin, SouthEast Asia
Map.addLayer({
  eeObject: transition,
  name: 'Transition classes (1984-2015)',
});

Komut dosyasını çalıştırdığınızda geçiş katmanı gösterilir.

Yüzey Suyu Geçiş Sınıfları
Şekil 10. Mekong Nehri deltasının ekran görüntüsü, yüzey suyu sınıfı geçişlerinde büyük bir varyasyon gösteriyor.

Geçiş sınıfları için harita anahtarı şöyledir:

Değer Sembol Şirket
0 Su değil
1 Kalıcı
2 Yeni kalıcı
3 Kalıcı olarak kayboldu
4 Sezonluk
5 Yeni sezonluk
6 Sezonluk kayıp
7 Sezonluktan kalıcıya
8 Kalıcıdan sezonluğa
9 Geçici kalıcı
10 Geçici sezonluk

Geçiş Sınıfına Göre Alanı Özetleme

Bu bölümde, ilgilenilen bölgeyi tanımlamak için bir kez daha geometri poligon aracını kullanacağız. Yeni bir konumu analiz etmek istiyorsanız birleştirilmiş alanlardan sonuç almamak için önce çizdiğiniz orijinal poligonu seçip silmeniz gerekir. Geometrilerin nasıl değiştirileceği hakkında bilgi edinmek için Kod Düzenleyici belgelerinin Geometri araçları bölümüne bakın.

Bu örnekte Mekong Nehri deltasında yeni bir poligon çizeceğiz.

YG ile Geçiş Sınıfları
Şekil 11. Vietnam'daki Mekong Nehri deltası. Kod Düzenleyici'nin poligon çizim aracı kullanılarak oluşturulan bir ilgi alanı gösteriliyor.

Bir görüntünün parçalarının kapladığı alanı hesaplamak için geçiş görüntüsü nesnesine, ee.Image.pixelArea yöntemini kullanarak her pikselin boyutunu metrekare cinsinden tanımlayan ek bir bant ekleyeceğiz.

Kod Düzenleyici (JavaScript)

var area_image_with_transition_class = ee.Image.pixelArea().addBands(transition);

Elde edilen görüntü nesnesi (area_image_with_transition_class), ilk bandın metrekare cinsinden alan bilgilerini ( ee.Image.pixelArea yöntemiyle üretilir) ve ikinci bandın geçiş sınıfı bilgilerini içerdiği iki bantlı bir görüntüdür.

Ardından, ee.Image.reduceRegion yöntemini ve her geçiş sınıfındaki alanı toplamak için kullanılan gruplandırılmış bir azaltıcıyı kullanarak ilgilenilen bölgedeki (roi) sınıf geçişlerini özetleriz:

Kod Düzenleyici (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);

Konsol sekmesi çıkışında artık reduction_results gösterilir. Alan özeti verilerini görmek için ağacı birkaç düzey genişletmeniz gerektiğini unutmayın.

Gruplandırılmış Azaltma Sonuçları
12. şekil. Gruplandırılmış azaltma sonuçlarını gösteren Console sekmesi çıkışı.

reduction_results nesnesi her bir geçiş sınıfının kapsadığı alanla ilgili bilgi içerse de bu bilgiyi okumak pek kolay değildir. Bir sonraki bölümde sonuçları görüntülemeyi kolaylaştıracağız.

Özet grafik oluşturma

Bu bölümde, sonuçları daha iyi özetlemek için bir grafik oluşturacağız. Başlamak için öncelikle geçiş sınıflarının listesini aşağıdaki gibi alanlarla birlikte çıkarırız:

Kod Düzenleyici (JavaScript)

var roi_stats = ee.List(reduction_results.get('groups'));

Gruplandırılmış indirgeyicinin (reduction_results) sonucu, sözlük listesi içeren bir sözlüktür. Listede her geçiş sınıfı için bir sözlük bulunur. Bu ifadeler, gruplandırılmış indirgeyici sonuçlarını sözlükten ayıklamak için ee.Dictionary.get yöntemini kullanır ve sonuçları ee.List veri türüne dönüştürür. Böylece, her bir sözlüğe erişebiliriz.

Kod Düzenleyici'nin grafik işlevlerinden yararlanmak için gerekli bilgileri içeren bir FeatureCollection oluşturacağız. Bunun için önce iki arama sözlüğü ve iki yardımcı işlev oluştururuz. Arama sözlüklerini oluşturan kod, "Hesaplamalar" bölümünün en üstüne aşağıdaki gibi yerleştirilebilir:

Kod Düzenleyici (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')
);

lookup_names sözlüğü, geçiş sınıfı değerlerini adlarıyla ilişkilendirirken lookup_palette sözlüğü, geçiş sınıfı değerlerini renk tanımlarıyla ilişkilendirir.

İki yardımcı işlev, "Yardımcı işlevler" adlı yeni bir kod bölümüne yerleştirilebilir.

Kod Düzenleyici (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();
}

createFeature işlevi, bir sözlük (alanı ve su geçiş sınıfını içeren) alır ve grafik oluşturmaya uygun bir özellik döndürür. createPieChartSliceDictionary işlevi, pasta grafiğin beklediği biçimi kullanarak geçiş sınıflarına karşılık gelen renklerin listesini oluşturur.

Ardından, ee.List.map kullanarak yardımcı işlevi listenin her öğesine uygulayarak listedeki (roi_stats) her sözlüğe createFeature işlevini uygularız.

Kod Düzenleyici (JavaScript)

var transition_fc = ee.FeatureCollection(roi_stats.map(createFeature));
print('transition_fc', transition_fc);

Grafikte görüntülemek istediğimiz özellikleri içeren bir FeatureCollection elde ettiğimize göre artık bir grafik nesnesi oluşturup konsola yazdırabiliriz.

Kod Düzenleyici (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);

slices seçeneği, pasta grafik dilimlerini geçiş sınıfları için tanımlanan varsayılan paleti (harita anahtarı tablosunda daha önce gösterilmiştir) kullanacak şekilde renklendirir. sliceVisibilityThreshold seçeneği, küçük dilimlerin "diğer" kategorisinde gruplandırılmasını engeller. Elde edilen grafik, Şekil 13'te gösterilene benzer olmalıdır.

Su geçiş sınıfı özet grafiği
Şekil 13. Su geçiş sınıflarının göreceli boyutunu özetleyen grafik.

Final Script

Bu bölümün senaryosunun tamamı şu şekildedir:

Kod Düzenleyici (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)',
});

Global Surface Water veri kümesiyle ilgili eğitimimiz sona erdi. Bu eğitimde, Global Surface Water veri kümesinde bulunan veri katmanlarından yalnızca üçüyle (bulunma, değişim yoğunluğu ve geçiş) nasıl çalışılacağı gösterilmiştir. Kullanabileceğiniz diğer veri katmanları hakkında bilgi edinmek için Veri Kullanıcıları Rehberi'ni (v2) inceleyebilirsiniz.

İyi analizler!