2010-04-08 18 views
21

Ich bin ziemlich verwirrt. Ich habe einen Punkt:So konvertieren Sie Vektor-Layer-Koordinaten in Map Breite und Länge in Openlayers

x= -12669114.702301 
y= 5561132.6760608 

Das habe ich vom Zeichnen eines Quadrats auf einer Vektorebene mit dem DrawFeature-Controller bekommen.

Die Zahlen scheinen ... ähm ... sehr groß, aber sie scheinen zu funktionieren, denn wenn ich später ein Quadrat mit den gleichen Punkten zeichne, ist es in der gleichen Position, also muss es stimmen .

Das Problem ist, wenn ich versuche, diesen Punkt in Breite und Länge zu konvertieren.

Ich verwende:

map.getLonLatFromPixel(pointToPixel(points[0])); 

Wo Punkte [0] eine Geometrie Punkt ist, und die pointToPixel Funktion nimmt jeden Punkt und wandelt es in ein Pixel (da die getLonLatFromPixel ein Pixel benötigt). Dies geschieht, indem einfach das x des Punktes genommen wird und es zu den Pixeln x gemacht wird, und so weiter.

Die Breiten- und Längengrad I ist in der Größenordnung erhalten:

lat: -54402718463.864 
lng: -18771380.353223 

Diese sehr eindeutig falsch ist. Ich bin wirklich verwirrt. Ich versuche, dieses Objekt vorsteht, mit:

.transform(new OpenLayers.Projection("EPSG:4326"), map.getProjectionObject()); 

Aber ich wirklich nicht bekommen und bin ziemlich sicher, dass ich es tat falsch, sowieso.

Mein Code ist hier: http://pastie.org/909644

Ich bin irgendwie mit einem Verlust. Die Koordinaten scheinen konsistent zu sein, weil ich sie wiederverwenden kann, um das gleiche Ergebnis zu erhalten ... aber sie scheinen viel größer als jedes der Beispiele, die ich auf der OpenLayers-Website sehe ...

Antwort

34

nach Ihren Code, der Vorsprung Sie verwenden, ist EPSG: 900913, die der ist, der Google Verwendet. Die Einheiten für diese Projektion Meter, und die Werte, die Sie für den Punkt erhalten sind vollkommen richtig:

x= -12669114.702301 (longitude) 
y= 5561132.6760608 (latitude) 

Diese Werte sind nicht Pixel aber Koordinaten in der EPSG: 900913 Projektion und richtig sind (solange sie sollen in Idaho sein, wenn nicht etwas nicht in Ordnung anderswo)

um zu überprüfen, es ist, können Sie auf http://proj4js.org/ und verwandeln Sie Ihre Koordinaten von EPSG gehen: 900.913 bis WGS84 (lat/lon), die Sie geben werden:

x = -113.8085937334033 (longitude) 
y = 44.615123313472 (latitude) 

Dies sind die Werte, die Sie wahrscheinlich erwarten. Wenn Sie sie von dem Punkt zu erhalten, wollen Koordinaten so etwas wie verwenden:

point.transform(new OpenLayers.Projection("EPSG:900913"), new OpenLayers.Projection("EPSG:4326")); 

Dadurch werden die Koordinaten aus dem Google-Projektion zu WGS84 (Breite/Länge) zu transformieren.

+0

Danke, ich hatte wirklich eine harte Zeit, wickelte meinen Kopf um die verschiedenen Projektionen ... – Jenny

+0

Eigentlich habe ich eine Frage ... Ich werde wieder formell fragen, aber: Wenn ich das Gegenteil tue (point.transform (neue OpenLayers.Projection ("EPSG: 4326"), neue OpenLayers.Projection ("EPSG: 900913")); Zu einem regulären Lat/Lon-Punkt bekomme ich NaN (keine Zahl?) für negative lon-Werte. Ist das zu erwarten? – Jenny

+0

http://stackoverflow.com/questions/2607734/openlayers-projections – Jenny

2

Soweit ich mich erinnere, Box Handler ist anders als andere Handler in OL. Wir hatten einen eigenen Handler zu implementieren, die eine Geometrie mit lon/lat Koordinaten liefert vielmehr, dass mit Pixelkoordinaten:

Legato.Handler.Box = OpenLayers.Class(OpenLayers.Handler.Box, { 
    endBox : function(end) { 
    var result; 
    if (Math.abs(this.dragHandler.start.x - end.x) > 5 
     || Math.abs(this.dragHandler.start.y - end.y) > 5) { 
     var start = this.dragHandler.start; 
     var top = Math.min(start.y, end.y); 
     var bottom = Math.max(start.y, end.y); 
     var left = Math.min(start.x, end.x); 
     var right = Math.max(start.x, end.x); 

     var lowerLeftLonLat = this.map.getLonLatFromPixel(new OpenLayers.Pixel(
      left, bottom)); 
     var upperRightLonLat = this.map.getLonLatFromPixel(new OpenLayers.Pixel(
      right, top)); 
     var bounds = new OpenLayers.Bounds(lowerLeftLonLat.lon, 
      lowerLeftLonLat.lat, upperRightLonLat.lon, upperRightLonLat.lat); 
     result = bounds.toGeometry(); 
    } else { 
     var xy = this.dragHandler.start.clone(); 
     var lonLat = this.map.getLonLatFromPixel(xy); 
     result = new OpenLayers.Geometry.Point(lonLat.lon, lonLat.lat); 
    } 
    this.removeBox(); 
    this.callback("done", [ result ]); 
    }, 

    CLASS_NAME :"Legato.Handler.Box" 
});