Eigene Tracks einfach anzeigen -- howto?

Hallo,

ich würde gerne eigene Tracks zwecks Weiterleitung an Freunde möglichst einfach in OSM darstellen können. Bei Google Maps funktioniert dies über eine URL der Form http://maps.google.de/maps?q=http://meine-domain.de/track.kml

Gibt es hier eine vergleichbare Funktion in OSM??

Grüße,
Andreas

Ob OSM sowas anbietet weiß ich nicht. Würde mich aber auch interessieren.
Bei GPSies kannst du dir über http://www.gpsies.com/map.do?url=… den Track anziegen lassen, auch als gpx, und als Karte OSM einblenden. Default ist aber leider Google, sodass der Anwender dann selber auf OSM umschalten muss.

Öffentliche GPS-Tracks von a_kemper
Bitte für jeden einzelnen Pfad (Track) eine eigene *.gpx Datei :slight_smile:

Damit stellt man den Track aber OSM zur Verfügung. Das könnte problematisch sein, wenn man den Track nicht aufgezeichnet hat, sonder er bspw. eine geplante Tour ist, die man aus urheberrechtlich geschützten Karten abgezeichnet hat. Diese Daten haben ja nichts im OSM-Projekt zu suchen. Andernfalls wäre es eine Möglichkeit, wenn gleich doch die Lösung von Google bzw. GPSies deutlich besser ist, da man hier den Track nur einer bestimmten Gruppe veröffentlicht und die Veröffentlichung jederzeit stoppen kann. Muss ja nicht jeder wissen, wo ich so langfahre :wink:

Hallo Andreas,

ganz so einfach geht das bei OSM (noch) nicht. Aber es geht.

Auf dieser Seite wird gezeigt, wie man solch eine Seite selbst erstellen kann:
http://wiki.openstreetmap.org/wiki/DE:Openlayers_Track_example

Ist recht einfach (angeblich 3 Minuten, kannst dann ja mal berichten), man braucht aber Webspace (braucht man aber sowieso, um die gpx-Datei zu veröffentlichen).

Bis dann
johannes

Guck auch mal hier:

http://osmtools.de/easymap/index.php?lang=de&page=start

Volker

http://www.gpswandern.de/gpxviewer/gpxviewer.shtml

Das ist richtig gut! :slight_smile:

Danke für den Link!

Ich hab das Ganze mir jetzt ein wenig angepasst und mit PHP dynamisch gemacht.
Ich kann jetzt einfach über ein Webinterface Files hochladen, dann wird der erste Trackpunkt direkt als Mittelpunkt der Anzeige genommen, und der Track dann angezeigt.
Die Tracks werden auf dem Server gespeichert, eine Funktion, einen einmal hochgeladenen Track erneut anzuzeigen ist noch nicht implementiert.

Ich bastel noch ein wenig und kann die nötigen Erweiterungen dann ja hier posten.

Hallo Akrisios,
das wollen wir doch hoffen das du dein Ergebnis hier präsentierst :smiley: Ich denke das Interesse daran ist recht groß.
Georg

Kann mich Georg nur anschließen…

dann wollen wir mal…ich nenne es GPX-View 0.01

Was ihr braucht:

  • Webspace mit PHP-Unterstützung

  • ein wenig HTML/PHP Erfahrung. Ganz wenig.

  • die folgende Anleitung:

  1. Legt euch auf eurem Webserver am besten ein eigenes Verzeichnis an, in das alle Dateien rein kommen, die wir brauchen.

  2. Legt in diesem Verzeichnis das Verzeichnis “files” an. In dieses Verzeichnis werden die gpx-daten geschrieben.

  3. Erstellt die Datei GPX.js, wie im Wiki-Tutorial (JavaScript-Datei_erstellen).

  4. Erstellt die CSS-Datei map.css, wie im Wiki-Tutorial (CSS-Datei_erstellen). Achso, ich hab folgende Änderung vorgenommen: Ich hab das background-color: von “#000000” in “#c0c0c0” geändert.

  5. Jetzt gehts ans Eingemachte. Wir brauchen eine Datei, die uns das Formular und die Karte anzeigt. Erstellt also ähnlich wie im Wiki-Tutorial eine Datei mit dem Inhalt des ersten Code-Feldes unten.
    Speichert diese als index.php. Diese Datei ist ähnlich der HTML-Datei aus dem Tutorial, sie zeigt keine Karte an, wenn sie nicht weiß, welche Position zu verwenden ist, sondern das Uploadformular.
    Ist eine Datei hochgeladen, zeigt sie die Karte und den Permalink dazu - und kein Uploadformular mehr. Für den Permalink passt bitte das www.eure-domain.de/Verzeichnis/ an.

  6. Jetzt kommt eine Datei, die es im originalen Tutorial so nicht gibt, sie entsteht aus dem zweiten Code-Feld unten.
    Diese Datei bitte unter Layercontrol.php speichern. Diese Datei besteht im Wesentlichen aus dem langen JavasScript-Teil des originalen Tutorials (HTML-Datei_erstellen).
    Die ersten Zeilen, die die anzuzeigenden Koordinaten beinhalten sind ersetzt durch ein wenig PHP-Spielerei, die aus dem GPX-File die ersten Koordinaten liest und als Kartenmittelpunkt wählt. Der Wert danach zeigt den Start-Zoom-Wert. Er kann geändert werden, wenn gewünscht. Weiter unten wird dem Layer dann noch einmal die anzuzeigende gpx-Datei übergeben.

  7. Alle 4 Dateien in euer Verzeichnis auf dem Server laden.

  8. www.eure-domain.de/Verzeichnis/ aufrufen - sich freuen.

Ich übernehme keine Garantie für Funktion, aus der Nutzung entstehende Schäden, insbesondere an der Integrität eures Webservers, usw.!
Für Verbesserungsvorschläge bin ich dankbar.

Optisch ist das Ganze kein Hingucker, wer sich in CSS auskennt, kann ja selbst was dagegen tun :wink:

Ich hab das System testweise laufen, kann es wegen Trafficbeschränkungen aber nicht der Öffentlichkeit zugänglich machen. Für kleine Tests eurerseits bin ich bereit, euch die URL in einer privaten Nachricht zu nennen.

index.php:


<?
$filetype=0;
if($_FILES) {
    $tempfile = $_FILES['file']['tmp_name'];
    $filename = strtoupper($_FILES['file']['name']);
         if(substr($filename, -4)==".GPX") $filetype=1;

}

if($tempfile!="" && $filetype==1)
{
$target = basename($filename);
move_uploaded_file($tempfile, "files/".$target);
chmod("files/".$target, 0604);
}

if ($_REQUEST['track'])
    $target = $_REQUEST['track'];

?>

<!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" lang="de" xml:lang="de"
<head>
<title>OSM GpX Track</title>

<? if ($target!="") echo "
<script src=\"http://www.openlayers.org/api/OpenLayers.js\" type=\"text/javascript\"></script>
<script src=\"http://www.openstreetmap.org/openlayers/OpenStreetMap.js\" type=\"text/javascript\"></script>
<script src=\"http://www.openlayers.org/api/Ajax.js\" type=\"text/javascript\"></script>
<script src=\"GPX.js\" type=\"text/javascript\"></script>

<script src=\"Layercontrol.php?file=$target\" type=\"text/javascript\"></script>
";
?>

<link rel="stylesheet" type="text/css" href="map.css">

</head>
<body <? if ($target!="") echo "onload=\"init();\""; echo ">";

if ($target=="") echo "
<form enctype=\"multipart/form-data\" action=\"\" method=\"post\">
<fieldset>
<legend>Track anzeigen:</legend>
<input name=\"file\" type=\"file\" class=\"text\" /><br />
<input type=\"submit\" value=\"anzeigen\" class=\"submit\" />
</fieldset>
</form>
";
else echo "permalink: <a href=\"www.eure-domain.de/Verzeichnis/?track=$target\">www.eure-domain.de/Verzeichnis/?track=$target</a><br />
<div id=\"map\"></div>
Karte von <a href=\"http://www.openstreetmap.org\" target=\"_blank\">www.openstreetmap.org</a>";
?>
</body>
</html>

Layercontrol.php:


<?
header("Content-Type: text/javascript");


if ($_REQUEST['file'])
    $file = $_REQUEST['file'];

$fp = fopen("files/".$file, "r");

while (!  feof( $fp )) {
   $zeile  = fgets( $fp , 4096);
   //$zeile  = chop( $zeile );
   if (strpos($zeile,"<trkpt")!==false) break;
  }

  fclose( $fp );

  $zeile=preg_replace("@<trkpt @", "", $zeile);
  $zeile=preg_replace("@>@", "", $zeile);
  $zeile=trim($zeile);
  $zeile=preg_replace("@\"@","",$zeile);
  $zeile=preg_replace("@lat@","var lat",$zeile);
  $zeile=preg_replace("@lon@","\n var lon",$zeile);

  echo $zeile;

?>

        var zoom=13

        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);
            layerMarkers = new OpenLayers.Layer.Markers("Markers");
            map.addLayer(layerMarkers);

var lgpx = new OpenLayers.Layer.GPX("Track", "<?php echo "files/".$file; ?>", "#0000FF");
map.addLayer(lgpx);

            var lonLat = new OpenLayers.LonLat(lon, lat).transform(new OpenLayers.Projection("EPSG:4326"), map.getProjectionObject());
            map.setCenter (lonLat, zoom);

            var size = new OpenLayers.Size(21,25);
            var offset = new OpenLayers.Pixel(-(size.w/2), -size.h);
            var icon = new OpenLayers.Icon('http://www.openstreetmap.org/openlayers/img/marker.png',size,offset);
            layerMarkers.addMarker(new OpenLayers.Marker(lonLat,icon));
        }

Super Sache wie weit bist du mit dieser Funktion?

Grüße KlausD

Hallo
Also da ich diesen Lösungsvorschlag von „Akrisios“ super fand habe ich ein wenig was dazu gebastelt denn mir ging es hauptsächlich um das anzeigen der Tracks und nicht um das hochladen.
Also mein Track liegt im selben Ordner wie die php Seite und wird mittels URL an die Ausgabe Seite übergeben. Habe das so gelöst da ich eine Webseite mit vielen MTB Touren betreibe und jede Tour in einem Ordner liegt und dort auch immer die Tracks dort sind.
Natürlich kann man das noch viel eleganter über eine Datenbank lösen aber für meine Zwecke reicht das hier aus.
Da ich hier nicht den ganzen PHP schreiben möchte habe ich zum Download eine kleine zip gemacht.
Alles dazu unter http://www.mtb.kilu.de dort gibt es eine kleine Demo.
Wichtig "Musste die Variable ‘gpx’ durch ‘track’ ersetzen da die Variable schon vergeben war auf meiner Seite. Die GPX.js ist unverändert weiterverwendet worden.
So nun kann jeder weiter an der Sache basteln. Wer eine große Track Verwaltung sucht sollte sich mal das hier http://osm.erlkoenigkabale.eu/phpmygpx.php anschauen, das ist auf eine Datenbank aufgebaut und funzt auch super.
Gruß
Folgender php code kommt auf die Seite1

Folgender php code kommt auf die Ausgabeseite

so und hier die script.php

Hallo AlterSachse,

vielen Dank für die Scripte. Ich hab die ersten beiden für mich angepasst. Was mir an der Darstellung noch nicht gefällt, ist die Startposition der Karte. Könnte man die auch so setzen, dass man den kompletten Track mittig sieht?

Oder müsste ich dazu zuerst diese Position und dann den Zoomwert aus der gpx-Datei berechnen?

EDIT:
Übrigens sehe ich ein “Problem” in deinem Code. Durch die Übergabe der kompletten gpx-Track-URL in dem Link ist es möglich, jede beliebige gpx-Datei darzustellen. Evtl. sollte man nur den Dateinamen übergeben und die url erst auf der Map-Seite erstellen.
Wenn diese Freiheit gewollt ist, ist es natürlich kein Problem…wollte nur drauf hinweisen.

HI,
ja Du hast recht mit der URL aber ich habe noch keine andere Lösung gefunden, wahrscheinlich baue ich aber mal eine Datenbank die nur die gpx Daten enthält und dann ausgelesen wird.
Das mit dem ganzen Track in die Mitte zu bekommen ist nicht so einfach, oder besser gesagt ich bin daran gescheitert.
Wie Du schon sagst man muss aus dem Track heraus die Mitte berechnen und auch den Zoom und das geht nur über eine Datenbank sag ich mal.
Wenn Du mal die Datei von http://osm.erlkoenigkabale.eu/phpmygpx.php probierst dann siehst Du dass das geht. Er schreibt aber die ganze gpx in eine Datenbank, also jeder Track Punkt steht in der Datenbank, und dann errechnet er die Mitte aus dem Track. Ich bin aber am Nachbau gescheitert, da sind meine PHP Kenntnisse einfach zu gering.
Aber falls jemand noch was anderes findet Bitte hier posten, bin für jedes PHP Schnipsel dankbar.
Gruß

Wo scheitert die Berechnung des Mitten? Wo liegt genau dein Problem?

Hallo,
die Situation ist folgende: die gpx-Datei liegt auf dem Server, die lat und die lon-Werte würde ich sicher jeweils in ein Array bekommen. Dann verlässt es mich aber schon…

Wäre schön, wenn du hier mit Code oder einem Algorithmus-Ansatz helfen könntest…

Alles in ein array zu bekommen ist die meiste Arbeid.

Vergess erst das Mitten. declariere vier variabelen;

maxlat = -90
minlat = +90
maxlon = -180
minlon = 180

jetzt eine schleife wo du immer eine lat und lon aus das array nimst

if ( lat < minlat ) minlat = lat
if ( lat > maxlat ) maxlat = lat
if ( lon < minlon ) minlon = lon
if ( lon > maxlon ) maxlon = lon

am ende hast du die coordinaten von den boundingbox von der track

aus minlon, maxlon, minlat und maxlat ist einfach das Mitten zu berechnen.

Das Einlesen ins Array war kein Problem. Den Algorithmus hab ich schonmal in VB geschrieben und musste ihn nur in php übersetzten. Der Rest war dann auch nicht das Problem. Google meinte, php hat Funktionen, um Maximum und Minimum eines Arrays zu bestimmen.

Was noch fehlt ist eine Bestimmung des Zoomfaktors. Hat jemand dafür eine Idee?