【问题标题】:Snap a marker to a specific road将标记捕捉到特定道路
【发布时间】:2014-07-01 16:29:21
【问题描述】:

我正在开展一个项目,我正在跟踪用户对某段施工的反馈,但它跨越了相当长的距离。

我希望能够发生的是用户单击地图,标记会捕捉到道路,位于 A 点和 B 点之间的某个位置。我已经将标记专门捕捉到道路,但从来没有特定的道路.

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

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

【问题讨论】:

  • 这个问题/答案可能有用:Confine dragging of Google Maps V3 Marker to Polyline
  • 我稍微修改了该解决方案以满足我的需求,但它并没有真正做到这一点。它测量到路径中每个点的距离,然后抓取最近的点。我想要更无缝的东西,它可以抓取路径中两点之间的路径中最近的点。
  • 很抱歉,它不能满足您的需求。该解决方案假定一条折线具有最小距离的点(“填充路径”)。我想我在某个地方有代码可以做你想做的事,需要一些时间来挖掘它。如果我没记错的话,它来自Bill Chadwick's 库之一的移植版本(“到折线或多边形的距离点”之一)。
  • 经过大量挖掘,我确实找到了解决方案。我仍在权衡它的效率。到目前为止,它似乎与上面的解决方案相当。它在路径的每一段之间分解它,然后获取到该路径中最近点的距离。
  • 我认为没有其他方法可以做到这一点。这相当于链接示例中的“填充”路径,只是在感兴趣的段上实现。

标签: javascript google-maps-api-3


【解决方案1】:

我的解决方案是从各种来源进行几个级别的调整。我喜欢上面的链接,它指向我填充点,但最后,它并没有达到我希望的准确性。记得很久以前的数学课,我知道有可能找到这个。最后,这个脚本循环遍历路径中的点,然后计算它们之间最接近用户点击的点。

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

这里的第一个参数是标记点。这是一个 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];
}

【讨论】:

    猜你喜欢
    • 2014-04-25
    • 1970-01-01
    • 1970-01-01
    • 2012-05-28
    • 1970-01-01
    • 2012-05-01
    • 2018-05-04
    • 2010-12-01
    • 2020-10-26
    相关资源
    最近更新 更多