Kompaß in Openstreetmap einbauen

Hallo joergi2012,
bevor die Krümmelkacker gleich wieder zuschlagen gleich vorweg, bei Openstreetmap - also in der Datenbank - gibt es kein Norden = Oben. Was du sicherlich meinst sind die Karten wie z.B. openstreetmap.org oder openstreetmap.de. Dort ist, wie bei allen anderen gerasterten (Tile) Karten auch, Norden immer oben - zumindest habe ich noch keine gesehen, bei der es nicht so ist. Im gegensatz zu vektorkarten kann man ja auch nicht mal gerade ebenso die Karte drehen wie man lustig ist, wie z.B. im bestimmten Navigation-Apps, wo es dann auch in der Tat Sinn macht eine Kompaßrose oder einen “Nordpfeil” einzublenden.

Wenn, dann müsste man es in der Tat als Layern einbinden, wobei dies nicht zwingend ein OpenLayers/Leaflet Layer sein müsste, da man TileKarten eh nicht drehen kann, reicht ein normaler html-div-layer.

Viele Grüße,
Harald Hartmann

Tja, dann schau mal hier: http://www.ancalime.de/rotated.html
oder auch “ausser Konkurenz” hier: http://gis.ibbeck.de/ginfo/apps/OLExamples/ol311/MapRotation/maprotation.asp

ich meine, ich hätte auch ein Feature zum Rotieren in Mapnik 3.x gesehen, kann es aber auf die Schnelle nicht finden.

Gruss
walter

Krümelk. v. D. :wink:

Definiere „Openstreetmap“. Es wäre wahrscheinlich kein Problem, aus der OSM-Datenbank eine elbische Karte zu rendern, die Westen oben hat. Die gängigen Renderer halten sich aber an die Konvention, Norden nach oben zu nehmen.

Also abgesehen von der Möglichkeit, deinen Bildschirm zu drehen: Ja, Norden ist in aus Openstreetmap erzeugten Karten (was nicht mit Openstreetmap selbst, der Geodatenbank, verwechselt werden sollte) oben.

Hier verläßt mich mein Logikmodul. Ein „Wenn nein“ hätte ich noch logisch gefunden, aber wozu brauchst du eine Windrose auf der Karte, wenn schon mehr oder weniger feststeht, wo Norden ist?

–ks

Ja, aber da handelt es sich ja nicht mehr um “Standardkarten” :wink: Und klar, wenn ein Radweg von Norden nach Süden läuft, ich den aber im Querformat haben will, macht es ja durchaus Sinn, die Karte “gedreht” zu rendern und dann ist der Nordpfeil oder die Kompaßrose definitiv auch eine Pflichtangabe

hej joergi2012,
fuer Dein Problem existieren diverse “fertige” Lösungen. Nimmst Du aus den openstreetmap Daten generierte Karten - wie z.B. die freizeitkarte-osm, reitwanderkarte.de oder openandromaps - und verwendest die entsprechenden zum Kartenformat passenden Programme (z.B. Oruxmaps, Basecamp von Garmin oder qlandkarte) kannst Du die Karte mit Hilfe der im Programm vorgesehen Kompassrose beliebig verdrehen. Auch die diversen Garmingeräte können die Karte automatisch in Fahrtrichtung ausrichten - es ist also vernuenftig anzunehmen, dass die Navis anderer Hersteller das auch können.

Der einzige Nachteil dieser Lösung ist, dass Änderungen nicht so schnell sichtbar werden und Du immer mit dem Datenbestand zum Zeitpunkt der ERstellung der Karte arbeitest - der grosse Vorteil ist aber, dass es auch ohne jede onlineverbindung klappt.

Lieben Gruss
Jens

Hi,
danke für Eure Antworten. Es ist eine ganz normale Karte, die auch nicht drehbar o.Ä. ist (siehe untenstehenden script).

Ich bekam teilweise Nachfragen, ob die Karte genordet ist, konnte dazu aber keine verbindliche Auskunft geben. Nun weis ich es besser :slight_smile:

Ich werde, wenn ich Euch richtig verstanden habe, einfach eine statische Kompaßgrafik als Layer einbinden :slight_smile:


<script src="OpenLayers/OpenLayers.js">
</script><script src="http://www.openstreetmap.org/openlayers/OpenStreetMap.js">
</script>
<div id="map" style="width:750px;height:510px;"></div>'
<script type="text/javascript" src="OpenLayers/my_panzoombar.js"></script>
<script type="text/javascript">
var map;
function showMap()
{
map = new OpenLayers.Map("map",
{
maxExtent: new OpenLayers.Bounds(-20037508.34,-20037508.34,20037508.34,20037508.34),
maxResolution: 156543.0399,
units: "m",
projection: new OpenLayers.Projection("EPSG:900913"),
displayProjection: new OpenLayers.Projection("EPSG:4326"),
controls: [],
});
map.addControl (new OpenLayers.Control.LayerSwitcher());
map.addControl (new OpenLayers.Control.Attribution());
map.addControl (new OpenLayers.Control.Navigation());
map.addControl (new OpenLayers.Control.PanZoomBar({minZoom: 12}));
var layerMapnik = new OpenLayers.Layer.OSM.Mapnik("Mapnik (updated weekly)");
map.addLayers([layerMapnik]);
map.setCenter(new OpenLayers.LonLat(7.2741121239461,51.590829124866).transform(new OpenLayers.Projection("EPSG:4326"),
new OpenLayers.Projection("EPSG:900913")), 14);
marker.events.register("mousedown", marker, function(evt)
{
OpenLayers.Event.stop(evt);
}
);
map.layers[map.layers.length-1];
}
showMap();
</script>

Einfache Antwort fürs nächste Mal: Wenn auf einer Karte keine Nordrichtung ausdrücklich angegeben ist, dann ist Norden oben.

–ks

So, habe jetzt eine Kompassgrafik gefunden. Nun stehe ich aber vor dem Problem, diese PNG Datei einzubinden. Irgendwie finde ich kein vernünftiges Beispiel, das ich verstehe. Könnt Ihr mir einen Tip geben, wie ich eine Grafik als “Overlay Layer” integrieren kann? Die Grafik verändert natürlich weder die Position noch die Größe

Ich denke, Du hast dieses Openlayers-Beispiel gemeint http://openlayers.org/en/v3.1.0/examples/rotation.html

Hi Joergi2012,
wenn die Kompassgrafik auch im rechten, unteren Karteneck sein darf, dann kannst Du die Grafik in die Attribution einbauen.


...
function init() {
	map = new OpenLayers.Map ("map", { controls:[
		new OpenLayers.Control.PanZoomBar({panIcons: false}),
		new OpenLayers.Control.Attribution(),

...
layerMyMap = new OpenLayers.Layer.TMS( 
		"myMap", 
		[ "" ],
		{ type:'png', getURL: get_osm_url, wrapDateLine: true, attribution: '&copy; <a href="http://www.openstreetmap.org/">OpenStreetMap und Mitwirkende CC-BY-SA</a><img src=compass.png>'});
	map.addLayer(layerMyMap);
...

Grüße
Andreas

Hi Andreas,

danke für das Angebot. Aber ich habe mir jetzt eine eigene Kompassgrafik gebastelt, die ich rechts neben dem “Layer switcher” positionieren möchte. Jetzt müßte meine Kompass Grafik ja eigentlich einen geringeren Z-index Wert besitzen, damit entsprechende Punkte im “Layer switcher” evtl. angelickt werden könnten, oder? Leider weiß ich nicht, wie ich meine feststehende und nicht größenveränderbare Kompass Grafik in meinen script (Siehe mein heutiges posting um 9:11 Uhr) einbetten kann … :frowning:

Versuchs mal damit. Ist eine leichte Veränderung Deines Scripts. Ich habe eine Bilddatei namens compass.png verwendet, die im selben Verzeichnis wie die HTML liegt (Diese Lösung “missbraucht” ebenfalls das Attribution-Control)


<script src="OpenLayers/OpenLayers.js">
</script><script src="http://www.openstreetmap.org/openlayers/OpenStreetMap.js">
</script>
<div id="map" style="width:750px;height:510px;"></div>'
<script type="text/javascript" src="OpenLayers/my_panzoombar.js"></script>
<script type="text/javascript">
var map;
function showMap()
{
map = new OpenLayers.Map("map",
{
maxExtent: new OpenLayers.Bounds(-20037508.34,-20037508.34,20037508.34,20037508.34),
maxResolution: 156543.0399,
units: "m",
projection: new OpenLayers.Projection("EPSG:900913"),
displayProjection: new OpenLayers.Projection("EPSG:4326"),
controls: [],
});
map.addControl (new OpenLayers.Control.LayerSwitcher());
map.addControl (new OpenLayers.Control.Attribution());
map.addControl (new OpenLayers.Control.Navigation());
map.addControl (new OpenLayers.Control.PanZoomBar({minZoom: 12}));
var layerMapnik = new OpenLayers.Layer.OSM.Mapnik("Mapnik (updated weekly)");
layerMapnik.attribution = "<img src=compass.png>";
map.addLayers([layerMapnik]);
map.setCenter(new OpenLayers.LonLat(7.2741121239461,51.590829124866).transform(new OpenLayers.Projection("EPSG:4326"),
new OpenLayers.Projection("EPSG:900913")), 14);
marker.events.register("mousedown", marker, function(evt)
{
OpenLayers.Event.stop(evt);
}
);
map.layers[map.layers.length-1];
}
showMap();
</script>
<style>
      div.olControlAttribution {
          right: 20px;
	  top: 3px;
      }
</style>

hallo,

schaue dir mal untter steuerelemente, kompass an:

http://gk.historic.place/historische_objekte/index.html

im quellcode müßte npoch ein ausdokumentiertes beispiel mit den layerswitcher in openlayers sein…

grüße von lutz

Ich würde auch wie im Beispiel von Lutz den Nordpfeil mit besonders hohem z-index als div ganz unabhängig von OpenLayers irgendwo über die Karte kleben und den Layerswitcher irgendwo darunter hinschieben… Oder warten bis jemand ein schönes Beispiel mit OpenLayers 3 oder Leaflet bringt.

Hi,

habe mich jetzt an das Beispiel von Andreas gehalten. Der Kompaß wurde oben rechts positioniert und der layerswitcher “tiefer gelegt”. Sieht jetzt toll aus. Aber leider fehlt jetzt der “Atrribution” Hinweis unten in der rechten Ecke. Mache ich da einen Denkfehler? Wie kann ich den wieder anzeigen lassen?

Soooo,

habe jetzt noch etwas rumexperimentiert und die für mich beste Lösung gefunden. Der Switchlayer, wurde nun weiter heruntergesetzt, damit der mit einer absoluten Positionierung rechts oben gesetzte Kompass Platz hat. Das ganze funktioniert einwandfrei. Damit habe ich jetzt doch auf eine Änderung im Javascript verzichtet.

Möglichkeit 1
Setze die Attribution vor den Kompass (Attribution wird dann direkt überhalb des Kompasses angezeigt, d.h. rechts oben)


layerMapnik.attribution = layerMapnik.attribution = "&copy; <a href=http://www.openstreetmap.org/>OpenStreetMap und Mitwirkende CC-BY-SA</a><br><img align=right src=compass.png>";

Möglichkeit 2
Setze die Attributierung in den HTML-Body manuell rein. Erscheint dann unterhalb der Karte

&copy; <a href="http://www.openstreetmap.org/">OpenStreetMap und Mitwirkende CC-BY-SA</a>

Ich habe auf der INTERGEO letztes Jahr in Berlin einen Vortrag dazu gehalten (@Markus: bald kommt noch was, ich habe echt viel zu tun).

Norden ist NICHT immer oben. Es gibt drei Arten von Norden:

  • Gitternord
  • Magnetisch Nord
  • Geographisch Nord

Die OpenStreetMap-Projektion zeigt nach Gitternord - das hat aber nichts mit dem Kompass zu tun. Wenn man z.B. in Nordamerika unterwegs ist und mit OSM und einem Kompass Richtung Kanada wandern will, kommt man ganz woanders raus. Ganz gefährlich ist das für Segler. Man muss einen Kurs nämlich ständig korrigieren.

Ich habe dazu einen Artikel für ein Magazin geschrieben, der noch nicht veröffentlicht wurde. Ich könnte ihn umschreiben und die wichtigsten Teile veröffentlichen.

Ich glaube, es hat sich eingebürgert, trotzdem keinen Nordpfeil auf die Karte zu setzen, solange die Abweichung nur ein paar Grad beträgt. Sonst hätten wir auf jeder Wanderkarte eine kleine Kompassrose. Die Feinheiten überlässt man Experten, die mit den Linien, den Diagrammen und dem Kleingedruckten am Kartenrand klarkommen. Dem Rest unterstellt man, dass er eh nicht genauer zielen kann.

Wie sieht denn eine nordkanadische Karte aus? Sind da drei fette Pfeile zu den beiden Polen und zum Gitternord drauf?

Grüße, Max

Achtung: Wanderkarten besitzen in der Regel eine Projektion, wie UTM oder Gauß-Krüger mit einer gewissen lokalen Begrenzung. In diesem Bereich sind dann Strecken- und Winkelmessungen einigermaßen okay. Wenn du aber z.B. eine GK2-Wanderkarte im Osten von NRW verwendest, wirst du dich schön wundern :slight_smile:

Wie du weißt, ist unsere Merkatorprojektion nur in sehr geringem räumlichen Maße z.B. für Streckenmessungen, aber recht gut für Peilungen geeignet. Wenn du dann aber in Realität die Peilung ablaufen willst, musst du deinen Kompass anpassen. Gute Kompasse haben extra eine Schraube dafür. In Deutschland ist das zur Zeit egal. Vor ein paar Jahrzehnten hatten wir aber noch 10° Abweichung zum Nordpol, momentan liegt der unterhalb der Messtoleranz eines normalen Wanderers.

Gauß hat das übrigens damals bei seinen Messungen rausgefunden - ich rede also kein Mist.

Professionelle Karten, wie See, Wanderung, amtliche Topographische Karten, - auch bei uns - haben einen Hinweis über die Nadelabweichung (usw.) drauf, meistens neben der Karte und nicht im Kartenbild. Außer bei Seekarten, dort sind sie in die Karte gezeichnet.