найти ближайшую точку в полилинии

У меня есть приложение для Android, использующее API карт Google. После рисования полилинии я хочу найти из известной позиции ближайшую точку (LatLng) в полилинии. Кто-нибудь знает, как это сделать с помощью Google Maps API? Я ничего не могу найти.

Спасибо


person pdcc    schedule 23.10.2014    source источник
comment
Если у вас есть расположение полилиний в LatLng и известная позиция в LatLng — просто рассчитайте ближайшую точку ко всем из них — и выберите точку с наименьшим расстоянием.   -  person harism    schedule 23.10.2014
comment
Проблема в том, что у меня есть только минимальное количество вершин полилинии (которое я использую для создания линии), и мне также могут понадобиться промежуточные точки.   -  person pdcc    schedule 23.10.2014
comment
Если я правильно понял, вычисление расстояния от точки до линии должно дать вам такую ​​промежуточную точку, которая вам нужна. Хотя, возможно, у меня какое-то недоразумение.   -  person harism    schedule 23.10.2014
comment
Но как я могу рассчитать расстояние? Я могу получить доступ только к вершине строки или ко всем?   -  person pdcc    schedule 23.10.2014


Ответы (1)


Учитывая точки на плоской поверхности, вот полезная функция, которую я написал:

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 карты для преобразования широты в точки на карте и обратно, прежде чем использовать эту функцию. См. ответ на этот вопрос .

Однако, если ваша полилиния находится в пределах небольшой области, например, вы едете менее 5 часов, то вышеприведенная функция должна быть достаточно хороша для использования непосредственно с x = широта, y = долгота, поскольку в близком приближении локально участок Поверхность Земли плоская.

person Gregory Magarshak    schedule 02.06.2017