2016-04-05 26 views
0

Ich hole Daten aus einer MySQL-Datenbank mit AJAX/jQuery und dann einige Berechnungen (Abstand zwischen den Koordinaten) auf der Client-Seite. Ich habe festgestellt, dass dies im Browser ziemlich anstrengend ist und möchte dies eher auf der Serverseite tun.Berechnung der Entfernung mit PHP für mehrere Punkte

Meine zurück JSON-Daten wie folgt aussieht:

{ 
    "result": [ 
    ["148", "osmand", "2", "2016-03-26 13:48:04", "2016-03-26 13:48:01", "2016-03-26 13:48:01", "1", "-39.094856", "46.166472", "1432.7", "0", "0", "20 Maretha street", "{\"battery\":\"0\",\"ip\":\"105.5.117.20\"}"], 
    ["149", "osmand", "2", "2016-03-26 13:48:24", "2016-03-26 13:48:22", "2016-03-26 13:48:22", "1", "-39.099305", "46.162392", "1435.26", "0", "0", "7 Ernst street", "{\"battery\":\"0\",\"ip\":\"105.5.117.20\"}"], 
    ["150", "osmand", "2", "2016-03-26 13:48:45", "2016-03-26 13:48:43", "2016-03-26 13:48:43", "1", "-39.099305", "46.162392", "1435.62", "0", "0", "7 Ernst street", "{\"battery\":\"0\",\"ip\":\"105.5.117.20\"}"], 
    ], 
    "errors": false 
} 

Die siebte und achte Werte die Koordinaten sind. Ich berechne gerade den Abstand, indem ich die Koordinaten zeichne und dann eine Polylinie zeichne und dann den Abstand der Polylinie in der Broschüre berechne.

Ich fand jedoch einige Beispiel-PHP-Code, der Abstand zwischen zwei Punkten berechnet:

<?php 
    $inputvalues = $_POST; 
    $errors = false; 
    $result = false; 
    include_once 'database.php'; 

    if (mysqli_connect_errno()) { 
     printf("Connect failed: %s\n", mysqli_connect_error()); 
     exit(); 
    } 

    foreach ($inputvalues as $key => $value) { 
     if(isset($value) && !empty($value)) { 
      $inputvalues[$key] = $mysqli->real_escape_string($value); 
     } else { 
      $errors[$key] = 'The field '.$key.' is empty'; 
     } 
    } 

if(!$errors) { 
     $addresult = " 
SELECT * FROM positions WHERE `fixtime` BETWEEN '" . $inputvalues['start'] . "' AND '" . $inputvalues['end'] . "' AND deviceid='" . $inputvalues['deviceid'] . "' 
     "; 
     if($result = $mysqli->query($addresult)) { 

      while($row = $result->fetch_all()) 
      { 
       $returnResult = $row; 
      } 
     } 
    } 

    mysqli_close($mysqli); 

    echo json_encode(['result' => $returnResult, 'errors' => $errors]); 

    exit; 
?> 
:

class test { 

public function GetDistance($lat1, $lng1, $lat2, $lng2) { 
     $radLat1 = $lat1*3.1415926535898/180.0; 
     $radLat2 = $lat2*3.1415926535898/180.0; 
     $a = $radLat1 - $radLat2; 
     $b = ($lng1*3.1415926535898/180.0) - ($lng2*3.1415926535898/180.0); 
     $s = 2 * asin(sqrt(pow(sin($a/2), 2) + cos($radLat1) * cos($radLat2) * pow(sin($b/2), 2))); 
     $s = $s * 6378.137; // EARTH_RADIUS; 
     $s = round($s * 1000,3); 
     return $s; 
    }  
} 

Verwendungsbeispiel

$obj=new test(); 
$dis=$obj->GetDistance($lat1,$lon1,$lat2,$lon2); 

derzeit Mein PHP-Code wie folgt aussieht

Wie kann ich das in m umsetzen? y-Code? Ich weiß nicht, wie man die Koordinaten aus dem mysql-Ergebnis erhält, mache die Berechnung für jede Koordinate und gebe sie dann über JSON aus.

Tut mir leid, wenn dies eine grundlegende oder breite Frage ist, ich bin sehr neu in PHP und ich lerne immer noch.

+0

Sie meinen, die Entfernung zwischen jedem Punkt zu jedem anderen Punkt zu berechnen? Dies ist sehr kostspielig, egal wo Sie dies tun - auf dem Client oder auf dem Server. (abhängig von der Anzahl der Punkte, natürlich) Eine Entfernung von einem einzelnen Punkt (z. B. Ihrem aktuellen Standort) zu einer Liste von Punkten ist eine andere Frage, nach welcher Sie suchen? – Eihwaz

+0

Ist dies für die Navigation? Der generische Erdradius gibt Ihnen in diesem Fall kein korrektes Ergebnis. Idealerweise erstellen Sie eine mxn-Entfernungsmatrix mithilfe der Google API, https://developers.google.com/maps/documentation/distance-matrix/ – Shailesh

+0

Von Punkt A nach Punkt B nach Punkt C usw. für die zurückgegebenen Ergebnisse. –

Antwort

0

Dies ist meine Funktion, die Ergebnisse in Zwischendateien speichert. Ich bin mir nicht sicher, ob es für Sie funktioniert, aber hilfreich sein könnte. Aktualisiere MY_KEY und den Modus für die Verwendung.

function get_distance($locations, $locs){ 
    $location_distance = array(); 
    foreach($locations as $location_key=>$location){ 
     $locs_keys = array_keys($locs); 
     $loc_lat_lng = "$location[1],$location[2]"; 
     $locs_lat_lng = join('|',$locs_keys); 
     $path = './'.$location_key; 
     if(!file_exists($path)){ 
      $path = "https://maps.googleapis.com/maps/api/distancematrix/json?origins=$loc_lat_lng&destinations=$locs_lat_lng&mode=walking&key=MY_KEY"; 
     } 
     $map_data = file_get_contents($path); 
     if($path != './'.$location_key){ 
      file_put_contents('./'.$location_key, $map_data); 
     } 
     $map_data = json_decode($map_data, true); 
     $distance = reslove_distance($map_data); 
     for($i = 0 ; $i < count($distance); $i++){ 
      $location_distance[$location_key][$locs_keys[$i]] = $distance[$i]; 
     } 
    } 
    return $location_distance; 
} 

function reslove_distance($map_data=null){ 
    $distance = array(); 
    foreach($map_data['rows'][0]['elements'] as $element){ 
     $distance[] = (int)$element['distance']['value']; 
    } 
    return $distance; 
} 
+0

Danke! Ich kann etwas von deinem Code einbauen. –

0

Vielleicht so etwas:

function getDistance($lat1, $lng1, $lat2, $lng2, $distance_unit = 'km') 
    { 
     $multiplicator = ($distance_unit == 'km' ? 6371 : 3959); 

     $lat1_rad = deg2rad($lat1); 
     $lng1_rad = deg2rad($lng1); 
     $lat2_rad = deg2rad($lat2); 
     $lng2_rad = deg2rad($lng2); 

     return $multiplicator * acos(cos($lat1_rad) * cos($lat2_rad) * cos($lng2 - $lng1) + sin($lat1_rad) * sin($lat2)); 
    } 

Und dann, wenn Sie die Ergebnisse aus der Datenbank sind holen:

$entries = $result->fetch_all(); 

    foreach ($entries as $index => &$entry) { 
     if ($index < count($entries)) { 
      $next = $entries[$index + 1]; 

      $entry['distance'] = self::getDistance($entry['latitude'], $entry['longitude'], $next['latitude'], $next['longitude']); 
     } else { 
      $entry['distance'] = 0; // there is no "next" point to calculate the distance. 
     } 
    } 

Dies sollte man ein Array geben, wo jeder Eintrag den Abstand enthält zum nächsten Punkt

+0

Sieht wie eine brauchbare Lösung aus, vielen Dank! –

Verwandte Themen