Painéis
Um ui.Panel
é um contêiner de IU de nível superior em que os widgets são organizados. Cada
ui.Panel
tem um objeto ui.Panel.Layout
que controla como os
widgets são organizados na tela. Saiba mais na seção Layouts. Os painéis também mantêm uma lista de widgets (que podem incluir outros painéis)
que foram adicionados a eles. Para gerenciar widgets no painel, add()
ou remove()
no painel ou extraia a lista de widgets chamando
widgets()
no painel. A lista de widgets é uma instância de
ui.data.ActiveList
, o que significa que você pode configurar o painel manipulando
a lista e os widgets nela.
ui.root
O ui.root
é uma instância fixa de um ui.Panel
para tudo
no editor de código abaixo da barra horizontal. Por padrão, ele contém apenas um widget: o mapa padrão. Especificamente, o item em ui.root.widgets().get(0)
é o objeto Map
(uma instância de ui.Map
) que é exibido
por padrão no editor de código. Além do alias Map
, a única
outra coisa especial sobre o mapa padrão é que ele tem ferramentas de edição de geometria. Para
criar uma tela em branco para desenvolver a interface, clear()
o mapa padrão
de ui.root
:
Editor de código (JavaScript)
ui.root.clear();
Também é possível modificar o mapa padrão no painel raiz adicionando widgets a ele. Especificamente, pense em um mapa como um painel com um layout absoluto (consulte a seção Layouts para mais detalhes). O exemplo a seguir ilustra uma modificação do mapa padrão:
Editor de código (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); });
O exemplo modifica o mapa padrão (que é Map
) tratando-o como um painel e adicionando widgets a ele. Como os mapas têm layout absoluto, a posição de um widget em um mapa é determinada por uma propriedade position
da propriedade style
do widget. Consulte a seção layout
absoluto para mais detalhes.
Quando você compartilha um link do Code Editor com outro usuário, por padrão, o ui.root
ocupa a maior parte da janela, e o editor de texto, o painel de documentos e o console ficam ocultos. Ao
controlar o layout ui.root
, você pode controlar a experiência de outros usuários
com seu script.
Layouts
Os layouts controlam como os widgets em um painel são organizados para exibição. Há duas opções de layout, descritas abaixo: layout de fluxo e layout absoluto. Os layouts são especificados com
a classe ui.Panel.Layout
. Defina o layout de um painel no construtor
ou com setLayout()
. A ordem em que os widgets são adicionados determina
como eles são organizados em um painel com layout de fluxo. A propriedade position
do style
de cada widget determina como um widget será organizado em um painel
com layout absoluto. Se o estilo em um widget for irrelevante para o layout em que
ele está colocado, ele será ignorado.
Fluxo
Um layout de fluxo mostra widgets em uma linha ('horizontal'
) ou uma coluna
('vertical'
). Os widgets são organizados de acordo com a ordem em que
são adicionados ao painel. Por exemplo, considere os seguintes botões adicionados a um painel:
Editor de código (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);
O layout vertical vai ficar assim:

O width
do painel está definido como 300 pixels, e o
stretch
está definido como 'horizontal'
com a propriedade
style
. A propriedade de estilo stretch
é aplicada a widgets em um painel com
layout de fluxo. Por exemplo, {stretch: 'horizontal'}
significa que o widget vai
se expandir para preencher o espaço horizontal disponível no painel. No exemplo anterior,
mude o tipo de layout de fluxo para 'horizontal'
para ver os botões organizados
em uma linha em vez de uma coluna.
Em um painel de fluxo horizontal, um widget esticado horizontalmente se expande para preencher o espaço disponível depois que todos os outros widgets ocuparem as larguras naturais. Se mais de um widget for esticado horizontalmente, o espaço horizontal disponível será dividido entre eles. Um widget esticado verticalmente se expande para preencher a altura do painel.
Em um painel de fluxo vertical, um widget esticado verticalmente se expande para preencher o espaço disponível depois que todos os outros widgets ocuparem as alturas naturais. Se mais de um widget for esticado verticalmente, o espaço vertical disponível será dividido entre eles. Um widget esticado horizontalmente se expande para preencher a largura do painel.
Absoluto
Um layout absoluto posiciona os widgets de acordo com as posições no painel. Ao contrário do
layout de fluxo, a posição de um widget é determinada pela propriedade position
da propriedade style
do widget, e não pela ordem em que ele é adicionado ao
painel. O exemplo a seguir demonstra o uso do painel root.ui
com
um layout absoluto (o layout do painel raiz é um fluxo horizontal por padrão, mas pode ser
definido com ui.root.setLayout()
):
Editor de código (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'));
O painel de layout absoluto vai ficar assim:

widgets()
Quando você adiciona um widget a um painel, ele é adicionado à lista de widgets do painel. Chamar widgets()
no painel retorna o
ui.data.ActiveList
, que pode ser usado para manipular os widgets no
painel. Considere o exemplo a seguir, que adiciona widgets a um painel, adiciona o painel
ao painel raiz e atualiza um gráfico quando o usuário clica no mapa:
Editor de código (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);
Neste exemplo, observe que, primeiro, os widgets são adicionados ao painel usando
add()
. Na função de callback registrada para mapear cliques, a lista de widgets
panel
é modificada. Especificamente, o terceiro widget (que pode ou não existir) é definido de modo que um novo gráfico de NDVI seja exibido ao longo do tempo. Saiba mais sobre
as funções de tratamento de eventos na página de eventos.