Berechnung der optimalen Geohash-Präzision aus dem Begrenzungsrahmen


8

Ich verwende die GeoHash - Rasteraggregation von Elasticsearch, um Cluster auf einer Karte zu zeichnen (mithilfe von Leaflet). Ich verstehe, dass für größere Bereiche eine niedrigere precisionEinstellung verwendet werden sollte, um die Anzahl der erstellten / zurückgegebenen Buckets zu begrenzen.

Wie soll ich den geeigneten Genauigkeitswert für die Anforderung ermitteln?

Gibt es eine Standard- oder empfohlene Formel zur Berechnung der optimalen Genauigkeit basierend auf einem Begrenzungsrahmen und / oder einer Zoomstufe? Ist es besser, Zoomstufen nur Präzisionswerten zuzuordnen (ich weiß, dass dies wahrscheinlich am einfachsten ist).

Antworten:


11

Die Seite, auf die Sie verlinkt haben, gibt Hinweise auf die Antwort. Finden Sie den Bereich Ihres Begrenzungsrahmens und teilen Sie ihn durch den Eimerbereich. Es wird jedoch nicht angegeben, wie die Größe jedes Geohash-Eimers berechnet werden soll, obwohl ein Beispiel mit Genauigkeit 5 angegeben wird.

Entsprechend der Seite, auf die Sie verlinkt haben, wird die Abfrage bei 10000 Buckets gestoppt.

Berechnen Sie die Fläche Ihres Begrenzungsrahmens in Quadrat-Grad (versuchen Sie dies nicht in km, sondern halten Sie sie in Lat / Long).

Der Screenshot unten zeigt die Grenzen der Genauigkeit 2 (die Farbe wird nach Genauigkeit 1 kategorisiert).

Geben Sie hier die Bildbeschreibung ein

Dies sind jedoch keine wirklichen Kacheln - ein Geohash stellt einen Punkt mit Fehlern in Lat / Lon dar - und diese Fehler variieren manchmal zwischen Längen- und Breitengrad (der Fehler ist bei Breitengraden größer, wenn die Genauigkeit gerade ist).

Verwendete ein bisschen Python (unter Verwendung der Geohash-Bibliothek ), um die Größe jeder 'Kachel' für verschiedene Präzisionen zu schätzen.

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

Dies ergibt die folgende Ausgabe

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

Ein Ansatz wäre also:

  • Berechnen Sie die "Fläche" (in Quadratgrad) Ihres Begrenzungsrahmens auf Lat / Lon-Basis
  • Gehen Sie diese Tabelle ab Genauigkeit 1 durch und teilen Sie Ihren bbox-Bereich (in Quadratgrad) durch den Bereich für diese Genauigkeit
  • Wählen Sie den Genauigkeitswert mit dem niedrigsten akzeptablen Teilungswert

Um "akzeptabel" zu klären: -

  • Ein sehr niedriger Teilungswert wie 0,001 bedeutet wahrscheinlich, dass die Genauigkeit zu niedrig ist. Sie werden nicht viele Eimer holen, aber viele entfernte Punkte in Betracht ziehen, die Sie nicht brauchen.

  • Für einen Wert über 10000 ist die Genauigkeit zu hoch. Sie werden mögliche Treffer verwerfen und eine langsamere Leistung erleiden.

Sie müssen experimentieren, um einen Wert zu finden, der die beste Leistung bietet.


Danke für die ausführliche Antwort; sehr hilfreich. Dieser Ansatz sollte mir das bringen, was ich brauche.
Peter
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.