Geohash - Geohash

Geohash é um sistema de geocódigo de domínio público inventado em 2008 por Gustavo Niemeyer e (trabalho semelhante em 1966) GM Morton, que codifica uma localização geográfica em uma curta sequência de letras e dígitos. É uma estrutura hierárquica de dados espaciais que subdivide o espaço em baldes de formato de grade , que é uma das muitas aplicações do que é conhecido como curva de ordem Z e , geralmente , curvas de preenchimento de espaço .

Geohashes oferecem propriedades como precisão arbitrária e a possibilidade de remover gradualmente caracteres do final do código para reduzir seu tamanho (e gradualmente perder a precisão). O geohashing garante que quanto mais longo for um prefixo compartilhado entre dois geohashes, mais próximos espacialmente eles ficarão. O inverso disso não é garantido, pois dois pontos podem estar muito próximos, mas ter um prefixo curto ou nenhum prefixo compartilhado.

História

A parte central do algoritmo Geohash e a primeira iniciativa de solução semelhante foi documentada em um relatório de GM Morton em 1966, "Uma base de dados geodésica orientada por computador e uma nova técnica em sequenciamento de arquivos". O trabalho de Morton foi usado para implementações eficientes da curva de ordem Z , como nesta moderna (2014) versão Geohash-inteiro , baseada na intercalação direta de inteiros de 64 bits . Mas sua proposta de geocódigo não era legível e não era popular.

Aparentemente, no final dos anos 2000, G. Niemeyer ainda não conhecia a obra de Morton e a reinventou, acrescentando o uso da representação base32 . Em fevereiro de 2008, juntamente com o anúncio do sistema, lançou o site http://geohash.org, que permite aos usuários converter coordenadas geográficas em URLs curtos que identificam posições de maneira única na Terra , para que seja mais conveniente referenciá-las em e - mails , fóruns e sites .

Muitas variações foram desenvolvidas, incluindo o link curto do OpenStreetMap (usando base64 em vez de base32) em 2009, o Geohash de 64 bits em 2014, o exótico Hilbert-Geohash em 2016 e outros.

Usos típicos e principais

Para obter o Geohash, o usuário fornece um endereço a ser geocodificado , ou coordenadas de latitude e longitude , em uma única caixa de entrada (os formatos mais usados ​​para pares de latitude e longitude são aceitos) e realiza a solicitação.

Além de mostrar a latitude e longitude correspondentes a determinado Geohash, os usuários que navegam para um Geohash em geohash.org também recebem um mapa embutido e podem baixar um arquivo GPX ou transferir o waypoint diretamente para determinados receptores GPS . Links também são fornecidos para sites externos que podem fornecer mais detalhes sobre o local especificado.

Por exemplo, o par de coordenadas 57.64911,10.40744(perto da ponta da península da Jutlândia, Dinamarca ) produz um hash ligeiramente mais curto de u4pruydqqvj.

Os principais usos dos geohashes são:

  • Como um identificador único.
  • Para representar dados pontuais, por exemplo, em bancos de dados.

Geohashes também foram propostos para serem usados ​​para geotagging .

Quando usada em um banco de dados, a estrutura de dados geohashed tem duas vantagens. Em primeiro lugar, os dados indexados por geohash terão todos os pontos de uma dada área retangular em fatias contíguas (o número de fatias depende da precisão necessária e da presença de "linhas de falha" do geohash). Isso é especialmente útil em sistemas de banco de dados onde as consultas em um único índice são muito mais fáceis ou mais rápidas do que as consultas com vários índices. Em segundo lugar, essa estrutura de índice pode ser usada para uma pesquisa de proximidade rápida e suja: os pontos mais próximos geralmente estão entre os geohashes mais próximos.

Descrição técnica

Uma descrição formal para vistas computacionais e matemáticas.

Representação textual

Para traduções exatas de latitude e longitude, Geohash é um índice espacial de base 4 , porque transforma as coordenadas espaciais contínuas de latitude e longitude em uma grade discreta hierárquica, usando uma quatro partições recorrentes do espaço. Para ser um código compacto ele usa a base 32 e representa seus valores pelo seguinte alfabeto, que é a "representação textual padrão".

Decimal 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Base 32 0 1 2 3 4 5 6 7 8 9 b c d e f g
 
Decimal 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
Base 32 h j k m n p q r s t você v C x y z

O "alfabeto Geohash" (32ghs) usa todos os dígitos 0-9 e quase todas as letras minúsculas, exceto "a", "i", "l" e "o".

Por exemplo, usando a tabela acima e a constante , o Geohash pode ser convertido em uma representação decimal por notação posicional comum : ezs42

[ ezs42] 32 ghs =
=
=
= =

Representação geométrica

A geometria do Geohash tem uma representação espacial mista:

  • Geohashes com 2, 4, 6, ... e dígitos (dígitos pares ) são representados por uma curva de ordem Z em uma "grade regular" onde o par decodificado (latitude, longitude) tem incerteza uniforme, válido como Geo URI .
  • Geohashes com 1, 3, 5, ... d dígitos (dígitos ímpares) são representados por "curva de ordem И". A latitude e a longitude do par decodificado têm incertezas diferentes (a longitude está truncada).
Geohash-OddEvenDigits.png
A curva da grade de 32 células foi obtida mesclando 2 por 2 células do "próximo nível" (grade de 64 células ilustrada aqui) para obter uma representação geométrica do "Geohash de dígitos ímpares".

É possível construir a "curva de ordem И" a partir da ordem Z mesclando células vizinhas e indexando a grade retangular resultante pela função j = floor ( i ÷ 2). A ilustração ao lado mostra como obter a grade de 32 células retangulares a partir da grade de 64 células quadradas.

A propriedade mais importante do Geohash para os humanos é que ele preserva a hierarquia espacial nos prefixos do código .
Por exemplo, na ilustração de "grade de 1 dígito Geohash" de 32 retângulos, acima, a região espacial do código e(retângulo de círculo azul acinzentado na posição 4,3) é preservada com o prefixo ena "grade de 2 dígitos" de 1024 retângulos (escala aparecendo eme círculos verdes acinzentados a azuis na grade).

Algoritmo e exemplo

Usando o hash ezs42como exemplo, aqui está como ele é decodificado em uma latitude e longitude decimal. O primeiro passo é decodificá-lo da " base 32ghs " textual , conforme mostrado acima, para obter a representação binária:

.

Essa operação resulta nos bits 01101 11111 11000 00100 00010 . Começando a contar do lado esquerdo com o dígito 0 na primeira posição, os dígitos nas posições ímpares formam o código da longitude ( 0111110000000), enquanto os dígitos nas posições pares formam o código da latitude ( 101111001001).

Cada código binário é então usado em uma série de divisões, considerando um bit de cada vez, novamente da esquerda para a direita. Para o valor de latitude, o intervalo -90 a +90 é dividido por 2, produzindo dois intervalos: -90 a 0 e 0 a +90. Como o primeiro bit é 1, o intervalo mais alto é escolhido e se torna o intervalo atual. O procedimento é repetido para todos os bits do código. Finalmente, o valor da latitude é o centro do intervalo resultante. As longitudes são processadas de forma equivalente, lembrando que o intervalo inicial é de -180 a +180.

Por exemplo, no código de latitude 101111001001, o primeiro bit é 1, portanto sabemos que nossa latitude está em algum lugar entre 0 e 90. Sem mais bits, adivinharíamos que a latitude era 45, resultando em um erro de ± 45. Como mais bits estão disponíveis, podemos continuar com o próximo bit, e cada bit subsequente divide esse erro pela metade. Esta tabela mostra o efeito de cada bit. Em cada estágio, a metade relevante do intervalo é destacada em verde; um bit baixo seleciona a faixa inferior, um bit alto seleciona a faixa superior.

A coluna "valor médio" mostra a latitude, simplesmente o valor médio do intervalo. Cada bit subsequente torna esse valor mais preciso.

Código de latitude 101111001001
posição da broca valor de bit min meio max valor médio erro máximo
0 1 -90.000 0,000 90.000 45.000 45.000
1 0 0,000 45.000 90.000 22.500 22.500
2 1 0,000 22.500 45.000 33.750 11,250
3 1 22.500 33.750 45.000 39,375 5,625
4 1 33.750 39,375 45.000 42,188 2.813
5 1 39,375 42,188 45.000 43.594 1.406
6 0 42,188 43.594 45.000 42,891 0,703
7 0 42,188 42,891 43.594 42.539 0,352
8 1 42,188 42.539 42,891 42,715 0,176
9 0 42.539 42,715 42,891 42.627 0,088
10 0 42.539 42.627 42,715 42.583 0,044
11 1 42.539 42.583 42.627 42,605 0,022
Código de longitude 0111110000000
posição da broca valor de bit min meio max valor médio erro máximo
0 0 -180.000 0,000 180.000 -90.000 90.000
1 1 -180.000 -90.000 0,000 -45.000 45.000
2 1 -90.000 -45.000 0,000 -22.500 22.500
3 1 -45.000 -22.500 0,000 -11,250 11,250
4 1 -22.500 -11,250 0,000 -5,625 5,625
5 1 -11,250 -5,625 0,000 -2.813 2.813
6 0 -5,625 -2.813 0,000 -4,219 1.406
7 0 -5,625 -4,219 -2.813 -4.922 0,703
8 0 -5,625 -4.922 -4,219 -5,273 0,352
9 0 -5,625 -5,273 -4.922 -5,449 0,176
10 0 -5,625 -5,449 -5,273 -5.537 0,088
11 0 -5,625 -5.537 -5,449 -5.581 0,044
12 0 -5,625 -5.581 -5.537 -5,603 0,022

(Os números na tabela acima foram arredondados para 3 casas decimais para maior clareza)

O arredondamento final deve ser feito com cuidado de forma que

Portanto, embora o arredondamento de 42,605 para 42,61 ou 42,6 seja correto, o arredondamento para 43 não é.

Dígitos e precisão em km

comprimento geohash bits lat bits lng erro lat erro de lng erro de km
1 2 3 ± 23 ± 23 ± 2500
2 5 5 ± 2,8 ± 5,6 ± 630
3 7 8 ± 0,70 ± 0,70 ± 78
4 10 10 ± 0,087 ± 0,18 ± 20
5 12 13 ± 0,022 ± 0,022 ± 2,4
6 15 15 ± 0,0027 ± 0,0055 ± 0,61
7 17 18 ± 0,00068 ± 0,00068 ± 0,076
8 20 20 ± 0,000085 ± 0,00017 ± 0,019

Limitações quando usado para decidir a proximidade

Casos extremos

Geohashes podem ser usados ​​para encontrar pontos próximos uns dos outros com base em um prefixo comum. No entanto, locais de casos extremos próximos uns dos outros, mas em lados opostos do meridiano de 180 graus, resultarão em códigos Geohash sem prefixo comum (longitudes diferentes para locais físicos próximos). Os pontos próximos aos pólos Norte e Sul terão geohashes muito diferentes (longitudes diferentes para localizações físicas próximas).

Duas localizações próximas em cada lado do Equador (ou meridiano de Greenwich) não terão um prefixo comum longo, uma vez que pertencem a diferentes 'metades' do mundo. Simplificando, a latitude (ou longitude) binária de um local será 011111 ... e o outro 100000 ..., portanto, eles não terão um prefixo comum e a maioria dos bits será invertida. Isso também pode ser visto como uma consequência de confiar na curva de ordem Z (que poderia ser mais apropriadamente chamada de visita de ordem N neste caso) para ordenar os pontos, já que dois pontos próximos podem ser visitados em momentos muito diferentes. No entanto, dois pontos com um prefixo comum longo estarão próximos.

Para fazer uma pesquisa de proximidade, pode-se calcular o canto sudoeste (geohash baixo com latitude e longitude baixas) e canto nordeste (geohash alto com latitude e longitude altas) de uma caixa delimitadora e pesquisar geohashes entre os dois. Esta pesquisa recuperará todos os pontos na curva de ordem z entre os dois cantos, que podem ser muitos pontos. Este método também se divide nos 180 meridianos e nos pólos. Solr usa uma lista de filtros de prefixos, calculando os prefixos dos quadrados mais próximos perto do geohash [1] .

Não-linearidade

Como um geohash (nesta implementação) é baseado em coordenadas de longitude e latitude, a distância entre dois geohashes reflete a distância em coordenadas de latitude / longitude entre dois pontos, o que não se traduz em distância real, consulte a fórmula de Haversine .

Exemplo de não linearidade para sistema de latitude-longitude:

  • No Equador (0 Graus), o comprimento de um grau de longitude é 111,320 km, enquanto um grau de latitude mede 110,574 km, um erro de 0,67%.
  • Em 30 graus (latitudes médias), o erro é 110,852 / 96,486 = 14,89%
  • A 60 graus (Alto Ártico) o erro é 111,412 / 55,800 = 99,67%, atingindo o infinito nos pólos.

Observe que essas limitações não são devido ao geohashing, e não devido às coordenadas de latitude-longitude, mas devido à dificuldade de mapear as coordenadas em uma esfera (não linear e com agrupamento de valores, semelhante ao módulo aritmético) para coordenadas bidimensionais e o dificuldade de explorar um espaço bidimensional uniformemente. O primeiro está relacionado ao sistema de coordenadas geográficas e projeção do mapa , e o outro à curva de Hilbert e curva de ordem z . Uma vez que um sistema de coordenadas é encontrado que representa pontos linearmente em distância e quebra nas bordas, e pode ser explorado uniformemente, a aplicação de geohashing a essas coordenadas não sofrerá com as limitações acima.

Embora seja possível aplicar geohashing a uma área com um sistema de coordenadas cartesiano , ele só se aplicaria à área onde o sistema de coordenadas se aplica.

Apesar desses problemas, existem soluções alternativas possíveis e o algoritmo foi usado com sucesso no Elasticsearch, MongoDB, HBase, Redis e Accumulo para implementar pesquisas de proximidade.

Sistemas de indexação semelhantes

É possível usar os mesmos códigos base32-Geohash em diferentes curvas de indexação. Para os ladrilhos quadriláteros, a curva de Hilbert é a melhor alternativa para a curva de Morton , usada por exemplo na geometria S2.
Códigos com número par de dígitos (2, 4, ...) são mapeados para grades regulares, mas códigos de número ímpar (1, 3, ...) devem ser mapeados para uma grade intermediária irregular, com células indexadas por curvas degeneradas .

Uma alternativa para armazenar Geohashes como strings em um banco de dados são os códigos de localização , que também são chamados de chaves espaciais e semelhantes a QuadTiles.

Em alguns sistemas de informações geográficas e bancos de dados espaciais de Big Data , uma indexação baseada na curva de Hilbert pode ser usada como uma alternativa para a curva de ordem Z , como na biblioteca de geometria S2 .

Em 2019, um front-end foi desenvolvido pela QA Locate no que eles chamaram de GeohashPhrase para usar frases para codificar Geohashes para facilitar a comunicação por meio do idioma inglês falado. Havia planos para tornar o GeohashPhrase de código aberto.

Licenciamento

O algoritmo Geohash foi colocado em domínio público por seu inventor em um anúncio público em 26 de fevereiro de 2008.

Enquanto algoritmos comparáveis ​​foram patenteados com sucesso e tiveram direitos autorais reivindicados, GeoHash é baseado em um algoritmo e abordagem totalmente diferentes.

Veja também

Referências

links externos