百度地图Android SDk中的方法,用js重写,原理不懂,实际使用时感觉有明显误差,但误差可以接受。
/**
*
* @param linesPoint 折线点列表 Point(lng,lat)
* @param point 计算最短距离点
* @param map 百度地图实例,用于计算两点间距离
* @returns {{distance: number, point: (*)}} 最短距离,点
*/
function getNearestPointFromLine(linesPoint, point, map) {
var lineBeginPoint = linesPoint[0];
var linePointSize = linesPoint.length;
var closestPoint;
var closestDistance = Infinity;
for (var i = 1; i <= linePointSize - 1; i++) {
var lineEndPoint = linesPoint[i];
var closestPointByLine = getClosestPoint(point, lineBeginPoint, lineEndPoint);
var distance = parseInt(map.getDistance(point, closestPointByLine));
if (distance < closestDistance) {
closestDistance = distance;
closestPoint = closestPointByLine;
}
lineBeginPoint = lineEndPoint;
}
return {point: closestPoint, distance: closestDistance};
}
function getClosestPoint(target, lineBegin, lineEnd) {
var p1 = (lineEnd.lng - lineBegin.lng) * (target.lng - lineBegin.lng) +
(lineEnd.lat - lineBegin.lat) * (target.lat - lineBegin.lat);
if (p1 <= 0.0) {
return lineBegin;
} else {
var p2 = (lineEnd.lng - lineBegin.lng) * (lineEnd.lng - lineBegin.lng) +
(lineEnd.lat - lineBegin.lat) * (lineEnd.lat - lineBegin.lat);
if (p1 >= p2) {
return lineEnd;
} else {
var p3 = p1 / p2;
var p4 = lineBegin.lng + (lineEnd.lng - lineBegin.lng) * p3;
var p5 = lineBegin.lat + (lineEnd.lat - lineBegin.lat) * p3;
return new BMap.Point(p4, p5);
}
}
}