2011-01-08 6 views
5

Ich möchte Tausende von Breiten-/Längengrad in einer MySQL-Datenbank speichern. Es war mir gelungen, die Tabellen zu erstellen und die Daten mit den Geodaten-Erweiterungen hinzuzufügen, wobei die Spalte "coord" ein Point (lat, lng) ist.Wie verwende ich geospatiale MySQL-Erweiterungen mit sphärischen Geometrien

Problem:

Ich möchte schnell die ‚N‘ am nächsten Einträge finden ‚X‘ Grad und Längengrade ‚Y‘ nördlicher Breite. Da die Funktion Distance() noch nicht implementiert wurde, habe ich die Funktion GLength() verwendet, um den Abstand zwischen (X, Y) und jedem der Einträge zu berechnen, nach aufsteigender Entfernung zu sortieren und auf "N" -Ergebnisse zu beschränken. Das Problem ist, dass dies nicht die kürzeste Entfernung mit sphärischer Geometrie berechnet. Das heißt, wenn Y = 179.9 Grad ist, wird die Liste der nächsten Einträge nur die Längen von 179.9 enthalten und abnimmt, obwohl engere Einträge mit Längen von -179.9 existieren.

Wie behandelt man typischerweise die Diskontinuität in der Länge beim Arbeiten mit sphärischen Geometrien in Datenbanken? Es muss eine einfache Lösung dafür geben, aber ich muss nur nach dem Falschen suchen, weil ich nichts hilfreiches gefunden habe.

Soll ich einfach die Funktion GLength() vergessen und meine eigene Funktion zur Berechnung der Winkeltrennung erstellen? Wenn ich das tue, wird es immer noch schnell sein und die räumlichen Erweiterungen nutzen?

Danke!

josh


UPDATE:

This ist genau das, was ich oben beschreibe. Es ist jedoch nur für SQL Server. Anscheinend hat SQL Server eine Geometry und Geography-Datentypen. Die Geographie macht genau das, was ich brauche. Gibt es in MySQL etwas Ähnliches?

Antwort

4

Wie behandelt man typischerweise die Diskontinuität in der Länge beim Arbeiten mit sphärischen Geometrien in Datenbanken?

Nicht viele Leute verwenden MySQL für dieses, weil es geospatial Erweiterungen nicht wirklich zum Schnupftabak sind.

Aus der Dokumentation: "All calculations are done assuming Euclidean (planar) geometry."

Die Lösung ist in der Regel zu roll your own.

Alternativ können Sie es fälschen - wenn Ihre Entfernungen weniger als 500 Meilen oder so sind, können Sie Ihre Breiten- und Längengrade als rechtwinklige Koordinaten behandeln und einfach die euklidische Distanzformel verwenden (sqrt(a^2 + b^2)).

+0

Danke für die Antwort. Was benutzen die Leute typischerweise dafür? Ich habe die Seite gesehen, die Sie vor einiger Zeit verlinkt haben, aber das scheint nur das Problem zu lösen, Punkte zu finden, die der gegebenen Breite/Länge am nächsten sind. Es löst nicht das Problem, alle Punkte innerhalb einer Region anzufordern. Mit der Roll-Methode können Sie nicht alle Punkte von 178 lon bis -178 lon und von 30 lat bis 35 lat (rechteckige Region) anfordern. – Joshua

+0

Ich benutze [PostGIS] (http://postgis.refractions.net/). Es gibt auch mehrere Open-Source-Bibliotheken, die verwendet werden können - siehe [osgeo] (http://www.osgeo.org/).Das kann übertrieben sein, wenn Sie nur relative Distanzberechnungen durchführen. – Seth