Kurz gesagt,
- Was sollte der Datentyp für Längen- und Breitengrad sein?
- Welchen SQL-Befehl sollte ich aufrufen, um beispielsweise die ersten 100 nächstgelegenen Restaurants abzurufen?
Detail:
Ich habe jeweils 100.000 Geschäftsaufzeichnungen mit Längen- und Breitengraden. Ich sehe, dass MySQL tatsächlich einen Datentyp namens point unterstützt. Soll ich das stattdessen verwenden?
Unterstützt MySQL das KDTree-Speichersystem http://en.wikipedia.org/wiki/File:KDTree-animation.gif
Ist es am besten, den Punktdatentyp anstelle des regulären Float-Datentyps zum Speichern von Latitutude und Longitude zu verwenden?
Schließlich möchte ich Dinge wie die ersten 100 Restaurants finden, die zum Beispiel den Punkten 105,6 am nächsten liegen, und meine Datenbanken enthalten viele Geschäfte und Punkte. Offensichtlich wäre die Berechnung der Entfernung nacheinander für jeden Datensatz und für jeden Punkt O (n) und daher schlecht.
Beachten Sie, dass mir eine einfachere Lösung bekannt ist, die unter Anwendung wie Yelp beschrieben wird. Entfernungsinformationen effizient aus der Datenbank abrufen und diese zunächst auch selbst implementieren. Das ist eine gute Antwort.
Ich denke jedoch, dass es eine Creme der Ernteantwort gibt, die das übertreffen sollte, oder? Tatsächlich ist das Speichern von Standorten basierend auf Breiten- und Längengraden und das Finden von Materialien in der Nähe ein sehr häufiges Problem. Ich erwarte, dass MySQL ein spezielles Entwurfsmuster dafür hat. Hat es das?
Wo kann ich mehr darüber erfahren? Vielen Dank.
Antworten:
In Bezug auf Designmuster ist die Yelp-Frage ziemlich normal.
Für eine komplexere Antwort benötigen Sie wahrscheinlich die räumliche Entfernung. Hier ist ein faszinierender Powerpoint zu diesem Thema (und hier ist auch eine PDF-Version davon). Die Mathematik ist jedoch ziemlich hässlich.
Von ihrer Folie:
Bei Stack Overflow gibt es eine längere und ausführlichere Antwort zur räumlichen Entfernung .
Sie möchten die Ergebnisse jedoch nach Längen- und Breitengrad begrenzen.
Letztendlich würde ich den Datentyp POINT vermeiden und mit Längen- / Breitengrad gehen. Derzeit gibt es keine Möglichkeit, den Abstand zwischen zwei PUNKTEN zu bestimmen. Daher müssen Sie für diese Berechnung ohnehin Breiten- und Längengrade speichern.
Ein letzter Link: Möglicherweise möchten Sie auch diesen SO-Thread lesen, um die Abfragen mithilfe von räumlichen Indizes zu beschleunigen.
quelle
Punktdatentypen sind OK; Sie können einfach X (Koordinate) / Y (Koordinate) aufrufen, um die Lat / Lon-Werte zu erhalten.
Beispielsweise:
quelle
Finden Sie die 100 Restaurants, die einer Koordinate am nächsten liegen: Siehe effizienten Code unter http://mysql.rjweb.org/doc.php/latlng. Er enthält eine gespeicherte Funktion zur Berechnung der Entfernung "großer Kreise".
quelle