Mam tabelę MySQL w usłudze PHP zawierającą długość i szerokość geograficzną. Chcę wysłać użytkownikowi tylko, powiedzmy, 5 najbliższych współrzędnych. Napisałem metodę, która oblicza odległość od współrzędnych do tych, które użytkownik wysłał w żądaniu POST, ale nie jestem pewien, jak ją posortować i tylko odesłać kilka.PHP Sortowanie najbliższych współrzędnych
Oto metoda odległość:
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;
}
a użytkownik aktualnie dostaje cały DB (na razie, jednocześnie rozwijając to małe, ale w przyszłości może to być dość duża)
$q = mysql_query("SELECT * FROM Coordinates");
$coordinates = array();
while ($e = mysql_fetch_assoc($q)) {
$coordinates[] = $e;
}
print (json_encode($coordinates));
Czy ktoś może wskazać mi właściwy kierunek? Jestem raczej nowy w PHP, wiem, że mogę utworzyć niestandardowe sortowanie za pomocą uasort, ale nie jestem całkiem pewien, jak go używać, korzystając z tej funkcji odległości.
EDIT: Stosując rozwiązanie @Norse „s, bieżące zapytanie brzmi:
$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));
Czy rozważałeś napisanie funkcji mysql i skorzystałeś z niej w zapytaniu sql? – WojtekT
Jestem całkiem nowy w tej całej sprawie DB. czy możesz uszczegółowić? –
czy jest to platforma Junaio AR? – HamZa