Last active
May 9, 2016 16:55
-
-
Save beckenkamp/d815e7cc6119bbe11f045b4ea26a90e3 to your computer and use it in GitHub Desktop.
Achando coordenadas de um endereço em Python
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # -*- 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