ImageCollection Görselleştirme

ImageCollection'ü oluşturan resimler, animasyon veya "film şeridi" olarak adlandırılan bir dizi küçük resim olarak görselleştirilebilir. Bu yöntemler, ImageCollection'ün içeriği hakkında hızlı bir değerlendirme sağlar ve zamansal-uzamsal değişimi gözlemlemek için etkili bir ortam sunar (Şekil 1).

Aşağıdaki bölümlerde, görselleştirme için ImageCollection'ün nasıl hazırlanacağı açıklanmakta, her koleksiyon görselleştirme yöntemi için örnek kod sağlanmakta ve çeşitli gelişmiş animasyon teknikleri ele alınmaktadır.


Şekil 1. Eylül 2017'de Atlantik kasırgalarının üç günlük gelişimini gösteren animasyon.

Koleksiyon hazırlama

Yalnızca ilgi çekici olanları göstermek veya bir fenomeni vurgulamak için koleksiyondaki resimleri filtreleyin, birleştirin, sıralayın ve biçimlendirin. Görselleştirme işlevlerine giriş olarak herhangi bir ImageCollection sağlanabilir ancak yıllık ve yıl içi tarih aralıkları, gözlem aralığı, bölgesel kapsam, kalite ve temsil dikkate alınarak seçilen bir koleksiyon daha iyi sonuçlar elde etmenizi sağlayabilir.

Filtreleme

Bir resim koleksiyonunu, yalnızca görselleştirmenin amacını destekleyen alakalı verileri içerecek şekilde filtreleyin. Tarihler, mekansal kapsam, kalite ve belirli bir veri kümesine özgü diğer özellikleri göz önünde bulundurun.

Örneğin, Sentinel-2 yüzey yansıması koleksiyonunu aşağıdaki ölçütlere göre filtreleyin:

tek bir tarih aralığı,

Kod Düzenleyici (JavaScript)

var s2col = ee.ImageCollection('COPERNICUS/S2_SR')
  .filterDate('2018-01-01', '2019-01-01');

Yılın gününü içeren seri bir aralık,

Kod Düzenleyici (JavaScript)

var s2col = ee.ImageCollection('COPERNICUS/S2_SR')
  .filter(ee.Filter.calendarRange(171, 242, 'day_of_year'));

bir alakalı konum,

Kod Düzenleyici (JavaScript)

var s2col = ee.ImageCollection('COPERNICUS/S2_SR')
  .filterBounds(ee.Geometry.Point(-122.1, 37.2));

veya resim mülkü.

Kod Düzenleyici (JavaScript)

var s2col = ee.ImageCollection('COPERNICUS/S2_SR')
  .filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 50));

Birden fazla filtreyi birbirine bağlayabilirsiniz.

Kod Düzenleyici (JavaScript)

var s2col = ee.ImageCollection('COPERNICUS/S2_SR')
  .filterDate('2018-01-01', '2019-01-01')
  .filterBounds(ee.Geometry.Point(-122.1, 37.2))
  .filter('CLOUDY_PIXEL_PERCENTAGE < 50');

Birleştirme

Bir koleksiyondaki resim sayısını azaltmak ve kaliteyi artırmak için yıl içi ve yıl sonu tarih aralıklarını birleştirin. Örneğin, Afrika için yıllık NDVI görselleştirmesi oluşturduğunuzu varsayalım. Bir seçenek, MODIS 16 günlük NDVI koleksiyonunu 2018'deki tüm gözlemleri içerecek şekilde filtrelemektir.

Kod Düzenleyici (JavaScript)

var ndviCol = ee.ImageCollection('MODIS/006/MOD13A2')
  .filterDate('2018-01-01', '2019-01-01')
  .select('NDVI');

Filtre ve azaltma yöntemine göre yıllık kompozit

Yukarıdaki koleksiyonun görselleştirmesinde, bulut örtüsünün yoğun olduğu ormanlık bölgelerde önemli miktarda parazit olduğu görülüyor (Şekil 2a). MODIS koleksiyonundaki tüm yıllar için seri tarih aralıklarını medyana göre azaltarak daha iyi bir temsil elde edilebilir.

Kod Düzenleyici (JavaScript)

// Make a day-of-year sequence from 1 to 365 with a 16-day step.
var doyList = ee.List.sequence(1, 365, 16);

// Import a MODIS NDVI collection.
var ndviCol = ee.ImageCollection('MODIS/006/MOD13A2').select('NDVI');

// Map over the list of days to build a list of image composites.
var ndviCompList = doyList.map(function(startDoy) {
  // Ensure that startDoy is a number.
  startDoy = ee.Number(startDoy);

  // Filter images by date range; starting with the current startDate and
  // ending 15 days later. Reduce the resulting image collection by median.
  return ndviCol
    .filter(ee.Filter.calendarRange(startDoy, startDoy.add(15), 'day_of_year'))
    .reduce(ee.Reducer.median());
});

// Convert the image List to an ImageCollection.
var ndviCompCol = ee.ImageCollection.fromImages(ndviCompList);

Her resim 20 yılı aşkın veri için 16 günlük bir NDVI kompozitinin medyan değerini temsil ettiğinden, bu koleksiyondan elde edilen animasyon daha az gürültülüdür (Şekil 1b). Bu animasyon hakkında daha fazla bilgi için bu eğitime bakın.

Şekil 2a. Yıllar arası kompozisyon olmayan yıllık NDVI. Şekil 2b. Yıllar arası kompozisyon ile yıllık NDVI.

Filtre ve azaltma yöntemine göre yıllık kompozit

Önceki örnekte, yıllar arası birleştirme uygulanmaktadır. Yıl içinde yapılan bir dizi gözlemi birleştirmek de yararlı olabilir. Örneğin, Landsat verileri sensör başına belirli bir sahne için on altı günde bir toplanır ancak genellikle görüntülerin bir kısmı bulutlar tarafından gizlenir. Bulutları maskeleyerek ve aynı sezondan birkaç resmi birleştirerek bulutsuz bir temsil oluşturabilirsiniz. Temmuz ve Ağustos'a ait Landsat 5 görüntülerinin, 1985-2011 yılları arasındaki her yıl için ortanca değer kullanılarak birleştirildiği aşağıdaki örneği düşünün.

Kod Düzenleyici (JavaScript)

// Assemble a collection of Landsat surface reflectance images for a given
// region and day-of-year range.
var lsCol = ee.ImageCollection('LANDSAT/LT05/C02/T1_L2')
  .filterBounds(ee.Geometry.Point(-122.9, 43.6))
  .filter(ee.Filter.dayOfYear(182, 243))
  // Add the observation year as a property to each image.
  .map(function(img) {
    return img.set('year', ee.Image(img).date().get('year'));
  });


// Define a function to scale the data and mask unwanted pixels.
function maskL457sr(image) {
  // Bit 0 - Fill
  // Bit 1 - Dilated Cloud
  // Bit 2 - Unused
  // Bit 3 - Cloud
  // Bit 4 - Cloud Shadow
  var qaMask = image.select('QA_PIXEL').bitwiseAnd(parseInt('11111', 2)).eq(0);
  var saturationMask = image.select('QA_RADSAT').eq(0);

  // Apply the scaling factors to the appropriate bands.
  var opticalBands = image.select('SR_B.').multiply(0.0000275).add(-0.2);
  var thermalBand = image.select('ST_B6').multiply(0.00341802).add(149.0);

  // Replace the original bands with the scaled ones and apply the masks.
  return image.addBands(opticalBands, null, true)
      .addBands(thermalBand, null, true)
      .updateMask(qaMask)
      .updateMask(saturationMask);
}

// Define a list of unique observation years from the image collection.
var years = ee.List(lsCol.aggregate_array('year')).distinct().sort();

// Map over the list of years to build a list of annual image composites.
var lsCompList = years.map(function(year) {
  return lsCol
    // Filter image collection by year.
    .filterMetadata('year', 'equals', year)
    // Apply cloud mask.
    .map(maskL457sr)
    // Reduce image collection by median.
    .reduce(ee.Reducer.median())
    // Set composite year as an image property.
    .set('year', year);
});

// Convert the image List to an ImageCollection.
var lsCompCol = ee.ImageCollection.fromImages(lsCompList);

Birleştirme ve azaltma işlemine göre yıllık kompozit

Önceki iki birleştirme yönteminin, filtrelenecek ve birleştirilecek yeni tarihleri kademeli olarak tanımlamak için List gün ve yıl boyunca eşlediğini unutmayın. Bu işlemi gerçekleştirmenin bir diğer yöntemi de birleştirme uygulamaktır. Aşağıdaki snippet'te benzersiz bir yıl koleksiyonu tanımlanır ve ardından belirli bir yıla karşılık gelen tüm resimleri tanımlamak için bir saveAllbirleştirme işlemi uygulanır. Belirli bir yıla ait resimler, farklı yıl koleksiyonunda ilgili yıl temsilcisinin bir özelliği olarak depolanan bir List nesnesinde gruplandırılır. Yıllık birleştirmeler, bu listelerde tanımlanan ImageCollections değerinin, farklı yıl koleksiyonuyla eşlenen bir işlevde azaltılmasıyla bu listelerden oluşturulur.

Kod Düzenleyici (JavaScript)

// Assemble a collection of Landsat surface reflectance images for a given
// region and day-of-year range.
var lsCol = ee.ImageCollection('LANDSAT/LT05/C02/T1_L2')
  .filterBounds(ee.Geometry.Point(-122.9, 43.6))
  .filter(ee.Filter.dayOfYear(182, 243))
  // Add the observation year as a property to each image.
  .map(function(img) {
    return img.set('year', ee.Image(img).date().get('year'));
  });

// Make a distinct year collection; one image representative per year.
var distinctYears = lsCol.distinct('year').sort('year');

// Define a join filter; one-to-many join on ‘year’ property.
var filter = ee.Filter.equals({leftField: 'year', rightField: 'year'});

// Define a join.
var join = ee.Join.saveAll('year_match');

// Apply the join; results in 'year_match' property being added to each distinct
// year representative image. The list includes all images in the collection
// belonging to the respective year.
var joinCol = join.apply(distinctYears, lsCol, filter);

// Define a function to scale the data and mask unwanted pixels.
function maskL457sr(image) {
  // Bit 0 - Fill
  // Bit 1 - Dilated Cloud
  // Bit 2 - Unused
  // Bit 3 - Cloud
  // Bit 4 - Cloud Shadow
  var qaMask = image.select('QA_PIXEL').bitwiseAnd(parseInt('11111', 2)).eq(0);
  var saturationMask = image.select('QA_RADSAT').eq(0);

  // Apply the scaling factors to the appropriate bands.
  var opticalBands = image.select('SR_B.').multiply(0.0000275).add(-0.2);
  var thermalBand = image.select('ST_B6').multiply(0.00341802).add(149.0);

  // Replace the original bands with the scaled ones and apply the masks.
  return image.addBands(opticalBands, null, true)
      .addBands(thermalBand, null, true)
      .updateMask(qaMask)
      .updateMask(saturationMask);
}

// Map over the distinct years collection to build a list of annual image
// composites.
var lsCompList = joinCol.map(function(img) {
  // Get the list of images belonging to the given year.
  return ee.ImageCollection.fromImages(img.get('year_match'))
    // Apply cloud mask.
    .map(maskL457sr)
    // Reduce image collection by median.
    .reduce(ee.Reducer.median())
    // Set composite year as an image property.
    .copyProperties(img, ['year']);
});

// Convert the image List to an ImageCollection.
var lsCompCol = ee.ImageCollection(lsCompList);

Birleştirme ve azaltma işlemiyle aynı gün kompozit

Birleştirmenin ek bir kullanım alanı da, uzamsal olarak birbirine bağlı resim mozaikleri oluşturmaktır. İlgilendiğiniz bölgenin aynı yol içindeki iki Landsat satırını kapsadığını ve amacınızın 2017 ve 2018'deki her Landsat 8 yörüngesi için iki görüntünün resim mozaiğini görüntülemek olduğunu varsayalım. Burada, koleksiyonu yola ve satıra göre filtreledikten sonra, edinme tarihine göre tanımlanan aynı yörüngeden Landsat görüntülerini mozaiklemek için bir birleştirme işlemi kullanılır.

Kod Düzenleyici (JavaScript)

var lsCol = ee.ImageCollection('LANDSAT/LC08/C02/T1_L2')
  .filterDate('2017-01-01', '2019-01-01')
  .filter('WRS_PATH == 38 && (WRS_ROW == 28 || WRS_ROW == 29)')
  .map(function(img) {
    var date = img.date().format('yyyy-MM-dd');
    return img.set('date', date);
  });

var distinctDates = lsCol.distinct('date').sort('date');
var filter = ee.Filter.equals({leftField: 'date', rightField: 'date'});
var join = ee.Join.saveAll('date_match');
var joinCol = join.apply(distinctDates, lsCol, filter);

var lsColMos = ee.ImageCollection(joinCol.map(function(col) {
  return ee.ImageCollection.fromImages(col.get('date_match')).mosaic();
}));

Sıralama

Doğru zamansal sırayı sağlamak için bir koleksiyonu zamana göre sıralayın veya seçtiğiniz bir özelliğe göre düzenleyin. Görselleştirme karesi serisi varsayılan olarak koleksiyonun doğal sırasına göre sıralanır. Serilerin düzenlenmesi, sort koleksiyonu yöntemi kullanılarak değiştirilebilir. Bu yöntemde, artan veya azalan düzende sıralama için bir Image mülkü seçilir. Örneğin, gözlem zamanına göre sıralamak için her yerde bulunan system:time_start mülkünü kullanın.

Kod Düzenleyici (JavaScript)

var s2col = ee.ImageCollection('COPERNICUS/S2_SR')
  .filterBounds(ee.Geometry.Point(-122.1, 37.2))
  .sort('system:time_start');

Alternatif olarak, bu Sentinel-2 görüntüsünde olduğu gibi bulutluluk arttıkça sıra belirlenebilir.

Kod Düzenleyici (JavaScript)

var s2col = ee.ImageCollection('COPERNICUS/S2_SR')
  .filterBounds(ee.Geometry.Point(-122.1, 37.2))
  .sort('CLOUDY_PIXEL_PERCENTAGE');

Sıralama, türetilmiş bir mülkle (ör. ortalama bölgesel NDVI) de tanımlanabilir. Burada, bölgesel NDVI, eşlenen bir işlevde her resme özellik olarak eklenir ve ardından yeni mülkte sıralama yapılır.

Kod Düzenleyici (JavaScript)

// Define an area of interest geometry.
var aoi = ee.Geometry.Point(-122.1, 37.2).buffer(1e4);

// Filter MODIS NDVI image collection by a date range.
var ndviCol = ee.ImageCollection('MODIS/061/MOD13A1')
  .filterDate('2018-01-01', '2019-01-01')
  .select('NDVI')
  // Map over the image collection to calculate regional mean NDVI and add
  // the result to each image as a property.
  .map(function(img) {
    var meanNdvi = img.reduceRegion({
      reducer: ee.Reducer.mean(), geometry: aoi, scale: 500});
    return img.set('meanNdvi', meanNdvi.get('NDVI'));
  })
  // Sort the collection by descending regional mean NDVI.
  .sort('meanNdvi', false);

Görüntü görselleştirme

Resim görselleştirme, sayıları renklere dönüştürür. Koleksiyon görselleştirme yöntemlerinde resim verilerinin renk olarak nasıl temsil edildiğini kontrol etmenin üç yolu vardır:

  1. Görselleştirme bağımsız değişkenlerini doğrudan getVideoThumbURL ve getFilmstripThumbURL'e sağlayın.
  2. getVideoThumbURL ve getFilmstripThumbURL uygulanmadan önce visualize resim yöntemini resim koleksiyonuyla eşleyin.
  3. getVideoThumbURL ve getFilmstripThumbURL uygulanmadan önce sldStyle resim yöntemini resim koleksiyonuyla eşleyin. Daha fazla bilgi için stillendirilmiş katman tanımlayıcısı bölümüne bakın.

Bu kılavuzda, 1. ve 2. seçenekler kullanılmaktadır. Bu seçeneklerde, çok bantlı bir görüntünün üç görüntü bandı kırmızı, yeşil ve mavi renk kanallarıyla eşlenerek veya tek bir bandın değerleri bir renk paleti boyunca doğrusal olarak derecelendirilerek görselleştirme elde edilir. Görselleştirme parametreleri şunlardır:

Görselleştirme parametreleri
Parametre Açıklama Tür
bantlar RGB ile eşlenecek üç bant adının virgülle ayrılmış listesi list
dk. 0 ile eşlenecek değerler Her bant için bir tane olmak üzere üç basamaklı bir sayı veya üç basamaklı sayı listesi
max 255 ile eşlenecek değerler Her bant için bir tane olmak üzere üç basamaklı bir sayı veya üç basamaklı sayı listesi
gain Her piksel değerinin çarpılacağı değerler Her bant için bir tane olmak üzere üç basamaklı bir sayı veya üç basamaklı sayı listesi
önyargı Her DN'ye eklenecek değerler Her bant için bir tane olmak üzere üç basamaklı bir sayı veya üç basamaklı sayı listesi
gamma Gama düzeltme katsayıları Her bant için bir tane olmak üzere üç basamaklı bir sayı veya üç basamaklı sayı listesi
palette CSS stilindeki renk dizelerinin listesi (yalnızca tek bantlı görüntüler) Onaltılık dizelerin virgülle ayrılmış listesi
opaklık Katmanın opaklığı (0,0 tamamen şeffaf, 1,0 tamamen opaktır) sayı

Görselleştirmek istediğiniz bantları seçmek için bands bağımsız değişkenini kullanın. Bir veya üç grup adının listesini sağlayın. Çok bantlı görüntülerde varsayılan olarak ilk üç bant seçilidir. Bant adı sırası, renk atamasını belirler. Listelenen ilk, ikinci ve üçüncü bantlar sırasıyla kırmızı, yeşil ve mavi ile eşlenir.

Veri aralığı ölçeklendirmesi, görselleri görselleştirmede önemli bir husustur. Varsayılan olarak, 0 ile 1 (dahil) arasındaki kayan nokta veri değerleri 0 ile 255 (dahil) arasında ölçeklendirilir. Bu aralığın dışındaki değerler, sırasıyla 0'dan küçük veya 1'den büyük olup olmadıklarına göre 0 ve 255'e zorlanacaktır. Tam sayı verileri söz konusu olduğunda, türüne göre tanımlanan tam kapasite 0 ile 255 arasında ölçeklendirilir (ör. işaretli 16 bit verilerin aralığı -32.768 ile 32.767 arasındadır ve varsayılan olarak [0, 255] olarak ölçeklendirilir). Varsayılanları kabul etmek, genellikle resim özellikleri arasında çok az veya hiç kontrast olmayan görselleştirmelere neden olabilir. Kontrastı artırmak ve belirli bir veri aralığını vurgulamak için min ve max simgesini kullanın. min ve max değerlerini, ilgilendiğiniz alandaki verilerin 2. ve 98. yüzdelik dilimlerini temsil eden değerlere ayarlamak iyi bir fikirdir. Dijital yükseklik modeli için bu değerlerin hesaplanmasına ilişkin aşağıdaki örneği inceleyin.

Kod Düzenleyici (JavaScript)

// Import SRTM global elevation model.
var demImg = ee.Image('USGS/SRTMGL1_003');

// Define a rectangular area of interest.
var aoi = ee.Geometry.Polygon(
  [[
    [-103.84153083119054, 49.083004219142886],
    [-103.84153083119054, 25.06838270664608],
    [-85.64817145619054, 25.06838270664608],
    [-85.64817145619054, 49.083004219142886]
  ]],
  null, false);

// Calculate the 2nd and 98th percentile elevation values from rescaled (to
// 500m) pixels intersecting the area of interest. A Dictionary is returned.
var percentClip = demImg.reduceRegion({
  reducer: ee.Reducer.percentile([2, 98]),
  geometry: aoi,
  scale: 500,
  maxPixels: 3e7
});

// Print the regional 2nd and 98th percentile elevation values. Get the
// dictionary keys and use them to get the values for each percentile summary.
var keys = percentClip.keys();
print('Set vis min to:', ee.Number(percentClip.get(keys.get(0))).round());
print('Set vis max to:', ee.Number(percentClip.get(keys.get(1))).round());

palette parametresi, 8 bit görselleştirme resmini temsil edecek renkleri tanımlar. Yalnızca tek bantlı gösterimler için geçerlidir. Çok bantlı bir resimle belirtilmesi hatayla sonuçlanır. Veriler tek bantlıysa veya çok bantlı bir görüntüden tek bir bandı görselleştirmek istiyorsanız forceRgbOutput parametresini true olarak ayarlayın (palette bağımsız değişkeni sağlanmışsa gerekli değildir). 0 ile 255 arasında doğrusal ölçeklendirme yapılacak değer aralığını tanımlamak için min ve max parametrelerini kullanın.

Aşağıda, tek bantlı bir görüntü koleksiyonu üzerinde görselleştirme işlevinin eşlenmesine dair bir örnek verilmiştir. Bir MODIS NDVI koleksiyonu içe aktarılır, visualization yöntemi için görselleştirme bağımsız değişkenleri ayarlanır ve değerleri RGB resim gösterimlerine dönüştüren bir işlev NDVI koleksiyonuyla eşlenir.

Kod Düzenleyici (JavaScript)

// Filter MODIS NDVI image collection by a date range.
var ndviCol = ee.ImageCollection('MODIS/061/MOD13A1')
  .filterDate('2018-01-01', '2019-01-01')
  .select('NDVI');

// Define visualization arguments.
var visArgs = {
  min: 0,
  max: 9000,
  palette: [
    'FFFFFF', 'CE7E45', 'DF923D', 'F1B555', 'FCD163', '99B718', '74A901',
    '66A000', '529400', '3E8601', '207401', '056201', '004C00', '023B01',
    '012E01', '011D01', '011301'
  ]
};

// Define a function to convert an image to an RGB visualization image and copy
// properties from the original image to the RGB image.
var visFun = function(img) {
  return img.visualize(visArgs).copyProperties(img, img.propertyNames());
};

// Map over the image collection to convert each image to an RGB visualization
// using the previously defined visualization function.
var ndviColVis = ndviCol.map(visFun);

Çok bantlı bir görüntü koleksiyonu üzerinde görselleştirme işlevinin eşlenmesini gösteren örnek:

Kod Düzenleyici (JavaScript)

// Assemble a collection of Sentinel-2 surface reflectance images for a given
// region and date range.
var s2col = ee.ImageCollection('COPERNICUS/S2_SR')
  .filterBounds(ee.Geometry.Point(-96.9037, 48.0395))
  .filterDate('2019-06-01', '2019-10-01');

// Define visualization arguments.
var visArgs = {bands: ['B11', 'B8', 'B3'], min: 300, max: 3500};

// Define a function to convert an image to an RGB visualization image and copy
// properties from the original image to the RGB image.
var visFun = function(img) {
  return img.visualize(visArgs).copyProperties(img, img.propertyNames());
};

// Map over the image collection to convert each image to an RGB visualization
// using the previously defined visualization function.
var s2colVis = s2col.map(visFun);

Bu durumda, her RGB katmanının yoğunluğunu tanımlayan üç bant verildiğinden palet bağımsız değişkeni sağlanmaz. Her iki örnekte de hangi değerlerin 8 bit RGB verilerinin sınırlarına kadar uzatıldığını kontrol etmek için min ve max parametrelerinin kullanıldığını unutmayın.

Video küçük resmi

getVideoThumbURL() işlevi, her resmin bir kareyi temsil ettiği bir ImageCollection içindeki tüm resimlerden animasyon oluşturur. Animasyon oluşturmayla ilgili genel iş akışı aşağıdaki gibidir:

  1. Animasyonun bölgesel kapsamını belirleyen sınırları olan bir Geometry tanımlayın.
  2. Bir ImageCollection tanımlayın.
  3. Resim görselleştirmeyi deneyin: Koleksiyon üzerinde bir resim görselleştirme işlevi eşleyin veya animasyon bağımsız değişkenleri grubuna resim görselleştirme bağımsız değişkenleri ekleyin.
  4. Animasyon bağımsız değişkenlerini tanımlayın ve getVideoThumbURL yöntemini çağırın.

getVideoThumbURL işlevinin sonucu bir URL'dir. URL'yi konsola yazdırın ve tıklayarak Earth Engine sunucularının yeni bir tarayıcı sekmesinde animasyonu anında oluşturmaya başlamasını sağlayın. Alternatif olarak, koleksiyondaki ui.Thumbnail işlevini ve ilgili animasyon bağımsız değişkenlerini çağırarak animasyonu Kod Düzenleyici konsolunda görüntüleyebilirsiniz. Oluşturulan animasyonu sağ tıklayıp içerik menüsünden uygun seçenekleri belirleyerek indirebilirsiniz.

Aşağıdaki örnekte, 24 saat boyunca dünya genelindeki sıcaklıkları gösteren bir animasyon oluşturma işlemi gösterilmektedir. Bu örnekte, önce ImageCollection üzerinde bir görselleştirme işlevi eşlemenin aksine, animasyon bağımsız değişkenlerinin yanı sıra görselleştirme bağımsız değişkenlerinin de yer aldığını unutmayın. Bu komut dosyası çalıştırıldığında, Kod Düzenleyici konsolunda Şekil 3'e benzer bir animasyon görünmelidir.

Kod Düzenleyici (JavaScript)

// Define an area of interest geometry with a global non-polar extent.
var aoi = ee.Geometry.Polygon(
  [[[-179.0, 78.0], [-179.0, -58.0], [179.0, -58.0], [179.0, 78.0]]], null,
  false);

// Import hourly predicted temperature image collection for northern winter
// solstice. Note that predictions extend for 384 hours; limit the collection
// to the first 24 hours.
var tempCol = ee.ImageCollection('NOAA/GFS0P25')
  .filterDate('2018-12-22', '2018-12-23')
  .limit(24)
  .select('temperature_2m_above_ground');

// Define arguments for animation function parameters.
var videoArgs = {
  dimensions: 768,
  region: aoi,
  framesPerSecond: 7,
  crs: 'EPSG:3857',
  min: -40.0,
  max: 35.0,
  palette: ['blue', 'purple', 'cyan', 'green', 'yellow', 'red']
};

// Print the animation to the console as a ui.Thumbnail using the above defined
// arguments. Note that ui.Thumbnail produces an animation when the first input
// is an ee.ImageCollection instead of an ee.Image.
print(ui.Thumbnail(tempCol, videoArgs));

// Alternatively, print a URL that will produce the animation when accessed.
print(tempCol.getVideoThumbURL(videoArgs));


Şekil 3. Kuzey kış gündönümü için saatlik yüzey sıcaklığı, animasyonlu GIF resmi olarak gösterilmektedir.

Film şeridi

getFilmstripThumbUrl işlevi, ImageCollection içindeki tüm resimlerin kuzey-güney dizisi olarak birleştirilmesini temsil eden tek bir statik resim oluşturur. Film şeridi karelerinin sırası, koleksiyonun doğal sırasını takip eder.

getFilmstripThumbUrl işlevinin sonucu bir URL'dir. URL'yi konsola yazdırın ve tıklayarak Earth Engine sunucularının yeni bir tarayıcı sekmesinde resmi anında oluşturmasını başlatın. Oluşturulan resim, sağ tıklayıp içerik menüsünden uygun seçenekleri belirleyerek indirilebilir.

Aşağıdaki kod snippet'inde, yukarıdaki video küçük resmi örneğiyle aynı koleksiyon kullanılmaktadır. Bu komut dosyası çalıştırıldığında, Kod Düzenleyici konsolunda Şekil 4'e benzer bir film şeridi gösterilir.

Kod Düzenleyici (JavaScript)

// Define an area of interest geometry with a global non-polar extent.
var aoi = ee.Geometry.Polygon(
  [[[-179.0, 78.0], [-179.0, -58.0], [179.0, -58.0], [179.0, 78.0]]], null,
  false);

// Import hourly predicted temperature image collection for northern winter
// solstice. Note that predictions extend for 384 hours; limit the collection
// to the first 24 hours.
var tempCol = ee.ImageCollection('NOAA/GFS0P25')
  .filterDate('2018-12-22', '2018-12-23')
  .limit(24)
  .select('temperature_2m_above_ground');

// Define arguments for the getFilmstripThumbURL function parameters.
var filmArgs = {
  dimensions: 128,
  region: aoi,
  crs: 'EPSG:3857',
  min: -40.0,
  max: 35.0,
  palette: ['blue', 'purple', 'cyan', 'green', 'yellow', 'red']
};

// Print a URL that will produce the filmstrip when accessed.
print(tempCol.getFilmstripThumbURL(filmArgs));


Şekil 4. Kuzey kış gündönümü için saatlik yüzey sıcaklığı, film şeridi PNG resmi olarak gösterilmektedir. Film şeridinin görüntüleme için dört bölüme ayrıldığını unutmayın. getFilmstripThumbURL sonucu, kuzey-güney yönünde birleştirilmiş tek bir koleksiyon resimleri dizisidir.

Gelişmiş teknikler

Aşağıdaki bölümlerde, poligon kenarlıkları ekleyerek, ilgi çekici bölgeleri vurgulayarak ve bir koleksiyondaki resimleri karşılaştırarak görselleştirmeleri iyileştirmek için kırpma, opaklık ve katman oluşturma özelliklerinin nasıl kullanılacağı açıklanmaktadır.

Bu bölümdeki aşağıdaki örneklerin tümü için burada tanımlanan aynı temel ImageCollection değerinin kullanıldığını unutmayın:

Kod Düzenleyici (JavaScript)

// Import hourly predicted temperature image collection for northern winter
// solstice. Note that predictions extend for 384 hours; limit the collection
// to the first 24 hours.
var tempCol = ee.ImageCollection('NOAA/GFS0P25')
  .filterDate('2018-12-22', '2018-12-23')
  .limit(24)
  .select('temperature_2m_above_ground');

// Define visualization arguments to control the stretch and color gradient
// of the data.
var visArgs = {
  min: -40.0,
  max: 35.0,
  palette: ['blue', 'purple', 'cyan', 'green', 'yellow', 'red']
};

// Convert each image to an RGB visualization image by mapping the visualize
// function over the image collection using the arguments defined previously.
var tempColVis = tempCol.map(function(img) {
  return img.visualize(visArgs);
});

// Import country features and filter to South American countries.
var southAmCol = ee.FeatureCollection('USDOS/LSIB_SIMPLE/2017')
  .filterMetadata('wld_rgn', 'equals', 'South America');

// Define animation region (South America with buffer).
var southAmAoi = ee.Geometry.Rectangle({
  coords: [-103.6, -58.8, -18.4, 17.4], geodesic: false});

Katmanlar

blend Image yöntemi kullanılarak birden fazla resim üste bindirilebilir. Bu yöntemde, iki resimdeki örtüşen pikseller maskelerine (opasite) göre harmanlanır.

Vektör yer paylaşımı

Bir resme idari sınır poligonları ve diğer geometriler eklemek, değerli bir mekansal bağlam sağlayabilir. Yukarıdaki dünya geneli günlük yüzey sıcaklığı animasyonunu (Şekil 3) inceleyin. Kara ile okyanus arasındaki sınırlar biraz ayırt edilebilir ancak ülkelerin poligon yer paylaşımı eklenerek daha belirgin hale getirilebilir.

Vektör verileri (Features), paint yöntemi uygulanarak resimlere çizilir. Özellikler mevcut bir resme boyanabilir ancak bunları boş bir resme boyamak, stil vermek ve ardından sonucu diğer stillendirilmiş resim katmanlarıyla karıştırmak daha iyi bir uygulamadır. Görselleştirme yığınının her katmanını bağımsız olarak ele almak, stil üzerinde daha fazla kontrol sahibi olmanızı sağlar.

Aşağıdaki örnekte, Güney Amerika ülke sınırlarının boş bir Image öğesine boyanması ve sonucun, küresel günlük sıcaklık koleksiyonunun her bir Image öğesiyle harmanlanması gösterilmektedir (Şekil 5). Yerleşim üzerine yerleştirilen ülke sınırları, kara ile suyun ayırt edilmesini sağlar ve sıcaklık kalıplarına bağlam sağlar.

Kod Düzenleyici (JavaScript)

// Define an empty image to paint features to.
var empty = ee.Image().byte();

// Paint country feature edges to the empty image.
var southAmOutline = empty
  .paint({featureCollection: southAmCol, color: 1, width: 1})
  // Convert to an RGB visualization image; set line color to black.
  .visualize({palette: '000000'});

// Map a blend operation over the temperature collection to overlay the country
// border outline image on all collection images.
var tempColOutline = tempColVis.map(function(img) {
  return img.blend(southAmOutline);
});

// Define animation arguments.
var videoArgs = {
  dimensions: 768,
  region: southAmAoi,
  framesPerSecond: 7,
  crs: 'EPSG:3857'
};

// Display the animation.
print(ui.Thumbnail(tempColOutline, videoArgs));


Şekil 5. Mekansal bağlam sağlamak için koleksiyondaki resimlere vektör yer paylaşımları ekleyin.

Görüntü bindirme

İstediğiniz stile ulaşmak için birkaç resim üste bindirilebilir. Bir ilgi alanı bölgesini vurgulamak istediğinizi varsayalım. Bir resim görselleştirmesinin sessiz kopyasını temel katman olarak oluşturabilir ve ardından orijinal görselleştirmenin kırpılmış bir sürümünü üzerine yerleştirebilirsiniz. Önceki örnekten yararlanarak aşağıdaki komut dosyası Şekil 6'yı oluşturur.

Kod Düzenleyici (JavaScript)

// Define an empty image to paint features to.
var empty = ee.Image().byte();

// Paint country feature edges to the empty image.
var southAmOutline = empty
  .paint({featureCollection: southAmCol, color: 1, width: 1})
  // Convert to an RGB visualization image; set line color to black.
  .visualize({palette: '000000'});

// Map a blend operation over the temperature collection to overlay the country
// border outline image on all collection images.
var tempColOutline = tempColVis.map(function(img) {
  return img.blend(southAmOutline);
});

// Define a partially opaque grey RGB image to dull the underlying image when
// blended as an overlay.
var dullLayer = ee.Image.constant(175).visualize({
  opacity: 0.6, min: 0, max: 255, forceRgbOutput: true});

// Map a two-part blending operation over the country outline temperature
// collection for final styling.
var finalVisCol = tempColOutline.map(function(img) {
  return img
    // Blend the dulling layer with the given country outline temperature image.
    .blend(dullLayer)
    // Blend a clipped copy of the country outline temperature image with the
    // dulled background image.
    .blend(img.clipToCollection(southAmCol));
});

// Define animation arguments.
var videoArgs = {
  dimensions: 768,
  region: southAmAoi,
  framesPerSecond: 7,
  crs: 'EPSG:3857'
};

// Display the animation.
print(ui.Thumbnail(finalVisCol, videoArgs));


Şekil 6. Resmi kırpıp sessiz bir kopyanın üzerine yerleştirerek ilgi çekici bir alanı vurgulayın.

Ayrıca, araziyi belirtmek ve görselleştirmeye biraz derinlik kazandırmak için görüntü verilerini bir tepe gölgesi temel katmanıyla da birleştirebilirsiniz (Şekil 7).

Kod Düzenleyici (JavaScript)

// Define a hillshade layer from SRTM digital elevation model.
var hillshade = ee.Terrain.hillshade(ee.Image('USGS/SRTMGL1_003')
  // Exaggerate the elevation to increase contrast in hillshade.
  .multiply(100))
  // Clip the DEM by South American boundary to clean boundary between
  // land and ocean.
  .clipToCollection(southAmCol);

// Map a blend operation over the temperature collection to overlay a partially
// opaque temperature layer on the hillshade layer.
var finalVisCol = tempColVis.map(function(img) {
  return hillshade
    .blend(img.clipToCollection(southAmCol).visualize({opacity: 0.6}));
});

// Define animation arguments.
var videoArgs = {
  dimensions: 768,
  region: southAmAoi,
  framesPerSecond: 7,
  crs: 'EPSG:3857'
};

// Display the animation.
print(ui.Thumbnail(finalVisCol, videoArgs));


Şekil 7. Kısmi şeffaflık içeren görüntü verilerini bir tepe gölgesi katmanına yerleştirerek araziyi gösterin.

Geçişler

Bir resim koleksiyonunu özelleştirerek koleksiyondaki iki resim arasındaki farkları gösteren animasyonlar oluşturmak için solma, titreme ve kaydırma geçişlerini kullanın. Aşağıdaki örneklerin her biri, aşağıdaki komut dosyasıyla oluşturulan aynı temel görselleştirmeyi kullanır:

Kod Düzenleyici (JavaScript)

// Define an area of interest geometry with a global non-polar extent.
var aoi = ee.Geometry.Polygon(
  [[[-179.0, 78.0], [-179.0, -58.0], [179.0, -58.0], [179.0, 78.0]]], null,
  false);

// Import hourly predicted temperature image collection.
var temp = ee.ImageCollection('NOAA/GFS0P25')

// Define a northern summer solstice temperature image.
var summerSolTemp = temp
  .filterDate('2018-06-21', '2018-06-22')
  .filterMetadata('forecast_hours', 'equals', 12)
  .first()
  .select('temperature_2m_above_ground');

// Define a northern winter solstice temperature image.
var winterSolTemp = temp
  .filterDate('2018-12-22', '2018-12-23')
  .filterMetadata('forecast_hours', 'equals', 12)
  .first()
  .select('temperature_2m_above_ground');

// Combine the solstice images into a collection.
var tempCol = ee.ImageCollection([
  summerSolTemp.set('season', 'summer'),
  winterSolTemp.set('season', 'winter')
]);

// Import international boundaries feature collection.
var countries = ee.FeatureCollection('USDOS/LSIB_SIMPLE/2017');

// Define visualization arguments.
var visArgs = {
  min: -40.0,
  max: 35.0,
  palette: ['blue', 'purple', 'cyan', 'green', 'yellow', 'red']
};

// Convert the image data to RGB visualization images.
// The clip and unmask combination sets ocean pixels to black.
var tempColVis = tempCol.map(function(img) {
  return img
    .visualize(visArgs)
    .clipToCollection(countries)
    .unmask(0)
    .copyProperties(img, img.propertyNames());
});

Flicker

Burada olduğu gibi, koleksiyonda yalnızca iki resim varsa koleksiyon animasyonu için varsayılan gösterim titreşimdir. Yanıp sönme hızını artırmak veya azaltmak için framesPerSecond animasyon bağımsız değişkenini ayarlayın. Yukarıdaki koleksiyona uygulanan aşağıdaki görselleştirme bağımsız değişkenleri Şekil 8'i oluşturur.

Kod Düzenleyici (JavaScript)

// Define arguments for animation function parameters.
var videoArgs = {
  dimensions: 768,
  region: aoi,
  framesPerSecond: 2,
  crs: 'EPSG:3857'
};

// Display animation to the Code Editor console.
print(ui.Thumbnail(tempColVis, videoArgs));


Şekil 8. Kuzey ve kış gündönümü için 12:00 GMT yüzey sıcaklığı arasında titreşim örneği.

Karart

İki katman arasında solma geçişi, bir katmanın opaklığı 0'a yakın bir değerden 1'e kadar opaklık artışları dizisi boyunca artırılırken diğer katmanın opaklığı aynı anda azaltılarak elde edilir (Şekil 9).

Kod Düzenleyici (JavaScript)

// Define a sequence of decreasing opacity increments. Note that opacity cannot
// be 0, so near 1 and 0 are used. Near 1 is needed because a compliment is
// calculated in a following step that can result in 0 if 1 is an element of the
// list.
var opacityList = ee.List.sequence({start: 0.99999, end: 0.00001, count: 20});

// Filter the summer and winter solstice images from the collection and set as
// image objects.
var summerImg = tempColVis.filter(ee.Filter.eq('season', 'summer')).first();
var winterImg = tempColVis.filter(ee.Filter.eq('season', 'winter')).first();

// Map over the list of opacity increments to iteratively adjust the opacity of
// the two solstice images. Returns a list of images.
var imgList = opacityList.map(function(opacity) {
  var opacityCompliment = ee.Number(1).subtract(ee.Number(opacity));
  var winterImgFade = winterImg.visualize({opacity: opacity});
  var summerImgFade = summerImg.visualize({opacity: opacityCompliment});
  return summerImgFade.blend(winterImgFade).set('opacity', opacity);
});

// Convert the image list to an image collection; the forward phase.
var fadeForward = ee.ImageCollection.fromImages(imgList);

// Make a copy of the collection that is sorted by ascending opacity to
// represent the reverse phase.
var fadeBackward = fadeForward.sort({property: 'opacity'});

// Merge the forward and reverse phase frame collections.
var fadeCol = fadeForward.merge(fadeBackward);

// Define animation arguments.
var videoArgs = {
  dimensions: 768,
  region: aoi,
  framesPerSecond: 25,
  crs: 'EPSG:3857'
};

// Display the animation.
print(ui.Thumbnail(fadeCol, videoArgs));


Şekil 9. Yaz ve kış gündönümü için 12:00 (GMT) yüzey sıcaklığı arasında solma örneği.

Kaydırıcı

Kaydırma çubuğu geçişi, temeldeki resim katmanını kademeli olarak gösterir ve gizler. Bu işlem, üstteki görüntünün opaklığını bir dizi boylam boyunca iteratif olarak ayarlayarak gerçekleştirilir (Şekil 10).

Kod Düzenleyici (JavaScript)

// Define a sequence of longitude increments. Start and end are defined by the
// min and max longitude of the feature to be provided to the region parameter
// of the animation arguments dictionary.
var lonSeq = ee.List.sequence({start: -179, end: 179, count: 20});

// Define a longitude image.
var longitude = ee.Image.pixelLonLat().select('longitude');

// Filter the summer and winter solstice images from the collection and set as
// image objects.
var summerImg = tempColVis.filter(ee.Filter.eq('season', 'summer')).first();
var winterImg = tempColVis.filter(ee.Filter.eq('season', 'winter')).first();

// Map over the list of longitude increments to iteratively adjust the mask
// (opacity) of the overlying image layer. Returns a list of images.
var imgList = lonSeq.map(function(lon) {
  lon = ee.Number(lon);
  var mask = longitude.gt(lon);
  return summerImg.blend(winterImg.updateMask(mask)).set('lon', lon);
});

// Convert the image list to an image collection; concealing phase.
var sliderColForward = ee.ImageCollection.fromImages(imgList);

// Make a copy of the collection that is sorted by descending longitude to
// represent the revealing phase.
var sliderColbackward = sliderColForward
  .sort({property: 'lon', ascending: false});

// Merge the forward and backward phase frame collections.
var sliderCol = sliderColForward.merge(sliderColbackward);

// Define animation arguments.
var videoArgs = {
  dimensions: 768,
  region: aoi,
  framesPerSecond: 25,
  crs: 'EPSG:3857'
};

// Display the animation.
print(ui.Thumbnail(sliderCol, videoArgs));


Şekil 10. Yaz ve kış gündönümü için 12:00 (GMT) yüzey sıcaklığı arasında kaydırmalı geçiş örneği.