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
___
Talk-de mailing list
Talk-de@openstreetmap.org
http://lists.openstreetmap.org/cgi-bin/mailman/listinfo/talk-de