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