top of page

Programação

Converta Endereços para Latitude e Longitude

-

Este código é um conjunto de funções e gatilhos (triggers) para uma planilha do Google Sheets que permite geocodificar endereços.

Fundo branco em branco

Posts relacionados...

Design azul abstrato
Design azul abstrato
Design azul abstrato
Design azul abstrato
Design azul abstrato
Design azul abstrato

Converta Endereços para Latitude e Longitude

Atualizado: 16 de jul. de 2024

Este código é um conjunto de funções e gatilhos (triggers) para uma planilha do Google Sheets que permite geocodificar endereços para obter coordenadas (latitude e longitude) e vice-versa. Em outras palavras, converta endereços para latitude e longitude. Ele também inclui a capacidade de definir a região para a qual o serviço de geocodificação deve ser direcionado.


Esteja ciente que, de acordo com as políticas de preço atuais do Google, existe um limite por mês utilizando o plano gratuito para geocodificação. Consulte a documentação para mais detalhes.


Copie o código abaixo e veja como executá-lo no vídeo ao final deste post:


function getGeocodingRegion() {
  return PropertiesService.getDocumentProperties().getProperty('GEOCODING_REGION') || 'us';
}

/*
function setGeocodingRegion(region) {
  PropertiesService.getDocumentProperties().setProperty('GEOCODING_REGION', region);
  updateMenu();
}
function promptForGeocodingRegion() {
  var ui = SpreadsheetApp.getUi();
  var result = ui.prompt(
    'Set the Geocoding Country Code (currently: ' + getGeocodingRegion() + ')',
    'Enter the 2-letter country code (ccTLD) that you would like ' +
    'the Google geocoder to search first for results. ' +
    'For example: Use \'uk\' for the United Kingdom, \'us\' for the United States, etc. ' +
    'For more country codes, see: https://en.wikipedia.org/wiki/Country_code_top-level_domain',
    ui.ButtonSet.OK_CANCEL
  );
  // Process the user's response.
  if (result.getSelectedButton() == ui.Button.OK) {
    setGeocodingRegion(result.getResponseText());
  }
}
*/

function addressToPosition() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var cells = sheet.getActiveRange();
  
  // Must have selected 3 columns (Address, Lat, Lng).
  // Must have selected at least 1 row.

  if (cells.getNumColumns() != 3) {
    Logger.log("Must select at least 3 columns: Address, Lat, Lng columns.");
    return;
  }
  
  var addressColumn = 1;
  var addressRow;
  
  var latColumn = addressColumn + 1;
  var lngColumn = addressColumn + 2;
  
  var geocoder = Maps.newGeocoder().setRegion(getGeocodingRegion());
  var location;
  
  for (addressRow = 1; addressRow <= cells.getNumRows(); ++addressRow) {
    var address = cells.getCell(addressRow, addressColumn).getValue();
    
    // Geocode the address and plug the lat, lng pair into the 
    // 2nd and 3rd elements of the current range row.
    location = geocoder.geocode(address);
   
    // Only change cells if geocoder seems to have gotten a 
    // valid response.
    if (location.status == 'OK') {
      lat = location["results"][0]["geometry"]["location"]["lat"];
      lng = location["results"][0]["geometry"]["location"]["lng"];
      
      cells.getCell(addressRow, latColumn).setValue(lat);
      cells.getCell(addressRow, lngColumn).setValue(lng);
    }
  }
};

function positionToAddress() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var cells = sheet.getActiveRange();
  
  // Must have selected 3 columns (Address, Lat, Lng).
  // Must have selected at least 1 row.

  if (cells.getNumColumns() != 3) {
    Logger.log("Must select at least 3 columns: Address, Lat, Lng columns.");
    return;
  }

  var addressColumn = 1;
  var addressRow;
  
  var latColumn = addressColumn + 1;
  var lngColumn = addressColumn + 2;
  
  var geocoder = Maps.newGeocoder().setRegion(getGeocodingRegion());
  var location;
  
  for (addressRow = 1; addressRow <= cells.getNumRows(); ++addressRow) {
    var lat = cells.getCell(addressRow, latColumn).getValue();
    var lng = cells.getCell(addressRow, lngColumn).getValue();
    
    // Geocode the lat, lng pair to an address.
    location = geocoder.reverseGeocode(lat, lng);
   
    // Only change cells if geocoder seems to have gotten a 
    // valid response.
    Logger.log(location.status);
    if (location.status == 'OK') {
      var address = location["results"][0]["formatted_address"];

      cells.getCell(addressRow, addressColumn).setValue(address);
    }
  }  
};

function generateMenu() {
  // var setGeocodingRegionMenuItem = 'Set Geocoding Region (Currently: ' + getGeocodingRegion() + ')';
  
  // {
  //   name: setGeocodingRegionMenuItem,
  //   functionName: "promptForGeocodingRegion"
  // },
  
  var entries = [{
    name: "Geocode Selected Cells (Address to   Lat, Long)",
    functionName: "addressToPosition"
  },
  {
    name: "Geocode Selected Cells (Address from Lat, Long)",
    functionName: "positionToAddress"
  }];
  
  return entries;
}

function updateMenu() {
  SpreadsheetApp.getActiveSpreadsheet().updateMenu('Geocode', generateMenu())
}

/**
 * Adds a custom menu to the active spreadsheet, containing a single menu item
 * for invoking the readRows() function specified above.
 * The onOpen() function, when defined, is automatically invoked whenever the
 * spreadsheet is opened.
 *
 * For more information on using the Spreadsheet API, see
 * https://developers.google.com/apps-script/service_spreadsheet
 */
function onOpen() {
  SpreadsheetApp.getActiveSpreadsheet().addMenu('Geocode', generateMenu());
  // SpreadsheetApp.getActiveSpreadsheet().addMenu('Region',  generateRegionMenu());
  // SpreadsheetApp.getUi()
  //   .createMenu();
};

getGeocodingRegion(): Esta função obtém a região de geocodificação armazenada nas propriedades do documento (Propriedades do Documento são propriedades que pertencem à planilha específica) ou retorna 'us' (Estados Unidos) como um valor padrão se a região não estiver definida. Isso permite que você defina a região para a qual deseja realizar geocodificação.


addressToPosition(): Esta função realiza a geocodificação de endereços. Ela obtém uma planilha ativa e a faixa de células selecionada. Certifica-se de que foram selecionadas pelo menos 3 colunas (Endereço, Latitude e Longitude) e pelo menos 1 linha. Em seguida, ele usa o serviço de geocodificação do Google Maps para converter os endereços nas células da coluna de endereço em coordenadas de latitude e longitude e preenche as células correspondentes com essas coordenadas.


positionToAddress(): Esta função faz o oposto da anterior. Ela pega as coordenadas de latitude e longitude de uma planilha ativa e a faixa de células selecionada, novamente garantindo que foram selecionadas pelo menos 3 colunas. Em seguida, usa o serviço de geocodificação reversa do Google Maps para converter as coordenadas em endereços e preenche as células da coluna de endereço com esses endereços.


generateMenu(): Esta função gera um menu personalizado que aparece na planilha. O menu inclui duas opções: "Geocode Selected Cells (Address to Lat, Long)" e "Geocode Selected Cells (Address from Lat, Long)". Essas opções correspondem às funções addressToPosition() e positionToAddress(). Isso permite que o usuário escolha entre geocodificar endereços em coordenadas ou vice-versa diretamente da planilha.


updateMenu(): Esta função atualiza o menu na planilha com as opções geradas por generateMenu().


onOpen(): Esta função é um gatilho que é acionado quando a planilha é aberta. Ela adiciona o menu personalizado (definido em generateMenu()) à planilha, tornando-o acessível aos usuários quando eles abrem a planilha.


Há também algumas funções e comentários que estão atualmente desativados (comentados), como a função setGeocodingRegion() e promptForGeocodingRegion(), que originalmente seriam usadas para definir a região de geocodificação. Essas funções estão comentadas, e o código usa apenas a região padrão 'us' definida na função getGeocodingRegion(). Se você quiser permitir que os usuários alterem a região, pode descomentar essas funções e integrá-las ao menu personalizado.


Veja como executar este código:



Gostou do conteúdo? Compartilhe!

bottom of page