PHP Сортировка ближайших координат

У меня есть таблица MySQL в веб-сервисе PHP, который содержит долготу и широту. Я хочу отправить пользователю только, скажем, 5 ближайших координат. Я написал метод, который вычисляет расстояние от координат до тех, которые отправил пользователь в запросе POST, но я не уверен, как сортировать его и отправлять только несколько.

Вот метод расстояния:

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; } 

и пользователь в настоящее время получает всю БД (пока, развиваясь, он мал, но в будущем он может быть довольно большим)

 $q = mysql_query("SELECT * FROM Coordinates"); $coordinates = array (); while ($e = mysql_fetch_assoc($q)) { $coordinates[] = $e; } print (json_encode($coordinates)); 

Может ли кто-нибудь указать мне правильное направление? Я довольно новичок в PHP, я знаю, что могу создать пользовательскую сортировку с использованием uasort, но я не совсем уверен, как ее использовать, используя эту функцию расстояния.

EDIT: Используя решение @Norse, текущий запрос:

 $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)); 

Solutions Collecting From Web of "PHP Сортировка ближайших координат"

Используя алгоритм Google:

 $lon = //your longitude $lat = //your latitude $miles = //your search radius $query = "SELECT *, ( 3959 * acos( cos( radians('$lat') ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians('$lon') ) + sin( radians('$lat') ) * sin( radians( latitude ) ) ) ) AS distance FROM yourtable HAVING distance < '$miles' ORDER BY distance ASC LIMIT 0, 5" 

latitude и longitude в этом запросе будут вашими именами столбцов lat / lon.

В последнее время я столкнулся с той же проблемой. Я решил написать функцию mysql для вычисления расстояния, а затем использовать ее в sql-запросе. Функция Mysql:

 CREATE FUNCTION distance(lat1 float, lon1 float, lat2 float, lon2 float) RETURNS float RETURN ACOS(SIN(RADIANS(lat1))*SIN(RADIANS(lat2))+COS(RADIANS(lat1))*COS(RADIANS(lat2))*COS(RADIANS(lon2-lon1)))*6371 

Если в таблице « Coordinates есть столбцы « latitude и longitude тогда код может выглядеть так:

 $q = mysql_query("SELECT * FROM Coordinates ORDER BY distance(latitude, longitude, $lat, $lon) LIMIT 5"; 

Где $lat и $lon содержат предоставленное местоположение.

Более эффективно внедрять сортировку в запрос.

Этот замечательный учебник поможет вам (и предоставляет запрос, который удовлетворяет ваши потребности): https://developers.google.com/maps/articles/phpsqlsearch_v3#findnearsql