Php - получение расстояния между несколькими точками, используя lon, lat и alt

Итак, я хочу загрузить файл gpx, получить все данные и вычислить общее пройденное расстояние, но я застрял с этим кодом:

    <?php

    $xml = simplexml_load_file("data/example.gpx");

    echo $xml->metadata->author->name;
    echo "</br>";
    echo "</br>";

    echo "</br>";

    $lon1=0;
    $lat1=0;
    $lon2=0;
    $lat2=0;
    $alt1=0;
    $alt2=0;
    $dist=0;

    $brr = count($xml->trk->trkseg);
    $brf = 0;

    for($i = 0; $i<$brr; $i++){

    $br = count($xml->trk->trkseg[$i]->trkpt);
    $brf= $brf + $br;

    for($j = 0; $j<$br;$j++){

    $lat2= (float) $xml->trk->trkseg[$i]->trkpt[$j]['lat'];
    $lon2= (float) $xml->trk->trkseg[$i]->trkpt[$j]['lon'];
    $alt2= (float) $xml->trk->trkseg[$i]->trkpt[$j]->ele;

    $lon2 = $alt2 * cos($lat2) * sin($lon2);
    $lat2 = $alt2 * sin($lat2);
    $alt2 = $alt2 * cos($lat2) * cos($lon2);

    if ($j==0){    //this is just for the first time because first points are not set
        $lat1=$lat2;
        $lon1=$lon2;
        $alt1=  $alt2;
        }

    $cdist = sqrt(pow(($lat2-$lat1),2) + pow(($lon2-$lon1),2) + pow(($alt2-$alt1),2));
    $dist = $dist + $cdist;

    $lat1=$lat2;
    $lon1=$lon2;
    $alt1=$alt2;
    }
    }

    echo 'Distance = '.$dist;
    echo '</br>';
    echo 'number of coordinates = '.$brf;
    ?>

В результате для расстояния я получаю номер 4592.6244157763 вместо 4,10 км (~~4100), но координаты хороши, он проходит через все координаты. (также, файл gpx от endomondo, если это имеет значение)

1 ответ

Исправлен код, в случае, если он кому-то нужен, вот он:

<?php

$xml = simplexml_load_file("data/vladantd.gpx");

echo $xml->metadata->author->name;
echo "</br>";
echo "</br>";



echo "</br>";

$lon1=0;
$lat1=0;
$lon2=0;
$lat2=0;
$alt1=0;
$alt2=0;
$dist=0;


$brr = count($xml->trk->trkseg);
$brf = 0;

for($i = 0; $i<$brr; $i++){

$br = count($xml->trk->trkseg[$i]->trkpt);
$brf= $brf + $br;

for($j = 0; $j<$br;$j++){
    if($j==0)
    {
        $j=1;
        $g=1;

    }
$lat2= (float) $xml->trk->trkseg[$i]->trkpt[$j]['lat'];
$lon2= (float) $xml->trk->trkseg[$i]->trkpt[$j]['lon'];
$alt2= (float) $xml->trk->trkseg[$i]->trkpt[$j]->ele;

$lon2 = $alt2 * cos($lat2) * sin($lon2);
$lat2 = $alt2 * sin($lat2);
$alt2 = $alt2 * cos($lat2) * cos($lon2);

if ($g==1){
    $lat1=$lat2;
    $lon1=$lon2;
    $alt1=  $alt2;
    $j=0;
    $g=0;
    }

$cdist = sqrt(pow(($lat2-$lat1),2) + pow(($lon2-$lon1),2) + pow(($alt2-$alt1),2));
$dist = $dist + $cdist;

$lat1=$lat2;
$lon1=$lon2;
$alt1=$alt2;
}
}

echo 'Distance = '.$dist;
echo '</br>';
echo 'number of coordinates = '.$brf;
?>

Итак, файлы, которые я использую, каждый первый trkpt в каждом trkseg не имеет высоты, поэтому, если j==0, тогда установите j в 1, поэтому он пропускает эту первую точку (он устанавливает точки 1 раз в несколько секунд, поэтому не должен сделать большую разницу (в моем случае), и в то же время я установил другую переменную g в 1, чтобы мы могли в конце этого текущего цикла вернуть j обратно в 0, так что j++ увеличивает его до 1 вместо пропуская точку и увеличивая ее до 2, остальное должно быть ясно, если у вас есть какие-либо вопросы, просто задавайте ^^

РЕДАКТИРОВАТЬ:

Код не работает хорошо. Чем длиннее расстояние, тем больше ошибка, которую он совершает: на 8,1 км он показывает 9 км, проверил его на нескольких файлах GPX и заметил. Извините, если у кого-то есть решение, это будет много значить!

Другие вопросы по тегам