Javascript 将标记捕捉到特定道路

Javascript 将标记捕捉到特定道路,javascript,google-maps-api-3,Javascript,Google Maps Api 3,我正在做一个项目,在这个项目中,我跟踪用户对某一部分建筑的反馈,但它跨越了相当长的一段距离 我希望能够做到的是,用户单击地图,标记捕捉到道路,在点a和点B之间的某个位置。我已经将标记捕捉到特定的道路,但从未捕捉到特定的道路 我觉得有两种可能的方法,要么谷歌没有这个功能,要么我还没有找到 或者,我通过从点a和点B生成方向来创建一条多段线,然后以某种方式将标记捕捉到该多段线,我现在还不知道该怎么做。我的解决方案是从各种来源进行一些级别的自适应。我喜欢上面的链接,它指向我去填充分数,但是最后,它没有达

我正在做一个项目,在这个项目中,我跟踪用户对某一部分建筑的反馈,但它跨越了相当长的一段距离

我希望能够做到的是,用户单击地图,标记捕捉到道路,在点a和点B之间的某个位置。我已经将标记捕捉到特定的道路,但从未捕捉到特定的道路

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


或者,我通过从点a和点B生成方向来创建一条多段线,然后以某种方式将标记捕捉到该多段线,我现在还不知道该怎么做。

我的解决方案是从各种来源进行一些级别的自适应。我喜欢上面的链接,它指向我去填充分数,但是最后,它没有达到我所希望的准确度。回想很久以前的数学课,我知道这是可能的。最后,该脚本循环遍历路径中的点,然后计算它们之间距离用户单击位置最近的点

效率低下的是,每次都必须循环通过一整套点。不幸的是,我只是不知道更好的方法,因为多个点的路径可以向任何方向移动,所以在集合结束之前,无法知道您是否已在路径中找到最近的点。这样做的美妙之处在于,它将获得路径中绝对最近的点,而不会捕捉到任何东西

其中的第一个参数是标记点。这是一对lat/lng。第二个是路径中的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];
}
函数查找路径上最近的点(标记点、路径点){
var最低值=9999999999;
var-theLat=0;
var-theLng=0;
$。每个(路径点,函数(键,路径点){
如果(路径类型[键+1]!=“未定义”){
var测试=点到线段的距离(路径纬度(),路径纬度(),路径纬度(),路径纬度[key+1]。纬度(),路径纬度[key+1]。lng(),标记纬度(),标记纬度();
如果(测试[0]<最低){
最低=测试[0];
theLat=试验[1];
theLng=试验[2];
}
}
});
返回新的google.maps.LatLng(theLat,theLng);
}
功能点到线段的距离(起点x、起点、终点x、终点y、点x、点y){
//根据Philip Nicoletti的功能改编,如下所示:http://www.codeguru.com/forum/printthread.php?t=194400
r_分子=(pointX-startX)*(endX-startX)+(pointY-startY)*(endY-startY);
r_分母=(endX-startX)*(endX-startX)+(endY-startY)*(endY-startY);
r=r_分子/r_分母;
px=startX+r*(endX-startX);
py=星型+r*(endY-星型);
s=((星尖)*(endX-startX)-(星尖x)*(endY-startY))/r_分母;
距离线=数学绝对值)*数学sqrt(r_分母);
_段上最近的_点__X=px;
_段上最近的_点__Y=py;

如果((r>=0)和(r此问题/答案可能有用:我对该解决方案进行了一些修改,以满足我的需要,但实际上没有做到。该解决方案测量路径中每个点的距离,然后获取最近的点。我想要更无缝的解决方案,可以获取路径中两点之间的路径中最近的点。抱歉,它不满足您的需要。这解决方案假设一条多段线的点之间的距离最小(“填充路径”)。我想我在某个地方有代码可以满足您的需要,这需要一些时间来挖掘它。它来自一个库的移植版本(“点到多段线或多边形的距离”库)如果我没记错的话。经过大量的挖掘,我确实找到了一个解决方案。我仍在权衡它的效率。到目前为止,它似乎与上面的解决方案相当。它在路径的每一段之间分解,然后得到距离该路径最近点的距离。我认为没有其他方法可以做到这一点。这是等价的t指向链接示例中的“填充”路径,该路径刚刚在感兴趣的段上实现。