У меня есть таблица 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));
Используя алгоритм 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