Widget

Ada berbagai widget yang dapat Anda gunakan untuk mem-build UI. Widget ini mencakup tombol, kotak centang, penggeser, kotak teks, dan menu pilihan. Widget hanya dapat dicetak atau ditambahkan ke panel satu kali. Bagian berikut mengilustrasikan fungsi dasar, tampilan, dan nuansa widget. Lihat bagian Gaya untuk mengetahui informasi selengkapnya tentang gaya widget Anda. Contoh berikut hanya print() widget ke konsol. Untuk mengetahui detail tentang cara menambahkan widget ke panel, lihat halaman Panel dan Tata Letak.

ui.Label

Label hanyalah area tempat teks ditampilkan. Misalnya, kode berikut mencetak label:

Editor Kode (JavaScript)

var label = ui.Label('Cool label!');
print(label);

Yang terlihat seperti ini:

ui_label.png

Pisahkan label panjang dengan menyisipkan karakter baris baru (\n) dan menetapkan argumen properti gaya whiteSpace ke 'pre':

print(ui.Label('Here is a:\nnew line', {whiteSpace: 'pre'}));

ui.Button

Tombol adalah widget UI interaktif yang dapat diklik. Anda dapat menentukan fungsi yang akan dipanggil (fungsi "callback") saat pengguna mengklik tombol. (Untuk informasi selengkapnya tentang penanganan peristiwa dengan fungsi callback, lihat halaman Peristiwa). Contoh berikut mencetak pusat peta saat ini saat tombol diklik:

Editor Kode (JavaScript)

var button = ui.Button({
  label: 'Get Map Center',
  onClick: function() {
    print(Map.getCenter());
  }
});
print(button);

Yang terlihat seperti ini:

ui_button.png

ui.Checkbox

Kotak centang adalah widget yang memungkinkan pengguna mencentang (atau menghapus centang) kotak. Saat status kotak centang berubah, callback yang terdaftar ke widget akan menerima nilai boolean yang menunjukkan apakah kotak centang sekarang dicentang. Contoh:

Editor Kode (JavaScript)

var checkbox = ui.Checkbox('Show SRTM layer', true);

checkbox.onChange(function(checked) {
  // Shows or hides the first map layer based on the checkbox's value.
  Map.layers().get(0).setShown(checked);
});

Map.addLayer(ee.Image('CGIAR/SRTM90_V4'));
print(checkbox);

Kotak centang yang dicetak akan terlihat seperti ini:

ui_checkbox.png

Perhatikan bahwa mencentang kotak akan mengaktifkan lapisan yang ditampilkan di peta. Seperti komponen UI lainnya, Peta Editor Kode dapat dimanipulasi secara terprogram. Pelajari lebih lanjut objek Peta di halaman Panel dan Tata Letak.

ui.Slider

Penggeser adalah widget yang memungkinkan pengguna menyesuaikan penggeser untuk mendapatkan angka dalam rentang penggeser. Konfigurasikan rentang menggunakan konstruktor atau dengan menetapkan properti penggeser. Contoh berikut menggunakan penggeser untuk menetapkan opasitas lapisan pertama di Peta:

Editor Kode (JavaScript)

var slider = ui.Slider();

slider.setValue(0.9);  // Set a default value.
slider.onChange(function(value) {
  Map.layers().get(0).setOpacity(value);
});

Map.addLayer(ee.Image(255), {palette: 'blue'});
print(slider);

Penggeser akan terlihat seperti ini:

ui_slider.png

Perhatikan bahwa nilai penggeser ditampilkan di sebelah kanan penggeser.

ui.DateSlider

Widget DateSlider mirip dengan widget Slider, tetapi menangani tanggal secara eksplisit. DateSlider yang dikonfigurasi untuk memilih hari dari Juni 2018 terlihat seperti ini:

DateSlider.png

DateSlider berguna untuk memfilter koleksi, seperti yang ditunjukkan dalam contoh berikut, yang membuat gabungan tahunan berdasarkan DateRange yang ditetapkan di DateSlider:

Editor Kode (JavaScript)

// Use a DateSlider to create annual composites of this collection.
var collection = ee.ImageCollection('LANDSAT/LC08/C02/T1');
// Use the start of the collection and now to bound the slider.
var start = ee.Image(collection.first()).date().get('year').format();
var now = Date.now();
var end = ee.Date(now).format();

// Run this function on a change of the dateSlider.
var showMosaic = function(range) {
  var mosaic = ee.Algorithms.Landsat.simpleComposite({
    collection: collection.filterDate(range.start(), range.end())
  });
  // Asynchronously compute the name of the composite.  Display it.
  range.start().get('year').evaluate(function(name) {
    var visParams = {bands: ['B4', 'B3', 'B2'], max: 100};
    var layer = ui.Map.Layer(mosaic, visParams, name + ' composite');
    Map.layers().set(0, layer);
  });
};

// Asynchronously compute the date range and show the slider.
var dateRange = ee.DateRange(start, end).evaluate(function(range) {
  var dateSlider = ui.DateSlider({
    start: range['dates'][0],
    end: range['dates'][1],
    value: null,
    period: 365,
    onChange: showMosaic,
    style: {width: '180px'}
  });
  Map.add(dateSlider.setValue(now));
});

// Initialize the map location at southern Africa.
Map.setCenter(23.861, -27.144, 6);

ui.Textbox

Kotak teks adalah tempat untuk mengumpulkan teks yang dimasukkan pengguna. Contoh:

Editor Kode (JavaScript)

var textbox = ui.Textbox({
  placeholder: 'Enter text here...',
  onChange: function(text) {
    print('So what you are saying is ' + text + '?');
  }
});
print(textbox);

Kotak teks akan terlihat seperti ini:

ui_textbox.png

Perhatikan bahwa callback hanya diaktifkan saat pengguna selesai memasukkan teks (dan menekan return), atau pengguna mengklik keluar dari kotak teks.

ui.Select

Widget pilih mewakili menu drop-down pilihan yang dapat dipilih oleh pengguna. Contoh berikut mengilustrasikan menu drop-down untuk memungkinkan pengguna memilih lokasi:

Editor Kode (JavaScript)

var places = {
  MTV: [-122.0849, 37.3887],
  PEK: [116.4056, 39.9097],
  ZRH: [8.536, 47.376]
};

var select = ui.Select({
  items: Object.keys(places),
  onChange: function(key) {
    Map.setCenter(places[key][0], places[key][1]);
  }
});

// Set a place holder.
select.setPlaceholder('Choose a location...');

print(select);

Widget yang dipilih akan terlihat seperti ini:

ui_select.png

ui.Chart

Diagram dalam paket ui.Chart berperilaku mirip dengan diagram dalam paket Chart. Secara khusus, ui.Chart adalah shell tipis di sekitar instance ChartWrapper Google Visualization API. Untuk informasi selengkapnya tentang cara memanipulasi objek ChartWrapper, lihat referensi ini. Untuk mengetahui informasi selengkapnya tentang fungsi helper diagram di Earth Engine, lihat Dokumen diagram.

ui.Thumbnail

Widget thumbnail dapat digunakan untuk melihat pratinjau objek ee.Image dan ee.ImageCollection. Jika diberi ee.Image, widget akan menampilkan gambar statis; jika diberi ee.ImageCollection, widget akan menampilkan animasi dengan satu frame per gambar dalam input. Seperti ee.Image.getThumbURL() dan ee.ImageCollection.getVideoThumbURL(), Anda dapat menentukan parameter untuk mengontrol format dan dimensi thumbnail yang dihasilkan:

Editor Kode (JavaScript)

// Create a box around an area in the Brazilian Amazon.
var box = ee.Geometry.Polygon([[
  [-62.9564, 2.5596], [-62.9550, 2.4313], [-62.8294, 2.4327], [-62.8294, 2.5596]
]]);

// Visualize the image in RGB.
var image = ee.Image('LANDSAT/LE07/C02/T1_L2/LE07_233058_20011113')
                .select(['SR_B[1-3]'])  // blue, green, red reflectance
                .multiply(0.0000275).add(-0.2)  // apply scaling factors
                .visualize({
                  bands: ['SR_B3', 'SR_B2', 'SR_B1'],
                  min: 0,
                  max: 0.12,
                  gamma: 1.3
                });

// Print a thumbnail to the console.
print(ui.Thumbnail({
  image: image,
  params: {dimensions: '256x256', region: box, format: 'png'},
  style: {height: '300px', width: '300px'}
}));

Thumbnail akan terlihat seperti ini:

ui_thumbnail.png

ui.Map

ui.Map adalah widget peta. (Bahkan, Peta Editor Kode default adalah instance dari class ini). Seperti widget lainnya, Anda dapat mencetak peta ke konsol. Manipulasi konten peta dengan menghapus, mendapatkan, atau menetapkan lapisan satu per satu. Contoh berikut mencetak peta ke konsol yang menampilkan batas Peta Code Editor:

Editor Kode (JavaScript)

// Make a little map.
var map = ui.Map();

// Make the little map display an inset of the big map.
var createInset = function() {
  var bounds = ee.Geometry.Rectangle(Map.getBounds());
  map.centerObject(bounds);
  map.clear();
  map.addLayer(bounds);
};

// Run it once to initialize.
createInset();

// Get a new inset map whenever you click on the big map.
Map.onClick(createInset);

// Display the inset map in the console.
print(map);

Peta inset akan terlihat seperti ini:

ui_map.png

Dalam contoh ini, pengguna perlu mengklik peta besar agar inset dapat digambar di peta kecil.

Anda juga dapat memanipulasi lapisan pada peta dengan memanggil layers() pada instance peta. layers() menampilkan ui.data.ActiveList, objek seperti array. Jika diubah, lapisan pada peta juga akan berubah. Pelajari lebih lanjut di bagian ui.Map.Layer.

ui.Map.Layer

Lapisan bukan widget yang dapat diberi gaya seperti ui.Button. Ini hanyalah representasi data lapisan di peta. Contoh berikut menunjukkan cara memperbarui peta dengan membuat lapisan dan memperbarui properti lapisan berdasarkan input pengguna:

Editor Kode (JavaScript)

var consoleMap = ui.Map({
  lon: -2.0174,
  lat: 48.6474,
  zoom: 13
});

// Create a Layer from this Sentinel-2 image
var image = ee.Image('COPERNICUS/S2/20150821T111616_20160314T094808_T30UWU');
var visParams = {bands: ['B4', 'B3', 'B2'], max: 2048, gamma: 1};
var layer = ui.Map.Layer(image, visParams);

// Update the map by updating the layers list.
var layers = consoleMap.layers();
layers.add(layer);

// Make a textbox to accept a gamma value.
// Update the layer when the gamma value is entered.
var gammaBox = ui.Textbox({
  value: 1,
  onChange: function(value) {
    // visParams is NOT an ActiveDictionary, so set it again.
    visParams.gamma = value;
    layer.setVisParams(visParams);
  }
});

print(ui.Label('Enter a gamma value:'));
print(gammaBox);
print(consoleMap);

ui.Map.CloudStorageLayer

Jika Anda ingin menampilkan (misalnya di aplikasi) lapisan yang relatif mahal untuk dikomputasi, sebaiknya ekspor data Anda ke bucket Cloud Storage karena alasan performa. Lapisan statis khusus visualisasi ini dapat membuat aplikasi dan skrip Anda lebih responsif. Anda dapat membuat lapisan tampilan statis untuk tujuan ini menggunakan Export.map.toCloudStorage(). Untuk menggunakan set kartu yang sebelumnya diekspor oleh Export.map.toCloudStorage(), buat ui.Map.Layer baru dari bucket dan jalur Cloud Storage yang ditentukan:

Map.add(ui.Map.CloudStorageLayer({
  bucket: 'earthenginepartners-hansen',
  path: 'tiles/gfc_v1.4/loss_year',
  maxZoom: 12,
  suffix: '.png'
}));

Saat menjalankan skrip yang memuat lapisan Cloud Storage, Anda mungkin melihat pesan peringatan:

Peringatan lapisan awan

ui.Map.DrawingTools

Ada serangkaian alat gambar geometri yang ditambahkan secara default ke Map di Editor Kode. Anda dapat mengubah perilaku alat ini di Map default dengan memanggil Map.drawingTools(). Misalnya, untuk menyembunyikan alat gambar:

Editor Kode (JavaScript)

Map.drawingTools().setShown(false);

Peta yang baru dibuat tidak mendapatkan alat gambar secara default, tetapi dapat diaktifkan dengan memanggil metode drawingTools() pada peta:

Editor Kode (JavaScript)

var map = ui.Map();
// Prints true since drawingTools() adds drawing tools to the map.
print(map.drawingTools().getShown());
// Replace the default Map with the newly created map.
ui.root.widgets().reset([map]);

Lapisan geometri yang digambar oleh alat gambar dimasukkan ke dalam ui.data.ActiveList yang dapat Anda akses dengan memanggil Map.drawingTools().layers(). Daftar lapisan geometri merespons peristiwa seperti daftar aktif lainnya, misalnya daftar lapisan di Map yang ditampilkan oleh Map.layers(). Contoh berikut menunjukkan cara menetapkan visibilitas lapisan geometri yang digambar oleh alat (yang ditampilkan secara default):

Editor Kode (JavaScript)

Map.drawingTools().layers().forEach(function(layer) {
  layer.setShown(false);
});

Untuk menambahkan lapisan secara terprogram ke alat gambar, Anda dapat memanggil metode addLayer pada alat gambar atau menambahkan lapisan langsung ke daftar lapisan:

Editor Kode (JavaScript)

var geometries = [ee.Geometry.Point([0,0]), ee.Geometry.Rectangle([[0,0], [1,1]])];
Map.drawingTools().addLayer(geometries, 'my_geometry1', 'red');

var layer = ui.Map.GeometryLayer(geometries, 'my_geometry2', 'blue');
Map.drawingTools().layers().add(layer);

Status alat gambar juga akan diterapkan saat Anda memublikasikan Aplikasi. Jika Anda menampilkan atau menyembunyikan alat gambar, alat tersebut juga akan ditampilkan atau disembunyikan di Aplikasi Anda. Geometri dalam impor juga akan diterapkan di Aplikasi Anda.

ui.Map.GeometryLayer

GeometryLayer adalah kumpulan geometri yang bertindak sebagai satu Geometry, GeometryCollection, atau FeatureCollection yang ditambahkan ke bagian impor di bagian atas skrip dan dapat direferensikan dalam kode.

GeometryLayer yang digambar oleh alat gambar memiliki perilaku default yang dapat Anda ganti dengan menyediakan fungsi callback baru. Misalnya, Anda ingin perubahan interaktif pada geometri untuk memicu peristiwa. Untuk menerapkan perilaku tertentu, Anda dapat menetapkan metode onEdit(), onErase(), atau onDraw() pada alat untuk merespons tindakan pengguna. Contoh berikut menunjukkan cara memicu komputasi dan memperbarui label dengan hasil komputasi saat pengguna menambahkan/mengedit/menghapus geometri:

Editor Kode (JavaScript)

// Load elevation data.
var srtm = ee.Image('USGS/SRTMGL1_003');
Map.addLayer(srtm, {min: 0, max: 5000}, 'SRTM');

// Make a label to display mean elevation at drawn points.
var label = new ui.Label('Draw points to calculate mean elevation');
var inspector = new ui.Panel([label]);
Map.add(inspector);
// Don't make imports that correspond to the drawn points.
Map.drawingTools().setLinked(false);
// Limit the draw modes to points.
Map.drawingTools().setDrawModes(['point']);
// Add an empty layer to hold the drawn points.
Map.drawingTools().addLayer([]);
// Set the geometry type to be point.
Map.drawingTools().setShape('point');
// Enter drawing mode.
Map.drawingTools().draw();

// This function gets called when the geometry layer changes.
// Use debounce to call the function at most every 100 milliseconds.
var getAverageElevation = ui.util.debounce(function() {
  var points = Map.drawingTools().layers().get(0).toGeometry();
  var elevation = srtm.reduceRegion({
    reducer: ee.Reducer.mean(),
    geometry: points,
    scale: 30
  }).get('elevation');
  // Asynchronously evaluate the mean elevation.
  elevation.evaluate(showElevation);
}, 100);

// Set the callback function on changes of the geometry layer.
Map.drawingTools().onEdit(getAverageElevation);
Map.drawingTools().onDraw(getAverageElevation);
Map.drawingTools().onErase(getAverageElevation);

// Set the label to the result of the mean reduction.
function showElevation(elevation) {
  inspector.clear();
  var elevationLabel = ui.Label('Mean elevation: ' + elevation);
  inspector.add(elevationLabel);
}

Perhatikan bahwa setLinked() digunakan untuk mengalihkan koneksi antara alat gambar geometri dan bagian Impor Editor Kode. Dalam contoh ini, alat geometri dibatalkan tautannya untuk mencegah impor dibuat. toGeometry digunakan untuk mengonversi lapisan menjadi ee.Geometry. Jika lapisan yang diimpor mewakili Feature atau FeatureCollection, Anda dapat mengambil objek EE yang mendasarinya menggunakan getEeObject(). Perhatikan juga penggunaan ui.util.debounce untuk mencegah setiap gerakan geometri memicu fungsi callback. Secara khusus, fungsi tidak akan diaktifkan hingga 100 milidetik berlalu sejak peristiwa terakhir. Hal ini membantu memastikan bahwa fungsi hanya berjalan saat pengguna telah menyelesaikan tindakan edit.

Lapisan geometri dalam impor dikaitkan dengan Geometry atau GeometryCollection, sehingga hanya dapat berisi geometri dengan status geodesik yang sama karena format GeoJSON hanya mengizinkan satu status geodesik untuk kumpulan geometri (lihat halaman Geodesic vs. Planar Geometries untuk mengetahui info selengkapnya). Mengonversi lapisan geometri ke FeatureCollection dengan menekan ikon roda gigi di samping nama lapisan akan memungkinkan Anda menambahkan geometri geodesik dan planar ke lapisan yang sama. Namun, mengonversinya kembali ke Geometry akan menghasilkan error. Untuk menghindarinya, konversikan ke FeatureCollection atau hapus geometri hingga hanya ada satu status geodesik di lapisan.

ui.Map.Linker

Seperti lapisan, penaut bukan widget yang dapat ditata gayanya. Ini adalah utilitas di balik layar yang dapat digunakan untuk menyinkronkan pergerakan beberapa instance ui.Map:

Editor Kode (JavaScript)

// Add two maps to the screen.
var left = ui.Map();
var right = ui.Map();
ui.root.clear();
ui.root.add(left);
ui.root.add(right);

// Link the "change-bounds" event for the maps.
// When the user drags one map, the other will be moved in sync.
ui.Map.Linker([left, right], 'change-bounds');

ui.SplitPanel

ui.SplitPanel berguna untuk membandingkan hal-hal secara berdampingan. Keuntungan ui.SplitPanel dibandingkan dua panel biasa adalah bahwa handle dapat digunakan untuk mencapai transisi penghapusan antara panel dalam ui.SplitPanel. Contoh berikut menggunakan ui.SplitPanel untuk menampilkan perbedaan spektral bekas luka bakar:

Editor Kode (JavaScript)

// Load an image of the Santa Rosa, California 2017 fires.
var image = ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_045033_20171011');

// Add a color-SWIR composite to the default Map.
Map.setCenter(-122.6624, 38.5011, 12);
Map.addLayer(image, {bands: ['B7', 'B5', 'B3'], max: 0.3}, 'color-SWIR');

// Make another map and add a color-NIR composite to it.
var linkedMap = ui.Map();
linkedMap.addLayer(image, {bands: ['B5', 'B4', 'B3'], max: 0.3}, 'color-NIR');
// Add a thermal image to the map.
linkedMap.addLayer(image, {
  bands: ['B11'],
  min: 290,
  max: 305,
  palette: ['gray', 'white', 'yellow', 'red']
}, 'Thermal');

// Link the default Map to the other map.
var linker = ui.Map.Linker([ui.root.widgets().get(0), linkedMap]);

// Make an inset map and add it to the linked map.
var inset = ui.Map();
inset.style().set({position: 'bottom-right', width: '300px', height: '250px'});
inset.setControlVisibility({all: false, mapTypeControl: true});
linkedMap.add(inset);

// Register a function to the linked map to update the inset map.
linkedMap.onChangeBounds(function() {
  var bounds = ee.Geometry.Rectangle(Map.getBounds());
  inset.centerObject(bounds);
  inset.layers().set(0, bounds);
});

// Create a SplitPanel which holds the linked maps side-by-side.
var splitPanel = ui.SplitPanel({
  firstPanel: linker.get(0),
  secondPanel: linker.get(1),
  orientation: 'horizontal',
  wipe: true,
  style: {stretch: 'both'}
});

// Set the SplitPanel as the only thing in root.
ui.root.widgets().reset([splitPanel]);

Perhatikan bahwa parameter wipe disetel ke true, di konstruktor ui.SplitPanel agar pengguna dapat menggeser handle bolak-balik di antara dua visualisasi.

Menata Gaya Widget

Gaya widget dikontrol oleh kamus properti gaya widget. Anda dapat mendapatkan akses ke kamus dengan memanggil style() di widget. Objek yang ditampilkan oleh style() adalah instance ui.data.ActiveDictionary. Artinya, menetapkan properti kamus gaya akan otomatis memperbarui cara widget ditampilkan. Kunci yang diizinkan untuk setiap kamus gaya widget dijelaskan dalam dokumen referensi widget untuk panggilan style().

Gaya widget dapat ditetapkan dengan konstruktor, dengan memanggil style().set() atau dengan memanggil style() dengan argumen kamus. Contoh:

Editor Kode (JavaScript)

var redLabel = ui.Label('Big, Red Label');

redLabel.style().set('color', 'red');
redLabel.style().set('fontWeight', 'bold');
redLabel.style().set({
  fontSize: '32px',
  padding: '10px'
});

print(redLabel);

Perhatikan bahwa dalam contoh ini, label diberi gaya terlebih dahulu dengan memanggil style().set() dengan argumen kunci dan nilai, lalu dengan memanggil style().set() dengan argumen kamus. Panggilan kedua tidak mengganti panggilan pertama; panggilan kedua menambahkan dan mengganti setiap properti gaya, bukan mengganti seluruh kamus gaya.

Untuk informasi selengkapnya tentang opsi gaya untuk widget, lihat referensi Cascading Style Sheet (CSS) ini untuk gaya yang tercantum dalam dokumen style() untuk setiap widget. Perhatikan bahwa gaya yang diizinkan untuk widget Earth Engine berbeda dengan gaya CSS di beberapa tempat, terutama fontSize dan fontWeight untuk font-style dan font-weight.

Kamus gaya juga berisi kunci yang mengontrol posisi widget. Lihat halaman Panel dan Tata Letak untuk mengetahui informasi selengkapnya tentang cara menggunakan properti posisi.