Jeder Benutzer in meiner Datenbank hat seinen Breiten- und Längengrad in zwei Feldern gespeichert (lat, lon)
Das Format jedes Felds lautet:
%Vor%Wenn ein Benutzer nach anderen Benutzern innerhalb von beispielsweise 100 Meilen sucht, führe ich Folgendes aus, um den entsprechenden Breitengrad / Längenbereich zu berechnen ($ lat und $ lon sind die aktuellen Benutzerwerte)
%Vor%Ich kann dann eine Abfrage ausführen wie:
%Vor%Das funktioniert einwandfrei, und ich verwende eine Funktion, um die tatsächliche Entfernung zwischen Benutzern in der Endstufe zu berechnen und anzuzeigen, aber ich möchte die Ergebnisse sortieren können, indem ich die Entfernung in der Abfragephase verringert oder erhöht.
Gibt es eine Möglichkeit, dies zu tun?
Erinnerst du dich an Pythagoras?
%Vor%Technisch ist das das Quadrat der Entfernung anstatt der tatsächlichen Entfernung, aber da Sie es nur zum Sortieren verwenden, ist das egal.
Dies verwendet die planare Abstandsformel, die über kleine Entfernungen gut sein sollte.
JEDOCH:
Wenn Sie genauer sein oder längere Distanzen verwenden möchten, verwenden Sie diese Formel für große Kreisentfernungen im Bogenmaß :
%Vor%(Um die Entfernung in realen Einheiten anstelle von Radianten zu erhalten, multiplizieren Sie sie mit dem Radius der Erde. Das ist jedoch für Ordnungszwecke nicht notwendig.)
Latitude und Longitude werden von der MySQL-Berechnungs-Engine als Radiant angenommen. Wenn sie also in Grad gespeichert wird (und wahrscheinlich auch ist), müssen Sie jeden Wert mit pi / 180, ungefähr 0,01745:
%Vor%oder sogar:
%Vor% Die Verwendung von SELECT * FROM Table WHERE lat between $minlat and $maxlat
ist nicht genau genug.
Die richtige Methode zum Abfragen der Entfernung ist die Verwendung der Koordinaten im Bogenmaß.
%Vor%Hier ist eine praktische Referenz - Ссылка
Zum Beispiel:
%Vor%Und wenn Sie die Reihenfolge machen und die Entfernung anzeigen möchten:
%Vor%Bearbeitet für @Blazonger und die Vermeidung von Zweifeln :) Wenn Sie in Grad statt im Bogenmaß arbeiten wollen:
%Vor%Sie könnten dies leicht in eine Klasse einfügen, die Radian oder Grad aus den oben angegebenen Informationen akzeptiert.
Dies ist die Formel, die mir die richtigen Ergebnisse (im Gegensatz zu den obigen Lösungen) gegeben hat. Bestätigt mit der Google Maps Funktion "Entfernung messen" (direkte Entfernung, nicht die Transportentfernung).
%Vor% :latitude
und :longitude
sind die Platzhalter für die PDO-Funktionen. Sie können sie durch die tatsächlichen Werte ersetzen, wenn Sie möchten. latitude
und longitude
sind die Spaltennamen.
3959
ist der Erdradius in Meilen; Die distance
-Ausgabe wird ebenfalls in Meilen angegeben. Um es in Kilometer zu ändern, ersetzen Sie 3959
durch 6371
.
wird Ihnen keine Ergebnisse geben, die nach planarer Entfernung geordnet sind (wobei die Krümmung der Erde nicht berücksichtigt wird), aber für einen kleinen Radius 'sollte funktionieren.
%Vor%