top of page

Converta Endereços para Latitude e Longitude

Foto do escritor: Adauto CostaAdauto Costa

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!

Posts recentes

Ver tudo

Comments


Faça parte da nossa lista de emails

Obrigado!

ad33geo canal whatsapp.png
Dê sua opinião sobre algo do site!

Obrigado! Enviaremos um e-mail em breve informando que seu conteúdo foi publicado!

siga-nos!

  • Facebook
  • Instagram
  • YouTube
bottom of page