Speicherung und Abfrage von GPS-Koordinaten Effektiv
Ich will eine große Datenbank mit GPS-Koordinaten abgefragt werden können, indem Sie sagen: "gib alle Koordinaten, die sich innerhalb von 'n' m [dieser Koordinate]".
Ich es brauche, um so effizient wie möglich sein, damit die Schleife durch alle Koordinaten in der Datenbank und die Berechnung, ob eine Koordinate innerhalb 'n' m würde nicht die gewünschte Lösung.
Gibt es eine einfachere Lösung?
Dank
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich in der Regel tun, diese Art der Abfrage mit lat/lon. Mit Hilfe der sphärischen geometrie können Sie einen Begrenzungsrahmen um einen bestimmten Punkt. Zum Beispiel, sagen, Sie haben einen Punkt (X,Y), dass Sie möchten, dass alle Koordinaten innerhalb 1 Meile (Umrechnung in Meter lasse ich als übung für den Leser). Sie können bestimmen, eine bounding-box (X-1,Y-1),(X+1,Y+1). Dann Fragen Sie Ihre Punkte-Datenbank mit dem ZWISCHEN-operator (SELECT foo FROM bar WHERE LAT ZWISCHEN X-1 UND X+1 UND LON-ZWISCHEN Y-1 UND Y+1). Dann müssen Sie Ihre detail-Distanz-Berechnung, um "Runde Ecken" Ihrer bounding box.
Nachteil ist, dass die Längengrade sind näher zusammen an der Spitze der Kugel, so erhalten Sie verzerrt die Ergebnisse, die weiter Weg Sie vom äquator entfernt. Aber es dient immer noch zu schnell filtern Sie Ihre Ergebnisse legt.
Google "Great Circle Distance" für die Berechnungen.
EDIT: Es gibt 0.167469 Längengrade pro Meile (das reicht von 0.167469 zu 0.014564), und 0.014483 Breitengrade pro Meile. Damit Ihre bounding box ist
(lat - (miles * 0.014483), lon - (miles * 0.167469)), (lat + (miles * 0.014483), lon + (miles * 0.167469))
Gibt es Unterstützung in SQL Server 2008 für die Speicherung Geo-Daten. Ich habe noch nie mit ihm gearbeitet, mich aber ich weiß, Sie können Abfragen erstellen, von der Art Sie wollen.
Viele Datenbank-Systeme haben die Funktion für das arbeiten mit raumbezogenen Daten.
Hier ist-Vergleich geospatial-Funktionen von SQL Server 2008, PosGIS und MySQL
http://www.bostongis.com/PrinterFriendly.aspx?content_name=sqlserver2008_postgis_mysql_compare
Wenn Sie können haben Ihre Wahl von DB, ich würde empfehlen, die gleiche wie rwwilden und verwenden von SQL 2008 mit seiner räumlichen Daten-Funktionen. Wenn Sie nicht verwenden können, dass die Lösung oder eine, die auch räumliche Abfragen, können Sie einen Blick auf Microsoft ' s eigene Papier auf Hierarchical Triangular Mesh und implementieren diese Dinge. Das SDK für MSSQL '05 kam mit einer ganzen Lösung für HTM out-of-the-box als gut, so konnte man nur nehmen, und konvertieren Sie es in was auch immer-Plattform, die Sie auf der Suche mit.
EDIT:
Hier ist ein Ausführlicher Dokument erklären, HTM und Umsetzung. Natürlich können Sie konvertieren Ihre DB der Wahl. Finden Sie die Quelle code, um eine vollständige HTM Umsetzung in das SDK für das Jahr 2005.
GIS-Datenbanken (MS PostgreSQL etc) auch tatsächlich umzusetzen, einige Datenstruktur für zwei - oder drei-dimensionale region-suchen (räumliche Indizes). Die einfachste sturcture ist die grid-index, dann die verschiedenen such-trees (kd-tree quad-tree) mit den R-Baum als die am häufigsten verwendet (eine generalisierte B-Baum für mehr Dimensionen). Diese Methoden angemessen erscheinen.
Einer grundlegenden grid-index (Partitionierung der Raum in grid-Zellen, und die Suche nur in den benachbarten Zellen) kann leicht implementiert werden und können reduzieren die Zeit für die Suche bis hin zu logarithmisch. Die Suche Bäume sind ein bisschen schwieriger zu implementieren, aber es gibt viele open-source-Implementierungen für viele Programmiersprachen. Doch in den meisten Fällen raster-Indexierung ist effizient genug.
Folgenden bis auf Erich - wenn Sie Ihrer Wahl verwenden PostGIS (postgresql) es ist kostenlos und open source, stellt die Fragen, die Sie beschreiben, sehr, sehr schnell, läuft auf fast allen Plattformen, und habe ich erwähnt, es ist kostenlos?
Wenn Sie vermeiden möchten, eine GIS-Erweiterung, ich angepasst, die Funktionen von dieser Beitrag zu postgres sql:
mit diesen können Sie einige der umliegenden Quadratmeter Abfragen:
wenn Sie es oft genug, ich bin sicher, drehen der zwischen-Anweisungen in eine einzelne Funktion einfach wäre. Ich habe nie irgendwelche tatsächlichen "im radius" - Abfragen mit diesem obwohl.
Für die etwas komplizierter sind, werden Sie wahrscheinlich wollen eine GIS-Erweiterung, wie in anderen Antworten gesagt haben. PostGIS ist gut, aber ich fand eine Menge von gis-spezifischen Funktionen sind schwer zu bekommen Recht, und es sei denn, Sie nutzen bounding-box-Indizes Ihre räumliche Abfragen könnte einen Tag dauern, wenn Sie Ihre Daten-set ist groß genug. Aber der Nachteil in der Komplexität ist es allemal Wert für alle die Phantasie Dinge, wie die Ausgabe Ihrer Daten im geojson-format, etc.