2016-08-09 8 views
0

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

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

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

Затем я попытался рассчитать расстояние для каждого места в массиве мест. Но расстояние между массивами составляет 0,0. Значения $ lat1, $ lon1, $ lat2, $ lon2 равны нулю.

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

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

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

public function searchVendors($lat1,$lon1) 
    { 
     // $lat2 = -10.4212157; 
     // $lon2 = 28.6031842; 

     // $lat1 = 19.9950050; 
     // $lon1 = 73.8413080; 

    try{ 

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

    $con = DB::getConnection(); 

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

    $rs = mysqli_query($con,$query) or die (json_encode(array("result"=>-1, "message"=>mysqli_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) 
    { 
     $lat2 = $venue -> lattitude; 
     $lon2 = $venue -> longitude; 

     $dist = $this -> distance($lat1, $lon1, $lat2, $lon2); 

     $distances[] = $dist; 

    } 
     echo $lat1; 
     echo $lon1; 
     echo $lat2; 
     echo $lon2; 

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

    } else { 
     $result = array("result"=>-1, "message"=>"Distances 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); 

    $lat1 = $data -> lattitude; 
    $lon1 = $data -> longitude; 

    echo $lat1; 
    echo $lon1; 

    $v = new Vendor(); 
    $response = $v -> searchVendors($lat1,$lon1); 

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

?> 

Input Я передаю от Почтальон:

{ 

    "lat1" : "19.9764360", 
    "lon1" : "73.8573440" 

} 

Выход я получаю:

{ 
    "lat1": null, 
    "lon1": null, 
    "lat2": null, 
    "lon2": null, 
    "result": 1, 
    "message": "success", 
    "distances": [ 
    0, 
    0, 
    0, 
    0, 
    0, 
    0, 
    0, 
    0 
    ] 
} 

EDIT: Как ответил RigsFolly

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);   // now its an object if it was stored as an object 

    $lat1 = $data -> lattitude; 
    $lon1 = $data -> longitude; 

    echo $lat1; 
    echo $lon1; 

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

    $con = DB::getConnection(); 

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

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

    $venues = array(); 

    $lat1 = $fields -> lattitude; 
    $lon1 = $fields -> longitude; 

    if ($n > 0) { 

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

$distances = array(); 

foreach($venues as $venue) 
{ 
    $lat2 = $venue -> lattitude; 
    $lon2 = $venue -> longitude; 

    $dist = $this -> distance($lat1, $lon1, $lat2, $lon2); 

    $distances[] = $dist; 

} 
     echo $lat1; 
     echo $lon1; 
     echo $lat2; 
     echo $lon2; 

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

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

Я получаю выход как:

{ 
    "lat1": null, 
    "lon1": null, 
    "lat2": "-2.6357434", 
    "lon2": "18.4276047", 
    "result": 1, 
    "message": "success", 
    "distances": [ 
    8321.16, 
    8322.48, 
    8321.37, 
    2617.96, 
    0, 
    2535.52, 
    3368.05, 
    2069.09 
    ] 
} 

LAT1, lon1 еще кажется пустым, а расстояние правильное? Как я могу получить его в километрах?

функция расстояния:

public function distance($lat1, $lon1, $lat2, $lon2) { 

     $theta = $lon1 - $lon2; 
     $dist = sin(deg2rad($lat1)) * sin(deg2rad($lat2)) + cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($theta)); 
     $dist = acos($dist); 
     $dist = rad2deg($dist); 
     $miles = $dist * 60 * 1.1515; 
     $unit = strtoupper($unit); 

     $km = $miles * 1.609344; 

     $result = round($km ,2); 

     return $result; 
    } 

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

ответ

1

Вы использовали mysqli_fetch_assoc, так что $row будет ассоциативным массивом, а не объектом. Поэтому либо используйте mysqli_fetch_object, либо укажите это как $lat2 = $venue['lattitude'];

Я предлагаю изменить mysqli_fetch_assoc на mysqli_fetch_object, меньше кода для внесения изменений!

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

$distances = array(); 

foreach($venues as $venue) 
{ 
    $lat2 = $venue -> lat1;  // name corrected 
    $lon2 = $venue -> lon1;  // name corrected 

    $dist = $this -> distance($lat1, $lon1, $lat2, $lon2); 

    $distances[] = $dist; 

} 

Также в getVendors вы преобразовываете строку json в массив.

Вы передаете его из JavaScript в качестве объекта, так что используйте его в качестве одного, как этот

//$data = json_decode($raw, true); // true = convert to array 
$data = json_decode($raw);   // now its an object if it was stored as an object 

$lat1 = $data -> lattitude; 
$lon1 = $data -> longitude; 
+0

попробовал этот способ .. могли бы вы проверить обновленный вопрос. @RiggsFolly – Sid

+0

Вы лучше показать мне, по крайней мере, образец JSON строку, которую вы отправляете на этот сценарий – RiggsFolly

+0

{ «LAT1»: «19,9764360», «lon1»: «73,8573440» } его так же, как и раньше, @RiggsFolly – Sid