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:
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:
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:
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:
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!