Como converter as coordenadas da camada vetorial em latitude e longitude do mapa em OpenLayers

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

Pergunta

Estou muito confuso. Eu tenho um ponto:

x= -12669114.702301
y= 5561132.6760608

Que obtive de desenhar um quadrado em uma camada vetorial com o controlador de tração.

Os números parecem ... erm ... terríveis grandes, mas eles parecem funcionar, porque se eu mais tarde desenhar um quadrado com os mesmos pontos, está na mesma posição, então acho que eles precisam estar certos.

O problema é quando tento converter esse ponto em latitude e longitude.

Estou a usar:

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

Onde os pontos [0] é um ponto de geometria, e a função PointTopixel pega qualquer ponto e a transforma em um pixel (já que o getlonlatfropixel precisa de um pixel). Faz isso simplesmente pegando o X do ponto, e tornando -o os pixels X, e assim por diante.

A latitude e a longitude que recebo estão na ordem de:

lat: -54402718463.864
lng: -18771380.353223

Isso está claramente errado. Fiquei realmente confuso. Eu tento projetar este objeto, usando:

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

Mas eu realmente não entendo e tenho certeza de que fiz isso incorretamente, de qualquer maneira.

Meu código está aqui: http://pastie.org/909644

Estou meio que perdido. As coordenadas parecem consistentes, porque posso reutilizá -las para obter o mesmo resultado ... mas parecem muito maiores do que qualquer um dos exemplos que estou vendo no site do OpenLayers ...

Foi útil?

Solução

De acordo com o seu código, a projeção que você está usando é o EPSG: 900913, que é o que o Google usa. As unidades para essa projeção são medidores, e os valores que você obtém para o ponto estão perfeitamente corretos:

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

Esses valores não são pixels, mas coordenados na projeção EPSG: 900913 e estão corretos (desde que devessem estar em Idaho, se não há algo errado em outro lugar)

Para verificar, você pode ir para http://proj4js.org/ E transforme suas coordenadas do EPSG: 900913 em WGS84 (LAT/LON), que lhe dará:

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

Estes são os valores que você provavelmente está esperando. Se você deseja obtê -los das coordenadas de ponto, use algo como:

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

Isso transformará as coordenadas da projeção do Google para o WGS84 (latitude / longitude).

Outras dicas

Até onde me lembro, o manipulador de caixa é implementado de maneira diferente de outros manipuladores no OL. Tivemos que implementar um próprio manipulador que retorna uma geometria com coordenadas LON/LAT, e não com as coordenadas do 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"
});
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top