PHP Sortierung nächsten Koordinaten
Ich habe eine MySQL-Tabelle in einer PHP-webservice mit Längen-und Breitengrad.
Ich möchte an die Nutzer zu schicken nur die, sagen wir mal, 5 nächsten Koordinaten.
Ich schrieb die Methode, die zur Berechnung einer Entfernung aus Koordinaten zu denen die Benutzer gesendet, in der POST-Anforderung, aber ich bin mir nicht sicher, wie zu Sortieren und nur senden Sie zurück ein paar.
Hier ist die Distanz-Methode:
function distance($longToCompare,$latToCompare) {
$dlong = $request_long - $longToCompare;
$dlat = $request_lat - $latToCompare;
$a = pow(sin($dlat/2)) + cos($latToCompare)*cos($request_lat)*pow(sin($dlong/2));
$c = 2*atan2(sqrt($a),sqrt(1-$a));
return 6373*$c;
}
ist und der Benutzer derzeit wird die gesamte DB (für jetzt, während der Entwicklung, es ist klein, aber in der Zukunft könnte es sein eher große)
$q = mysql_query("SELECT * FROM Coordinates");
$coordinates = array ();
while ($e = mysql_fetch_assoc($q)) {
$coordinates[] = $e;
}
print (json_encode($coordinates));
Kann jemand mir die richtige Richtung? Ich bin ziemlich neu in PHP, ich weiß, ich kann erstellen Sie eine benutzerdefinierte Sortierung mit uasort, aber ich bin mir nicht ganz sicher, wie es mit dieser distanzfunktion.
BEARBEITEN:
Mithilfe von @Norse 's Lösung, die aktuelle Abfrage ist:
$request_long = $_POST['longitude'];
$request_lat = $_POST['latitude'];
$km = 0.5;
$query = "SELECT *,
( 6373 * acos( cos( radians('$request_lat') ) *
cos( radians( latitude ) ) *
cos( radians( longitude ) -
radians('$request_long') ) +
sin( radians('$request_lat') ) *
sin( radians( latitude ) ) ) )
AS distance FROM Coordinates HAVING distance < '$km' ORDER BY distance ASC LIMIT 0, 5";
$coordinates = array ();
while ($e = mysql_fetch_assoc($query)) {
$coordinates[] = $e;
}
print (json_encode($coordinates));
- Haben Sie sich überlegt zu schreiben mysql-Funktion und verwenden Sie es in der sql-Abfrage?
- ich bin ziemlich neu in diesem ganzen DB-Sache. kann u bitte näher erläutern?
- ist es für die Junaio-AR-Plattform ?
- Weiß nicht, was es ist, so ich raten bin, nicht. Es ist für, schließlich, iPhone & Android app
- Was @WojtekT bedeutet, dass Sie schrieb Ihre Funktion mit Hilfe von PHP, aber Sie können schreiben Sie es als eine MySQL stored function mit MySQL Programmiersprache. So könnten Sie es direkt in der Abfrage, etwa so: SELECT * FROM Tabelle ORDER BY shortest_distance_to(X1, Y1, X2, Y2) ASC, die könnten sehr viel schneller als das abrufen von allen Koordinaten aus der Datenbank, um den PHP-interpreter und vergleichen Sie es, vor allem, wenn Ihr dataset sehr groß ist.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mithilfe von Google ' s Algorithmus:
latitude
undlongitude
in dieser Abfrage gehen, um Ihre lat/lon-Spalten-Namen.$runquery = mysql_query($query);
var_dump
der eingehenden $_POST breiten-und Längengrade und stellen Sie sicher, es gibt keine lästigen weißen Räumen, die sich außerhalb von Ihnen. Töten Sie Sie mittrim()
Ich erlebt habe gleiche problem in letzter Zeit. Was habe ich mich entschlossen zu schreiben, das eine mysql-Funktion zum berechnen der Entfernung und verwenden Sie dann in der sql-Abfrage.
Die Mysql-Funktion:
Wenn Ihr
Coordinates
Tabelle hat die Spalten f.e.latitude
undlongitude
dann könnte der code so Aussehen:Wo
$lat
und$lon
enthalten, sofern Standort.Ist es effizienter einbinden zu Sortieren in der Abfrage.
Dieses wunderbare tutorial wird Ihnen helfen, (und bietet eine Abfrage, dient Ihr braucht):
https://developers.google.com/maps/articles/phpsqlsearch_v3#findnearsql