Comment convertir couche vecteur en coordonnées Carte Latitude et Longitude dans OpenLayers

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

Question

Je suis assez confus. J'ai un point:

x= -12669114.702301
y= 5561132.6760608

Que je suis arrivé de dessiner un carré sur une couche vectorielle avec le contrôleur DrawFeature.

Les chiffres semblent ... euh ... awfull grand, mais ils semblent fonctionner, parce que si je dessine un carré plus tard avec tous les mêmes points, il est dans la même position, alors je me dis que ils doivent avoir raison.

Le problème est lorsque je tente de convertir ce point à la latitude et la longitude.

J'utilise:

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

Lorsque les points [0] est un point de la géométrie, et la fonction de pointToPixel prend un point quelconque et il se transforme en un pixel (depuis le getLonLatFromPixel a besoin d'un pixel). Elle le fait en prenant simplement le x de point, et d'en faire les pixels x, et ainsi de suite.

La latitude et la longitude que je reçois est de l'ordre de:

lat: -54402718463.864
lng: -18771380.353223

Ceci est très clairement erronée. Je suis parti vraiment confus. J'essaie de projeter cet objet, en utilisant:

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

Mais je ne comprends pas vraiment et je suis assez sûr que je l'ai fait mal, de toute façon.

Mon code est ici: http://pastie.org/909644

Je suis un peu à perte. Les coordonnées semblent cohérentes, parce que je peux les réutiliser pour obtenir le même résultat ... mais ils semblent façon plus grande que l'un des exemples que je vois sur le site OpenLayers ...

Était-ce utile?

La solution

Selon votre code, la projection que vous utilisez est EPSG: 900913, qui est celui utilisé par Google. Les unités de cette projection sont mètres, et les valeurs que vous obtenez pour le point sont parfaitement correct:

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

Ces valeurs ne sont pas des pixels, mais coordonnées dans le EPSG: 900913 projection, et sont corrects (tant qu'ils sont censés être en Idaho , sinon il y a quelque chose de mal ailleurs)

Pour le vérifier, vous pouvez aller à http://proj4js.org/ et transformer vos coordonnées de EPSG: 900913 WGS84 (latitude / longitude), qui vous donnera:

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

Ce sont les valeurs que vous attendiez probablement. Si vous voulez les obtenir à partir du point de coordonnées utiliser quelque chose comme:

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

Cela transformera les coordonnées de la projection Google WGS84 (latitude / longitude).

Autres conseils

Pour autant que je me souviens, gestionnaire de boîte est implementy différemment des autres gestionnaires de LO. Nous avons dû mettre en œuvre un propre gestionnaire qui renvoie une géométrie avec des coordonnées LON / lat plutôt avec les coordonnées pixel:

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"
});
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top