Palavra do dia, Geocoding

Imagine que você tem um banco de dados grande de pontos de interesse (padarias, lojas, restaurantes, escolas, monumentos, museus, etc.) com as posições geográficas (latitude e longitude) de cada um e deseja saber qual deles está mais próximo de um certo endereço.

Sabendo a latitude e longitude do endereço, descobrir a distância em “linha reta”, na verdade é um arco, entre cada ponto é uma conta bem simples.

Distância entre duas coordenadas geográficas

Onde  e são respectivamente as latitudes dos dois pontos, é a diferença das longitudes e S é o arco que queremos descobrir. Para saber a distância em km, é preciso multiplicar o valor de S pelo raio da Terra, que, na média é igual a 6367,5km.

Por exemplo, suponhamos que quiséssemos saber a distância entre a Torre Eiffel (48.8582780, 2.2942540) e o museu do Louvre (48.86063610, 2.33760960) em Paris.

= 48.8582780˚ = 0.852737818rad
= 48.86063610˚ = 0.852778975rad
= (2.33760960 – 2.2942540) = 0.0433556˚ = 0.000756697969rad

cos(S) = sin(0.852778975) * sin(0.852737818) + cos(0.852778975) * cos(0.852737818) * cos(0.000756697969) = 0.99999987523

Srad = acos(0.99999987523) = 0.000499539793

Skm = 0.000499539793 * 6367.5 = 3.18km

Antes que me xinguem, esta conta não é muito precisa, visto que o raio da Terra não é constante e a Terra não é uma esfera, mas é uma boa aproximação e serve para podermos comparar distâncias.

Então o problema está resolvido, diria um leitor mais afoito. Infelizmente, não. A pergunta é: “Como eu sei que a posição da Torre Eiffel é (48.8582780, 2.2942540)?”

Para isso, precisamos saber como descobrimos a latitude e longitude de um certo endereço (Ex.: Av. Nações Unidas, 12.901, São Paulo, SP) ou local (Tour Eiffel) para podermos resolver o problema. A ação de converter um endereço em latitude e longitude é chamada de “Geocoding”

Algum esperto poderia dizer de gozação: “Ah, procura no Google!” e eu responderia que ele estava certo. O Google disponibiliza gratuitamente um serviço de Geocoding que resolve esse problema, mas tem algumas limitações. A maior delas é o limite de 2.500 buscas por dia, e também a restrição de ter que exibir o resultado da busca num mapa. O endereço de busca é o seguinte:

http://maps.googleapis.com/maps/api/geocode/json?address=[Endereço]&sensor=false

Existem outras soluções gratuitas, como o Bing Maps, o Mapbox e o OpenStreetMaps, dentre outras.

Este último é o único que realmente é gratuito e sem limites, se você quiser hospedar os dados num servidor próprio. O problema é que os dados e o sistema de Geocoding do OpenStreetMaps, chamado de Nominatim, do planeta inteiro ocupam aproximadamente 600GB de HD e sugerem um servidor com 32GB de RAM para rodar bem. Caso contrário, eles sugerem usar um serviço hospedado em sites de terceiros.

Eu encontrei no site da Mapquest, um serviço gratuito de Geocoding, baseado no Nominatim, que parece não ter as limitações do Google.

O endereço é http://open.mapquestapi.com/nominatim/#search_basic

Ainda não sei qual serviço vou usar no projeto que estou terminando, mas estou tendendo a usar este último.

E você? Já fez algum projeto usando Geocoding? Tem alguma dica para passar? Deixe seu recado nos comentários!

Comments on this entry are closed.