2016-04-05 2 views
0

Я извлекаю данные из базы данных MySQL с помощью AJAX/jQuery, а затем выполняю некоторые вычисления (расстояние между координатами) на стороне клиента. Я обнаружил, что это довольно уместно в браузере и хотелось бы сделать это на стороне сервера.Расчет расстояния с 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 
} 

Седьмое и восьмое значение координата. В настоящее время я вычисляю расстояние, вычерчивая координаты, а затем вытягивая полилинию, а затем вычисляя расстояние от полилинии в листовке.

Я однако нашел некоторые примеры 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); 

Мой 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; 
?> 

Как это реализовать в m y код? Я не знаю, как получить координаты из результата mysql, выполнить расчет для каждой координаты, а затем вывести его через JSON.

Извините, если это основной или широкий вопрос, я очень новичок в PHP, и я все еще участвую.

+0

Вы хотите рассчитать расстояние между каждой точкой до любой другой точки? Это будет очень дорого, независимо от того, где вы это делаете - на клиенте или на сервере. (в зависимости от количества точек, конечно). Расстояние от одной точки (например, ваше текущее местоположение) до списка точек - это другое дело, из которого вы после? – Eihwaz

+0

Это для навигации? Общий радиус земли не даст вам правильного результата, если это так. В идеале создайте матрицу расстояний mxn с помощью API Goolge, https://developers.google.com/maps/documentation/distance-matrix/ – Shailesh

+0

От точки 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

Может быть что-то вроде этого:

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

И тогда, когда вы выборки результатов из базы данных:

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

Это должно дать вам массив, где каждый элемент содержит расстояние к следующей точке

+0

Выглядит как жизнеспособное решение, большое вам спасибо! –

Смежные вопросы