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>
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.
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ß
Ja…ist im Eifer des Gefechts passiert…str_replace gehört natürlich in die Funktion
@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ß
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.
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.