Skip to content

Instantly share code, notes, and snippets.

@beckenkamp
Last active May 9, 2016 16:55
Show Gist options
  • Select an option

  • Save beckenkamp/d815e7cc6119bbe11f045b4ea26a90e3 to your computer and use it in GitHub Desktop.

Select an option

Save beckenkamp/d815e7cc6119bbe11f045b4ea26a90e3 to your computer and use it in GitHub Desktop.
Achando coordenadas de um endereço em Python
# -*- coding: utf-8-*-
import sys
import requests
import json
from openpyxl import load_workbook
from script import coordinates # importo o método do projeto
# https://github.com/ffreitasalves/python-address-to-coordinates
# Uma lista de API KEYs do Google Maps
api_key = ["<api key>",
"<api key>",
"<api key>",
"<api key>",
"<api key>"]
# O input do arquivo que contem a Planilha Excel na linha de comando
input_file = sys.argv[1]
# Variaveis de controle inicializadas
count_used_key = 0
blacklist_key = []
# Verifica se alguma planilha foi especificada como segundo argumento na linha de comando senão usa a padrão Palnilha1
if not len(sys.argv) > 2:
sheet_name = 'Planilha1'
else:
sheet_name = sys.argv[2]
# Lê a planilha do Excel
wb_read = load_workbook(input_file)
sh = wb_read.get_sheet_by_name(sheet_name)
# Começa a iterar pelas linhas da planilha, começando da terceira, porque neste caso são os títulos das colunas
for row in sh.rows[3:]:
address = u""
# Sabendo em que coluna cada informação está, eu monto pego cada parte do endereço para uso futuro
the_address = row[2].value
address_extra = row[3].value
neighborhood = row[4].value
city = row[5].value
state = row[6].value
zipcode = row[7].value
city = row[8].value
# itero sobre as mesmas colunas acima para montar a string única de endereço que usarei para pegar as coordenadas
for r in row[2:]:
if r.value is not None:
if address == "":
address = r.value
else:
address = u"{}, {}".format(address, r.value)
# Se existe um endereço, começo a procurar
if not address == ""
tries = 0 # inicializo o número de tentativas
coord = {'lat': '', 'lng': ''} # inicializo o dicionario com coordenadas vazias
while coord['lat'] == '' and coord['lng'] == '':
if tries > 2: # vou tentar procurar as coordenadas no máximo três vezes
break
if tries == 1: # na segunda tentativa eu retiro qualquer extra do endereço (como APTO 108, CASA 4, etc)
address = address.replace(u" {},".format(address_extra), '')
elif tries == 2: # na ultima tentativa eu retiro o bairro
address = address.replace(u" {},".format(neighborhood), '')
print u"Procurando coordenadas. Endereço: {}".format(address)
# aqui começo a iterar sobre a lista de API Keys do Google Maps, isso é feito para que se possa
# utilizar mais requests do que o limite diário de cada API Key
for key in api_key:
# Verifico se a Key já está inutilizável ou não
if key not in blacklist_key:
try:
# busco as coordenadas
coord = coordinates(address, key)
except RuntimeError as e:
# se a Key estiver inutilizável eu adiciona na blacklist
blacklist_key.append(key)
print str(e) # imprimo o erro na tela
tries += 1 # adiciono mais um no número de tentativas para controle
# Junto os dados gerais com as coordenadas
data = {
"address": the_address,
"address_extra": address_extra,
"neighborhood": neighborhood,
"city": city,
"zipcode": zipcode,
"coords" : "POINT({} {})".format(coord['lng'], coord['lat']) # formato as coordenadas em texto
}
# Agora você pode fazer o que quiser com esse dicionário de dados
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment