You are not logged in.

Announcement

*** NOTICE: forum.openstreetmap.org is being retired. Please request a category for your community in the new ones as soon as possible using this process, which will allow you to propose your community moderators.
Please create new topics on the new site at community.openstreetmap.org. We expect the migration of data will take a few weeks, you can follow its progress here.***

#1 2009-10-12 10:03:50

a_kemper
Member
Registered: 2009-10-12
Posts: 1

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://mei … /track.kml

Gibt es hier eine vergleichbare Funktion in OSM??

Grüße,
Andreas

Offline

#2 2009-10-12 10:22:30

aighes
Member
From: Shanghai
Registered: 2009-03-29
Posts: 5,383
Website

Re: Eigene Tracks einfach anzeigen -- howto?

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.


Viele Grüße
Henning

Offline

#3 2009-10-12 10:43:09

Oktober
Member
Registered: 2008-11-04
Posts: 37

Re: Eigene Tracks einfach anzeigen -- howto?

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

Offline

#4 2009-10-12 15:00:35

aighes
Member
From: Shanghai
Registered: 2009-03-29
Posts: 5,383
Website

Re: Eigene Tracks einfach anzeigen -- howto?

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


Viele Grüße
Henning

Offline

#5 2009-10-12 15:30:56

JohannesF
Member
Registered: 2009-05-06
Posts: 99

Re: Eigene Tracks einfach anzeigen -- howto?

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:O … ck_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

Offline

#6 2009-10-12 15:35:08

vofiwg
Member
Registered: 2008-10-06
Posts: 131

Re: Eigene Tracks einfach anzeigen -- howto?

Offline

#7 2009-10-12 18:10:15

gmhofmann
Member
From: Heilbronx (Germany)
Registered: 2008-12-31
Posts: 297
Website

Re: Eigene Tracks einfach anzeigen -- howto?


"Jeder hat das Recht, sich idiotisch zu benehmen!" (Harold und Maude)

Offline

#8 2009-10-12 18:39:49

vofiwg
Member
Registered: 2008-10-06
Posts: 131

Re: Eigene Tracks einfach anzeigen -- howto?

Das ist richtig gut! smile

Offline

#9 2009-10-14 20:54:09

Akrisios
Member
Registered: 2009-01-04
Posts: 15

Re: Eigene Tracks einfach anzeigen -- howto?

JohannesF wrote:

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

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.

Last edited by Akrisios (2009-10-14 20:57:05)

Offline

#10 2009-10-15 06:21:44

Hobby Navigator
Member
From: Aßlar, Germany
Registered: 2007-11-11
Posts: 1,616

Re: Eigene Tracks einfach anzeigen -- howto?

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


"Ich denke, dass es einen Weltmarkt für vielleicht fünf Computer gibt."
Thomas Watson, Vorsitzender von IBM, 1943

Offline

#11 2009-10-15 08:41:38

aighes
Member
From: Shanghai
Registered: 2009-03-29
Posts: 5,383
Website

Re: Eigene Tracks einfach anzeigen -- howto?

Kann mich Georg nur anschließen...


Viele Grüße
Henning

Offline

#12 2009-10-15 17:48:03

Akrisios
Member
Registered: 2009-01-04
Posts: 15

Re: Eigene Tracks einfach anzeigen -- howto?

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 ;-)
formular.jpg
map.jpg



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));
        }

Offline

#13 2010-01-04 19:20:09

KlausD
Member
Registered: 2009-01-21
Posts: 5

Re: Eigene Tracks einfach anzeigen -- howto?

Akrisios wrote:

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.

Super Sache wie weit bist du mit dieser Funktion?

Grüße KlausD

Offline

#14 2010-01-27 19:38:53

AlterSachse
Member
From: D-02763
Registered: 2010-01-27
Posts: 125
Website

Re: Eigene Tracks einfach anzeigen -- howto?

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

<!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" />
<title>Unbenanntes Dokument</title>
</head>

<body>
<h1>Track auf OSM</h1>
<p>
        <?php
        $map = "http://mtb.kilu.de/ausgabe/map.php"; //Pfad zur URL muss angepast werden
        $track = "Feierabend.gpx"; //die Datei muss im selben Ordner liegen wie diese Seite
        if (file_exists($track)) // prüfen ob der Track auch da ist
        {
        $track = "http://".($_SERVER['HTTP_HOST']).(dirname($_SERVER['PHP_SELF']))."/"."$track"; // erstellt die URL des Tracks
        echo "<li><a href='$map?track=$track'>Track in OSM Karte</a></li>"; // das ist der Link der die Ausgabeseite aufruft
        }
        ?>
</p>

</body>
</html>

Folgender php code kommt auf die Ausgabeseite

<?php
$track = $_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">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>GPX-Track von der Tour auf OSM Karte</title>
<?php include("#script.php"); ?>
<style type="text/css">.bildmitte { display: block; text-align: center; margin: 0 auto;}</style>
</head>
<!-- body.onload da wird die Funktion aus dem script.php aufgerufen -->   
<body onload="init();">
<h1><?php echo "$title"; ?></h1>
    <!-- DIV für das anzeigen der Karte -->
    <div class="bildmitte" style="height:500px" id="map"></div>
      <ul>
          <li><a href="javascript:history.back();">Zur&uuml;ck</a></li>   
      </ul>
<h2>Downloads</h2>
<ul>
<li><a href="http://mtb.kilu.de" target="_top">HOME</a></li>
<li><a href="<?= $track ?>" target="_blank">Download der GPX Datei</a></li>
<li><a href="http://www.openstreetmap.org" target="_blank">Gro&szlig;e openstreetmap Karte</a></li>
</ul>
</body>
</html>

so und hier die #script.php

<!-- bring in the OpenLayers javascript library -->
<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">
<?
$fp = fopen( $track, "r"); /* $track ist der Trackname aus der vorhergehenden Seite */

while (!  feof( $fp )) {
   $zeile  = fgets( $fp , 4096);
   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=12

        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("Start / Wegpunkte");
            map.addLayer(layerMarkers);
           
            var lgpx = new OpenLayers.Layer.GPX("GPX-Track", "<?= $track ?>", "#9900ff");
            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));
        }
</script>


GPS --Huawei Mate 20 / Garmin Oregon700 eigene OSM-Karte für meine Hometouren
Software -- Linux Debian Stable, QMapShack, JOSM

Offline

#15 2010-01-27 22:26:11

aighes
Member
From: Shanghai
Registered: 2009-03-29
Posts: 5,383
Website

Re: Eigene Tracks einfach anzeigen -- howto?

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.

Last edited by aighes (2010-01-27 22:31:26)


Viele Grüße
Henning

Offline

#16 2010-01-28 08:32:56

AlterSachse
Member
From: D-02763
Registered: 2010-01-27
Posts: 125
Website

Re: Eigene Tracks einfach anzeigen -- howto?

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ß

Last edited by AlterSachse (2010-01-28 08:35:12)


GPS --Huawei Mate 20 / Garmin Oregon700 eigene OSM-Karte für meine Hometouren
Software -- Linux Debian Stable, QMapShack, JOSM

Offline

#17 2010-01-28 12:31:00

greencaps
Member
Registered: 2009-10-05
Posts: 423

Re: Eigene Tracks einfach anzeigen -- howto?

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

Offline

#18 2010-01-28 12:38:26

aighes
Member
From: Shanghai
Registered: 2009-03-29
Posts: 5,383
Website

Re: Eigene Tracks einfach anzeigen -- howto?

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...


Viele Grüße
Henning

Offline

#19 2010-01-28 13:22:04

greencaps
Member
Registered: 2009-10-05
Posts: 423

Re: Eigene Tracks einfach anzeigen -- howto?

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.

Offline

#20 2010-01-28 13:47:14

aighes
Member
From: Shanghai
Registered: 2009-03-29
Posts: 5,383
Website

Re: Eigene Tracks einfach anzeigen -- howto?

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?

Last edited by aighes (2010-01-29 13:31:24)


Viele Grüße
Henning

Offline

#21 2010-01-28 15:21:07

aighes
Member
From: Shanghai
Registered: 2009-03-29
Posts: 5,383
Website

Re: 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>

Last edited by aighes (2010-01-29 11:03:30)


Viele Grüße
Henning

Offline

#22 2010-01-29 10:59:51

aighes
Member
From: Shanghai
Registered: 2009-03-29
Posts: 5,383
Website

Re: Eigene Tracks einfach anzeigen -- howto?

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


Viele Grüße
Henning

Offline

#23 2010-01-29 12:25:34

greencaps
Member
Registered: 2009-10-05
Posts: 423

Re: Eigene Tracks einfach anzeigen -- howto?

aighes wrote:

           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], "\""));

           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")

Offline

#24 2010-01-29 12:44:58

Zartbitter
Member
Registered: 2009-04-22
Posts: 201

Re: Eigene Tracks einfach anzeigen -- howto?

Ich bin mal über das hier gestolpert:

http://linuxundich.de/de/webhosting/ope … 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.

Offline

#25 2010-01-29 13:07:56

Bikeman2000
Member
Registered: 2009-09-27
Posts: 223
Website

Re: Eigene Tracks einfach anzeigen -- howto?

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

Offline

Board footer

Powered by FluxBB