Ich habe Breiten- und Längengrade und möchte den Datensatz aus der Datenbank abrufen, deren Längen- und Breitengrad um die Entfernung am nächsten liegt. Wenn diese Entfernung länger als angegeben wird, rufen Sie sie nicht ab.
Tabellenstruktur:
id
latitude
longitude
place name
city
country
state
zip
sealevel
mysql
sql
coordinates
geospatial
Basit
quelle
quelle
Antworten:
Dabei ist [starlat] und [startlng] die Position, an der mit der Entfernungsmessung begonnen werden soll.
quelle
Googles Lösung:
Tabelle erstellen
Wenn Sie die MySQL-Tabelle erstellen, möchten Sie den Attributen lat und lng besondere Aufmerksamkeit widmen. Mit den aktuellen Zoomfunktionen von Google Maps sollten Sie nach der Dezimalstelle nur 6 Stellen Genauigkeit benötigen. Um den für Ihre Tabelle erforderlichen Speicherplatz auf ein Minimum zu beschränken, können Sie angeben, dass die Attribute lat und lng Floats der Größe (10,6) sind. Dadurch können die Felder 6 Stellen nach der Dezimalstelle sowie bis zu 4 Stellen vor der Dezimalstelle speichern, z. B. -123,456789 Grad. Ihre Tabelle sollte auch ein ID-Attribut haben, das als Primärschlüssel dient.
Den Tisch füllen
Nach dem Erstellen der Tabelle ist es Zeit, sie mit Daten zu füllen. Die unten angegebenen Beispieldaten beziehen sich auf etwa 180 in den USA verteilte Pizzarias. In phpMyAdmin können Sie auf der Registerkarte IMPORT verschiedene Dateiformate importieren, einschließlich CSV (durch Kommas getrennte Werte). Microsoft Excel und Google Spreadsheets werden beide in das CSV-Format exportiert, sodass Sie durch Exportieren / Importieren von CSV-Dateien problemlos Daten aus Tabellenkalkulationen in MySQL-Tabellen übertragen können.
Suchen von Standorten mit MySQL
Um Positionen in Ihrer Markertabelle zu finden, die sich innerhalb eines bestimmten Radiusabstands zu einem bestimmten Breiten- / Längengrad befinden, können Sie eine SELECT-Anweisung verwenden, die auf der Haversine-Formel basiert. Die Haversine-Formel wird allgemein zur Berechnung von Großkreisabständen zwischen zwei Koordinatenpaaren auf einer Kugel verwendet. Eine ausführliche mathematische Erklärung wird von Wikipedia gegeben, und eine gute Diskussion der Formel in Bezug auf die Programmierung finden Sie auf der Website von Movable Type.
Hier ist die SQL-Anweisung, die die nächsten 20 Positionen findet, die sich in einem Radius von 25 Meilen zur 37, -122-Koordinate befinden. Es berechnet die Entfernung basierend auf dem Breiten- / Längengrad dieser Zeile und dem Zielbreiten- / Längengrad und fragt dann nur nach Zeilen, bei denen der Entfernungswert weniger als 25 beträgt, ordnet die gesamte Abfrage nach Entfernung und begrenzt sie auf 20 Ergebnisse. Um nach Kilometern statt nach Meilen zu suchen, ersetzen Sie 3959 durch 6371.
Dieser soll Breiten- und Längengrade in einer Entfernung von weniger als 28 Meilen finden.
Eine andere ist, sie in einer Entfernung zwischen 28 und 29 Meilen zu finden:
https://developers.google.com/maps/articles/phpsqlsearch_v3#creating-the-map
quelle
HAVING distance < 25
, dass wir Standorte in einem Umkreis von 25 Meilen abfragen?Hier ist meine vollständige Lösung in PHP implementiert.
Diese Lösung verwendet die Haversine-Formel, wie in http://www.scribd.com/doc/2569355/Geo-Distance-Search-with-MySQL dargestellt .
Es ist zu beachten, dass die Haversine-Formel Schwächen an den Polen aufweist. Diese Antwort zeigt, wie man die vincenty Great Circle Distance-Formel implementiert , um dies zu umgehen. Ich habe mich jedoch für Haversine entschieden, weil es für meine Zwecke gut genug ist.
Ich speichere den Breitengrad als DEZIMAL (10,8) und den Längengrad als DEZIMAL (11,8). Hoffentlich hilft das!
showClosest.php
./assets/db/db.php
./assets/db/dbSettings.php
Es kann möglich sein, die Leistung durch Verwendung einer gespeicherten MySQL-Prozedur zu steigern, wie im oben veröffentlichten Artikel "Geo-Distance-Search-with-MySQL" vorgeschlagen.
Ich habe eine Datenbank mit ~ 17.000 Stellen und die Ausführungszeit für Abfragen beträgt 0,054 Sekunden.
quelle
abs
sollte entfernt werden. Es ist nicht erforderlich, den abs-Wert bei der Umrechnung von Grad in Bogenmaß zu verwenden, und selbst wenn Sie dies getan haben, tun Sie dies nur in einer der Breiten. Bitte bearbeiten Sie es, damit der Fehler behoben wird.69
durch111,044736
(vergessen Sie das im obigen Kommentar)Nur für den Fall, dass Sie faul sind wie ich, hier ist eine Lösung, die aus dieser und anderen Antworten auf SO zusammengeführt wurde.
quelle
bounding_distance
repräsentiert? Begrenzt dieser Wert die Ergebnisse auf einen Meilenbetrag? In diesem Fall werden die Ergebnisse innerhalb von 1 Meile zurückgegeben.Einfaches ;)
Ersetzen Sie einfach die Koordinaten durch Ihre gewünschten. Die Werte müssen doppelt gespeichert werden. Dies ist ein funktionierendes MySQL 5.x-Beispiel.
Prost
quelle
dx+dy
Versuchen Sie dies, es werden die Punkte angezeigt, die den angegebenen Koordinaten am nächsten liegen (innerhalb von 50 km). Es funktioniert perfekt:
Einfach ändern
<table_name>
.<userLat>
und<userLon>
Weitere Informationen zu dieser Lösung finden Sie hier: http://www.plumislandmedia.net/mysql/haversine-mysql-nearest-loc/
quelle
Sie suchen nach Dingen wie der Haversine-Formel . Siehe hier .
Es gibt andere, aber dies ist die am häufigsten zitierte.
Wenn Sie nach etwas noch Robusterem suchen, sollten Sie sich die GIS-Funktionen Ihrer Datenbanken ansehen. Sie können einige coole Dinge sagen, beispielsweise, ob ein Punkt (Stadt) in einem bestimmten Polygon (Region, Land, Kontinent) erscheint.
quelle
Die ursprünglichen Antworten auf die Frage sind gut, aber neuere Versionen von MySQL (MySQL 5.7.6 on) unterstützen Geo-Abfragen, sodass Sie jetzt integrierte Funktionen verwenden können, anstatt komplexe Abfragen durchzuführen.
Sie können jetzt so etwas tun wie:
Die Ergebnisse werden also zurückgegeben
meters
, wenn SieKM
anstelle von Meilen.0001
anstelle von verwenden möchten.000621371192
MySQL-Dokumente sind hier
quelle
ST_Distance_Sphere
existiert nicht in der install (mysql Ver 15.1 Distrib 10.2.23-MariaDB
) meines Hosts . Ich habe irgendwo gelesen, um zu ersetzen,ST_Distance
aber die Entfernungen sind weit weg.ST_Distance_Sphere
Überprüfen Sie diesen Code anhand des Artikels Geo-Distance-Search-with-MySQL :
Beispiel: Finden Sie die 10 nächstgelegenen Hotels zu meinem aktuellen Standort in einem Umkreis von 10 Meilen:
quelle
quelle
Es hört sich so an, als ob Sie eine Suche nach dem nächsten Nachbarn durchführen möchten, wobei einige an die Entfernung gebunden sind. Soweit mir bekannt ist, unterstützt SQL so etwas nicht und Sie müssten eine alternative Datenstruktur wie einen R-Baum oder einen kd-Baum verwenden .
quelle
Finden Sie die nächstgelegenen Benutzer zu meinem:
Entfernung in Metern
Basierend auf Vincentys Formel
Ich habe Benutzertabelle:
SQL:
Radius der Erde: 6371000 (in Metern)
quelle
MS SQL Edition hier:
quelle
Klingt so, als sollten Sie nur PostGIS, SpatialLite, SQLServer2008 oder Oracle Spatial verwenden. Sie alle können diese Frage mit räumlichem SQL für Sie beantworten.
quelle
In extremen Fällen schlägt dieser Ansatz fehl, aber für die Leistung habe ich die Trigonometrie übersprungen und einfach das Quadrat der Diagonale berechnet.
quelle
Dieses Problem ist überhaupt nicht sehr schwer, aber es wird komplizierter, wenn Sie es optimieren müssen.
Was ich meine ist, haben Sie 100 Standorte in Ihrer Datenbank oder 100 Millionen? Es macht einen großen Unterschied.
Wenn die Anzahl der Speicherorte gering ist, entfernen Sie sie aus SQL und in den Code, indem Sie einfach -> ausführen
Sobald Sie sie in den Code eingegeben haben, berechnen Sie den Abstand zwischen jedem Lat / Lon und Ihrem Original mit der Haversine-Formel und sortieren Sie ihn.
quelle