заданных точек на плоскую поверхность, вот полезная функция я писал:
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 = долгота, поскольку в близком приближении локально патч поверхности Земли плоский.
Если у вас есть полилинии в LatLng и известное положение в LatLng - просто вычислите ближайшую точку для всех из них - и выберите ту, которая находится на самом маленьком расстоянии. – harism
Проблема заключается в том, что у меня есть только минимальное количество вершин полилинии (которое я использую для создания строки), и мне также могут понадобиться промежуточные точки. – pdcc
Если я правильно понял, вычисление расстояния от точки до линии должно дать вам такую промежуточную точку, в которой вы нуждаетесь. Может быть, есть недоразумение от моего имени. – harism