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!

3 comentários sobre “Palavra do dia, Geocoding”

  1. Interessante notar que este problema de medir distâncias na Terra é bem mais complexo que parece, principalmente se queremos uma precisão maior.

    Numa superfície como a da Terra, o problema de distância é um problema de geometria diferencial, como mostrou o José Antonio, que é agravado pelo fato do raio não ser constante e de a forma da Terra não ser exatamente uma esfera ou elipsoide (na verdade a forma da Terra é um geóide).

    Para quem quiser saber mais sobre o problema de medição de distâncias em geometrias não euclideanas eu recomendo:
    http://en.wikipedia.org/wiki/Great-circle_distance
    http://en.wikipedia.org/wiki/Earth_radius
    http://www.movable-type.co.uk/scripts/latlong.html

    Exemplo de variação do raio da Terra:
    http://upload.wikimedia.org/wikipedia/en/c/cf/Lowresgeoidheight.jpg

    O que é um Geóide?

    Calculando distâncias com precisão: Great Circle

  2. Lembro agora dos meus tempos de IMPA estudando Riemannian Manifold. Se vê que não foi em vão tanta matemática.

    A geometria não euclidiana é bem mais interessante. 🙂

Os comentários estão fechados.