2010-04-08 6 views
21

Je suis assez confus. J'ai un point:Comment convertir les coordonnées du calque vectoriel en Map Latitude et Longitude dans Openlayers

x= -12669114.702301 
y= 5561132.6760608 

Cela m'a permis de dessiner un carré sur un calque vectoriel avec le contrôleur DrawFeature. Les nombres semblent ... erm ... awfull large, 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 lorsque j'essaie de convertir ce point en latitude et longitude.

J'utilise:

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

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

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

lat: -54402718463.864 
lng: -18771380.353223 

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

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

Mais je ne suis 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 elles semblent beaucoup plus grandes que tous les exemples que je vois sur le site web d'openLayers ...

Répondre

34

Selon votre code, la projection que vous utilisez est EPSG: 900913, qui est celui que Google les usages. 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 pixels mais coordonnées dans la projection EPSG: 900913, et sont corrects (aussi longtemps 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 attendez 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).

+0

Merci, j'avais vraiment du mal à envelopper ma tête autour des différentes projections ... – Jenny

+0

En fait, j'ai une question ... Je vais demander à nouveau formellement, mais: Si je fais le contraire (point.transform (new OpenLayers.Projection ("EPSG: 4326"), new OpenLayers.Projection ("EPSG: 900913")); A un point de latitude/longitude normal, j'obtiens NaN (pas un nombre?) pour toutes les valeurs de lon négatif. – Jenny

+0

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

2

Pour autant que je m'en souvienne, boîte Le gestionnaire est implémenté différemment des autres gestionnaires dans OL. Nous avons dû mettre en œuvre un propre gestionnaire qui renvoie une géométrie avec des coordonnées LON/lat plutôt que, 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" 
}); 
Questions connexes