So konvertieren Sie Vektorschichtkoordinaten in den Kartenbreitengrad und Längengrad in OpenLayers

StackOverflow https://stackoverflow.com/questions/2601745

Frage

Ich bin ziemlich verwirrt. Ich habe einen Punkt:

x= -12669114.702301
y= 5561132.6760608

Dass ich mit dem DrawFeature -Controller ein Quadrat auf eine Vektorschicht gezogen habe.

Die Zahlen scheinen ... ähm ... schrecklich 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 denke ich, dass sie Recht haben müssen.

Das Problem ist, wenn ich versuche, diesen Punkt in Breitengrad und Länge umzuwandeln.

Ich benutze:

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

Dabei ist Punkte [0] ein Geometriepunkt, und die PointTopixel -Funktion nimmt einen beliebigen Punkt und verwandelt ihn in ein Pixel (da das getLonlatfrompixel ein Pixel benötigt). Dies geschieht einfach, indem es einfach das X -X -X nimmt und es zu den Pixeln x usw. macht.

Der Breitengrad und die Länge, die ich bekomme, ist in der Reihenfolge von:

lat: -54402718463.864
lng: -18771380.353223

Das ist sehr deutlich falsch. Ich bin wirklich verwirrt. Ich versuche dieses Objekt zu projizieren, verwendete:

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

Aber ich verstehe es nicht wirklich und bin mir ziemlich sicher, dass ich es sowieso falsch gemacht habe.

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

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

War es hilfreich?

Lösung

Laut Ihrem Code ist die von Ihnen verwendete Projektion EPSG: 900913, die Google verwendet. Die Einheiten für diese Projektion sind Messgeräte, und die Werte, die Sie für den Punkt erhalten, sind vollkommen korrekt:

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

Diese Werte sind keine Pixel, sondern Koordinaten in der EPSG: 900913 -Projektion und sind korrekt (solange sie sich in sein sollen Idaho, wenn nicht, woanders stimmt etwas nicht.)

Um es zu überprüfen, können Sie gehen http://proj4js.org/ und verwandeln Sie Ihre Koordinaten von EPSG: 900913 in WGS84 (LAT/LON), was Ihnen:

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

Dies sind die Werte, die Sie wahrscheinlich erwarten. Wenn Sie sie von den Punktkoordinaten erhalten möchten, verwenden Sie so etwas wie:

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

Dadurch werden die Koordinaten von der Google -Projektion in WGS84 (Breitengrad / Längengrad) umgewandelt.

Andere Tipps

Soweit ich mich erinnere, ist Box Handler implementiert als andere Handler in OL. Wir mussten einen eigenen Handler implementieren, der eine Geometrie mit LON/LAT -Koordinaten eher mit Pixelkoordinaten zurückgibt:

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"
});
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top