So berechnen Sie Entfernungen zwischen den Koordinaten EFFIZIENT in Oracle
Ich habe einen großen Oracle-Datenbank ( 720,000 Datensätze ca), wo jeder Datensatz hat seine eigenen geographischen Koordinaten (lat & lng) und ich müssen wählen Sie nur die Datensätze, die in einer bestimmten Entfernung von einem Punkt ( in einem bestimmten radius).
Derzeit habe ich implementiert eine Distanz-Funktion (basierend auf haversine), die ich gefunden habe in einer oracle-forum, aber da die Datenbank ist ein bisschen groß, es gibt etwa 50 Sekunden pro wählen.
Irgendwelche Empfehlungen, wie thi effizient?. Ich weiß, es ist eine Erweiterung namens oracle spatial & locator, aber ich weiß nicht, ob ich es kaufen kann oder sogar, wie es funktioniert. Vielen Dank im Voraus. Beste Grüße
InformationsquelleAutor Fgblanch | 2009-10-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwendung eines besseren Algorithmus. Statt der Berechnung die tatsächliche euklidische Distanz, welche ein Quadrat-Wurzel Berechnung, machen Sie Ihre Auswahl auf der linearen Strecke, die erfordert, dass nur die Subtraktion und addition. I. e. wenn Ihr Punkt ist bei (10, 10) und dem radius 5, wählen Sie alle Orte mit Punkte innerhalb des Quadrats gebildet durch (10 +/- 5, 10 +/- 5).
Diese fangen eine kleine Anzahl von false-positives in den Ecken des Platzes. Beseitigen Sie diese durch die überprüfung der Ergebnisse in Ihrer Anwendung durch die Berechnung der richtigen euklidischen Abstand.
Eine weitere Sache. Effizienter zu machen haben wir zwei Indizes, eine für die Breite Spalte und eine weitere für den Längengrad ein. Nun die Leistung ist wirklich gut.
InformationsquelleAutor JSBձոգչ
Bieten mehr details über das format der Lat-und Long-Werten, sowie die spezielle Formel verwendet, die für die Umsetzung haversine.
Gibt es drei Ansätze, die können die Dinge ein wenig zu beschleunigen. Je nach der situation, die wir tun können, zumindest zwei davon.
Weed-out, wie viele Datensätze wie möglich durch ein einfaches Attribut-Wert comparaison.
Für diese Datensätze, die wir nicht brauchen, zu berechnen, was überhaupt.
Zum Beispiel, konvertieren Sie den maximalen radius-Anforderung an einen [großzügig, aber Ungefähre] Bereich der Länge (und ggf. Breite) Werte gelten würde,
Eine alternative (evtl. groben) Distanzmessung.
Zum Beispiel, kann es schneller sein, zu berechnen das Quadrat der eucldidian Entfernung, basierend auf einem gerundeten-up-Koordinaten. (Und natürlich ein, vergleichen diese mit dem Quadrat des gewünschten radius)
Verbesserung der Art und Weise der haversine-Formel umgesetzt wird.
lat und long sind float-Werte in separaten Spalten. Die-Implementierung, die ich verwendet habe, die ich gefunden habe, in dieses forum: forums.oracle.com/forums/thread.jspa?threadID=477747 die ushitaki.
InformationsquelleAutor mjv
Ein paar Vorschläge, wenn Sie nicht bereits tun Sie...
Da die Haversine Berechnung erfordert die Winkel im Bogenmaß, wenn Sie die Speicherung von Längen-und Breitengrad in Grad, fügen Sie ein paar von Spalten und vorausberechnen der radian-äquivalente. Mehr allgemein, pre-compute-Werte in die Funktion, die Sie für die Formel ein, und speichern Sie Sie.
Überlegen mit eine einfachere Funktion zu beseitigen, Punkte, die auch außerhalb des radius, läuft die Haversine-Funktion nur auf diejenigen, die mögliche übereinstimmungen auf der Grundlage der einfachere Funktion. Für Abschlüsse, die Sie nutzen könnten SQRT( (69.1*dLat)2 + (53*dLong)2) ) und verwenden Sie einige fudge-Faktor (10%). Führen Sie Ihre Haversine Berechnung nur auf die Punkte, die mit der gröberen approximation, wenn Sie brauchen, besser als das, was die einfachere Berechnung ermöglicht.
+1, vor allem für Punkt 2.
Ich glaube, ich war der Annahme, dass letztendlich die tatsächliche Entfernung notwendig sein würde, als Teil der Ausgabe, aber wenn nicht, dann könntest du einfach Quadrat der Distanz für den Vergleich.
InformationsquelleAutor tvanfosson
Wenn Sie die Lizenz dann von Oracle Spatial von nutzen sein könnten
Oracle-Docs - Oracle Spatial
Habe ich nicht verwendet, aber einen schnellen scan des docs würde, zeigen Sie auf die Funktion SDO_WITHIN_DISTANCE
InformationsquelleAutor Paul James
Ist die "bestimmte Distanz" etwas konstant? IE sind Sie immer auf der Suche nach "alle Punkte innerhalb von 1 Meile" oder den radius ändern?
Welchen Anteil der Datensätze, die Sie erwarten, um wieder in jede Abfrage? 10%? .10%?
Wenn Sie immer den gleichen radius haben, bauen Sie ein raster aus Quadraten mit der gleichen Länge wie der radius. Weisen Sie jedem eine Liste von benachbarten Quadraten. Jeder Punkt wird wissen, was Platz ist, von dem können Sie eine Liste der alle benachbarten Quadrate. Führen Sie dann die Berechnung nur auf die Punkte, die in diesen Feldern. Dies ist ähnlich wie die anderen Antworten aufgetaucht, aber Sie werden schneller, weil der linearen Berechnungen sind angenähert in einem indizierten lookup eher als berechnet, zwischen jedem Punkt.
Sogar mit einem Variablen radius, Sie können weiterhin die oben genannten, aber Sie haben, um zu berechnen, wie viele 'Nachbarn' zu gehören. Diese sind nur möglich, wenn Sie erwarten sind, erhalten Sie nur einen kleinen Teil der insgesamt von jeder einzelnen Abfrage.
InformationsquelleAutor David Oneill
Wenn Sie nicht brauchen, die Distanz, zu genau, Sie können nur behandeln die Erde als flach. Von diese Diskussion:
Ich habe vor kurzem einige Optimierung für mysql (die hier beschrieben werden: http://www.mooreds.com/wordpress/archives/000547 [sorry, ich bekomme nur 1 hyperlink pro post] ), aber bin mir nicht sicher, wie viele von den Schritten, die ich ging durch gelten für Oracle. Einige werden auf jeden Fall (wie die Verwendung einer bounding box wenn möglich).
InformationsquelleAutor mooreds
Bekommen Sie ein viel genaueres Ergebnis... wenn Sie den 53.0 Magische Zahl... zu berücksichtigen auch die änderung in der Breite. (Nach und nach kleiner, während Sie bei der Bewegung in Richtung der Pole.)
Hat jemand das magic-Magische Formel?
Oder, näher an der form, die Sie verwenden: x = 69.1 * (lat2 - lat1); y = 69.1 * (lon2 - lon1) * cos(lat1/57.3); Aus meridianworlddata.com/Distance-Calculation.asp
InformationsquelleAutor Sally
Zunächst, Haversine ist nicht perfekt, weil die Erde keine perfekte Kugel ist - Lesen http://www.movable-type.co.uk/scripts/latlong-vincenty.html
Zweite - PL/SQL ist nicht ein perfektes Werkzeug, um das Programm Berechnungen mit vielen Zeilen code, die viele Male aufgerufen werden. Wenn man mit Java oder C++ implementieren Sie Ihre math, wird Ihnen eine enorme performance-Verbesserung. C++ - oder Java-code aufgerufen werden kann Oracle nur wie eine Funktion.
Dritte - Menschen kommentiert, dass Sie brauchen, um schneiden Sie so viele Punkte wie möglich mit einfachen rechteckigen Boxen sind sehr korrekt. Einen index erstellen, der durch Längen-und Breitengrad Spalten, wird es helfen, zu führen, dass der Boxsport-Klausel.
Schließlich, ich glaube nicht, dass Oracle Spatial muss hier mit einbezogen werden - es ist ein overkill. Wenn Sie bereits haben und erstellt SDO_GEOMETRY-Spalte, dies ist eine Geschichte, aber wenn nicht, würde ich nicht in Betracht ziehen.
InformationsquelleAutor DimaA6_ABC