2016-08-09 67 views
0

Ich habe eine Tabelle von Veranstaltungsorten, die Spalte der Breite, Länge hat, die ihren Standort angibt. Ich möchte die Orte aus der Veranstaltungsort-Tabelle abrufen und die Orte abrufen, die sich in der Nähe des aktuellen Standorts des Benutzers befinden.Werte von Längengrad als null erhalten. PHP

Der aktuelle Standort wird als Parameter für die Funktion angegeben.

Für diese erste Ich habe versucht, alle Breiten-und Längengrad von der Venues Tabelle erstellt eine Reihe davon.

Dann habe ich versucht, die Entfernung für jeden Veranstaltungsort in Veranstaltungsorte Array zu berechnen. Aber Distanz-Array scheint 0,0 zu sein. Die Werte von $ lat1, $ lon1, $ lat2, $ lon2 sind null.

Ich bin neu zu PHP so keine Ahnung, wie das geht.

Ich möchte die Orte in der Nähe von 10 km vom aktuellen Standort des Benutzers zurückgeben.

Suchfunktion:

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

?> 

Eingang I von Postbote bin vorbei ist:

{ 

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

} 

Ausgang I erhalten ist:

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

EDIT: Wie RigsFolly beantwortet

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

?> 

Suchfunktion:

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

Ich erhalte Ausgang als:

{ 
    "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 noch scheint leer, und ist die Entfernung richtig? Wie kann ich es in Kilometern bekommen?

Distanzfunktion:

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

Was ist hier falsch? Kann mir bitte jemand helfen? Vielen Dank ..

Antwort

1

Sie haben mysqli_fetch_assoc verwendet, so dass $row ein assoziatives Array und kein Objekt ist. Also entweder mysqli_fetch_object oder als $lat2 = $venue['lattitude'];

Ich empfehle die Änderung der mysqli_fetch_assoc zu mysqli_fetch_object, weniger Code zu ändern!

//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; 

} 

Auch in getVendors konvertieren Sie die JSON-Zeichenfolge in ein Array.

Sie passieren sie von Javascript als Objekt, so dass es als ein verwenden, wie diese

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

versucht, auf diese Weise .. könnten Sie bitte die aktualisierte Frage prüfen. @RiggsFolly – Sid

+0

Es wäre besser, zeigen Sie mir zumindest eine Probe des JSON String Sie in diesem Skript senden – RiggsFolly

+0

{ „LAT1“: „19,9764360“, „LON1“: „73,8573440“ } seine gleiche wie zuvor, @RiggsFolly – Sid