Visualisasi ImageCollection

Gambar yang menyusun ImageCollection dapat divisualisasikan sebagai animasi atau serangkaian thumbnail yang disebut sebagai “filmstrip”. Metode ini memberikan penilaian cepat terhadap konten ImageCollection dan media yang efektif untuk menyaksikan perubahan spasial-temporal (Gambar 1).

Bagian berikut menjelaskan cara menyiapkan ImageCollection untuk visualisasi, memberikan contoh kode untuk setiap metode visualisasi koleksi, dan membahas beberapa teknik animasi lanjutan.


Gambar 1. Animasi yang menunjukkan progres badai Atlantik selama tiga hari pada September 2017.

Persiapan pengumpulan

Memfilter, menggabungkan, mengurutkan, dan menata gaya gambar dalam koleksi untuk hanya menampilkan gambar yang menarik atau menekankan fenomena. Setiap ImageCollection dapat diberikan sebagai input ke fungsi visualisasi, tetapi koleksi yang diseleksi dengan mempertimbangkan rentang tanggal antar- dan intra-tahunan, interval pengamatan, ekstensi regional, kualitas, dan representasi dapat memberikan hasil yang lebih baik.

Pemfilteran

Filter koleksi gambar untuk hanya menyertakan data relevan yang mendukung tujuan visualisasi. Pertimbangkan tanggal, cakupan spasial, kualitas, dan properti lainnya yang spesifik untuk set data tertentu.

Misalnya, filter koleksi pantulan permukaan Sentinel-2 menurut:

satu rentang tanggal,

Editor Kode (JavaScript)

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

rentang hari dalam setahun secara berurutan,

Editor Kode (JavaScript)

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

wilayah minat,

Editor Kode (JavaScript)

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

atau properti gambar.

Editor Kode (JavaScript)

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

Mengaitkan beberapa filter.

Editor Kode (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');

Komposisi

Rentang tanggal intra- dan antar-tahun gabungan untuk mengurangi jumlah gambar dalam koleksi dan meningkatkan kualitas. Misalnya, Anda ingin membuat visualisasi NDVI tahunan untuk Afrika. Salah satu opsi adalah dengan memfilter koleksi NDVI MODIS 16 hari untuk menyertakan semua pengamatan tahun 2018.

Editor Kode (JavaScript)

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

Komposit antar-tahunan menurut filter dan pengurangan

Visualisasi koleksi di atas menunjukkan banyak derau di wilayah berhutan dengan tutupan awan yang tebal (Gambar 2a). Representasi yang lebih baik dapat dicapai dengan mengurangi rentang tanggal serial menurut median di semua tahun dalam koleksi MODIS.

Editor Kode (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);

Animasi yang dihasilkan dari koleksi ini tidak terlalu berisik, karena setiap gambar mewakili median komposit NDVI 16 hari selama lebih dari 20 tahun data (Gambar 1b). Lihat tutorial ini untuk mengetahui informasi selengkapnya tentang animasi ini.

Gambar 2a. NDVI tahunan tanpa komposit antar-tahunan. Gambar 2b. NDVI tahunan dengan komposit antar-tahunan.

Komposisi intra-tahunan menurut filter dan pengurangan

Contoh sebelumnya menerapkan komposisi antar-tahunan. Hal ini juga dapat membantu membuat gabungan serangkaian pengamatan intra-tahunan. Misalnya, data Landsat dikumpulkan setiap enam belas hari untuk scene tertentu per sensor, tetapi sering kali beberapa bagian gambar dikaburkan oleh awan. Menyamarkan awan dan menggabungkan beberapa gambar dari musim yang sama dapat menghasilkan representasi yang lebih bebas awan. Pertimbangkan contoh berikut saat gambar Landsat 5 dari Juli dan Agustus digabungkan menggunakan median untuk setiap tahun dari 1985 hingga 2011.

Editor Kode (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);

Gabungan intra-tahunan berdasarkan penggabungan dan pengurangan

Perhatikan bahwa dua metode komposisi sebelumnya memetakan selama List hari dan tahun untuk menentukan tanggal baru secara bertahap untuk difilter dan digabungkan. Menerapkan join adalah metode lain untuk melakukan operasi ini. Dalam cuplikan berikut, koleksi tahun unik ditentukan, lalu join saveAll diterapkan untuk mengidentifikasi semua gambar yang sesuai dengan tahun tertentu. Gambar yang termasuk dalam tahun tertentu dikelompokkan ke dalam objek List yang disimpan sebagai properti perwakilan tahun masing-masing dalam koleksi tahun yang berbeda. Komposit tahunan dihasilkan dari daftar ini dengan mengurangi ImageCollections yang ditentukan olehnya dalam fungsi yang dipetakan di seluruh koleksi tahun yang berbeda.

Editor Kode (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);

Komposisi hari yang sama berdasarkan penggabungan dan pengurangan

Kasus tambahan untuk komposisi adalah membuat mosaik gambar yang berdekatan secara spasial. Misalnya, area minat Anda mencakup dua baris Landsat dalam jalur yang sama dan tujuan Anda adalah menampilkan mosaik gambar dari dua gambar untuk setiap orbit Landsat 8 pada tahun 2017 dan 2018. Di sini, setelah memfilter koleksi menurut jalur dan baris, operasi join digunakan untuk membuat mosaik gambar Landsat dari orbit yang sama, yang ditentukan berdasarkan tanggal akuisisi.

Editor Kode (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();
}));

Pengurutan

Urutkan koleksi menurut waktu untuk memastikan urutan kronologis yang tepat, atau urutkan berdasarkan properti pilihan Anda. Secara default, rangkaian frame visualisasi diurutkan dalam urutan alami koleksi. Pengaturan deret dapat diubah menggunakan metode pengumpulan sort, dengan properti Image dipilih untuk diurutkan dalam urutan menaik atau menurun. Misalnya, untuk mengurutkan menurut waktu pengamatan, gunakan properti system:time_start yang ada di mana-mana.

Editor Kode (JavaScript)

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

Atau mungkin urutan harus ditentukan dengan meningkatkan tingkat mendung, seperti dalam kasus citra Sentinel-2 ini.

Editor Kode (JavaScript)

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

Urutan juga dapat ditentukan oleh properti turunan, seperti NDVI regional rata-rata. Di sini, NDVI regional ditambahkan sebagai properti ke setiap gambar dalam fungsi yang dipetakan, diikuti dengan pengurutan pada properti baru.

Editor Kode (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);

Visualisasi gambar

Visualisasi gambar mengubah angka menjadi warna. Ada tiga cara untuk mengontrol cara data gambar direpresentasikan sebagai warna dalam metode visualisasi koleksi:

  1. Berikan argumen visualisasi langsung ke getVideoThumbURL dan getFilmstripThumbURL.
  2. Petakan metode gambar visualize ke koleksi gambar sebelum penerapan getVideoThumbURL dan getFilmstripThumbURL.
  3. Petakan metode gambar sldStyle ke koleksi gambar sebelum penerapan getVideoThumbURL dan getFilmstripThumbURL. Lihat Deskripsi Lapisan Bergaya untuk informasi selengkapnya.

Contoh dalam panduan ini menggunakan opsi 1 dan 2, dengan visualisasi yang dicapai dengan memetakan tiga band gambar dari gambar multi-band ke saluran warna merah, hijau, dan biru atau menilai nilai satu band secara linear di sepanjang palet warna. Parameter visualisasi mencakup:

Parameter visualisasi
Parameter Deskripsi Jenis
band Daftar tiga nama band yang dipisahkan koma yang akan dipetakan ke RGB list
mnt Nilai yang akan dipetakan ke 0 angka atau daftar tiga angka, satu untuk setiap band
max Nilai yang akan dipetakan ke 255 angka atau daftar tiga angka, satu untuk setiap band
gain Nilai yang akan digunakan untuk mengalikan setiap nilai piksel angka atau daftar tiga angka, satu untuk setiap band
bias Nilai yang akan ditambahkan ke setiap DN angka atau daftar tiga angka, satu untuk setiap band
gamma Faktor koreksi gamma angka atau daftar tiga angka, satu untuk setiap band
palette Daftar string warna gaya CSS (khusus gambar band tunggal) daftar string hex yang dipisahkan koma
opasitas Opasitas lapisan (0,0 sepenuhnya transparan dan 1,0 sepenuhnya buram) angka

Gunakan argumen bands untuk memilih band yang ingin Anda visualisasikan. Berikan daftar satu atau tiga nama band. Sehubungan dengan gambar multi-band, tiga band pertama dipilih secara default. Urutan nama band menentukan penetapan warna; band pertama, kedua, dan ketiga yang tercantum masing-masing dipetakan ke merah, hijau, dan biru.

Penskalaan rentang data adalah pertimbangan penting saat memvisualisasikan gambar. Secara default, nilai data floating point antara 0 dan 1 (inklusif) diskalakan antara 0 dan 255 (inklusif). Nilai di luar rentang ini dipaksa menjadi 0 dan 255, bergantung pada apakah nilai tersebut kurang dari 0 atau lebih besar dari 1. Sehubungan dengan data bilangan bulat, kapasitas penuh yang ditentukan oleh jenisnya diskalakan antara 0 dan 255 (misalnya, data 16-bit bertanda tangan memiliki rentang dari −32.768 hingga 32.767, yang diskalakan ke [0, 255], secara default). Menerima setelan default sering kali dapat menghasilkan visualisasi dengan sedikit atau tanpa kontras antara fitur gambar. Gunakan min dan max untuk meningkatkan kontras dan menekankan rentang data tertentu. Prinsip dasarnya adalah menetapkan min dan max ke nilai yang mewakili persentil ke-2 dan ke-98 data dalam area minat Anda. Lihat contoh berikut untuk menghitung nilai ini untuk model elevasi digital.

Editor Kode (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());

Parameter palette menentukan warna untuk merepresentasikan gambar visualisasi 8-bit. Hal ini hanya berlaku untuk representasi band tunggal; menentukan representasi dengan gambar multi-band akan menghasilkan error. Jika data adalah band tunggal atau Anda ingin memvisualisasikan satu band dari gambar multi-band, tetapkan parameter forceRgbOutput ke true (tidak diperlukan jika argumen palette disediakan). Gunakan parameter min dan max untuk menentukan rentang nilai untuk diskalakan secara linear antara 0 dan 255.

Berikut adalah contoh pemetaan fungsi visualisasi pada kumpulan gambar satu band. Koleksi NDVI MODIS diimpor, argumen visualisasi untuk metode visualization ditetapkan, dan fungsi yang mengubah nilai menjadi representasi gambar RGB dipetakan di atas koleksi NDVI.

Editor Kode (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);

Berikut adalah contoh pemetaan fungsi visualisasi pada koleksi gambar multi-band:

Editor Kode (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);

Dalam hal ini, tidak ada argumen palet yang diberikan karena tiga band diberikan, yang menentukan intensitas untuk setiap lapisan RGB. Perhatikan bahwa kedua contoh menggunakan parameter min dan max untuk mengontrol nilai yang diregangkan hingga batas data RGB 8-bit.

Thumb video

Fungsi getVideoThumbURL() menghasilkan animasi dari semua gambar dalam ImageCollection dengan setiap gambar mewakili frame. Alur kerja umum untuk membuat animasi adalah sebagai berikut:

  1. Tentukan Geometry yang batasnya menentukan cakupan regional animasi.
  2. Tentukan ImageCollection.
  3. Pertimbangkan visualisasi gambar: petakan fungsi visualisasi gambar di atas koleksi atau tambahkan argumen visualisasi gambar ke kumpulan argumen animasi.
  4. Tentukan argumen animasi dan panggil metode getVideoThumbURL.

Hasil getVideoThumbURL adalah URL. Cetak URL ke konsol dan klik untuk memulai server Earth Engine yang menghasilkan animasi secara langsung di tab browser baru. Atau, lihat animasi di konsol Editor Kode dengan memanggil fungsi ui.Thumbnail pada koleksi dan argumen animasinya yang sesuai. Setelah dirender, animasi tersedia untuk didownload dengan mengklik kanan dan memilih opsi yang sesuai dari menu konteksnya.

Contoh berikut mengilustrasikan pembuatan animasi yang menggambarkan suhu global selama 24 jam. Perhatikan bahwa contoh ini menyertakan argumen visualisasi bersama dengan argumen animasi, bukan memetakan fungsi visualisasi terlebih dahulu di atas ImageCollection. Setelah menjalankan skrip ini, animasi yang mirip dengan Gambar 3 akan muncul di konsol Code Editor.

Editor Kode (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));


Gambar 3. Suhu permukaan per jam untuk solstis musim dingin utara diwakili sebagai gambar GIF animasi.

Filmstrip

Fungsi getFilmstripThumbUrl menghasilkan satu gambar statis yang mewakili penyambungan semua gambar dalam ImageCollection menjadi rangkaian utara-selatan. Urutan frame filmstrip mengikuti urutan alami koleksi.

Hasil getFilmstripThumbUrl adalah URL. Cetak URL ke konsol dan klik untuk memulai server Earth Engine yang membuat gambar secara langsung di tab browser baru. Setelah dirender, gambar dapat didownload dengan mengklik kanan gambar dan memilih opsi yang sesuai dari menu konteksnya.

Cuplikan kode berikut menggunakan koleksi yang sama dengan contoh thumbnail video di atas. Setelah menjalankan skrip ini, filmstrip yang mirip dengan Gambar 4 akan muncul di konsol Code Editor.

Editor Kode (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));


Gambar 4. Suhu permukaan per jam untuk solstis musim dingin utara diwakili sebagai gambar PNG filmstrip. Perhatikan bahwa filmstrip telah dibagi menjadi empat bagian untuk ditampilkan; hasil getFilmstripThumbURL adalah satu rangkaian gambar koleksi yang digabungkan dari utara ke selatan.

Teknik lanjutan

Bagian berikut menjelaskan cara menggunakan pemangkasan, opasitas, dan komposisi lapisan untuk meningkatkan visualisasi dengan menambahkan batas poligon, menekankan area yang diinginkan, dan membandingkan gambar dalam koleksi.

Perhatikan bahwa semua contoh berikut di bagian ini menggunakan ImageCollection dasar yang sama yang ditentukan di sini:

Editor Kode (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});

Overlay

Beberapa gambar dapat ditempatkan secara bertumpuk menggunakan metode blend Image dengan piksel yang tumpang-tindih dari dua gambar digabungkan berdasarkan mask-nya (opasitas).

Overlay vektor

Menambahkan poligon batas administratif dan geometri lainnya ke gambar dapat memberikan konteks spasial yang berharga. Pertimbangkan animasi suhu permukaan harian global di atas (Gambar 3). Batas antara daratan dan samudra agak dapat dibedakan, tetapi dapat dibuat eksplisit dengan menambahkan overlay poligon negara.

Data vektor (Features) digambar ke gambar dengan menerapkan metode paint. Fitur dapat digambar ke gambar yang ada, tetapi praktik yang lebih baik adalah menggambarnya ke gambar kosong, menata gayanya, lalu menggabungkan hasilnya dengan lapisan gambar lain yang ditata gayanya. Memperlakukan setiap lapisan stack visualisasi secara mandiri memberikan lebih banyak kontrol atas gaya visual.

Contoh berikut menunjukkan cara menggambar batas negara Amerika Selatan ke Image kosong dan menggabungkan hasilnya dengan setiap Image dari kumpulan suhu harian global (Gambar 5). Batas negara yang di-overlay membedakan daratan dari perairan dan memberikan konteks pada pola suhu.

Editor Kode (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));


Gambar 5. Tambahkan overlay vektor ke gambar dalam koleksi untuk memberikan konteks spasial.

Overlay gambar

Beberapa gambar dapat ditempatkan untuk mendapatkan gaya yang diinginkan. Misalnya, Anda ingin menekankan area minat. Anda dapat membuat salinan visualisasi gambar yang dibisukan sebagai lapisan dasar, lalu menempatkan versi visualisasi asli yang dipangkas. Berdasarkan contoh sebelumnya, skrip berikut menghasilkan Gambar 6.

Editor Kode (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));


Gambar 6. Menekankan area minat dengan memotong gambar dan menempatkannya di atas salinan yang dibisukan.

Anda juga dapat menggabungkan data gambar dengan lapisan dasar hillshade untuk menunjukkan medan dan memberikan kedalaman pada visualisasi (Gambar 7).

Editor Kode (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));


Gambar 7. Tampilkan medan dengan menempatkan data gambar yang sebagian transparan di lapisan hillshade.

Transisi

Sesuaikan koleksi gambar untuk menghasilkan animasi yang mengungkapkan perbedaan antara dua gambar dalam koleksi menggunakan transisi memudar, berkedip, dan geser. Setiap contoh berikut menggunakan visualisasi dasar yang sama yang dihasilkan oleh skrip berikut:

Editor Kode (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

Dengan hanya dua gambar dalam koleksi, seperti yang terjadi di sini, kedipan adalah representasi default pada animasi koleksi. Sesuaikan argumen animasi framesPerSecond untuk mempercepat atau memperlambat kecepatan kelip. Argumen visualisasi berikut yang diterapkan ke koleksi di atas akan menghasilkan Gambar 8.

Editor Kode (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));


Gambar 8. Contoh berkedip antara suhu permukaan pukul 12.00 GMT untuk solstice utara dan musim dingin.

Pudar

Transisi memudar antara dua lapisan dicapai dengan secara bersamaan mengurangi opasitas satu lapisan sekaligus meningkatkan opasitas lapisan lainnya melalui urutan penambahan opasitas dari mendekati 0 hingga 1 (Gambar 9).

Editor Kode (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));


Gambar 9. Contoh memudar antara suhu permukaan pukul 12.00 GMT untuk musim panas dan solstis musim dingin.

Penggeser

Transisi penggeser secara bertahap menampilkan dan menyembunyikan lapisan gambar yang mendasarinya. Hal ini dicapai dengan menyesuaikan opasitas gambar yang berada di atasnya secara iteratif di berbagai rentang bujur (Gambar 10).

Editor Kode (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));


Gambar 10. Contoh transisi geser antara suhu permukaan pukul 12.00 GMT untuk solstis musim panas dan musim dingin.