[Talk-de] POIs und Openlayers

Andreas Titz erddaten at fahrrad.streckenfun.de
Di Jan 15 13:49:19 UTC 2008


Meine Antwort bezieht sich auf folgende Mail vom Montag, 14. Januar 2008 00:20:
> mallok schrieb:
> > Hallo,
> > ich habe gemaess dem Beispiel im wiki versucht mit POIs in einer
> > Textdatei und openlayers, diese in OSM zeichnen zu lassen.  Habe auch
> > brav die lat lons in mercator umgerechnet (ebenfalls wie im wiki
> > beschrieben). Meine POIs landen allerdings in Italien und nicht in
> > Muenchen, wo sie hingehoeren.

Italien statt München geht ja noch fast unter Messungenauigkeit durch ;-)
(Meine POI waren anfangs in der Nähe vom Kap der guten Hoffnung gelandet statt 
15km nördlich von Berlin).

> > Ich habe die letzten 6 Stunden mit suchen
> > im Netz zugebracht aber keine fuer brauchbaren beispiele gefunden. Eine
> > Umrechnung der im wiki angegebenen Punkte transportiert die weit in den
> > Norden und nicht nach Muenchen. Ich bin inzwischen so weit. dass ich
> > weis. dass ich ein  Problem mit der Projektion  habe; nur habe ich leider
> > keine Ahnung, welche Formel(n) ich anwenden soll. Weiss hier jemand
> > weiter?
> >
> > Gruesse
> > mallok
>
> Ja des ist ne zimlich seltsamme Sache, bin damals auch dran gescheitert.
> Die von OSM auf der Seite benutzte OpenLayers Variante benutzt intern
> keine Koordinaten, sondern Meter zwischen -20037508 und 20037508.
>
> Aber in deren JavaScripts gibts auch ne Funktion die die normalen
> Lat/Lon Koordinaten entsprechnd umwandelt, wie man z.B. bei der
> Centerfunktion sieht:
>
> var centre = lonLatToMercator(new OpenLayers.LonLat(10.688571882011752,
> 48.87896240236462));
>

Die Umrechnungsfunktion selbst steht ja auch im Wiki auf der Seite mit dem 
POI-Beispiel[1]. Allerdings war ich mit dieser Funktion auch nicht zum Ziel 
gekommen (s.o.). Inzwischen habe ich jedoch mit den Umrechnungsformeln aus der 
Wikipedia[2] eine Lösung für die Projektion LatLon <-> Mercator gefunden, die 
zumindest bei mir für verschiedene Regionen der Welt zu passen scheint. Zu 
beachten ist, dass die Umrechnungsformeln, wie sie in der Wikepedia dargestellt 
sind, mit Bogenmaß (Radiant) arbeiten und nicht mit Grad. Anschließend muss 
dann noch der Winkel in Meter auf dem angenommenen Erdumfang umgerechnet werden.

[1]<http://wiki.openstreetmap.org/index.php/Openlayers_POI_layer_example>
[2]<http://de.wikipedia.org/wiki/Mercator-Projektion>

Hier mal die entscheidenden JavaScript-Schnipsel aus meiner Seite:
----------8<----------------------------
// Umrechnung Lat/Lon -> interne Koordinaten
function lonToMercator(l) {
        return lon = l * 20037508.34 / 180;
};
function latToMercator(l) {
	// Umrechnung Graß -> rad
        l = l * Math.PI / 180;
	// Projektion Erdkugel -> Mercator
        var lat = Math.log( (1+Math.sin(l)) / (1-Math.sin(l)) );
	// Umrechnung rad -> Meter
        lat = lat * 20037508.34 / 2 / Math.PI;
 
        return lat;
};
// Umrechnung interne Koordinaten -> Lat/Lon
function MercatorToLonLat(ll) {
        var lon = ll.lon / 20037508.34 * 180;
	
        // Umrechnung Meter -> rad
        var lat = ll.lat / 20037508.34 * 180 * ( Math.PI / 180 );
	// Projektion Mercator -> Erdkugel
        lat = ( Math.pow(Math.E, lat) - Math.pow(Math.E, -lat) ) / 2;   // = Math.sinh(lat)
        lat = Math.atan( lat );
	// Umrechnung rad -> Grad
        lat = lat * 180 / Math.PI;                                            	
        return new OpenLayers.LonLat(lon, lat);
}
----------->8--------------------------------
Bitte beachten, dass die Umrechung in Interne Koordinaten für Latitude 
und Longitude mit getrennten Funktionen erfolgt. Die Gegenrichtung erwartet 
dagegen ein OpenLayers.LonLat-Objekt als Argument.

Möglicherweise haben noch die folgenden Zeilen Einfluss auf die 
Projektion der POIs auf die Karte:
<!-- Einbindung des JavaScripts von OSM -->
<script src="http://openstreetmap.org/openlayers/OpenStreetMap.js"></script>
<script>
        map = new OpenLayers.Map('map', { maxExtent: newOpenLayers.Bounds(-20037508,-20037508,20037508,20037508),                                  
					  maxResolution:156543,
                                          units:'m',
                                          projection: "EPSG:41001",
                                          numZoomLevels:18,
					 } );
	// von OSM vorgegebene Objekte für die Kartenlayer verwenden
	var layerTah    = new OpenLayers.Layer.OSM.Osmarender("Osmarender");
        var layerMapnik = new OpenLayers.Layer.OSM.Mapnik("Mapnik");
</script>


HTH, Gruß Andreas




Mehr Informationen über die Mailingliste Talk-de