Comment convertir les coordonnées de la couche vectorielle En Latitude et Longitude dans les couches Ouvertes

je suis assez confus. J'ai un point:

x= -12669114.702301
y= 5561132.6760608

que j'ai obtenu en dessinant un carré sur une couche vectorielle avec le contrôleur DrawFeature.

Les chiffres semblent...la gestion des risques...très gros, mais ils semblent fonctionner, parce que si je dessine plus tard un carré avec tous les mêmes points, c'est dans la même position, donc je me dis qu'ils doivent avoir raison.

le problème est quand j'essaie de convertir ce point en latitude et longitude.

je suis en utilisant:

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

où points[0] est un point de géométrie, et la fonction pointttopixel prend n'importe quel point et le transforme en pixel (puisque le getLonLatFromPixel a besoin d'un pixel). Il le fait en prenant simplement le x du point, et en le faisant les pixels x, et ainsi de suite.

la latitude et la longitude que j'obtiens est de l'ordre de:

lat: -54402718463.864
lng: -18771380.353223

C'est très clairement erroné. Je suis à gauche vraiment confus. J'essaie de projeter cet objet, en utilisant:

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

Mais je n'ai pas j'ai vraiment compris et je suis presque sûr que je ne l'ai pas fait correctement, de toute façon.

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

je suis en quelque sorte à une perte. Les coordonnées semblent cohérents, parce que je peux les réutiliser pour obtenir le même résultat...mais ils semblent bien plus grands que tous les exemples que je vois sur le site openLayers...

21
demandé sur winwaed 2010-04-08 20:37:41

2 réponses

selon votre code, la projection que vous utilisez est EPSG:900913, qui est celle que Google utilise. Les unités pour cette projection sont des mètres, et les valeurs que vous obtenez pour le point sont parfaitement correctes:

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

ces valeurs ne sont pas des pixels mais des coordonnées dans la projection EPSG:900913, et sont correctes (tant qu'elles sont supposées être en Idaho, sinon il y a quelque chose de mal, d'ailleurs)

Pour le vérifier, vous pouvez aller à http://proj4js.org/ et transformez vos coordonnées EPSG: 900913 en WGS84 (lat/lon), ce qui vous donnera:

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

ce sont les valeurs que vous attendez probablement. Si vous voulez les obtenir à partir des points de coordonnées utilisez quelque chose comme:

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

ceci transformera les coordonnées de la projection Google en WGS84 (Latitude / Longitude).

34
répondu amercader 2010-04-09 11:58:03

autant que je m'en souvienne, box handler est implémenty différent des autres handlers en OL. Nous avons dû implémenter un propre gestionnaire qui renvoie une géométrie avec des coordonnées lon/lat plutôt qu'avec des 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"
});
2
répondu lexicore 2010-04-08 18:24:50