Desenvolvimento

4 nov, 2016

GeoFire e conceitos de geolocalização – Parte 02

Publicidade

Leia o primeiro artigo da série Geofire e conceitos de geolocalização.

O que é Geolocalização?

Geolocalização é a localização geográfica do mundo real de um objeto. Isso significa que tudo, desde que esteja em nosso planeta, possui uma localização geográfica, formada pelo cruzamento de dois pontos:

Latitude: É a posição Norte-Sul de um ponto na superfície da Terra.

Longitude: É a posição Leste-Oeste de um ponto na superfície da Terra.

Certo, mas o que este blá blá blá tem a ver com resolver o problema da nossa aplicação?

Em 2008, Gustavo Niemeyer inventou um sistema de geolocalização, uma estrutura de dados hierárquica que subdivide o espaço em forma de grid, chamado GEOHASH.

Geohash

Imagine nosso planeta Terra em um tipo de visualização 2D, plano, com várias divisões, horizontais e verticais. Algo parecido com isso:

1

Cada área representada no mapa possui uma geolocalização, possui uma latitude e uma longitude e possui uma Geohash.

Geohash é um identificador, um ID, um código, ou talvez, assumindo nosso grid como uma matriz, Geohash representa um index de um um conjunto de geolocalizações por todo o planeta Terra.

Um identificador?

Geohash é um código alfanumérico composto por um ou mais caracteres, no qual cada caractere representa a precisão da localização proposta.

Isso significa que quando estou dividindo o meu mapa, formando o grid, quanto mais eu dividir maior será o length do meu geohash e mais precisa será a identificação da localização do meu ponto. Simples, não?

Segue uma tabelinha bacana que ajuda a dar uma dimensão maior:

# km
 1 ±2500
 2 ±630
 3 ±78
 4 ±20
 5 ±2.4
 6 ±0.61
 7 ±0.076
 8 ±0.019

Esta tabelinha se refere à quantidade de caracteres em relação à precisão em Km. Em um caractere estamos falando de uma precisão de 2.500km, quatro caracteres 20km e oito caracteres, algo em torno de 19 metros.

Até hoje, trabalhando com geolocalização não me lembro de ter visto uma precisão acima de nove caracteres, algo em torno de 4 metros.

Mas, como criar uma Geohash?

Para isso, vamos entender o conceito por trás do sistema.

Para criar uma Geohash, passamos por três etapas de conversão:

Latitude/Longitude > Binário

Binário > Decimal

Decimal > alfanumérico (Base 32)

Garanto que em breve tudo fará sentido, então vamos começar do começo. Consideremos uma precisão de seis caracteres.

Nosso primeiro passo é converter nossas coordenadas em um binário. Este binário será composto por seis números de 6 bits cada (precisão de seis caracteres).

Vamos pegar nosso mapa em 2D e fazer uma marcação vertical bem no centro. Vamos assumir então que de -180 até 0 é 0 e de 0 até 180 é 1. Logo, teremos algo assim:

2

Vamos pegar a parte em que o nosso ponto está marcado, que vai de -180 à 0.

Com isso, nosso binário já tem seu primeiro bit: 0.

Agora, vamos fazer a mesma coisa, mas desta vez vamos fazer uma marcação na horizontal, bem no centro:

3

Da mesma forma, vamos pegar a parte em que o nosso ponto está marcado, assumindo também que, de -180 à 0 é 0, e de 0 à 180 é 1.

Com isso, já temos o segundo bit de nosso binário: 0.

Vamos continuar dividindo nosso mapa até termos um binário no qual seja possível dividirmos em seis partes iguais, com seis bits cada.

Acelerando o processo, o ponto marcado possui a coordenada: (-23.550520, -46.633309).

Continuando nossa divisão, vamos ter o binário: 000110001111011110001110000100001010.

Dividindo em seis partes iguais de seis bits cada, teremos: 000110–001111–011110–001110–000100–001010.

Nosso próximo passo é converter este binário em decimal. Cada parte representa um número decimal, ou seja, nosso binário representa: 6–15–30–14–4–10.

Vamos para a última etapa: Converter nosso decimal para alfanumérico, utilizando a base 32 de caracteres:

4

Finalmente, temos nossa Geohash: 6gyf4b.

Isso significa que nosso ponto marcado no mapa é representado/identificado/indexado pelo código 6gyf4b.

Agora, vamos voltar ao nosso problema inicial. Como vou fazer para buscar em minha base de dados estabelecimentos que estejam próximos à mim. Se você entendeu tudo até aqui, já deve ter notado que pontos geográficos próximos a mim têm o mesmo prefixo que eu.

Vamos voltar à nossa tabelinha de precisão x número de caracteres. Sabemos que um Geohash de 6 caracteres se refere a mais ou menos uma área de 610 metros. Logo, estabelecimentos que estejam à 500 metros de mim têm os 6 primeiros caracteres iguais aos meus.

Agora ficou fácil fazer minha query, ein??

Bem, esta é apenas uma introdução sobre geolocalização. Conforme você vai estudando e pesquisando sobre o assunto, vai vendo que existem inúmeras variáveis e formas de mapear pontos geográficos. Geohash é apenas um sistema de geolocalização entre muitos outros.

Dúvidas? Comenta aqui embaixo!