Получить расстояние от местоположений до 10 км

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

Текущее местоположение будет указано в качестве параметра функции.

Для этого 1-го я попытался получить всю широту и долготу из таблицы мест проведения, создав ее массив.

Затем я попытался рассчитать расстояние для каждого места в массиве мест. Но это дает ошибку для массива $distances, который я создал.

Я новичок в php, поэтому не знаю, как это сделать.

Я хочу вернуть местоположения, которые находятся примерно в 10 км от текущего местоположения пользователя.

функция поиска:

public function searchVendors($fields)
{

    try {

        $lat1 = $fields -> lat1;
        $lat2 = $fields -> lon1;

        $con = DB::getConnection();

        $query = "SELECT `lattitude`,`longitude` FROM venues";

        $rs = mysqli_query($con,$query) or die (json_encode(array("result"=>-1, "message"=>mysql_error())));
        $n = mysqli_num_rows($rs);

        $venues = array();

        if ( $n > 0 ) {

            while ( $row = mysqli_fetch_assoc($rs)) {
                $venues[] = $row;
            }

            $distances = array();

            foreach($venues as $venue) {

                $distance = (((acos(sin((".$latitude."*pi()/180)) * sin((`Latitude`*pi()/180))+
                    cos((".$latitude."*pi()/180)) * cos((`Latitude`*pi()/180)) *
                    cos(((".$longitude."- `Longitude`)*pi()/180))))*180/pi())*60*1.1515*1.609344)

                $distances[] = $distance;

            }

            $result = array("result"=>1, "message"=>"success", "distances" => $distances);
            return json_encode($result);

        } else {
            $result = array("result"=>-1, "message"=>"Event list is empty");
            return json_encode($result);
        }
    } catch(DBConnectionException $e) {
        $result = array("result"=>-1, "message"=> $e -> getMessage());
        return json_encode($result);
    }
    return null;
}

получитьVendors php:

<?php 
header("Content-type: application/json");

if ( $_SERVER['REQUEST_METHOD']=='POST') {
    include_once ("../include/Vendor.php");
    try {

        $con = DB::getConnection();

        $raw = file_get_contents("php://input");
        $data = json_decode($raw, true);

        $v = new Vendor();
        $response = $v -> searchVendors($data);

        json_encode($response);

        if ( $response == null ) {
            $response = json_encode(array("result" => -2, "message" => "Empty result"));
            echo $response;
        } else {
            echo $response;
        }
    } catch(Exception $e) {
        $result = array("result" => -1, "message" => $e -> getMessage());
        echo json_encode($result);
    }
}

?>

Изменить: функция поиска

 public function searchVendors($fields)
{


 try{

 $lat1 = $fields -> lat1;
 $lat2 = $fields -> lon1;

   $con = DB::getConnection();

   $query = "SELECT `lattitude`,`longitude` FROM venues";

    $rs = mysqli_query($con,$query) or die (json_encode(array("result"=>-1, "message"=>mysql_error())));
    $n = mysqli_num_rows($rs);

    $venues = array();

      if ( $n > 0 ) {

         while ( $row = mysqli_fetch_assoc($rs)) {
                $venues[] = $row;
            }

            $distances = array();

            foreach($venues as $venue)
            {
    $distance = (((acos(sin((".$latitude."*pi()/180)) * sin((`Latitude`*pi()/180))+
            cos((".$latitude."*pi()/180)) * cos((`Latitude`*pi()/180)) *
             cos(((".$longitude."- `Longitude`)*pi()/180))))*180/pi())*60*1.1515*1.609344);

             if($distance < 10)
             {

             $distances[] = $distance;
             }

            }

            $result = array("result"=>1, "message"=>"success", "distances" => $distances);

            return json_encode($result);

        } else {
            $result = array("result"=>-1, "message"=>"Event list is empty");
            return json_encode($result);
        }
    } catch(DBConnectionException $e) {
        $result = array("result"=>-1, "message"=> $e -> getMessage());
        return json_encode($result);
    }
    return null;
}

получение вывода следующим образом:

   {
  "result": 1,
  "message": "success",
  "distances": [
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0
  ]
}

Как я могу этого добиться? Что я должен изменить в своем коде? Кто-нибудь может помочь, пожалуйста? Спасибо..


person Sid    schedule 08.08.2016    source источник
comment
Прежде чем углубиться в это, вы пропустили точку с запятой после этого оператора $distance = .... Это помогает?   -  person Don't Panic    schedule 08.08.2016
comment
Я предполагаю, что ошибка, которую вы видите, говорит вам, что PHP не ожидает $distances (поскольку предыдущий оператор не был завершен).   -  person Don't Panic    schedule 09.08.2016
comment
да, это была проблема, но я решил, что я получаю нулевой массив, не могли бы вы проверить отредактированный код? @Не паникуйте   -  person Sid    schedule 09.08.2016


Ответы (1)


Вы можете определить расстояние и порядок в самом операторе MySQL. Вам нужно будет определить широту/долготу текущего адреса, указанного пользователем при поиске, а затем использовать следующий код:

SELECT *, 
( 3959 * acos( cos( radians($latitude) ) * cos( radians( lattitude ) ) 
* cos( radians(longitude) - radians($longitude)) + sin(radians($latitude)) 
* sin( radians(lattitude)))) AS distance
FROM venues
ORDER BY distance;
person Adam Collins    schedule 08.08.2016
comment
Затем вы также можете установить максимальное расстояние от искомого адреса примерно так: HAVING distance < 50 (50 миль) - person Adam Collins; 08.08.2016