Re: [Talk-de] POIs und Openlayers

2008-01-15 Diskussionsfäden Andreas Titz
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]
[2]

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:

http://openstreetmap.org/openlayers/OpenStreetMap.js";>

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");



HTH, Gruß Andreas

___
Talk-de mailing list
Talk-de@openstreetmap.org
http://lists.openstreetmap.org/cgi-bin/mailman/listinfo/talk-de


Re: [Talk-de] POIs und Openlayers

2008-01-13 Diskussionsfäden Andreas Hubel
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.
> 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));

oder bei der Funktion hier:

   function setPosition(lat, lon, zoom) {
 var centre = lonLatToMercator(new OpenLayers.LonLat(lon, lat));

 map.setCenter(centre, zoom);

 if (marker)
   removeMarkerFromMap(marker);

 marker = addMarkerToMap(centre, getArrowIcon());
   }

Ich hoffe, das ich weiter helfen konnte, ansonsten zeig einfach mal 
deinen Code.

MfG Andreas Hubel


___
Talk-de mailing list
Talk-de@openstreetmap.org
http://lists.openstreetmap.org/cgi-bin/mailman/listinfo/talk-de