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

时间:2010-04-08 16:37:41

标签: openlayers latitude-longitude proj4js

我很困惑。我有一点意见:

x= -12669114.702301
y= 5561132.6760608

我通过DrawFeature控制器在矢量图层上绘制了一个正方形。

在数字似乎......呃...... awfull大,但他们似乎工作,因为如果我后来画与所有同分一个正方形,它是在同一位置,所以我想他们是对的。

问题是当我尝试将此点转换为纬度和经度时。

我正在使用:

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

其中点[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 个答案:

答案 0 :(得分:34)

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

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

这个值不是像素,而是EPSG:900913投影中的坐标,并且是正确的(只要它们应该在Idaho,如果没有其他地方有问题)

要检查它,您可以转到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(纬度/经度)。

答案 1 :(得分:2)

据我所知,box处理程序的实现方式与OL中的其他处理程序不同。我们必须实现一个自己的处理程序,它返回一个带有lon / lat坐标的几何体,而不是像素坐标:

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