2016-08-08 3 views
0

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

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

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

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

Я новичок в 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; 
} 

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

?> 

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

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

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

+1

Прежде чем попасть в него слишком много, вам не хватает точки с запятой после этого ' $ distance = ... 'statement. Это помогает? –

+1

Я предполагаю, что ошибка, которую вы видите, говорит вам, что PHP не ожидает '$ distanceances' (потому что предыдущий оператор не был прерван). –

+0

Да, это была проблема, но решение о том, что я получаю нулевой массив, вы можете проверить отредактированный код? @ Don'tPanic – Sid

ответ

0

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

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; 
+0

Тогда вы также можете установить максимальное расстояние от искомого адреса примерно отсюда. 'HAVING distance <50' (50 миль) –

Смежные вопросы