Cálculo da precisão ideal de geohash a partir da caixa delimitadora

8

Estou usando a agregação de grade GeoHash do Elasticsearch para plotar clusters em um mapa (usando o Leaflet). Entendo que para áreas maiores, uma precisionconfiguração mais baixa deve ser usada para limitar o número de buckets criados / retornados.

Como devo determinar o valor de precisão apropriado a ser solicitado?

Existe uma fórmula padrão ou recomendada para calcular a precisão ideal com base em uma caixa delimitadora e / ou nível de zoom? É melhor apenas mapear os níveis de zoom para valores de precisão (eu sei que provavelmente é mais fácil).

Pedro
fonte

Respostas:

11

A página que você vinculou sugere a resposta; encontre a área da sua caixa delimitadora e divida pela área do balde. Porém, deixa de fora como calcular o tamanho de cada bloco de geohash, embora dê um exemplo com precisão 5.

De acordo com a página à qual você vinculou, a consulta será interrompida em 10000 buckets.

Calcule a área da sua caixa delimitadora em graus ao quadrado (não tente fazer isso em km, mantenha-a em lat / long)

A captura de tela abaixo mostra os limites da precisão 2 (a cor é categorizada pela precisão 1).

insira a descrição da imagem aqui

Porém, não são realmente blocos - uma geohash representa um ponto com erros em lat / lon - e esses erros às vezes variam entre longitude e latitude (o erro é maior com latitudes, quando a precisão é uniforme)

Usou um pouco de Python (usando a biblioteca Geohash ) para estimar o tamanho de cada 'bloco' para diferentes precisões.

from Geohash import geohash

strg = geohash.encode(56.9,-3.2,precision=15)

for prec in range(1,10):
    y,x,yerror,xerror = geohash.decode_exactly(strg[:prec])
    xsize = 2*xerror
    ysize = 2*yerror
    area = xsize*ysize
    print("Precision {}".format(prec))
    print("\tSize approx {} long by {} lat".format(xsize,ysize))
    print("\tArea is {}".format(area))

isso fornece a seguinte saída

Precision 1
    Size approx 45.0 long by 45.0 lat
    Area is 2025.0
Precision 2
    Size approx 11.25 long by 5.625 lat
    Area is 63.28125
Precision 3
    Size approx 1.40625 long by 1.40625 lat
    Area is 1.9775390625
Precision 4
    Size approx 0.3515625 long by 0.17578125 lat
    Area is 0.061798095703125
Precision 5
    Size approx 0.0439453125 long by 0.0439453125 lat
    Area is 0.0019311904907226562
Precision 6
    Size approx 0.010986328125 long by 0.0054931640625 lat
    Area is 6.034970283508301e-05
Precision 7
    Size approx 0.001373291015625 long by 0.001373291015625 lat
    Area is 1.885928213596344e-06
Precision 8
    Size approx 0.00034332275390625 long by 0.000171661376953125 lat
    Area is 5.893525667488575e-08

Então, uma abordagem seria,

  • calcule a "área" (em graus quadrados) da sua caixa delimitadora lat / lon
  • desça a tabela, começando na precisão 1, e divida sua área bbox (em graus quadrados) pela área para essa precisão
  • escolha o valor de precisão com o menor valor de divisão aceitável

Para esclarecer 'aceitável': -

  • um valor de divisão muito baixo como 0,001 provavelmente significa que a precisão é muito baixa. Você não estará buscando muitos baldes, mas estará considerando muitos pontos distantes dos quais não precisa.

  • Para um valor acima de 10000, a precisão é muito alta. Você descartará possíveis ocorrências e sofrerá um desempenho mais lento.

Você precisará experimentar para encontrar um valor que ofereça o melhor desempenho.

Steven Kay
fonte
Obrigado pela resposta detalhada; muito útil Essa abordagem parece que deve me dar o que eu preciso.
Peter