mysqli — Получение значений широты и долготы в виде нуля. Переполнение стека

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

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

Для этого 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);
}
}

?>

Входные данные, которые я передаю от почтальона:

{

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

РЕДАКТИРОВАТЬ: Как ответил 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;
}

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

0

Решение

Ты использовал 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;
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]