Eigene Tracks einfach anzeigen -- howto?

Hallo aighes,

probier doch mal PHPlot (http://phplot.sourceforge.net/)

einfache Anwendung: Höhendaten rein → Grafik raus :wink:

Grüße,
Sebastian

@ aighes
Noch mal ich, scheint sich wohl sonst keiner mit der Sache zu befassen. Also ich bastle im Moment an so etwas ähnlichen allerdings mit Datenbank. Was mir noch fehlt wäre jetzt die Berechnung der Fahrzeit aus dem Track. Aber hier muss ich echt passen habe keinen Schimmer. Das mit der Speicherzeit des Tracks und den Namen auslesen habe ich ja nun hin bekommen (siehe Deine Seite) aber mit der Fahrzeitberechnung komme ich nicht weiter. Kannst Du mir eventuell dabei helfen, denn Du hast ja den Track schon in ein Array gelegt und man müsste jetzt die Startzeit und die Endzeit daraus auslesen, dann noch die Differenz bestimmen und fertig. Allerdings bin ich an der Umsetzung im Moment gescheitert. Gruß AlterSachse

Der Zeitpunkt eines Trackpunkts kannst du über die Zeile 2009-10-09T15:00:56Z auslesen. Diese Elemente lädst du auch alle in ein Array, formatierst das, so dass du damit rechnen kannst. Nun musst du überlegen, ob du jede Streckenzeit berechnest und diese Addierst oder ob du wirklich nur Ende-Anfang rechnest.

HI,
hat etwas gedauert aber ich hab es glaube hin bekommen. Ich habe die erste Zeit ausgelesen welche die Speicherzeit ist und oben in den Metadaten der GPX steht. Die nächste Zeit (zweiter Wert) ist dann die Startzeit des Tracks und dann noch die letzte Zeit. Nun die Differenz gebildet und Stunden, Minuten und Sekunden ausgegeben.
Das jahr hab ich auch noch gebildet weil das mit in die Datenbank kommt zum aussortieren.

@aighes falls Du die Sachen mit bei dir einbauen willst hier der ganze Code den ich jetzt habe.
So nun frohes Pfingsten Gruß Jörg


<?php
function getlatlon($quelle, $suche) {//Funktion zum Auslesen von lat und lon aus der gpx-Datei
    $suche= " ".$suche."=\"";
    if (strpos($quelle, $suche) == false){
        $suche = str_replace("\"","'",$suche);
    }//end if
    $quelle = substr($quelle, strpos($quelle, $suche)+ strlen($suche));
    return str_replace(",",".",substr($quelle, 0, strpos($quelle, "\"")));
}//end function
function getele($quelle) {//Funktion zum Auslesen von ele aus der gpx-Datei
    $quelle = substr($quelle, strpos($quelle, "<ele>")+ strlen("<ele>"));
    return str_replace(",",".",substr($quelle, 0, strpos($quelle, "</ele>")));
}//end function
function gettime($quelle) {//Funktion zum Auslesen von time aus der gpx-Datei
    $quelle = substr($quelle, strpos($quelle, "<time>")+ strlen("<time>"));
    return substr($quelle, 0, strpos($quelle, "</time>"));
}//end function
function zertime($quelle) {//Funktion zum Umwandeln der Zeit
$quelle = str_replace(array("T","Z"),array(" ",""), $quelle);
return $quelle;
}//end function
?>

<?php
    $track = "../110-gpx/".$filename; // erstellt die URL des Tracks aus dem Unterordner gpx
    if (file_exists($track)) {//prüfen, ob angegebene Datei vorhanden ist
 
     //Koordinaten und Höhen in Array schreiben
             $fp = fopen( $track, "r"); // gpx-Datei öffnen
             $n=0;    //Zähler für lat lon
             $m=0;    //Zähler für Höhe
             $t=0;    //Zähler für Zeit
             while (! feof( $fp )) {
                     $zeile  = fgets( $fp , 4096);
                     //lat lon auslesen lür fast alles
                     if (strpos($zeile,"<trkpt") !== false) {
                             $lat[$n] = getlatlon($zeile, "lat");
                             $lon[$n] = getlatlon($zeile, "lon");
                             $n++;
                     } //end if
                    //ele - Höhe auslesen
                     if (strpos($zeile,"<ele>") !== false) {
                         $ele[$m] = getele($zeile);
                         $m++;
                     }//end if
                     //time - Zeit auslesen
                     if (strpos($zeile,"<time>") !== false) {
                         $time[$t] = gettime($zeile);
                         $t++; //das ist die Zahl wieviel mal <time> vorkommt
                         }//end if
             } //end while
                }//end if
                 
             fclose($fp); //gpx-Datei schließen
    //Berechnung der Zeit'en
    $tspeicher = zertime($time[$t-$t]); //Speicherzeit der gpx ermitteln
    $tanfang = zertime($time[($t-$t)+1]); //Startzeit des Tracks
    $tende = zertime($time[$t-1]); //Endzeit des Tracks
    $jahr = substr($tanfang,0,-15);
    //Berechnung der Fahrtzeit
    $diff = ((strtotime($tende))-(strtotime($tanfang)));
    $trackdiff = array("h"=>0, "m"=>0, "s"=>0);
        while ($diff>=3600) {// 1 Stunde = 3600 Sekunden
          $diff -= 3600;
          $trackdiff['h']++;
        }
            while ($diff>=60) {// 1 Minute = 60 Sekunden
              $diff -= 60;
              $trackdiff['m']++;
            }
            $trackdiff['s'] = $diff;
    //Ausgabe der Fahrzeit
    $tfahrth = $trackdiff['h'];
    $tfahrtm = $trackdiff['m'];
    $tfahrts = $trackdiff['s'];
    //Berechnung der Tracklänge
             $i = 0;
             $r0 = 6371.0;//Erdradius
             $laenge = 0.0;
             while ($i < ($n-1)) {
                      if(($lat[$i] != $lat[$i+1]) && ($lon[$i] != $lon[$i+1])) {
                               $a = (90.0 - $lat[$i]) * M_PI / 180.0;
                               $b = (90.0 - $lat[$i+1]) * M_PI / 180.0;
                               $gamma = (abs($lon[$i+1] - $lon[$i])) * M_PI / 180.0;
                               $c = $r0 * acos(cos($a)*cos($b) + sin($a)*sin($b)*cos($gamma));
                               $laenge = $laenge + $c;
                      }//end if
                      $i++;
             }//end while
             $laenge = (round(10 * $laenge) / 10);
    //Höhenmeter addieren
             if ($m > 0) {
                      $i=0;
                      $up=0.0;
                      $down=0.0;
                      while ($i < ($m-1)) {
                            if ($ele[$i] < $ele[$i+1]) {
                                    $up = $up + $ele[$i+1] - $ele[$i];

                            }//end if
                            if ($ele[$i] > $ele[$i+1]) {
                                    $down = $down + $ele[$i] - $ele[$i+1];
                            }//end if
                            $i++;
                      }//end while
                      $up = (round(10 * $up) / 10);
                      $down = (round(10 * $down) / 10); 
                      $b_ele = true;
             }//end if
?>

@aighes
Hallo noch mal ich also ich hab Deinen Code noch weiter ausgebaut dabei ist mir aber aufgefallen das die Tracklänge nicht mit anderen GPS Programmen übereinstimmt.
Also ich habe eine frisch aufgezeichnete GPX Datei genommen und die Tracklänge mit Deinem Code berechnet, raus kam 18,9 km mit up 342,7 HM. Die selbe Datei hab ich in GTA geöffnet und dort kamen 24,4 km und up 523 HM raus. Wie kann es zu diesen Abweichungen kommen, nach meinem Tacho hat GTA besser gerechnet.
Ich lege die Datei mal wieder hier ab http://mtb.kilu.de/down/23-MAI-10.gpx
Vieleicht haste noch eine Idee wie die Berechnung der Tracklänge noch genauer wird.
Gruß Jörg

Edit:
Uff das ist vielleicht komisch, also wie gesagt die Datei war eine frisch aufgezeichnete vom Garmin Dakota20, einfach runter gezogen und rechnen lassen. Dann habe ich die Datei in TTQV geladen und sofort wieder Exportiert ohne sie zu bearbeiten und siehe da wenn ich dann Deinen Code rechnen lasse kommt auch 24,4 km und up 524 HM heraus.
Das gleiche passiert mit GTA wenn ich die unbehandelte Garmin Dakota20 Datei in GTA öffne und dann wieder als gpx abspeichere stimmt die Berechnung auch.
Also liegt die erste falsche Berechnung eindeutig an der unbehandelten Garmin Dakota20 Datei.
Fazit für alle die den Code nutzen wollen wäre aus meiner Sicht niemals eine unbehandelte Garmin Dakota20 Datei verwenden. Wie es mit anderen Geräten ausschaut weiß ich nicht aber eventuell kann das ja mal jemand testen.
Gruß Jörg

Hab noch die Durchschnittsgeschwindigkeit mit eingebaut. Die Zeile hab ich unter der Tracklänge eingefügt, die Zeitberechnung hatte ich ja schon vorgestellt die muss natürlich auch erst gemacht werden.


//Durchschnitt km/h errechnen
$durchschnitt = str_replace(".",",",round($laenge/(((strtotime($tende))-(strtotime($tanfang)))/3600),2));