2016-04-05 23 views
0

AJAX/jQueryを使用してMySQLデータベースからデータを取得し、クライアント側でいくつかの計算(座標間の距離)を行っています。私はこれがかなりブラウザに課税され、むしろサーバー側でこれをやりたいと思っています。複数の点でPHPを使用した距離の計算

マイ返されたJSONデータは次のようになります。

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

7番目と8番目の値は座標です。私は現在、座標をプロットしてポリラインを描き、ポリラインのリーフレット内の距離を計算することによって距離を計算しています。

しかし私は、2点間の距離を算出し、いくつかのサンプルPHPコードが見つかりました:

<?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; 
?> 
:私のPHPコードは、現在このようになります

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

使用例

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

これをmに実装するにはyコード?私は、mysqlの結果から座標を取得する方法を知りません、それぞれの座標の計算を行い、JSON経由で出力します。

申し訳ありませんが、これは基本的な質問や広範な質問、私は非常にPHPに新しいと私はまだ学んでいます。

+0

あなたは、各点と他の点との間の距離を計算することを意味しますか?これは、クライアントまたはサーバー上で、これを行っている場所にかかわらず、非常にコストがかかります。 (ポイント数にもよりますが)シングルポイント(現在の場所など)からポイントのリストまでの距離は、別の問題です。 – Eihwaz

+0

これはナビゲーション用ですか?もしそうなら、一般的な地球半径はあなたに正しい結果を与えません。 Goolge API https://developers.google.com/maps/documentation/distance-matrix/ – Shailesh

+0

を使用して、距離のmxn行列を作成することが理想的です。返された結果の点Aから点Bから点Cまで。 –

答えて

0

これは、結果を中間ファイルに保存する私の機能です。私はそれがあなたのために働くかどうかは分かりませんが、助けになるかもしれません。使用のためにMY_KEYとモードを更新してください。

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

ありがとう!私はあなたのコードのいくつかを組み込むことができます。 –

0

たぶん、このような何か:

$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. 
     } 
    } 

これはあなたの各エントリは距離を含む配列を与える必要があります:

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

そして、あなたは、データベースから結果をフェッチしているとき次の点へ

+0

実行可能なソリューションのように見える、ありがとう! –

関連する問題