2016-04-22 6 views
0

Ich habe ein Problem, bei dem ich prüfen muss, ob ein Geohash in eine Liste anderer Punkte mit dynamischen Radien/Kästchen fällt. Momentan erhalte ich Gebotsanforderungsnachrichten, die lat/lon enthalten, und benutze redis, um zu prüfen, welche Kampagnen mit dem Gerät der Stadt/lon übereinstimmen würden. Dies funktioniert, wenn ich mit einem festen Radius abfrage. Das Problem ist, dass ich die Kampagnen mit dynamischen Radien abhängig von der Bevölkerungsdichte speichern möchte.Überprüfen, ob ein Geohash einen anderen Geohash schneidet

Die aktuelle Implementierung

In 3.2 Versionen von redis Sie die Möglichkeit, speichern geohashes in einem Zsoll in Befehle der eingebauten verwenden. Dies wandelt das lat/lon in einen 52 Bit Geohash um.

Mit der Funktion redis zset kann ich die Liste der Kampagnen abfragen, die auch in einem Radius passieren. Dies wird mir (0, n) Kampagnen zurückgeben, die in den aktuellen Radius fallen.

Die aktuelle Implementierung Nachteile

Das Problem, das ich habe, ist, dass die Kampagnen dynamischen Radien haben. So kann beispielsweise eine Kampagne einen Radius von 3 Meilen haben, während eine andere einen Radius von 20 Meilen haben kann. Da ich in einem einzigen Radius fahren muss, passiere ich einfach 5 Meilen, aber dies schließt Anfragen aus dem 20-Meilen-Radius aus.

Potential Verbesserte Umsetzung

ich über dieses Problem dachte, aber ich bin nicht sicher, wie es zusammen zu stellen. Ich denke, was wäre eine bessere Lösung wäre, eine Liste von Geohashes in einem sortierten Satz mit unterschiedlicher Genauigkeit im Wesentlichen erstellen eine Geo-Hash-Box für jeden Eintrag zu haben. Das Problem ist jetzt, dass ich mir nicht 100% sicher bin, wie ich das zusammenstellen soll oder ob es so funktionieren würde, wie ich es möchte. Ich suche wirklich nach Führung, wenn das funktionieren würde und wenn irgendjemand so etwas zusammen gestellt hätte. Ich denke, ich kann dies mit einer einfachen sortierten Menge erreichen und dann die Bits in der Genauigkeit des Eintrags in der sortierten Menge maskieren. Ich kann jedoch feststellen, dass dies ein Problem bei der Bearbeitung einer großen Liste von Kampagnen ist. Nicht ganz sicher, ob es mit mehreren ganzen Zahlen unterschiedlicher Genauigkeit arbeiten wird oder wie die O-Notation in diesem Fall funktionieren würde. Ich brauche es so schnell wie möglich, da ich täglich rund 4 Milliarden Anfragen bearbeiten muss.

Hinweise

Ich hoffe, ich habe einen guten Job des Problems getan, da es ein ziemlich komplexes Problem zu beschreiben ist. Ich habe mir auch einige Bibliotheken angeschaut, aber ich denke nicht, dass sie das Problem für mich lösen werden. Ich habe angefangen, meine eigene Implementierung zu schreiben, aber die Komplexität lässt meinen Kopf schnell schmerzen.

Die ursprüngliche Bibliothek, die ich untersucht habe. Ermöglicht die Abfrage einzelner Boxen.

https://github.com/kungfoo/geohash-java

Dieses schaut vielversprechend, aber ich war nicht sicher, ob es tatsächlich die Möglichkeit geben, mehrere Boxen zu suchen.

https://github.com/davidmoten/geo

Hier ist eine hervorragende Übersicht über geohasing. Nicht sicher, warum es bei einem IP ist, aber ich bin froh, dass ich es gefunden habe.

http://23.239.12.206:8000/posts/2014-04-05-geohash-proximity-pt2.html

Antwort

1

Sie könnten einen gewichteten Voronoidiagramm und einen Punkt in Polygon-Test versuchen. Eine einfache und schnelle Lösung könnte eine Bitmap sein, bei der jede Zelle des gewichteten Voronoi-Diagramms eine Farbe hat. Dann überprüfe einfach die Farbe des Punktes.

Verwandte Themen