OverLays in OpenLayers mit PermaLink übernehmen

Moin :slight_smile:

Ich versuche ums verrecken (Entschuldigt die Wortwahl :)) OpenLayers mit einem PermaLink zu öffnen aber dass gleichzeiig auch mein GPX Track angezeigt wird.
Aber ich bekomms nicht hin. Sobald ich OL via PermaLink öffne, ist automatisch der Start-, Endmarker sowie die Route weg. Alle Overlays. Auch der für das Anzeigen von heruntergeladenen Tiles oder der Shading Layer. Hat jemand eine Idee dass die ganzen OverLays erhalten bleiben?

Code:


<html>
<head>
    <title>OpenLayers</title>
	<p>Um etwas direkt zu finden, geben sie das Gesuchte in die "Schnell Suche" TextBox ein und druecken sie "Enter"!</p>
    <link rel="stylesheet" href="img_js_css/style.css" type="text/css" />
    <style type="text/css">
      .olImageLoadError {                                                                                                  
         background-image: url('img_js_css/img/missing-tile.png');
         background-repeat: no-repeat;
      }     
    </style>    



    <script src="img_js_css/OpenLayers.js"></script>
 

    <script src="img_js_css/OpenStreetMap.js"></script>


    <script type="text/javascript" src="img_js_css/searchbox.js"></script>


    <script type="text/javascript" src="img_js_css/nominatim_translation_de.js"></script>



    <script type="text/javascript">

[....] // Lange Dankensrede und Copyright Hinweise. Unteranderem Copyright Hinweise an Netzwolf (cc-by-sa wegen den Code Schnipseln), ein Danke an netzwolf, ein Danke an euch..........


//========================================================================================================================================
// Version Information anzeigen
// alert("OpenLayers (Version: " + OpenLayers.VERSION_NUMBER + ") configured and optimized for [...]");
//========================================================================================================================================
// Start Koordinaten für die Karte:
        var lat=50.01;
        var lon=10.99;
        var zoom=3;
//========================================================================================================================================
//Komplexes Objekt vom Typ OpenLayers.Map:
        var map;
//========================================================================================================================================
// Bing API Key:
        var apiKey = "AqTGBsziZHIJYYxgivLBf0hVdrAk9mWO5cQcb8Yux8sW5M8c8opEC2lZqKR1ZZXf";
//========================================================================================================================================
        //Initalisieren von der Karte
        function init() {
 
            map = new OpenLayers.Map ("map", {
                controls:[
                    new OpenLayers.Control.Navigation(),
                    new OpenLayers.Control.PanZoomBar(),
                    new OpenLayers.Control.Permalink(),
                    new OpenLayers.Control.ScaleLine({geodesic: true}),
                    new OpenLayers.Control.Permalink('permalink'),
                    new OpenLayers.Control.MousePosition(),
                    new OpenLayers.Control.Attribution()],
                maxExtent: new OpenLayers.Bounds(-20037508.34,-20037508.34,20037508.34,20037508.34),
                maxResolution: 156543.0339,
                numZoomLevels: 19,
                units: 'm',
                projection: new OpenLayers.Projection("EPSG:900913"),
                displayProjection: new OpenLayers.Projection("EPSG:4326")
            } );

//========================================================================================================================================
 	    // Umschalter einfügen
 	    var switcherControl = new OpenLayers.Control.LayerSwitcher();
	    map.addControl(switcherControl);
	    switcherControl.maximizeControl();
//= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
	// "Search Box" hinzufügen
	map.addControl (new OpenLayers.Control.SearchBox({
		resultMinZoom: 19
	}));
//========================================================================================================================================
	    // Mapnik (Normale Straßenkarte) Layer hinzufügen:

            layerMapnik = new OpenLayers.Layer.OSM.Mapnik("Normal map");
            map.addLayer(layerMapnik); 
//========================================================================================================================================
	    // CycleMap (Fahrradkarte) hinzufügen:

            layerCycleMap = new OpenLayers.Layer.OSM.CycleMap("Bicylce map");
            map.addLayer(layerCycleMap);
//========================================================================================================================================
	    // Satelliten Ansicht hinzufügen:
		// Ausgeklammert wegen Lizenztechnischen Unklarheiten!!! <<<<<<<<<<<<<

//          var Satellite_View_Bing = new OpenLayers.Layer.Bing({
//                name: "Satellite View",
//                key: apiKey,
//                type: "Aerial"
//          });
//	    map.addLayer(Satellite_View_Bing);
//========================================================================================================================================
	    //Layer der die loakeln Tiles lädt
	    var OfflineMap = new OpenLayers.Layer.OSM("Use downloaded map data", "offline_map_data-tiles/${z}/${x}/${y}.png", {numZoomLevels: 20, alpha: true, isBaseLayer: false});
	    map.addLayer(OfflineMap);
	    // Ende des "Local Tile" Layer
//========================================================================================================================================
	// Shading Layer generieren
	OpenLayers.Layer.Shading = OpenLayers.Class (OpenLayers.Layer.XYZ, {
		attribution: 'Elevation data by <a href="http://www2.jpl.nasa.gov/srtm/">NASA SRTM</a>',
		displayOutsideMaxExtent: true,
		isBaseLayer: false,
		name: 'Show SRTM Data',
		sphericalMercator: true,
		transparent: true,
		type: 'png',
		url: 'http://toolserver.org/~cmarqu/hill/${z}/${x}/${y}.png',
		visibility: true,
		CLASS_NAME: 'OpenLayers.Layer.Shading'
	});
	// Shading Layer anzeigen
	map.addLayer (new OpenLayers.Layer.Shading());
//========================================================================================================================================
 	    // lonLat generieren
            if( ! map.getCenter() ){
                var lonLat = new OpenLayers.LonLat(lon, lat).transform(new OpenLayers.Projection("EPSG:4326"), map.getProjectionObject());
                map.setCenter (lonLat, zoom);
//========================================================================================================================================
	//GPX Darstellung
	    // Layer mit Routenanzeige erstellen
	    var route = new OpenLayers.Layer.Vector("Show route", {
	    	strategies: [new OpenLayers.Strategy.Fixed()],
	    	protocol: new OpenLayers.Protocol.HTTP({
	    		url: "route/route.gpx",
	    		format: new OpenLayers.Format.GPX()
	    	}),
	    	style: {strokeColor: "orangered", strokeWidth: 5, strokeOpacity: 1.0},
	    	projection: new OpenLayers.Projection("EPSG:4326")
	    });
	    map.addLayer(route);
//= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
	    // Layer für Startmarker hinzufügen:s
            layerMarker_1 = new OpenLayers.Layer.Markers("Show route start point");
            map.addLayer(layerMarker_1);
//= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
	    // Layer für Endmarker hinzufügen:
            layerMarker_2 = new OpenLayers.Layer.Markers("Show route end point");
            map.addLayer(layerMarker_2);
//= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
			// Marker Start Point Einstellungen Anfang
				var size_1 = new OpenLayers.Size(21, 25);
				var offset_1 = new OpenLayers.Pixel(-(size_1.w/2), -size_1.h);
				var icon_1 = new OpenLayers.Icon('img_js_css/img/marker-green.png',size_1,offset_1);
			// Marker Start Point Einstellungen Ende
//= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
    		        // Als Position des ersten Markers, den Startpunkt der Route angeben:
			    route.events.register("loadend", route, function() {
			      this.map.zoomToExtent(this.getDataExtent());
			      var startPoint = this.features[0].geometry.components[0];
			      layerMarker_1.addMarker(new OpenLayers.Marker(new OpenLayers.LonLat(startPoint.x, startPoint.y),icon_1));
//= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
			// Marker End Point Einstellungen Anfang
				var size_2 = new OpenLayers.Size(21, 25);
				var offset_2 = new OpenLayers.Pixel(-(size_2.w/2), -size_2.h);
				var icon_2 = new OpenLayers.Icon('img_js_css/img/marker-red.png',size_2,offset_2);
			// Marker End Point Einstellungen Ende
//= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
    		        // Als Position des zweiten Markers, den Endpunkt der Route angeben:

		       	    var components = this.features[this.features.length-1].geometry.components;
			    var endPoint = components[components.length-1];
			    layerMarker_2.addMarker(new OpenLayers.Marker(new OpenLayers.LonLat(endPoint.x, endPoint.y),icon_2))
//= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
//========================================================================================================================================
		});

            }
        }

    </script>

<style type="text/css">

/************************************************
*
*	Gestaltung der Searchbox
*
*************************************************/

.olControlSearchBox {
	left: 120px;
	top: 2px;
}

.olControlSearchBox div.busy {
	background: url(/j/ajax-loader.gif);
	height: 55px;
	width: 54px;
}

.olControlSearchBox div.failure {
	background: red;
	color: black;
	font-weight: bold;
}

.olControlSearchBox div.success {
	background: white;
}

.olControlSearchBox div.success.empty {
	color: gray;
	font-style: italic;
}

.olControlSearchBox div.success div.entry:hover {
	background: blue;
	color: white;
	cursor: pointer;
}
</style>

</head>
 
<!-- body.onload is called once the page is loaded (call the 'init' function) -->
<body onload="init();">
 
    <!-- define a DIV into which the map will appear. Make it take up the whole window -->
    <div style="width:100%; height:100%" id="map"></div>
 
</body>
 
</html>

Viele Grüße
Euer SuperSchnitzel1806

PS: Das ist der Grundcode, ohne meine Fehlversuche.

PPS: Das Problem liegt halt darin dass die Software die ich entwickel, bei einem Fehler mglw. OL neu laden muss. Aber halt dann an einer bestimmten Koordinate. Deswegen brauch ich ganz drigend diese PermaLink Unterstützung.

Nahmd,


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

Hier fehlt die schließende “}”.

Wird eine Permalink angegeben, ist die Karte also hier bereits positioniert, wird nicht nur das setCenter() übersprungen, sondern der Rest des Code.

Tipp dazu: JavaScript-Beautifier über den Code laufen lassen, dann fallen Schachtelprobleme schon optisch auf.

Gruß Wolf

Wie immer, die kleinsten Fehler machen die größten Probleme :frowning:

Nun, stimmt, ich hab die schließende Klammer hinzugefügt. Aber jetzt geht garnichts mehr. Wenn ich jetzt OL öffne, ist der Bildschirm komplett Leer.
Alles was ich sehe ist dann: “Um etwas direkt zu finden, geben sie das Gesuchte in die “Schnell Suche” TextBox ein und druecken sie “Enter”!”.

hmm, wie ich das sehe fehlt nur " } ".

Sieht jetzt so aus:


 	    // lonLat generieren
            if( ! map.getCenter() ){
                var lonLat = new OpenLayers.LonLat(lon, lat).transform(new OpenLayers.Projection("EPSG:4326"), map.getProjectionObject());
                map.setCenter (lonLat, zoom);
	    }

?

PS: Ich hab mal das OL (ohne die Klammer) hochgeladen: www.vriena-intern.lima-city.de/OpenLayers.html
Wegen dem “Tile not available” musste den Haken bei “Use downloaded map data” rausnehmen. Gegebenfalls auch noch bei “SRTM”

PPS: Frag mich nicht warum der plötzlich, auf dem Server irgendwo mitten in den Ocean reinspringt. Am PC ist alles normal. und wo die Route her kommt.

Wenn die Zahl der Klammern vorher stimmte, gibt es jetzt eine zuviel: Syntax-Fehler → Skript wird nicht ausgeführt. Tilge die letzte im Skript.

Ich empfehle auch die Nutzung der Browser-Konsole: Extras→Webentwickler→Browserkonsole; leeren, dann Reload der Seite. Wenn es die nicht gäbe, so müsste man sie erfinden.

Gruß Wolf

Nachtrag: auch sehr schön: http://www.javascriptlint.com/online_lint.php

Lint warnt nur hier:


[...]
186  //= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
187                      // Als Position des zweiten Markers, den Endpunkt der Route angeben:
188  
189                         var components = this.features[this.features.length-1].geometry.components;
190                  var endPoint = components[components.length-1];
191                  layerMarker_2.addMarker(new OpenLayers.Marker(new OpenLayers.LonLat(endPoint.x, endPoint.y),icon_2))
192  //= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
193  //========================================================================================================================================
194          });
     ==^
     lint warning: missing semicolon

ich mach gerade mit der Debug Console. Melde mich gleich.
moment, warum wird da jetzt eine Klammer vermisst wenn sie doch eigentlich bei dem “lonLat genieren” sein müsste?

Konsolen Ausgabe:

sorry, da mußt du durch: wenn ein grober Syntaxfehler vorliegt wie hier, kann dir die Console oder ähnliches auch nicht helfen. Bring die Klammerstruktur in Ordnung und dann sehen wir weiter.

gruss
walter

ok.

Kurz: Was ist DOM?

Da steht “missing semicolon” und nicht “missing }”. Beende die Zeile 191 mit einem “;” und Du machst den JSL glücklich.

Wg. Browser-Konsole: die ist für Dich zum Einarbeiten und nicht zum Copy+Paste: widme der ein bisschen Zeit und mach Dich mit der vertraut: oben gibt es eine Menge Knöpfe, mit denen Du das abschalten kannst, was Dich nicht interessiert. Dann zeigt sie Syntax-Fehler und auch undefinierte Variablen zeilengenau an. Das würde ich auch mal in Ruhe ausprobieren und absichtlich einen Fehler einbauen.

Nachtrag:

Ich empfehle beim “this.map.zoomToExtent(…)” eine Abfrage auf this.map.getCenter():


if(!this.map.getCenter()) this.map.zoomToExtent(this.getDataExtent());

dann funktioniert auch der Permalink. Ohne diese Abfrage überschreibt das GPX nach dem Laden den Permalink.

Gruß Wolf

Hi,

ich komme mit dieser Meldung nicht klar:

Ich deklariere nirgendwo diese Eigenschaft.

Edit: @Netzwolf: Ups, ist behoben.

guggst du http://de.wikipedia.org/wiki/Document_Object_Model

Im Gegensatz zu meinen Erwarten liegen 8 / 10 Fehlern in der style.css

@tunnelbauer: thx

das ist eine Warnung, daß FF diese CSS-Anweisung nicht “gefällt”. Ist ok so, da diese Anweisung für andere Browser gedacht ist - denen dann wieder was anderes nicht “gefällt”.

merken und dann ignorieren. später köntest du dann css-warnungen in der Console abschalten, vorausgesetzt du folgst Wolf’s Rat und lernst das Teil mal richtig kennen und findest dann den Knopf dafür :wink:

Gruss
walter

Console gibt jetzt aus:

Jedoch scheint:

11:12:32.456 getUserData() oder setUserData() sollten nicht mehr verwendet werden. Verwenden Sie stattdessen WeakMap oder element.dataset.

ein Problem von Firefox zu sein. Jedenfalls endet der Fehler in einer .jar Datei im Firefox Verzeichnis.

und

11:12:32.524 NS_ERROR_DOM_BAD_URI: Access to restricted URI denied OpenLayers.js:553

scheint ein Fehler in der OpenLayers.js zu sein. Den kann ich jedoch nicht beheben.
Hoffe dass jetzt alles passt :slight_smile:

und!

@Wolf: Ich hab

jetzt behoben. Die Klammer die da hingehörte war ganz unten vom html Dokument. Das heisst, wenn ich sie hinsetze hatte ich eine zuviel und ohne hinsetzen war sie an der falschen Stelle. Aber jetzt passt es!

Nahmd,

Geh in die Browser-Konsole. Öffne nacheinander die Auswahlknöpfe oben, und nimm dann alle Häkchen weg. Nur bei JS lässt Du das Häkchen vor “Error/Fehler”. Dann bleibt nur das übrig, was Dich interessiert.

Meine Kopie Deiner Seite wirft so genau 0 Meldungen.

Wegen einer kleinen Modifikation schau auf den Nachtrag zu meinen vorherigen Beitrag.

Gruß Wolf

Permalink geht jetzt, ohne Probleme auf wundersame Weise :confused:
Naja, hauptsache es geht.

Zu deinem Nachtrag. Wenn ich die Zeile


this.map.zoomToExtent(this.getDataExtent());

durch


if(!this.map.getCenter()) this.map.zoomToExtent(this.getDataExtent());

ersetze, wird die Route nicht mehr komplett angezeigt. Es wird quasi fehlerhaft gezoomt.

PS: Einzigste Fehlermeldung:

http://www.vriena-intern.lima-city.de/e1.png

Führt aber meiner Meinung nach auf Firefox zurück.

Nahmd,

Mit Permalink wird auf den Permalink gezoomt (und nicht auf den Track). Dazu ist der Permalink da. Der interessiert sich nicht für den Inhalt der Karte, sondern zoomt die so, wie die Paramter der URL-Zeile das fordern. Auch wenn dabei die Route nur teilweise oder auch gar nicht dargestellt wird.

Soll immer die Route dargestellt werden, so braucht es keinen Permalink. :wink:

Gruß Wolf

Alles, was in der Console steht, geht auf FF zurück - weil er das schreibt :wink:
Hier informiert dich FF, daß OPENLAYERS eine Funktion verwendet, die inzwischen obsolet ist oder bald obsolet werden soll.

also —> OL-Problem, was du einfach ignorieren solltest. Eventuell ist die mit OL 3.0 weg.

Gruss
walter

achso, ja stimmt. Ich meine wenn ich die Karte jetzt normal öffne, dann steht da auf größter Zoom Stufe (also Kontinent Ansicht) anstatt die Route anzuzoomen. Aber das ist nicht schlimm. Bin Zufrieden! Danke dir :slight_smile:

Diese “OpenLayer” Konfiguration dient für ein Navigationsprogramm. Deswegen muss die OL Konfiguration so viel können.
Zu guter letzt arbeite ich gerade an dem hier von dir: http://www.netzwolf.info/kartografie/openlayers/trackplayer.htm

Ich hab eine Frage:

Du hast geschrieben:

Ist das hier ok?


// ***************************************************************************************************************************
// * * * * * Ein großen Danke an "Netzwolf" (www.netzwolf.info)
// der mir sowohl im Forum weitergeholfen hat sowie auch mit seinen "Code Schnipseln" :-) * * * * *
// 
// Die folgenden Daten sind komplett vom Netzwolf übernommen:
// Die/Der/Das...
// 
// 	-> Adressuche
// 	-> Shading Layer
// 
// Die folgenden Daten sind teilweise vom Netzwolf übernommen:
// Die/Der/Das...
// 
// 	-> Routen Endmarker Konfiguration
// 

Oder passt dir das nicht so?

Nahmd,

Mea culpa. Nimm das:


if(!location.search) this.map.zoomToExtent(this.getDataExtent());

Ich wünsche nur einen Hinweis im Source auf “http://www.netzwolf.info/kartografie/openlayers/”, damit wenn jemand sich für die JS-Schnipsel interessiert, er die Doku dazu findet. Eine Würdigung braucht es nicht.

Falls das Ergebnis kommerziell eingesetzt wird und Geld verdient, wären als Danke ein paar € an OpenStreetMap.de fein. Einfach schätzen, wieviel Stunden man durch hilfreiche Antworten eingespart hat, und mit einem Faktor (Dicke der Geldbörse geteilt durch Geiz) multiplizieren. Ich gehe mal davon aus, dass ich da für alle hier spreche. Server kosten.

Gruß Wolf

Ich habs nun so gemacht:

Das mit dem “Keine Werbung” ist aus rechtlichen Gründen.

Stimm ich dir, voll und ganz zu.

Ich interessiere mich noch gerade für http://www.netzwolf.info/kartografie/openlayers/trackplayer.htm
Evtl. brauch ich nochmal hier Hilfe :confused:

Ich meld mich dann einfach nochmal :slight_smile:

Viele Grüße
SuperSchnitzel1806