Google maps 谷歌地图决定了这条线的距离

Google maps 谷歌地图决定了这条线的距离,google-maps,Google Maps,我试图在Google maps中确定点沿给定多段线(从起点)的距离(假设用户单击多段线,我在事件中获得点坐标) 到目前为止,我唯一想到的是: 迭代多段线中的所有线段,直到找到 d(直线,点)~=0,记录到目前为止所覆盖的距离 在点所在的线段上插值以查找其距离 相对于线段的起点 可悲的是,对于一些本应直截了当的事情来说,这似乎相当复杂 有没有更简单的方法 附言:我正在使用API v3,如果你得到起点和终点的坐标,然后使用哈弗森算法计算距离,你可以很容易地找到两点之间的距离,同时考虑到地球的曲率

我试图在Google maps中确定点沿给定多段线(从起点)的距离(假设用户单击多段线,我在事件中获得点坐标)

到目前为止,我唯一想到的是:

  • 迭代多段线中的所有线段,直到找到 d(直线,点)~=0,记录到目前为止所覆盖的距离
  • 在点所在的线段上插值以查找其距离 相对于线段的起点
可悲的是,对于一些本应直截了当的事情来说,这似乎相当复杂

有没有更简单的方法


附言:我正在使用API v3,如果你得到起点和终点的坐标,然后使用哈弗森算法计算距离,你可以很容易地找到两点之间的距离,同时考虑到地球的曲率

以下是公式(您可能需要将转换为您正在使用的语言):

变量d是你的距离


希望这能有所帮助,所以,经过多次搜索,我决定实现上述算法。结果并不像我想的那么糟。如果有人登陆此页面,完整代码如下:

var DistanceFromStart = function (/*latlng*/ markerPosition) {

    var path = this.polyline.getPath();      
    var minValue = Infinity;
    var minIndex = 0;
    var x = markerPosition.lat();
    var y = markerPosition.lng();

    for (var i = 0; i < path.getLength() - 1; i++) {

        var x1 = path.getAt(i).lat();
        var y1 = path.getAt(i).lng();

        var x2 = path.getAt(i + 1).lat();
        var y2 = path.getAt(i + 1).lng();

        var dist = pDistance(x, y, x1, y1, x2, y2);

        if (dist < minValue) {
            minIndex = i;
            minValue = dist;
        }
    }      

    var gdist = google.maps.geometry.spherical.computeDistanceBetween;
    var dinit = gdist(markerPosition, path.getAt(minIndex));
    var dtotal = gdist(path.getAt(minIndex), path.getAt(minIndex + 1));

    var distanceFromStart = 0;

    for (var i = 0; i <= minIndex - 1; i++) {
        distanceFromStart += gdist(path.getAt(i), path.getAt(i + 1));
    }

    distanceFromStart += dtotal * dinit / dtotal;

    return distanceFromStart;
}

function pDistance(x, y, x1, y1, x2, y2) {

    var A = x - x1;
    var B = y - y1;
    var C = x2 - x1;
    var D = y2 - y1;

    var dot = A * C + B * D;
    var len_sq = C * C + D * D;
    var param = dot / len_sq;

    var xx, yy;

    if (param < 0 || (x1 == x2 && y1 == y2)) {
        xx = x1;
        yy = y1;
    }
    else if (param > 1) {
        xx = x2;
        yy = y2;
    }
    else {
        xx = x1 + param * C;
        yy = y1 + param * D;
    }

    var dx = x - xx;
    var dy = y - yy;
    return Math.sqrt(dx * dx + dy * dy);
}
var DistanceFromStart=函数(/*latlng*/markerPosition){
var path=this.polyline.getPath();
var minValue=无穷大;
var-minIndex=0;
var x=markerPosition.lat();
var y=markerPosition.lng();
对于(var i=0;i

如果您认为有什么需要改进的地方,请务必告诉我。

只有当您的多段线中只有一个线段时,这才有效。如上所述,感谢您的回答,但这通常不适用于多段线,因为有许多线段。
var DistanceFromStart = function (/*latlng*/ markerPosition) {

    var path = this.polyline.getPath();      
    var minValue = Infinity;
    var minIndex = 0;
    var x = markerPosition.lat();
    var y = markerPosition.lng();

    for (var i = 0; i < path.getLength() - 1; i++) {

        var x1 = path.getAt(i).lat();
        var y1 = path.getAt(i).lng();

        var x2 = path.getAt(i + 1).lat();
        var y2 = path.getAt(i + 1).lng();

        var dist = pDistance(x, y, x1, y1, x2, y2);

        if (dist < minValue) {
            minIndex = i;
            minValue = dist;
        }
    }      

    var gdist = google.maps.geometry.spherical.computeDistanceBetween;
    var dinit = gdist(markerPosition, path.getAt(minIndex));
    var dtotal = gdist(path.getAt(minIndex), path.getAt(minIndex + 1));

    var distanceFromStart = 0;

    for (var i = 0; i <= minIndex - 1; i++) {
        distanceFromStart += gdist(path.getAt(i), path.getAt(i + 1));
    }

    distanceFromStart += dtotal * dinit / dtotal;

    return distanceFromStart;
}

function pDistance(x, y, x1, y1, x2, y2) {

    var A = x - x1;
    var B = y - y1;
    var C = x2 - x1;
    var D = y2 - y1;

    var dot = A * C + B * D;
    var len_sq = C * C + D * D;
    var param = dot / len_sq;

    var xx, yy;

    if (param < 0 || (x1 == x2 && y1 == y2)) {
        xx = x1;
        yy = y1;
    }
    else if (param > 1) {
        xx = x2;
        yy = y2;
    }
    else {
        xx = x1 + param * C;
        yy = y1 + param * D;
    }

    var dx = x - xx;
    var dy = y - yy;
    return Math.sqrt(dx * dx + dy * dy);
}