屏幕坐标到纬度和经度

Abh*_*bhi 1 gis latitude-longitude openlayers

在开放图层库中,下面是用于将屏幕坐标转换为经纬度的方法。我无法弄清楚此方法封装的逻辑?

getLatLonFromPoint: function (point) {
    var center = this.getCenter();
    //map center lat/lon
    var res  = this.getResolution(); 
    //pre defined by the user. Represents the change in lat long per screen unit at the given zoom level
    var size = this.getSize(); 
    //this is the width and height of the div in which the map has to be displayed
    var delta_x = point.x - (size.w / 2);
    var delta_y = point.y - (size.h / 2);
    return new OpenLayers.LatLon(
        center.lat - delta_y * res,
        center.lon + delta_x * res );
   }

有人可以提供一些指示吗?

cod*_*ike 5

该函数根据地图的当前分辨率,以及当前地图中心点的经纬度,以及所选点与地图中心的距离,计算指定点的经纬度。

var center = this.getCenter();
//地图中心纬度/经度
var res = this.getResolution(); 
//由用户预先定义。代表 lat long 的变化...
var size = this.getSize(); 

上面的代码收集了计算所需的信息:当前地图视图的中心点(它将为我们提供中心点的纬度/经度)、当前地图分辨率以及用户屏幕上的当前地图大小(这可能受屏幕尺寸等影响)。

然后计算是这样的:

    //这是必须显示地图的div的宽度和高度
    var delta_x = point.x - (size.w / 2);
    var delta_y = point.y - (size.h / 2);

首先取 x 坐标(以像素为单位)并减去地图的宽度(以像素为单位)。这给了我们一个新的 x 坐标,其中 0 是地图的中心像素。delta-x 现在应该是一个从 -(size.w/2) 到 +(size.w/2) 的像素值。然后我们对 y 坐标做同样的事情。所以 delta-x 和 delta-y 现在是笛卡尔坐标,原点位于地图的中心。

    返回新的 OpenLayers.LatLon(
        center.lat - delta_y * res,
        center.lon + delta_x * res );

我们需要将 delta-x 和 delta-y 从像素转换为纬度/经度。首先,我们将 delta-x 和 delta-y 乘以当前分辨率。这给了我们正确的比例,但不是正确的原点。添加 center.lat 和 center.lon adusts 以根据当前显示的地图为我们提供纬度/经度。

最后,'new OpenLayers.LatLon' 调用只是将上述计算包装在一个 LatLon 对象中,以便它可以作为 LatLon 对象从函数中返回。

编辑:使用像素时,x 坐标的增加通常意味着“向右移动”,而 y 坐标的增加通常意味着“向上移动”。在地图上,当您增加经度时,您通常会“向右移动”。然而,纬度是颠倒的;当您增加纬度时,您通常会在地图上“向下移动”。

因此,纬度的工作方向与屏幕上正常的 y 坐标方案相反。因此,在最终计算中, center.lat 使用减号,而 center.lon 使用加号。

  • 因为按照惯例,纬度与屏幕 y 坐标的方向相反。请参阅答案末尾的编辑。 (2认同)