在折线中找到最近的点

时间:2014-10-23 17:03:03

标签: android google-maps polyline

我有一个使用谷歌地图API的Android应用程序。 绘制折线后,我想从已知位置找到折线中最近的点(LatLng)。有人知道如何用谷歌地图api做到这一点?我找不到任何东西。

由于

1 个答案:

答案 0 :(得分:0)

在平面上给出点,这是我写的一个有用的函数:

var Places = {
    /**
     * Use this method to calculate the closest point on a polyline
     * @method closest
     * @static
     * @param {Object} point
     * @param {Number} point.x
     * @param {Number} point.y 
     * @param {Array} polyline an array of objects that contain "x" and "y" properties
     * @return {Object} contains properties "index", "x", "y", "distance", "fraction"
     */
    closest: function(point, polyline) {
        var x = point.x;
        var y = point.y;
        var closest = null;
        var distance = null;
        for (var i=1, l=polyline.length; i<l; i++) {
            var a = polyline[i-1].x;
            var b = polyline[i-1].y;
            var c = polyline[i].x;
            var d = polyline[i].y;
            var n = (c-a)*(c-a) + (d-b)*(d-b);
            var frac = n ? ((x-a)*(c-a) + (y-b)+(d-b)) / n : 0;
            var e = a + (c-a)*frac;
            var f = b + (d-b)*frac;
            var dist = Math.sqrt((x-e)*(x-e) + (y-f)(y-f));
            if (distance === null || distance > dist) {
                distance = dist;
                closest = {
                    index: i,
                    x: e,
                    y: f,
                    distance: dist,
                    fraction: frac
                };
            }
        }
        return closest;
    }
}

如果您想更精确,在使用此功能之前,您应该使用地图的Projection对象方法将latlng转换为地图上的点并返回。请参阅this question的答案。

但是,如果你的折线在一个很小的区域内,比如开车少于5个小时,那么上面的函数应该足够好,可以直接使用x =纬度,y =经度,因为近似,本地a地球表面的斑块是平坦的。