获取OpenLayers中2个LonLat对象之间的距离(以像素为单位)

时间:2011-07-05 06:46:50

标签: javascript openlayers

我有2个OpenLayers.LonLat对象,我想确定2之间当前缩放的像素距离。我正在使用OpenLayers.Layer.getViewPortPxFromLonLat()来确定点的x和y然后减去看2之间的差异,但对于相距2000公里的点,我得到的值非常小。

这是我的代码:

        var center_lonlat = new OpenLayers.LonLat(geometry.lon, geometry.lat);
        var center_px = layer.getViewPortPxFromLonLat(center_lonlat);

        var radius_m = parseFloat(feature.attributes["radius"]);
        var radius_lonlat = OpenLayers.Util.destinationVincenty(center_lonlat, 0, radius_m);
        var radius_px = layer.getViewPortPxFromLonLat(radius_lonlat);

        var radius = radius_px.y - center_px.y;

我正在尝试绘制一个圆圈,假设我得到一个中心点和一个以米为单位的半径。 LonLat对象似乎没问题。

我做错了吗?

2 个答案:

答案 0 :(得分:2)

我发现了问题:destinationVincenty()需要并返回wgs84中我的地图使用球形墨卡托投影的坐标。

我希望我得到正确的答案,因为投影让我头晕并且从未真正理解它们:(。我在控制台中查找我的坐标数字和map.getExtent()的坐标。计算getViewPortPxFromLonLat()并且我意识到它们不是正确的数量级,然后它击中了我。

所以,代码现在是:

        var spherical_mercator = new OpenLayers.Projection("EPSG:900913");
        var wgs84 = new OpenLayers.Projection("EPSG:4326");

        var map = feature.layer.map;
        var geometry = feature.geometry;
        var center_lonlat = new OpenLayers.LonLat(geometry.y, geometry.x);
        var center_px = map.getViewPortPxFromLonLat(center_lonlat);

        var radius_m = parseFloat(feature.attributes["radius"]);
        var radius_lonlat = OpenLayers.Util.destinationVincenty(center_lonlat.clone().transform(spherical_mercator, wgs84), 0, radius_m).transform(wgs84, spherical_mercator);
        var radius_px = map.getViewPortPxFromLonLat(radius_lonlat);

        var radius = Math.abs(radius_px.y - center_px.y);

使用OpenLayers.Control.ScaleLine测量圆圈,并且大小已经消失:D

答案 1 :(得分:0)

你似乎做得对。如果你得到的距离太小,可能是OpenLayers.Util.destinationVincenty功能有问题?您是否尝试用其他任何东西替换轴承(0) - 在您的情况下,它的值似乎并不重要。但坦率地说,我在浏览the source

时无法理解它的工作原理