如何在Openlayers中将矢量图层坐标转换为地图的纬度和经度

21

我很困惑。我的观点是:

x= -12669114.702301
y= 5561132.6760608

这些数字是我使用DrawFeature控制器在矢量图层上绘制正方形获得的。

这些数字看起来非常大,但它们似乎可以工作。如果我稍后使用完全相同的点绘制一个正方形,则该正方形位于相同位置,因此我认为它们必须是正确的。

问题在于当我试图将此点转换为纬度和经度时。

我正在使用:

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

points[0]是一个几何点,pointToPixel函数可以将任何点转换为像素(因为getLonLatFromPixel需要像素)。它通过简单地将点的x坐标作为像素的x坐标等等来实现。

我得到的纬度和经度的顺序为:

lat: -54402718463.864
lng: -18771380.353223

这很明显是错误的。我感到非常困惑。我尝试使用以下方法来投影这个对象:

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

但是我真的不明白,而且相当确定我做错了。

我的代码在这里:http://pastie.org/909644

我有点无助了。坐标似乎是一致的,因为我可以重复使用它们来得到相同的结果... 但它们似乎比我在openLayers网站上看到的任何示例都要大得多...

2个回答

34

根据您的代码,您使用的投影方式是EPSG:900913,这是Google使用的投影方式。该投影方式的单位为米,您得到的点的值完全正确:

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

这些值不是像素,而是EPSG:900913投影中的坐标,并且是正确的(只要它们应该在爱达荷州,如果不是,则其他地方可能有问题)。

为了检查它,您可以访问http://proj4js.org/并将您的坐标从EPSG:900913转换为WGS84(纬度/经度),这将给你:

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

这些是您可能期望的值。如果您想从点坐标中获取它们,请使用类似以下的代码:

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

这将把坐标从Google投影转换为WGS84(纬度/经度)。


谢谢,我真的很难理解各种投影方式... - J.R.
实际上我有一个问题...我会正式地再问一遍,但是:如果我做相反的事情(point.transform(new OpenLayers.Projection("EPSG:4326"), new OpenLayers.Projection("EPSG:900913")); 对于普通的纬度/经度点,当我的经度值为负数时,我会得到NaN(不是数字)...这个结果是预期的吗? - J.R.
1
这段代码导致了一些错误,弹出窗口没有在标记上打开。相反,这个代码运行得非常完美:OpenLayers.Layer.SphericalMercator.inverseMercator(lonlat.lon, lonlat.lat); - pbibergal

2
据我所记,Box Handler在OL中与其他处理程序的实现方式不同。我们必须实现一个自己的处理程序,该处理程序返回具有经度/纬度坐标而不是像素坐标的几何体:
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"
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接