Panel dan Tata Letak

Panel

ui.Panel adalah penampung UI tingkat atas tempat mengatur widget. Setiap ui.Panel memiliki objek ui.Panel.Layout yang mengontrol cara widgetnya diatur di layar. Pelajari lebih lanjut di bagian Tata Letak. Panel juga menyimpan daftar widget (yang dapat mencakup panel lain) yang telah ditambahkan ke panel tersebut. Untuk mengelola widget di panel, add() atau remove() widget dari panel, atau ambil daftar widget dengan memanggil widgets() di panel. Daftar widget adalah instance ui.data.ActiveList, yang berarti Anda dapat mengonfigurasi panel dengan memanipulasi daftar dan widget di dalamnya.

ui.root

ui.root adalah instance tetap ui.Panel untuk semua yang ada di Editor Kode di bawah panel horizontal. Secara default, hanya berisi satu widget: peta default. Secara khusus, item di ui.root.widgets().get(0) adalah objek Map (instance ui.Map) yang ditampilkan secara default di Code Editor). Selain alias Map, satu-satunya hal khusus lainnya tentang Peta default adalah Peta default memiliki alat pengeditan geometri di dalamnya. Untuk mendapatkan kanvas kosong tempat membuat UI, clear() peta default dari ui.root:

Editor Kode (JavaScript)

ui.root.clear();

Atau, Anda dapat mengubah peta default di panel root dengan menambahkan widget ke peta. Secara khusus, anggap peta sebagai panel dengan tata letak absolut (lihat bagian Tata letak untuk mengetahui detailnya). Contoh berikut menggambarkan modifikasi peta default:

Editor Kode (JavaScript)

// Load a VIIRS surface reflectance image and display on the map.
var image = ee.Image('NOAA/VIIRS/001/VNP09GA/2022_06_05').select('M.*');
Map.addLayer(image, {bands: ['M5', 'M4', 'M3'], min: 0, max: 4e3, gamma: 1.5});

// Create the title label.
var title = ui.Label('Click to inspect');
title.style().set('position', 'top-center');
Map.add(title);

// Create a panel to hold the chart.
var panel = ui.Panel();
panel.style().set({
  width: '400px',
  position: 'bottom-right'
});
Map.add(panel);

// Register a function to draw a chart when a user clicks on the map.
Map.style().set('cursor', 'crosshair');
Map.onClick(function(coords) {
  panel.clear();
  var point = ee.Geometry.Point(coords.lon, coords.lat);
  var chart = ui.Chart.image.regions(image, point, null, 30);
  chart.setOptions({title: 'Band values'});
  panel.add(chart);
});

Perhatikan bahwa contoh ini mengubah peta default (yaitu Map) dengan memperlakukannya sebagai panel dan menambahkan widget ke dalamnya. Karena peta memiliki tata letak absolut, posisi widget pada peta ditentukan oleh properti position dari properti style widget. Lihat bagian tata letak absolut untuk mengetahui detailnya.

Saat Anda membagikan link Code Editor kepada pengguna lain, secara default ui.root akan menempati sebagian besar jendela, dan editor teks, panel dokumen, serta konsol akan disembunyikan. Dengan mengontrol tata letak ui.root, Anda dapat mengontrol pengalaman pengguna lain saat menggunakan skrip Anda.

Tata letak

Tata letak mengontrol cara widget di panel diatur untuk ditampilkan. Ada dua opsi tata letak, yang dijelaskan di bawah: tata letak alur dan tata letak absolut. Tata letak ditentukan dengan class ui.Panel.Layout. Tetapkan tata letak panel di konstruktor atau dengan setLayout(). Urutan penambahan widget menentukan cara widget diatur dalam panel dengan tata letak alur. Properti position style setiap widget menentukan cara widget akan diatur dalam panel dengan tata letak absolut. Jika gaya pada widget tidak relevan untuk tata letak tempat widget ditempatkan, gaya tersebut akan diabaikan.

Flow

Tata letak alur menampilkan widget dalam baris ('horizontal') atau kolom ('vertical'). Widget disusun sesuai urutan penambahannya ke panel. Misalnya, pertimbangkan tombol berikut yang ditambahkan ke panel:

Editor Kode (JavaScript)

// Create a panel with vertical flow layout.
var panel = ui.Panel({
  layout: ui.Panel.Layout.flow('vertical'),
  style: {width: '300px'}
});

// Add a bunch of buttons.
for (var i = 0; i < 30; i++) {
  panel.add(ui.Button({label: 'Button ' + i, style: {stretch: 'horizontal'}}));
}

ui.root.clear();
ui.root.add(panel);

Tata letak vertikal akan terlihat seperti ini:

ui_flow_layout.png

Perhatikan bahwa width panel disetel ke 300 piksel dan stretch disetel ke 'horizontal' dengan properti style. Properti gaya stretch berlaku untuk widget di panel dengan tata letak alur. Misalnya, {stretch: 'horizontal'} berarti widget akan diperluas untuk mengisi ruang horizontal yang tersedia dalam panel. Pada contoh sebelumnya, ubah jenis tata letak alur menjadi 'horizontal' untuk melihat tombol yang diatur dalam baris, bukan kolom.

Di panel alur horizontal, widget yang diregangkan secara horizontal akan diperluas untuk mengisi ruang yang tersedia setelah semua widget lain menggunakan lebar alaminya. Jika lebih dari satu widget diregangkan secara horizontal, ruang horizontal yang tersedia akan dibagi di antara widget tersebut. Widget yang diregangkan secara vertikal akan diperluas untuk mengisi tinggi panel.

Di panel alur vertikal, widget yang diregangkan secara vertikal akan diperluas untuk mengisi ruang yang tersedia setelah semua widget lain menggunakan tinggi alaminya. Jika lebih dari satu widget diregangkan secara vertikal, ruang vertikal yang tersedia akan dibagi di antara widget tersebut. Widget yang diregangkan secara horizontal akan diperluas untuk mengisi lebar panel.

Absolut

Tata letak absolut memosisikan widget sesuai posisi di panel. Tidak seperti tata letak alur, posisi widget ditentukan oleh properti position dari properti style widget, bukan urutan penambahannya ke panel. Contoh berikut menunjukkan penggunaan panel root.ui dengan tata letak absolut (tata letak panel root adalah alur horizontal secara default, tetapi dapat disetel dengan ui.root.setLayout()):

Editor Kode (JavaScript)

ui.root.clear();
ui.root.setLayout(ui.Panel.Layout.absolute());

// A function to make buttons labeled by position.
function makeButton(position) {
  return ui.Button({
    label: position,
    style: {position: position}
  });
}

// Add labeled buttons to the panel.
ui.root.add(makeButton('top-left'));
ui.root.add(makeButton('top-center'));
ui.root.add(makeButton('top-right'));
ui.root.add(makeButton('middle-left'));
ui.root.add(makeButton('middle-right'));
ui.root.add(makeButton('bottom-left'));
ui.root.add(makeButton('bottom-center'));
ui.root.add(makeButton('bottom-right'));

Panel tata letak absolut akan terlihat seperti ini:

ui_absolute_layout.png

widgets()

Saat Anda menambahkan widget ke panel, widget tersebut akan ditambahkan ke daftar widget panel. Memanggil widgets() di panel akan menampilkan ui.data.ActiveList yang dapat Anda gunakan untuk memanipulasi widget di panel. Pertimbangkan contoh berikut, yang menambahkan widget ke panel, menambahkan panel ke panel root, lalu memperbarui diagram saat pengguna mengklik peta:

Editor Kode (JavaScript)

// Load and display NDVI data.
var ndvi = ee.ImageCollection('NOAA/VIIRS/001/VNP13A1')
    .filterDate('2021-01-01', '2022-01-01').select('NDVI');
Map.addLayer(
  ndvi.median(), {min: 0, max: 10000, palette: ['99c199', '006400']}, 'NDVI');

// Configure the map.
Map.setCenter(-94.84497, 39.01918, 8);
Map.style().set('cursor', 'crosshair');

// Create an empty panel in which to arrange widgets.
// The layout is vertical flow by default.
var panel = ui.Panel({style: {width: '400px'}})
    .add(ui.Label('Click on the map'));

// Set a callback function for when the user clicks the map.
Map.onClick(function(coords) {
  // Create or update the location label (the second widget in the panel)
  var location = 'lon: ' + coords.lon.toFixed(2) + ' ' +
                 'lat: ' + coords.lat.toFixed(2);
  panel.widgets().set(1, ui.Label(location));

  // Add a red dot to the map where the user clicked.
  var point = ee.Geometry.Point(coords.lon, coords.lat);
  Map.layers().set(1, ui.Map.Layer(point, {color: 'FF0000'}));

  // Create a chart of NDVI over time.
  var chart = ui.Chart.image.series(ndvi, point, ee.Reducer.mean(), 200)
      .setOptions({
        title: 'NDVI Over Time',
        vAxis: {title: 'NDVI'},
        lineWidth: 1,
        pointSize: 3,
      });

  // Add (or replace) the third widget in the panel by
  // manipulating the widgets list.
  panel.widgets().set(2, chart);
});

// Add the panel to the ui.root.
ui.root.add(panel);

Dalam contoh ini, amati bahwa pertama-tama, widget ditambahkan ke panel menggunakan add(). Dalam fungsi callback yang terdaftar untuk memetakan klik, daftar widget panel akan diubah. Secara khusus, widget ketiga (yang mungkin ada atau tidak ada) ditetapkan sedemikian rupa sehingga diagram baru ditampilkan dari NDVI dari waktu ke waktu. Pelajari lebih lanjut fungsi penanganan peristiwa di halaman Peristiwa.