2017-07-14 2 views
0

donc je veux charger un fichier GPX et obtenir tous les cordinates et calculer la distance totale parcourue, mais im coincé avec ce code:Php - obtenir la distance entre plusieurs points à l'aide lon, lat et alt

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

comme résultat pour la distance je reçois le numéro 4592.6244157763 au lieu de 4.10km (~~ 4100), mais les coordonnées sont bonnes, il passe par toutes les coordonnées. (Également, le fichier GPX est de Endomondo si elle importe)

+0

est-ce un problème mathématique ou un problème de programmation? – Jeff

+0

Le grand mystère est comment vous pouvez obtenir 4592 lorsque lat1/lon1 et lat2/lon2 est 0. – Andreas

+0

@Andreas première ligne dans la boucle 'for'. – Jeff

Répondre

0

fixe le code, au cas où quelqu'un en a besoin, la voici:

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

d'accord, de sorte que les fichiers que j'utilise , chaque premier trkpt dans chaque trkseg n'a pas d'altitude, donc si j == 0 alors mettre j à 1, donc il saute ce premier point (il règle les points 1 fois toutes les quelques secondes donc ça ne devrait pas faire une grosse différence (dans mon cas) et en même temps j'ai mis une autre variable g à 1, de sorte que nous puissions à la fin de cette boucle courante, renvoyer j à 0 donc le j ++ l'augmente à 1 au lieu de sauter le point et l'augmenter à 2 , le repos devrait être cl oreille, si vous avez des questions, il suffit de demander ^^

EDIT:

Le code isnt bon travail. Plus la distance est longue, plus l'erreur est grande, 8,1 km, 9 km, testé sur quelques fichiers gpx et remarqué. Désolé, si quelqu'un a une solution, cela voudrait dire beaucoup!

+0

peut-être ajouter une explication de ce que vous avez changé? – Jeff

+0

@Jeff fait! Pardon! – xddman

+0

C'est seulement 10% de réduction. Qu'est-ce que tu veux dire, c'est le bon numéro? Je comprends que vous utilisez une sorte de GPS pour obtenir le fichier gpx et à partir de là vous obtenez 9 km. Mais qu'est-ce qui vous dit que c'est 8,1 km? – Andreas