Como converter endereço em latitude e longitude

O Google oferece um serviço de pesquisa e visualização de mapas e imagens de satélite online, conhecido como Google Maps. Através de dados de terceiros, também oferece serviço de busca de endereços no mapa. O processo de conversão de endereços em coordenadas geográficas é chamado geocodificação. Ou seja, o usuário digita o endereço e o Google procura em sua base de dados, fornecendo CEP, latitude e longitude (o que permite plotar o ponto no mapa) e outras informações. O serviço é chamado Google Geocoding API.

end2coord

As informações estão dispostas em um arquivo no formato JSON (JavaScript Object Notation), que é um formato leve com o objetivo de troca de informações entre computadores. É constituído de dois tipos de estruturas: coleção de pares nome/valor (conhecidos como objetos e dispostos em chaves {}) e lista ordenada de valores (conhecida como array ou vetor, dispostos entre colchetes []).

Clique no link abaixo e veja um trecho de um arquivo JSON para o endereço do MASP (Museu de Arte de São Paulo: Avenida Paulista, 1578 - São Paulo):

http://maps.googleapis.com/maps/api/geocode/json?sensor=false&address=Avenida%20Paulista,%201578,%20Sao%20Paulo

Esse arquivo pode ser baixado através do comando wget e lido usando a biblioteca jq, que permite a leitura dos campos JSON. Para baixar a jq, execute os seguintes comandos:

$ wget http://stedolan.github.io/jq/download/linux32/jq (ou 64)
$ chmod +x ./jq
$ sudo cp jq /usr/bin

Segue o script para ler um arquivo ".csv", linha por linha, extraindo as informações úteis, montando o link e baixando-o através do comando wget, retirando as informações do arquivo JSON baixado através do jq e gravando os resultados em um novo arquivo (também imprime uma contagem regressiva para saber quantas linhas ainda faltam para acabar o arquivo de input de dados):

#!/bin/bash
# Script para converter endereço em latitude/longitude

# Contador regressivo para acompanhar evolução
wc=`wc -l input.csv`
nlinhas=`echo $wc | cut -d' ' -f1`

oldIFS=$IFS  # backup do separador de campo
IFS=$'\n'     # novo separador de campo, o caractere de fim de linha

for linha in $(cat input.csv); do
	id=`echo $linha |cut -d',' -f1`
	data=`echo $linha |cut -d',' -f2`
	hora=`echo $linha |cut -d',' -f3`
	tipo=`echo $linha |cut -d',' -f13`
	logradouro=`echo $linha |cut -d',' -f14`
	numeral=`echo $linha |cut -d',' -f16`
	link="http://maps.googleapis.com/maps/api/geocode/json?sensor=false&address=$tipo%20$logradouro,%20$numeral,%20Sao%20Paulo"
	# Colocar %20 no lugar do espaço em branco
	wget -nv `echo $link | sed 's/ /%20/g'`
	# Arrumar nome do arquivo
	arq=`ls -t | head -1`
	mv "$arq" arq_baixado.json
	# Obter variáveis de interesse
	longitude=`cat arq_baixado.json | jq '.results[0].geometry.location.lng'`
	latitude=`cat arq_baixado.json | jq '.results[0].geometry.location.lat'`
	endereco=`cat arq_baixado.json | jq '.results[0].formatted_address'`
	# Imprimir data/horário, endereço e coordenadas em novo arquivo
	echo $id,$data,$hora,$latitude,$longitude,$endereco >> info.csv
	rm arq_baixado.json
	echo $nlinhas
	nlinhas=$(($nlinhas-1))
done
IFS=$old_IFS     # restabelecimento do separador de campo padrão

ps: existe um limite para utilização dessa api no site do Google. Se atingido o limite, aparecerá algo como "You have exceeded your daily request quota for this API." De acordo com o site do Google, é de 2500 requisições por dia para uso gratuito.

Segue um exemplo com duas linhas do arquivo CSV de entrada:

1234,07/12/2012,09:00,FRANZONI,CET,1234-5768,4012,ÁRVORE,ÁRVORE,MÉDIO,TOTAL,JA - JABAQUARA,R,GENERAL GASTAO GOULART,AMBOS,280
5678,07/12/2012,05:00,MICHEL,CET,1234-5678,4012,ÁRVORE,ÁRVORE,MÉDIO,TOTAL,MG - V. MARIA/V. GUILHERME,R,ITAMONTE,B/C,2027

A conversão de CEP para endereço pode ser vista nesse link.

Compartilhe o link desse texto, mas se for copiar algum trecho, cite a fonte. Valorize nosso trabalho.
Mais informações na licença de uso do site.

Um Pingback/Trackback

  • Sadrake Gabriel Silva

    boa tarde,

    Voce pode disponibilizar esse arquivo csv para ter como exemplo?

    Obrigado.

    • Vinicius Roggério da Rocha

      Oi Sadrake,

      Coloquei no final do post duas linhas do arquivo CSV que usei com o script, você pode copiá-las para um arquivo de texto e salvar como “input.csv” para fazer os testes. Espero que ajude.

  • maiconjg

    esse limite será do site que esta requisitando? ou da conta do usuário logado no google?

    • Vinicius Roggério da Rocha

      Creio que esse limite seja por IP, ou seja, se você realizar mais consultas mas de outro computador ou mudar seu IP de saída (usando tor, por exemplo), ele pensa que é outro usuário. Não precisa de conta no Google para usar essa ferramenta deles.

  • Fábio

    boa tarde, estou precisando fazer um cadastro de visitantes, onde consigo formar um grupo de visitantes fechado por uma “categoria” dentro do formulário, no raio de 10km do cadastro de cada visitante, eu consigo fazer isso acontecer?

    • Vinicius Roggério da Rocha

      Boa tarde, Fábio. Uma ideia é, primeiro, converter cada endereço cadastrado em latitude/longitude. Depois, calcular um intervalo máximo e mínimo de latitude e longitude para um visitante e fazer a verificação para cada um dos outros cadastrados se ele está dentro desse limite: se estiver, grava em uma coluna dizendo o CPF dele. Daí você tem todos os visitantes que estão perto dele.
      Para medir a distância entre duas coordenadas de uma forma mais precisa, existe um shell script nesse link que pode ajudar: http://www.unix.com/shell-programming-and-scripting/250356-geographical-distance-between-long-lat-bash.html
      Creio que existe uma técnica matemática mais poderosa que essas iterações, mas no momento pensei isso.

  • Pingback: Como converter CEP para endereço | Monolito Nimbus()