Tengo una tabla MySQL en un servicio web PHP que contiene longitud y latitud. Deseo enviar al usuario solo, digamos, 5 coordenadas más cercanas. Escribí el método que calcula una distancia desde las coordenadas a las que el usuario envió en la solicitud POST, pero no estoy seguro de cómo ordenarlo y solo devolver algunas.PHP Ordenando las coordenadas más cercanas
Aquí es el método de la distancia:
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;
}
y actualmente el usuario obtiene toda la base de datos (por ahora, mientras que el desarrollo es pequeño, pero en el futuro podría ser bastante grande)
$q = mysql_query("SELECT * FROM Coordinates");
$coordinates = array();
while ($e = mysql_fetch_assoc($q)) {
$coordinates[] = $e;
}
print (json_encode($coordinates));
¿Alguien puede indicarme la dirección correcta? Soy bastante nuevo en PHP, sé que puedo crear una clasificación personalizada usando uasort, pero no estoy muy seguro de cómo usarlo usando esta función de distancia.
EDIT: Utilizando la solución @Norse 's, la consulta actual es:
$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));
¿Ha considerado escribir la función mysql y usarla en la consulta SQL? – WojtekT
soy bastante nuevo en todo esto de DB. ¿puedes por favor elaborar? –
¿es para plataforma Junaio AR? – HamZa