Calcul de la précision optimale du géohash à partir de la boîte englobante


8

J'utilise l' agrégation de grille GeoHash d'Elasticsearch pour tracer des clusters sur une carte (à l'aide de Leaflet). Je comprends que pour des zones plus grandes, un precisionparamètre inférieur doit être utilisé pour limiter le nombre de compartiments créés / renvoyés.

Comment dois-je déterminer la valeur de précision appropriée à demander?

Existe-t-il une formule standard ou recommandée pour calculer la précision optimale en fonction d'un cadre de sélection et / ou d'un niveau de zoom? Est-il préférable de simplement mapper les niveaux de zoom sur des valeurs de précision (je sais que c'est probablement plus facile.)

Réponses:


11

La page que vous avez liée aux indices de la réponse; trouver la zone de votre boîte englobante et diviser par la zone du seau. Il laisse cependant de côté la façon de calculer la taille de chaque seau de geohash, bien qu'il donne un exemple avec une précision 5.

Selon la page à laquelle vous avez lié, cela arrêtera la requête à 10000 compartiments.

Calculez la surface de votre boîte englobante en degrés carrés (n'essayez pas de le faire en km, gardez-le en lat / long)

La capture d'écran ci-dessous montre les limites de la précision 2 (la couleur est classée par précision 1).

entrez la description de l'image ici

Ce ne sont pas vraiment des tuiles - un geohash représente un point avec des erreurs en lat / lon - et ces erreurs varient parfois entre la longitude et la latitude (l'erreur est plus grande avec les latitudes, lorsque la précision est égale)

Utilisé un peu de Python (en utilisant la bibliothèque Geohash ) pour estimer la taille de chaque 'tuile' pour différentes précisions.

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

cela donne la sortie suivante

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

Donc, une approche serait,

  • calculer la "surface" (en degrés carrés) de votre boîte englobante basée sur lat / lon
  • descendez ce tableau, en commençant à la précision 1, et divisez votre zone bbox (en degrés carrés) par la zone de cette précision
  • choisir la valeur de précision avec la plus petite valeur de division acceptable

Pour clarifier «acceptable»: -

  • une valeur de division très faible comme 0,001 signifie probablement que la précision est trop faible. Vous n'allez pas chercher de nombreux seaux, mais vous envisagerez de nombreux points distants dont vous n'avez pas besoin.

  • Pour une valeur supérieure à 10000, la précision est trop élevée. Vous rejetterez les coups possibles et souffrirez de performances plus lentes.

Vous devrez expérimenter pour trouver une valeur qui donne les meilleures performances.


Merci pour la réponse détaillée; très utile. Cette approche semble me fournir ce dont j'ai besoin.
Peter
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.