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!
Comments