Google Maps Directions API - 标记距离起点x km的点

时间:2012-06-11 08:08:11

标签: google-maps-api-3 google-maps-markers

我正在尝试构建一个Web应用程序,以显示用户在参与虚拟漫游的地图中的位置。这些徒步旅行是高速公路上的长距离徒步旅行,通常> 500公里。我所知道的信息是徒步路线(起点,终点和路点)以及他相对于起点所涵盖的距离。

如果在GMaps V3中,我可以在Google地图的绘制方向上绘制距起点x km的标记。

1 个答案:

答案 0 :(得分:0)

弄清楚这一点。该技术涉及获得单个lat长步骤并逐步计算距离。各个步骤足够接近,可以在两个连续点之间进行直线近似。 对最后一个过冲点进行反向遍历。

错误率为0.1%,与距离无关。即地图上距离2000公里的距离将减少2公里。

//Returns the Google LatLng object corresponding to distanceInKM for the given route.
//Params : directionResult : The google.maps.DirectionsResult obtained from DirectionService.route(request:DirectionsRequest, callback:function(DirectionsResult, DirectionsStatus))
//distanceInKM : The distance offset with respect to the starting point.
function getLatLngOnRoute(directionResult, distanceInKM) {
    var lastPos=directionResult.routes[0].legs[0].steps[0].path[0]; var currPos;
    var distance=0.0;
    distanceInKM*=1000;
    //Will not consider alternate routes. 
    for (var j=0; j<directionResult.routes[0].legs.length; j++) {
        //There may be multiple legs, each corresponding to one way point. If there are no way points specified, there will be a single leg
        for (var k=0; k<directionResult.routes[0].legs[j].steps.length; k++) {
            //There will be multiple sub legs or steps
            for (var l=0; l<directionResult.routes[0].legs[j].steps[k].path.length; l++) {
                currPos=directionResult.routes[0].legs[j].steps[k].path[l];
                //Calculate the distance between two lat lng sets. 
                distance+=google.maps.geometry.spherical.computeDistanceBetween(lastPos, currPos);
                if (distance>distanceInKM) {
                    //If the exact point comes between two points, use distance to lat-lng conversion
                    var heading=google.maps.geometry.spherical.computeHeading(currPos, lastPos);
                    var l= google.maps.geometry.spherical.computeOffset(currPos, distance-distanceInKM, heading);
                    return l;
                }
                lastPos=currPos;
            }
        }
    }
}

This话题让我朝着正确的方向前进。