我正在开展一个项目,我正在跟踪一段建筑的用户反馈,但它跨越很长的距离。
我希望能够实现的是用户点击地图,标记会在A点和B点之间的某个位置捕捉到道路。我特意将标记捕捉到道路上,但从来没有特定道路
我觉得有两种可能的方法,谷歌没有这个功能,我还没有找到它。
或者,我通过从A点和B点生成方向来创建折线,然后以某种方式将标记捕捉到该折线,我不知道该怎么做。
答案 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];
}