Php - 使用lon,lat和alt获取多个点之间的距离

时间:2017-07-14 11:43:03

标签: php xml coordinates distance

所以我想加载一个gpx文件并获取所有cordinates并计算行进的总距离,但是我坚持使用这段代码:

    <?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.10km(~~ 4100),但是坐标很好,它遍历所有坐标。 (另外,如果重要的话,gpx文件来自endomondo)

1 个答案:

答案 0 :(得分:0)

修复了代码,如果有人需要它,这里是:

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

<击> 好吧,所以我使用的文件,每个trkseg中的每个第一个trkpt都没有高度,所以如果j == 0然后将j设置为1,那么它会跳过第一个点(它每隔几秒设置一次点,所以它不应该产生很大的不同(在我的情况下),同时我将另一个变量g设置为1,这样我们就可以在这个当前循环结束时将j返回0,这样j ++就将它增加到1而不是跳过点并将其增加到2,休息应该是清楚的,如果你有任何问题,只要问^^

编辑:

代码不能正常工作。距离越远,误差越大,8.1km显示9km,在几个gpx文件上测试并注意到。对不起,如果有人有解决方案,那就意味着很多!