2010-04-08 33 views
21

Estoy bastante confundido. Tengo un punto:Cómo convertir las coordenadas de la capa vectorial en latitud y longitud del mapa en Openlayers

x= -12669114.702301 
y= 5561132.6760608 

Que obtuve al dibujar un cuadrado en una capa vectorial con el controlador DrawFeature.

Los números parecen ... erm ... awfull large, pero parecen funcionar, porque si dibujo más adelante un cuadrado con los mismos puntos, está en la misma posición, así que creo que tienen que ser correctos .

El problema es cuando trato de convertir este punto en latitud y longitud.

que estoy usando:

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

Dónde puntos [0] es un punto de la geometría y la función pointToPixel lleva a cualquier punto y lo convierte en un píxel (ya que el getLonLatFromPixel necesita un píxel). Lo hace simplemente tomando la x del punto y convirtiéndola en los píxeles x, y así sucesivamente.

La latitud y longitud que consigo es del orden de:

lat: -54402718463.864 
lng: -18771380.353223 

Esto es muy claramente erróneo. Me siento realmente confundido. Trato de proyectar este objeto, usando:

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

Pero realmente no conseguirlo y estoy bastante seguro de que lo hice de forma incorrecta, de todos modos.

Mi código está aquí: http://pastie.org/909644

Soy una especie de pérdida. Las coordenadas parecen consistentes, porque puedo reutilizarlas para obtener el mismo resultado ... pero parecen mucho más grandes que cualquiera de los ejemplos que estoy viendo en el sitio web de openLayers ...

Respuesta

34

De acuerdo con su código, la proyección que está utilizando es EPSG: 900913, que es la que Google usos. Las unidades de esta proyección son metros, y los valores que se obtenga para el punto tienen toda la razón:

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

Estos valores no son píxeles, pero coordenadas en la EPSG: 900913 proyección, y son correctos (siempre y cuando se supone que son en Idaho, si no hay algo malo en otros lugares)

para comprobarlo, se puede ir a http://proj4js.org/ y transformar las coordenadas de EPSG: 900913 WGS84 (latitud/longitud), que le dará:

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

Estos son los valores que probablemente esperas. Si desea obtener de las coordenadas del punto usar algo como:

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

Esto va a transformar las coordenadas de la proyección Google a WGS84 (latitud/longitud).

+0

Gracias, realmente me estaba costando pasar las diferentes proyecciones ... – Jenny

+0

En realidad tengo una pregunta ... Preguntaré de nuevo formalmente, pero: Si hago lo contrario (point.transform (nueva OpenLayers.Projection ("EPSG: 4326"), nueva OpenLayers.Projection ("EPSG: 900913")); A un punto lat/lon normal, obtengo NaN (¿no es un número?) para cualquier valor de lon negativo. .Esto es esperado? – Jenny

+0

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

2

Por lo que recuerdo, recuadro controlador se implementa de manera diferente a otros controladores en OL. Hemos tenido que implementar un controlador propio que devuelve una geometría con lon coordenadas latitud/longitud en lugar que con coordenadas de píxeles:

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" 
}); 
Cuestiones relacionadas