Вопрос по sorting, mysql, php – PHP сортировка ближайших координат

10

У меня есть таблица 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, но я не совсем уверен, как использовать ее, используя эту функцию расстояния.

РЕДАКТИРОВАТЬ: Используя решение @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));
Рассматривали ли вы написание функции MySQL и использовать ее в SQL-запрос? WojtekT
это для платформы Junaio AR? HamZa
Не знаю, что это такое, так что я не догадываюсь. Это, в конце концов, для iPhone & amp; Android-приложение La bla bla
я совсем новичок во всей этой БД. Можете ли вы уточнить? La bla bla
Что означает @WojtekT, так это то, что вы написали свою функцию с использованием PHP, но вы можете написать ее как хранимую функцию MySQL, используя язык программирования MySQL. Таким образом, вы можете использовать его непосредственно в своем запросе, например так: SELECT * FROM table ORDER BY shorttest_distance_to (X1, Y1, X2, Y2) ASC, что может быть намного быстрее, чем получение всех координат из вашей базы данных в PHP интерпретатор и сравнение их там, особенно если ваш набор данных очень большой. Sebastián Grignoli

Ваш Ответ

3   ответа
22

$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.

Error: User Rate Limit Exceededdevelopers.google.com/maps/articles/phpsqlsearch
Error: User Rate Limit Exceeded La bla bla
Error: User Rate Limit Exceeded La bla bla
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded La bla bla
3

нкцию 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 содержать предоставленное местоположение.

Error: User Rate Limit Exceeded La bla bla
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded La bla bla
Error: User Rate Limit Exceeded
0

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

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded

Похожие вопросы