Eigene Tracks einfach anzeigen -- howto?

Zu der Zoomstufe:

Die Umsetzung hat bei mir gerade bei mehreren gpx-Dateien geklappt. Evtl. müssen die Werte für h_faktor und v_faktor angepasst werden. Eine Berechnung der Tracklänge ist auch integriert.


<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">
<html xmlns=\"http://www.w3.org/1999/xhtml\">
<head>
<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />
<?php
if(isset($_GET["track"])){
?>
<title>GPX-Track auf OSM Karte</title>
<script type="text/javascript" src="http://www.openlayers.org/api/OpenLayers.js"></script>
<script type="text/javascript" src="http://www.openstreetmap.org/openlayers/OpenStreetMap.js"></script>
<script type="text/javascript" src="GPX.js"></script>
<script type="text/javascript">
<?php
    $track_name = $_GET["track"];//Dateiname des gpx-Track
    $track = "./gpx/".$track_name; // erstellt die URL des Tracks aus dem Unterordner gpx

    $fp = fopen( $track, "r"); // $track ist der Trackname
    $n=0;
    while (!  feof( $fp )) {
        $zeile  = fgets( $fp , 4096);
        if (strpos($zeile,"<trkpt")!==false) {
            $temp = explode("\" lon=\"",$zeile);
                    $lat[$n] = substr($temp[0], strpos($temp[0], "\"") + 1);
            $lon[$n] = substr($temp[1], 0, strpos($temp[1], "\""));
            $n++;
        } //end if
    } //end while
    fclose( $fp );
    $i = 0;
    $r0 = 6371.0;
    $laenge = 0.0;
    while ($i < ($n-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 + round(1000 * $c) / 1000;
        $i++;
     }//end while
    $laenge = str_replace(".",",",$laenge);
    $maxlat = max($lat);
    $minlat = min($lat);
    $maxlon = max($lon);
    $minlon = min($lon);
    $width=800;//Breite der Karte in pixel
    $height=600;//Höhe der Karte in pixel

    $j=18;
    $h_faktor=304000;//experimenteller Wert für die Höhe
    while (($height/($maxlat-$minlat)) < $h_faktor) {
        $h_faktor = $h_faktor/2;
        $j--;
        if ($j < 0) break;//Not-Aus
    }
    $i=18;
    $v_faktor=192000;//experimenteller Wert für die Breite
    while (($width/($maxlon-$minlon)) < $v_faktor) {
        $v_faktor = $v_faktor/2;
        $i--;
        if ($i < 0) break;//Not-Aus
    }
    if ($i <= $j) $zoom=$i;
    if ($i > $j) $zoom=$j;

?>
            var map; //complex object of type OpenLayers.Map

            //Initialise the 'map' object
            function init() {
                map = new OpenLayers.Map ("map", {
                    controls:[
                        new OpenLayers.Control.Navigation(),
                        new OpenLayers.Control.PanZoomBar(),
                        new OpenLayers.Control.LayerSwitcher(),
                        new OpenLayers.Control.Attribution()],
                    maxExtent: new OpenLayers.Bounds(-20037508.34,-20037508.34,20037508.34,20037508.34),
                                maxResolution: 156543.0399,
                    numZoomLevels: 19,
                    units: 'm',
                    projection: new OpenLayers.Projection("EPSG:900913"),
                    displayProjection: new OpenLayers.Projection("EPSG:4326")
                } );

                layerMapnik = new OpenLayers.Layer.OSM.Mapnik("Mapnik");
                map.addLayer(layerMapnik);
                layerTilesAtHome = new OpenLayers.Layer.OSM.Osmarender("Osmarender");
                map.addLayer(layerTilesAtHome);
                layerCycleMap = new OpenLayers.Layer.OSM.CycleMap("CycleMap");
                map.addLayer(layerCycleMap);
<?php
           echo"var lgpx = new OpenLayers.Layer.GPX(\"".substr($track_name, 0, strlen($track_name) - 4)."\", \"".$track."\", \"#0000ff\");\n";
           echo"map.addLayer(lgpx);\n";
           echo"var lonLat = new OpenLayers.LonLat(".(($minlon+$maxlon)/2).",".(($minlat+$maxlat)/2).").transform(new OpenLayers.Projection(\"EPSG:4326\"), map.getProjectionObject());";
           echo"map.setCenter (lonLat, ".$zoom.");";
?>
            }
    </script>
<?php
    echo"</head>\n";
    echo"<body onload=\"init();\">\n";//Funktion init() aufrufen
    echo"<div style=\"width:".$width."; height:".$height."\" id=\"map\"></div>\n";    //DIV für das anzeigen der Karte
          echo $laenge." km\n";
}
else {
?>
<title>GPX-Track auf OSM Karte</title>
<?php
    echo"</head><body>\n";
    $name="test.gpx";
    echo"<a href=\"./index.php?track=".$name."\">".$name."</a>\n";
}
?>
</body></html>

So…ich hab obigen Code mal noch etwas ergänzt und optimiert…

       if (strpos($zeile,"<trkpt")!==false) {

Ist das richtich php ? Ich würde denken

       if (strpos($zeile,"<trkpt") != false ) 

Aber denn noch. strpos() liefert eine integer. Nich schön ein int mit ein boolischer werd zu vergleichen.

        if (strpos($zeile,"<trkpt") ) 

würde reichen.

Dann: deine code nimmt an das die zeile so aussieht:

<trkpt lat="53.227362" lon="6.563737">

aber es gibt auch .gpx files wo die reihenfolge umgekehrt is. Dann geht es schief

 <trkpt lon="8.60706806182861328125" lat="54.500476837158203125"/>

Besser du scheibst eine kleine function getattibvalue()

     if (strpos($zeile,"<trkpt")) {
         $lat[$n] = getattibvalue($zeile, "lat")
         $lon[$n] = getattibvalue($zeile, "lon")

Ich bin mal über das hier gestolpert:

http://linuxundich.de/de/webhosting/openstreetmap-inklusive-gps-track-in-webseite-einbetten/

Das ist vielleicht eine Alternative und funktioniert über die Einbettung eines iframe, dessen Inhalt auf dem Server des Autors bereitgestellt wird. Verwendet habe ich es (bisher) aber noch nicht.

Mit Openlayers lassen sich auch GPX Tracks einbinden:
http://dev.openlayers.org/docs/files/OpenLayers/Format/GPX-js.html

Danke für den Hinweis. Bisher hab ich noch keine gpx-Datei gesehen, die andersrum aufgebaut war. Daher ging ich davon aus, dass es der Standard ist.

EDIT: Den php-Code gibts jetzt auf meiner wiki-Seite. Ich denke, das ist übersichtlicher, als ihn hier zu posten.
http://wiki.openstreetmap.org/wiki/User:Aighes#GPX-Track_auf_der_Website_anzeigen

Hallo

ich habe damit mal angefangen ==> http://osmtools.de/easymap/index.php?lang=de&page=editor

==> Ergebnis http://augilabs.de/osm/RW_BeWi_Buechele.htm

MfG
Achim

<?php function getattibvalue($quelle, $suche) { $quelle = substr($quelle, strpos($quelle, $suche)+ strlen($suche)+2); return substr($quelle, 0, strpos($quelle, "\"")); } ?>

Dass geht alles gut hier aber für eine algemeine getattribvalue() function würde sie schnel scheitern. Z.b. auf

 <trkpt latent="xxxx" lon="8.60706806182861328125" lat="54.500476837158203125"/>
<?php function getattibvalue($quelle, $attribname) { $suche = " " + $attribname + "=\"" ; // ' lat="' ....... } ?>

Hallo aighes,
bin gerade am testen Deiner letzten Version. Leider bekomme ich aber dort dann nichts mehr angezeigt sondern im Quelltext steht dann plötzlich:

usw, usw.
Die Version vom 28.01. 14:21 die funzt aber super auf meinem Server und mit den gpx die ich habe.
Gruß

Da meinte ich getattribvalue() (von attribute)

Hallo AlterSachse,

du wie schaut denn deine gpx-DAtei aus. Könntest du davon mal eine entsprechende Zeile posten.

evtl. könnte es helfen die Zeilen

$lat[$n] = getattibvalue($zeile, " lat=\"");
$lon[$n] = getattibvalue($zeile, " lon=\"");

mit

$lat[$n] = str_replace(",",".",getattibvalue($zeile, " lat=\""));
$lon[$n] = str_replace(",",".",getattibvalue($zeile, " lon=\""));

zuersetzen, wenn in der gpx-Datei ein Komma verwedet wird und kein Punkt.

Nein, nein, nein… nein.

Dass ist häsliche code!

Die Anruf soll getattributevalue($zeile, “lat” ); bleiben. Die rest macht die function.

Ja…ist im Eifer des Gefechts passiert…str_replace gehört natürlich in die Funktion :wink:

@AlterSachse: Ich konnte den Fehler eben reproduzieren und habe ihn gelöst.
Es lag an der Zeile

if (strpos($zeile,“<trkpt”)) {

nachdem ich sie wieder in

if (strpos($zeile,“<trkpt”) !== false) {

geändert hatte, trat der Fehler nicht mehr auf. Ist auch logisch. Wenn ‘<trkpt’ am Zeilenanfang steht, liefert strpos natürlich eine 0 und 0 interpretiert er als false und das if… wird nicht ausgeführt. !== verhindert das.

HI,
also im Moment nutze ich zwei gpx Versionen, einmal von TTQV und eine aus GPS.Track.Analyse
die TTQV fängt so an

und aus GPS.Track.Analyse

Das andere werde ich testen. Aber wie gesagt das erste von gestern ging super erst mit dem Einbau der Funktion war es Tod. Ach ja muss vielleicht noch sagen das alles mit Sirf III aufgezeichnet ist und mittels TTQV ausgelesen wird. Dann meistens Export in die GPX und dann Höhen Auswertung mittels GPX.Track.Analyse weil das einfach ein geileres Profil erstellt was ich dann auch in meine Webseiten mit einbaue.
Gruß

Verstehe ich nicht. Bitte gebe ein Beispiel.

Du willst die attributevalue von ein attribute mit name lat bekommen. Dan schreibe lat. Code sieht besser aus: verständlicher auch.

Es komt auch vor das statt quotes ticks benutzt werden:

<trkpt latent="xxxx" lon="8.60706806182861328125" lat="54.500476837158203125"/>
<trkpt latent='xxxx' lon='8.60706806182861328125' lat='54.500476837158203125'/>

Mann implementiert dann getattributevalue() so dass die beide möchlichkeiten versucht wenn die erste fehlschlagt.

Hallo greencaps,

du meinst sowas als Funktion:


function getattibvalue($quelle, $suche) {
    $suche= " ".$suche."=\"";
    if (strpos($quelle, $suche) == false){
        $suche = str_replace("\"","'",$suche);
    }
    $quelle = substr($quelle, strpos($quelle, $suche)+ strlen($suche));
    return str_replace(",",".",substr($quelle, 0, strpos($quelle, "\"")));
}

Bzgl. dem ele. Ich wollte die Höhendaten eines GPX-Tracks auslesen, die so gespeichert sind: 100.0, aber dafür schreib ich mir dann eine Extrafunktion.

Also is eine php string auch 0 indiciert. Noch immer finde ich

            !== 

eine fremde operator. Ich kenne nur

             !=

Ich denke dass besser zu schreiben ist:

if (strpos($zeile,“<trkpt”) >= 0) {

denn dann bleibt es bei integers.

Hallo greencaps,
schau mal ins php-Manual, Beispiel 2.

Danke. Sehr erlauterend. Alle neu für mich: eine function die eine numerische werk zurück geben kann und auch ein boolischer.

So…mittlerweile bin ich mit der Funktionsumfang meines Skripts egtl. zufrieden.
Eben hab ich noch einen Fehler in der Längenberechnung gefixt, der Auftrat, wenn die selben lat und lon-Werte direkt aufeinanderfolgten.

Was mir als Funktion noch fehlt, wäre das Erstellen eines Höhenprofils. Wenn hier jemand eine Idee hat, ich bin für jede Hilfe dankbar. Die Koordinaten des Graphen sind vorhanden. Leider hab ich von php zu wenig Ahnung, um aus diesen Werten ein Diagramm zu erstellen.
Ich möchte das Höhenprofil aber selber erzeugen, da ich egtl. auf Abhängigkeiten von anderen Diensten nicht so besonders stehe.