将标记捕捉到特定道路

时间:2014-07-01 16:29:21

标签: javascript google-maps-api-3

我正在开展一个项目,我正在跟踪一段建筑的用户反馈,但它跨越很长的距离。

我希望能够实现的是用户点击地图,标记会在A点和B点之间的某个位置捕捉到道路。我特意将标记捕捉到道路上,但从来没有特定道路

我觉得有两种可能的方法,谷歌没有这个功能,我还没有找到它。

或者,我通过从A点和B点生成方向来创建折线,然后以某种方式将标记捕捉到该折线,我不知道该怎么做。

1 个答案:

答案 0 :(得分:0)

我的解决方案是各种来源的一些适应水平。我喜欢上面的链接指向我填充点,但最后,它只是没有达到我希望的准确性。记得数学课从回来的时候,我知道有可能找到这个。最后,此脚本循环遍历路径中的点,然后计算它们与用户单击的位置之间的最近点。

低效率是每次必须遍历整个点集。不幸的是,我只是不知道更好的方法,因为多个点的路径可以向任何方向移动,直到设置结束时无论如何都无法知道你是否&#39 ; ve找到了路径中最近的点。它的美妙之处在于它会在路径中获得绝对最接近的点,而不会捕捉到任何东西。

此处的第一个参数是标记点。这是一对lat / lng对。第二个是路径中的lat / lng点数组。返回的是路径上最靠近您个人点的纬度/经度。如果您愿意,可以对此进行大量修改以报告更多信息,但就我的目的而言,这正是我希望它做的。

function find_closest_point_on_path(marker_pt,path_pts){

    var lowest = 9999999999999999;
    var theLat = 0;
    var theLng = 0;

    $.each(path_pts,function(key, path_pt){
        if(typeof path_pts[key+1] != "undefined"){
            var test = point_to_line_segment_distance(path_pt.lat(),path_pt.lng(), path_pts[key+1].lat(),path_pts[key+1].lng(), marker_pt.lat(),marker_pt.lng());
            if(test[0] < lowest){
                lowest = test[0];
                theLat = test[1];
                theLng = test[2];
            }
        }
    });

    return new google.maps.LatLng(theLat, theLng);
}

function point_to_line_segment_distance(startX,startY, endX,endY, pointX,pointY) {

    // Adapted from Philip Nicoletti's function, found here: http://www.codeguru.com/forum/printthread.php?t=194400

    r_numerator = (pointX - startX) * (endX - startX) + (pointY - startY) * (endY - startY);
    r_denominator = (endX - startX) * (endX - startX) + (endY - startY) * (endY - startY);
    r = r_numerator / r_denominator;

    px = startX + r * (endX - startX);
    py = startY + r * (endY - startY);

    s = ((startY-pointY) * (endX - startX) - (startX - pointX) * (endY - startY) ) / r_denominator;

    distanceLine = Math.abs(s) * Math.sqrt(r_denominator);

    closest_point_on_segment_X = px;
    closest_point_on_segment_Y = py;

    if ( (r >= 0) && (r <= 1) ) {
       distanceSegment = distanceLine;
    }
    else {
       dist1 = (pointX - startX) * (pointX - startX) + (pointY - startY) * (pointY - startY);
       dist2 = (pointX - endX) * (pointX - endX) + (pointY - endY) * (pointY - endY);
       if (dist1 < dist2) {
          closest_point_on_segment_X = startX;
          closest_point_on_segment_Y = startY;
          distanceSegment = Math.sqrt(dist1);
       }
       else {
          closest_point_on_segment_X = endX;
          closest_point_on_segment_Y = endY;
          distanceSegment = Math.sqrt(dist2);
       }
    }

    return [distanceSegment, closest_point_on_segment_X, closest_point_on_segment_Y];
}