GPX Datei auslesen nach Name und Zeit

Status
Für weitere Antworten geschlossen.

AS-123

Well-known member
Hallo,
also ich möchte gern mit PHP eine gpx Datei auslesen um Name und Zeit auf einer Webseite ausgeben zu können, hab aber keinen Schimmer wie ich das hin bekommen kann.
Code GPX
Code:
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<gpx
  version="1.1"
  creator="Touratech QV 4.0.127 Standard - http://www.ttqv.com"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xmlns:topografix="http://www.topografix.com/GPX/Private/TopoGrafix/0/1"
  xmlns="http://www.topografix.com/GPX/1/1"
  xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd">
<metadata>
  <time>2010-04-16T15:02:11Z</time>
  <bounds minlat="50.778714" minlon="14.805415" maxlat="50.909815" maxlon="14.915388"/>
</metadata>
<trk>
  <name>Meine-erste-Tour</name>
  <trkseg>
    <trkpt lat="50.909664" lon="14.809377"><ele>240</ele><time>2010-04-16T08:14:55Z</time></trkpt>
    <trkpt lat="50.909676" lon="14.809383"><ele>243</ele><time>2010-04-16T08:14:58Z</time></trkpt>
    <trkpt lat="50.909674" lon="14.809386"><ele>243</ele><time>2010-04-16T08:14:59Z</time></trkpt>
 </trkseg>
</trk>
<extensions>
</extensions>
</gpx>
So was ich benötige wäre nach <metadata> die Angaben zur Zeit und dann noch den Namen der zwischen <name>*</name> steht.
Alle anderen Daten hab ich schon mit einem anderen Script auslesen können.
Wobei $filename der Dateiname der gpx Datei ist.
PHP:
Dateiname dieser PHP Datei - "auslese.php"
$filename der Dateiname der gpx Datei zB. test.gpx
<?php
//Funktion zum Auslesen von lat und lon aus der gpx-Datei
function getlatlon($quelle, $suche) {
	$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
//Funktion zum Auslesen von ele aus der gpx-Datei
function getele($quelle) {
	$quelle = substr($quelle, strpos($quelle, "<ele>")+ strlen("<ele>"));
	return str_replace(",",".",substr($quelle, 0, strpos($quelle, "</ele>")));
}//end function
?>

<?php
// erstellt die URL des Tracks aus dem Unterordner gpx
	$track = "../110-gpx/".$filename;
	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;
	         $m=0;
	         while (! feof( $fp )) {
	                 $zeile  = fgets( $fp , 4096);
	                 if (strpos($zeile,"<trkpt") !== false) {
	                         $lat[$n] = getlatlon($zeile, "lat");
	                         $lon[$n] = getlatlon($zeile, "lon");
	                         $n++;
		         } //end if
	                 if (strpos($zeile,"<ele>") !== false) {
	                 	$ele[$m] = getele($zeile);
	                 	$m++;
	                 }//end if
	         } //end while
				}//end if
				 
	         fclose($fp); //gpx-Datei schließen
 
	//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)." km";
	         $laenge = str_replace(".",",",$laenge);
	//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)." m";
	                  $up = str_replace(".",",",$up);
	                  $down = -(round(10 * $down) / 10)." m";
	                  $down = str_replace(".",",",$down);
	                  $b_ele = true;
	         }//end if
	         else {
	                  $down = "n/a";
	                  $up = "n/a";
	                  $b_ele = false;
	         }//end else	 

?>
Auf der Ausgabe Seite steht dann das
PHP:
/* So jetzt die Daten aus der gpx auslesen */
include("auslese.php");	
echo 'Trackname:  ' .$filename.'<br />';
echo 'Tracklänge:  ' .$laenge.'<br />';
echo 'Anstieg:  '.$up.'<br />';
echo 'Abstieg:  '.$down.'<br />';
Kann mir hier jemand weiterhelfen um das letzte kleine übel noch hinzu bekommen. Ach so jetzt nicht wundern das obere Script ist nicht von mir sondern aus einem OSM Forum wo es nur um die Koordinaten und Höhen ging, hab es nur ein wenig angepasst. Meine PHP Kenntnisse sind nicht ganz so toll.
Gruß und schon mal Danke. :thx:
 
Hi,
da es eine XML-Datei ist, einfach SimpleXML (oder eine andere XML-Lese Klasse: PHP: XML Manipulation - Manual ) benutzen ;)
PHP: SimpleXML - Manual

Code:
		$file = simplexml_load_file('./as-123.xml');
		echo 'Time: '.$file->metadata[0]->time.'; Name: '.$file->trk[0]->name;
Info: Für das Arbeiten mit Variablen von $file, strval() benutzen, da außer bei automatischen String-Umwandlungen (Bsp. '.$file->bla.') sonst nur die XML-Resource zurückgegeben wird!

Gruß
Broken Sword
 
Hallo Broken Sword,
wieder mal einen großen Dank an Dich für die schnelle Hilfe.
Genau diesen Code hab ich gesucht und es funzt wunderbar.
Die Links werde ich mir zu Gemüt führen und durchlesen.
Den Code von Dir werde ich erst mal so einbauen damit ich weiterkomme und meine Datenbank füllen kann.
Also nochmals Danke und schönes WE noch Gruß AS-123

edit:
ich noch mal. Ist ein sortieren der Zeit aus der Datenbank heraus möglich.
Blöde Frage na klar kann man nach Zeit sortieren und ausgeben lassen, aber aus der obigen Abfrage bekomme ich ja nun dieses Zeitformat
2010-03-06T15:42:14Z
kann ich das so in die Datenbank schreiben und zum sortieren nutzen oder muss ich das erst noch bearbeiten?
Gruß AS-123
 
Hi,
wenn es "JAHR-MONAT-TAGTSTUNDE:MINUTE:SEKUNDEZ" ist, kannst du es mittels ORDER BY sortieren.
Sonst einfach mittels PHP: strtotime - Manual in UNIX-Timestamp überführen und abspeichern.

Gruß
Broken Sword
 
Danke

Hallo,
Danke noch mal.
Werde zuerst das sortieren versuchen sonst das umwandeln.
Gruß AS-123
 
Status
Für weitere Antworten geschlossen.

Beliebte Schlagwörter

Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden.
Du solltest ein Upgrade durchführen oder einen alternativen Browser verwenden.

Zurück
Oben Unten