2014-10-23 4 views
0

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

Благодаря

+1

Если у вас есть полилинии в LatLng и известное положение в LatLng - просто вычислите ближайшую точку для всех из них - и выберите ту, которая находится на самом маленьком расстоянии. – harism

+0

Проблема заключается в том, что у меня есть только минимальное количество вершин полилинии (которое я использую для создания строки), и мне также могут понадобиться промежуточные точки. – pdcc

+1

Если я правильно понял, вычисление расстояния от точки до линии должно дать вам такую ​​промежуточную точку, в которой вы нуждаетесь. Может быть, есть недоразумение от моего имени. – harism

ответ

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 = долгота, поскольку в близком приближении локально патч поверхности Земли плоский.

Смежные вопросы