Cómo convertir las coordenadas de la capa vectorial en latitud y longitud del mapa en layas abiertas

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

Pregunta

Estoy bastante confundido. Tengo un punto:

x= -12669114.702301
y= 5561132.6760608

Que obtuve de dibujar un cuadrado en una capa vectorial con el controlador de tareas de dibujo.

Los números parecen ... Erm ... Atrás grandes, pero parecen funcionar, porque si luego dibujo un cuadrado con los mismos puntos, está en la misma posición, así que creo que tienen que tener razón.

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

Estoy usando:

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

Donde los puntos [0] es un punto de geometría, y la función PointTopixel toma cualquier punto y lo convierte en un píxel (ya que GetLonlatFrompixel necesita un píxel). Lo hace simplemente tomando la X del punto y convirtiéndolo en los píxeles X, y así sucesivamente.

La latitud y la longitud que obtengo es del orden de:

lat: -54402718463.864
lng: -18771380.353223

Esto está muy claramente mal. Me queda muy confundido. Intento proyectar este objeto, usando:

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

Pero realmente no lo entiendo y estoy bastante seguro de que lo hice incorrectamente, de todos modos.

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

Estoy un poco perdido. 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 ...

¿Fue útil?

Solución

Según su código, la proyección que está utilizando es EPSG: 900913, que es la que usa Google. Las unidades para esta proyección son medidores, y los valores que obtienes para el punto son perfectamente correctos:

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

Estos valores no son píxeles, sino que se coordinan en la proyección EPSG: 900913, y son correctas (siempre que se suponga que están en Idaho, si no, hay algo mal en otro lugar)

Para comprobarlo, puedes ir a http://proj4js.org/ y transforme sus coordenadas de EPSG: 900913 a WGS84 (LAT/LON), que le dará:

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

Estos son los valores que probablemente esté esperando. Si desea obtenerlos de las coordenadas de puntos, use algo como:

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

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

Otros consejos

Hasta donde recuerdo, el controlador de cajas se implementa de manera diferente a otros manejadores en OL. Tuvimos que implementar un manejador propio que devuelva una geometría con coordenadas LON/LAT 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"
});
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top