Cálculo de la precisión óptima de Geohash desde el cuadro delimitador

8

Estoy usando la agregación de cuadrícula GeoHash de Elasticsearch para trazar clústeres en un mapa (usando Leaflet). Entiendo que para áreas más grandes precisionse debe usar una configuración más baja para limitar el número de depósitos creados / devueltos.

¿Cómo debo determinar el valor de precisión apropiado para solicitar?

¿Existe una fórmula estándar o recomendada para calcular la precisión óptima basada en un cuadro delimitador y / o nivel de zoom? ¿Es mejor simplemente asignar niveles de zoom a valores de precisión (sé que probablemente sea lo más fácil).

Peter
fuente

Respuestas:

11

La página a la que se vinculó insinúa la respuesta; encuentre el área de su cuadro delimitador y divida por el área del cubo. Sin embargo, deja de lado cómo calcular el tamaño de cada cubo de geohash, aunque da un ejemplo con precisión 5.

Según la página a la que se vinculó, detendrá la consulta en 10000 cubos.

Calcule el área de su cuadro delimitador en grados al cuadrado (no intente hacer esto en km, manténgalo en lat / long)

La captura de pantalla siguiente muestra los límites de precisión 2 (el color se clasifica por precisión 1).

ingrese la descripción de la imagen aquí

Sin embargo, estos no son realmente mosaicos: un geohash representa un punto con errores en lat / lon, y esos errores a veces varían entre la longitud y la latitud (el error es mayor con las latitudes, cuando la precisión es pareja)

Usé un poco de Python (usando la biblioteca Geohash ) para estimar el tamaño de cada 'mosaico' para diferentes precisiones.

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))

esto da el siguiente resultado

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

Entonces un enfoque sería,

  • calcule el "área" (en grados cuadrados) de su cuadro delimitador basado en lat / lon
  • baje esa tabla, comenzando en la precisión 1, y divida su área de bbox (en grados cuadrados) por el área para esa precisión
  • elija el valor de precisión con el valor de división más bajo aceptable

Para aclarar 'aceptable': -

  • un valor de división muy bajo como 0.001 probablemente significa que la precisión es demasiado baja. No irá a buscar muchos cubos, pero considerará muchos puntos distantes que no necesita.

  • Para un valor superior a 10000, la precisión es demasiado alta. Desecharás posibles golpes y sufrirás un rendimiento más lento.

Tendrá que experimentar para encontrar un valor que ofrezca el mejor rendimiento.

Steven Kay
fuente
Gracias por la respuesta detallada; muy útil. Parece que este enfoque debería darme lo que necesito.
Peter