按距离从方向服务中检索目的地坐标

时间:2011-10-13 20:28:56

标签: google-maps coordinates distance directions

我需要使用google maps api directions服务检索目的地的坐标。我已经有了起点坐标,但是我没有指定坐标中的终点,而是希望通过指定距离(以km为单位)来检索坐标。

所以我想我的问题如下:是否可以通过指定服务方向的距离(以km为单位)来检索目的地latlong坐标(基于/计算道路的距离而不是方向/直线)也许还有其他办法吗?

我有一个图片插图,但不幸的是我无法附加到这个问题,因为我没有足够的声誉。如果我的问题不清楚,或者您希望看到插图,那么请联系我,我会把它发送出去。

2 个答案:

答案 0 :(得分:1)

我认为你不能这样做,因为request parameters说需要原点和目的地参数。

答案 1 :(得分:-2)

我相信你是对的。 api中似乎没有任何当前的方法可以让您执行以下操作。

相反,我循环通过Directions service调用返回的坐标,并使用函数计算坐标之间的距离。然而,即使这样也不够准确,因为返回的坐标似乎也是聚合的,并且在计算每个坐标之间的距离时不会返回准确的值/距离,因为它们是聚合的,因此沿着道路不需要每个坐标。

为了解决上述问题,我最终添加了一个点击事件,并自己绘制了道路上的坐标,然后将它们存储在我使用xmlhttprequest缓存和调用的本地json文件中。

幸运的是,对于我的情况,我只需要计算A点和A点之间的距离。 B在一条单独的道路上,因此当您使用多个或通用道路/位置时,我的替代方案将不起作用。您可以使用所描述的第一种方法,因为您很乐意使用汇总数据和不准确的计算。

以下是用于计算坐标之间距离的函数,然后是用于求出点和点的最终计算。最后两点之间的坐标。请注意,此代码依赖于并使用jQuery方法。

<强> 1。计算两个坐标之间的距离(以米为单位)

function pointDistance( begin, end )
{
    var begin   = { lat: begin[0], long: begin[1] },
        end     = { lat: end[0], long: end[1] };

    // General calculations
    var earthRadius     = 6371, //km
        distanceLat     = (end.lat - begin.lat).toRad(),
        distanceLong    = (end.long - begin.long).toRad();

    // Convert lats to radiants
    begin.lat   = begin.lat.toRad();
    end.lat     = end.lat.toRad();

    // Calculation
    var a = Math.sin(distanceLat / 2) * Math.sin(distanceLat / 2) +
            Math.sin(distanceLong / 2) * Math.sin(distanceLong / 2) * Math.cos(begin.lat) * Math.cos(end.lat);

    var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); 
    var distance = (earthRadius * c) - 0.000536;

    return (distance * 1000);
}

<强> 2。获取最终A-B坐标的坐标(基于剩余百分比)。 'matrix'变量是json坐标数组。

function getCoordinates( totalDistance )
{
    var lastPoint   = { lat: null, long: null },
        total       = parseFloat(0),
        position    = { start: null, end: null, distance: 0 };

    $(matrix).each(function()
    {
        if ( lastPoint.lat == null )
        {
            lastPoint = { lat: this[0], long: this[1] };
            return;
        }

        var distance = pointDistance([lastPoint.lat, lastPoint.long], [this[0], this[1]]);
        total = total + distance;

        if ( (total / 1000) >= totalDistance )
        {
            position.start      = new google.maps.LatLng(lastPoint.lat, lastPoint.long);
            position.end        = new google.maps.LatLng(this[0], this[1]);
            position.distance   = total;

            return false;
        }

        lastPoint = { lat: this[0], long: this[1] };
    });

    return position;
}

第3。将数字度转换为弧度

if ( typeof(Number.prototype.toRad) === 'undefined' ) {
    Number.prototype.toRad = function() {
        return this * Math.PI / 180;
    }
}

希望以下内容可以帮助任何具有相同或类似问题的人。我没有对此进行调查,因为我没有必要,但是,如果您正在处理谷歌的付费服务,他们不会聚合通话返回的数据?