Há vários widgets que você pode usar para criar interfaces.  Esses widgets incluem
      botões, caixas de seleção, controles deslizantes, caixas de texto e menus de seleção.  Os widgets só podem ser
      impressos ou adicionados a um painel uma vez.  As seções a seguir ilustram a funcionalidade
      básica, a aparência e a sensação dos widgets.  Consulte a
      seção "Estilo" para mais informações sobre como estilizar
      seus widgets.  Os exemplos a seguir simplesmente print() os widgets para o
      console.  Para saber como adicionar widgets aos painéis, consulte a página Painéis e layouts.
ui.Label
Os rótulos são simplesmente áreas em que o texto aparece. Por exemplo, o código a seguir imprime um rótulo:
Editor de código (JavaScript)
var label = ui.Label('Cool label!'); print(label);
Que tem esta aparência:
      Divida rótulos longos inserindo um caractere de nova linha (\n)
      e definindo o argumento de propriedade de estilo whiteSpace como
      'pre':
print(ui.Label('Here is a:\nnew line', {whiteSpace: 'pre'}));
ui.Button
Um botão é um widget de interface interativo que pode ser clicado. É possível especificar uma função a ser chamada (a função "callback") quando um usuário clica no botão. Para mais informações sobre o processamento de eventos com funções de callback, consulte a página de eventos. O exemplo a seguir imprime o centro atual do mapa quando o botão é clicado:
Editor de código (JavaScript)
var button = ui.Button({ label: 'Get Map Center', onClick: function() { print(Map.getCenter()); } }); print(button);
Que tem esta aparência:
      ui.Checkbox
Uma caixa de seleção é um widget que permite que o usuário marque (ou desmarque) uma caixa. Quando o estado da caixa de seleção muda, os callbacks registrados no widget recebem um valor booleano que indica se a caixa de seleção está marcada. Exemplo:
Editor de código (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);
A caixa de seleção impressa vai ficar assim:
      Ao marcar a caixa, uma camada é ativada e exibida no mapa. Assim como outros componentes da interface, o Map do editor de código pode ser manipulado de forma programática. Saiba mais sobre o objeto map na página Painéis e layouts.
ui.Slider
Um controle deslizante é um widget que permite que o usuário ajuste um controle deslizante para receber um número dentro do intervalo do controle. Configure o intervalo usando o construtor ou definindo propriedades do controle deslizante. O exemplo a seguir usa o controle deslizante para definir a opacidade da primeira camada no Mapa:
Editor de código (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);
O controle deslizante vai ficar assim:
      O valor do controle deslizante é mostrado à direita dele.
ui.DateSlider
O widget DateSlider é semelhante ao Slider, mas processa
      datas explicitamente.  Um DateSlider configurado para selecionar um dia de junho
      2018 tem esta aparência:
      O DateSlider é útil para filtrar coleções, conforme mostrado no
      exemplo abaixo, que cria um composto anual com base no DateRange
      definido no DateSlider:
Editor de código (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
Uma caixa de texto é um local para coletar texto inserido pelo usuário. Exemplo:
Editor de código (JavaScript)
var textbox = ui.Textbox({ placeholder: 'Enter text here...', onChange: function(text) { print('So what you are saying is ' + text + '?'); } }); print(textbox);
A caixa de texto vai ficar assim:
      O callback só é acionado quando o usuário termina de digitar texto (e pressiona Return) ou quando o usuário clica fora da caixa de texto.
ui.Select
O widget de seleção representa um menu suspenso de opções que o usuário pode escolher. O exemplo a seguir ilustra um menu suspenso para permitir que um usuário selecione um local:
Editor de código (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);
O widget de seleção vai ficar assim:
      ui.Chart
Os gráficos no pacote ui.Chart se comportam de maneira semelhante aos gráficos no
      pacote Chart.  Especificamente, um ui.Chart é um shell fino
      em torno de uma instância do ChartWrapper da API Google Visualization.
      Para mais informações sobre como manipular objetos ChartWrapper, consulte
      esta
        referência.  Para mais informações sobre as funções auxiliares de gráficos no Earth Engine, consulte a documentação de gráficos.
ui.Thumbnail
O widget de miniatura pode ser usado para visualizar objetos ee.Image e
    ee.ImageCollection. Quando um ee.Image é fornecido, o widget
    mostra uma imagem estática. Quando um ee.ImageCollection é fornecido, ele mostra uma
    animação com um frame por imagem na entrada. Assim como em ee.Image.getThumbURL() e
    ee.ImageCollection.getVideoThumbURL(), é possível especificar parâmetros para controlar o
    formato e as dimensões da miniatura resultante:
Editor de código (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'} }));
A miniatura vai ficar assim:
      ui.Map
Um ui.Map é um widget de mapa.  Na verdade, o Map
      padrão do Code Editor é uma instância dessa classe.  Assim como outros widgets, é possível imprimir um mapa no console.  Manipule o conteúdo do mapa limpando, recebendo ou definindo camadas individuais.  O exemplo a seguir imprime um mapa no console que mostra os limites
      do Mapa do editor de código:
Editor de código (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);
O mapa inserido deve ficar assim:
      Neste exemplo, o usuário precisa clicar no mapa grande para que o mapa menor seja desenhado.
Também é possível manipular camadas no mapa chamando layers() na instância do mapa.  O layers() retorna um ui.data.ActiveList, um
      objeto semelhante a uma matriz.  Quando isso acontece, as camadas do mapa também mudam.  Saiba mais
      na seção ui.Map.Layer.
ui.Map.Layer
Uma camada não é um widget estilizável, como um ui.Button.  É apenas uma representação de dados da camada no mapa.  O exemplo a seguir demonstra como atualizar um mapa criando uma camada e atualizando as propriedades dela com base na entrada do usuário:
Editor de código (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
Se você quiser mostrar (por exemplo) uma camada relativamente cara para computação,
      exporte seus dados para um bucket do Cloud Storage
      por motivos de desempenho.  Essas camadas estáticas, apenas de visualização, podem deixar seus apps
      e scripts mais responsivos.  É possível criar uma camada de exibição estática para essa finalidade usando
      Export.map.toCloudStorage().
      Para usar um conjunto de blocos exportado anteriormente por
      Export.map.toCloudStorage(),
      crie um novo ui.Map.Layer de um bucket e um caminho especificados do Cloud Storage:
    
Map.add(ui.Map.CloudStorageLayer({ bucket: 'earthenginepartners-hansen', path: 'tiles/gfc_v1.4/loss_year', maxZoom: 12, suffix: '.png' }));
Ao executar um script que carrega uma camada do Cloud Storage, você pode receber a seguinte mensagem de aviso:
    ui.Map.DrawingTools
Há um conjunto de ferramentas de desenho de geometria que é adicionado por padrão ao Map
      no editor de código.  É possível mudar o comportamento dessas ferramentas no Map
      padrão chamando Map.drawingTools().  Por exemplo, para ocultar as
      ferramentas de desenho:
Editor de código (JavaScript)
Map.drawingTools().setShown(false);
Os mapas recém-criados não recebem ferramentas de desenho por padrão, mas podem ser ativadas chamando o
      método drawingTools() no mapa:
Editor de código (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]);
As camadas de geometria desenhadas pelas ferramentas de desenho são colocadas em um
      ui.data.ActiveList, que pode ser acessado chamando
      Map.drawingTools().layers().  A lista de camadas de geometria responde a eventos
      como outras listas ativas, por exemplo, a lista de camadas no Map retornado por
      Map.layers().  O exemplo a seguir mostra como definir a visibilidade das camadas de geometria desenhadas pelas ferramentas (que são mostradas por padrão):
Editor de código (JavaScript)
Map.drawingTools().layers().forEach(function(layer) { layer.setShown(false); });
      Para adicionar uma camada de forma programática às ferramentas de desenho, chame o
      método addLayer nas ferramentas de desenho ou adicione uma camada diretamente à lista de camadas:
    
Editor de código (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);
O estado das ferramentas de desenho também é transferido quando você publica um app. Se as ferramentas de desenho estiverem mostradas ou ocultas, elas também serão mostradas ou ocultas no app. As geometrias nas importações também serão transferidas para o app.
ui.Map.GeometryLayer
Um GeometryLayer é uma coleção de geometrias que atua como um único
      Geometry, GeometryCollection ou FeatureCollection
      que é adicionado à seção de importações na parte superior do script e pode ser referenciado no
      código.
Os GeometryLayers desenhados pelas ferramentas de desenho têm um comportamento padrão que pode ser
      substituído fornecendo novas funções de callback.  Por exemplo, suponha que você queira
      mudanças interativas nas geometrias para acionar um evento.  Para implementar um comportamento
      específico, defina os métodos onEdit(), onErase() ou
      onDraw() nas ferramentas para responder às ações do usuário.
      O exemplo a seguir mostra como acionar um cálculo e atualizar um rótulo com o resultado da
      computação quando o usuário adiciona/edita/apaga uma geometria:
Editor de código (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); }
setLinked() é usado para alternar a conexão entre as
      ferramentas de desenho de geometria e a seção
      Imports
      do editor de código.  Neste exemplo, as ferramentas de geometria são desvinculadas para
      impedir a criação de importações. toGeometry é usado para converter a
      camada em um ee.Geometry. Se a camada importada representar um Feature
      ou FeatureCollection, será possível recuperar o objeto EE subjacente usando
      getEeObject().  Observe também o uso de ui.util.debounce
      para evitar que cada movimento de uma geometria acione a função de callback.  Especificamente,
      a função não será acionada até que 100 milissegundos tenham decorrido desde o último evento.  Isso
      ajuda a garantir que a função seja executada somente quando o usuário concluir a ação de edição.
Uma camada de geometria nas importações é associada a um Geometry ou
      GeometryCollection. Portanto, ela só pode conter geometrias com o mesmo estado geodesicamente
      porque o formato GeoJSON permite apenas um único estado geodesicamente para a coleção
      de geometrias. Consulte a página Geodesic vs. Planar Geometries para mais informações.  A conversão da camada de geometria em uma
      FeatureCollection ao pressionar o ícone de engrenagem ao lado do nome da camada permite
      adicionar geometrias planas e geodésicas à mesma camada. No entanto, a conversão
      de volta para um Geometry vai gerar um erro.  Para evitar isso, converta
      em um FeatureCollection ou exclua geometrias até que haja apenas um estado geodésico
      na camada.
    
ui.Map.Linker
Assim como uma camada, um vinculador não é um widget estilizável.  É um utilitário de bastidores que
      pode ser usado para sincronizar o movimento de várias instâncias de ui.Map:
Editor de código (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
Um ui.SplitPanel é útil para comparar coisas lado a lado.  A vantagem
      de um ui.SplitPanel em relação a dois painéis comuns é que uma alça pode ser usada para
      conseguir uma transição de limpeza entre os painéis em um ui.SplitPanel.  O exemplo a seguir usa um ui.SplitPanel para mostrar as diferenças espectrais das cicatrizes de queimadura:
Editor de código (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]);
O parâmetro wipe é definido como true,
      no construtor ui.SplitPanel, para permitir que o usuário deslize a alça
      para frente e para trás entre as duas visualizações.
Estilo dos widgets
O estilo de um widget é controlado pelo dicionário de propriedades de estilo do widget.  Para acessar o dicionário, chame style() no widget.  O
      objeto retornado por style() é uma instância de
      ui.data.ActiveDictionary.  Isso significa que definir propriedades do dicionário de estilo
      atualiza automaticamente a forma como o widget é exibido.  As chaves permitidas
      para o dicionário de estilo de cada widget são detalhadas nos documentos de referência do widget para a
      chamada style().
Os estilos do widget podem ser definidos com o construtor, chamando
      style().set() ou style() com um argumento de
      dicionário.  Exemplo:
Editor de código (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);
Neste exemplo, o estilo do rótulo é definido primeiro chamando
      style().set() com argumentos de chave e valor e, em seguida, chamando
      style().set() com um argumento de dicionário.  A segunda chamada não
      substitui a primeira. Ela adiciona e substitui propriedades de estilo individuais, em vez de
      substituir o dicionário de estilo inteiro.
Para mais informações sobre as opções de estilo para widgets, consulte esta
      referência de folha de estilo
        (CSS) em casca para os estilos listados nos documentos style() de cada
      widget.  Os estilos permitidos para widgets do Earth Engine são diferentes dos estilos CSS
      em vários lugares, principalmente fontSize e fontWeight para
      font-style e font-weight, respectivamente.
O dicionário de estilos também contém chaves que controlam a posição do widget. Consulte a página Painéis e layouts para mais informações sobre como usar propriedades posicionais.