Como obter cidade usando latitude e longitude

Existem ferramentas em python para consultar um shapefile e extrair as informações catalogadas da região à qual o ponto pertence. Também é possível usar outras ferramentas para usar uma API de um servidor de mapas e fazer a conversão de uma coordenada geográfica para uma cidade/estado. Veja uma opção de cada sistema e decida qual agrada mais.

Shapegeocode

Shapfile é o formato de arquivo que contém dados geoespaciais em forma de vetor. Ele consiste de três arquivos que trabalham conjuntamente: um principal (.shp), que traz o desenho do mapa propriamente, um índice (.shx), que é um indexador de informações para facilitar buscas, e um de banco de dados (.dbf), trazendo informações e atributos das unidades espaciais (população do município, renda per capita, etc). O que liga esses três arquivos é um ID, único para cada unidade espacial, geralmente chamado de Geocódigo.

Um shapefile com os municípios do Brasil pode ser baixado gratuitamente no site do IBGE (arquivo br_municipios.zip). O código de exemplo mais abaixo está também com o código comentado usando outro shapefile.

Os scripts python podem ser baixados do GitHub/pyshpgeocode https://github.com/gka/pyshpgeocode e instalados através do seguinte comando (para o Anaconda):

O código a seguir lê um arquivo de colunas fixas separadas por espaços sem um cabeçalho. Também abre um arquivo de saída para gravar um cabeçalho e as linhas geradas. Dentro de um loop para todas as linhas do arquivo de entrada, são lidos os valores de latitude, longitude e as coordenadas temporais, que montarão uma string.

Caso seja encontrada uma cidade para aquela coordenada, será impressa uma linha no arquivo de saída com as informações; caso contrário, imprime as coordenadas na tela dizendo que não encontrou.

Geocoder

O Geocoder é uma biblioteca de geocodificação simples e consistente, escrita em Python. Lida com vários provedores de geocodificação diferentes, como Google, Bing, OSM (Open Street Map) e outros. Ele pode ser instalado usando o Anaconda (vide post sobre python) ou usando o pip:

O código a seguir lê um arquivo de colunas fixas separadas por espaços sem um cabeçalho. Também abre um arquivo de saída para gravar um cabeçalho e as linhas geradas. Dentro de um loop para todas as linhas do arquivo de entrada, são lidos os valores de latitude, longitude e as coordenadas temporais, que montarão uma string.

É usada a API do OSM para obter informações do ponto. Nesse caso, faz uma requisição online para um servidor de mapas remoto, mas também pode ser local se tiver instalado o servidor de mapas. Comentado, está uma chamada para a API do Google Maps.

Caso seja encontrada uma cidade para aquela coordenada, será impresso na tela o nome da cidade e o estado; caso contrário, imprime as coordenadas e diz que não encontrou.

Outra forma de consultar uma API do OSM é através do seguinte link de exemplo:

http://nominatim.openstreetmap.org/reverse?format=json&lat=-23&lon=-57

Ela retorna os dados no formato JSON e são informadas a latitude e a longitude do ponto.