直线上的最近点(球形/墨卡托投影)


9

我在墨卡托投影(google maps)上有一条线(Ax,Ay-Bx,By)和最接近该线的随机点(Cx,Cy),我想知道最近的点(图像上的透明蓝色)指向那条线(图像中为蓝色)

编辑:澄清这是在墨卡托投影(球面投影) 在此处输入图片说明


3
这篇文章有非常有用的解决方案,您可能会感兴趣stackoverflow.com/questions/3120357/get-closest-point-to-a-line
vinayan 2012年

1
浅蓝色看起来不像最接近的颜色,最接近的颜色在连接到深蓝色时应该形成90度角,这是您的意思吗?
Glenn Plas 2012年

我是手动制作图片的,所以可以
Colas 2012年

@vinayan您引用的帖子解决了另一个问题,即找到与直线的最近点,而此处所需的似乎是希望与直线段最接近。
whuber

1
该路段的长度应为20-100米左右,从厘米到该路段的距离应为30米之多
Colas 2012年

Answers:


2

查看此链接,它使我使用以下函数来计算到线段的距离。

在PHP中:

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

   // list($distanceSegment, $x, $y) = 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 = abs($s) * 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 = sqrt($dist1);
       }
       else {
          $closest_point_on_segment_X = $endX;
          $closest_point_on_segment_Y = $endY;
          $distanceSegment = sqrt($dist2);
       }
    }

    return array($distanceSegment, $closest_point_on_segment_X, $closest_point_on_segment_Y);
}

然后,您可以使用投影函数来计算距离,在给定平均速度的情况下,我使用上面的公式来计算该点的时间,并且效果很好。

如果您想要一个好的PHP库来计算PHP中坐标之间的距离,请查看GeoCalc类


嘿Glenn Plas,您的班级似乎向左或向右偏移一点,我在Google Earth上做了一个屏幕截图,您会看到该偏移量,pic:link,我使用的代码point_to_line_segment_distance(41.421649, 2.600410, 41.413851, 2.594356, 41.415710, 2.600638))
Colas

这不是我的课程,只是在搜索了很多之后才发现的;-)但是我在问题中使用8位精度,您似乎使用6。这可能是原因,我在这里从未注意到任何偏移量。感谢您指出这一点,我将在需要知道的情况下尽快进行仔细检查。
Glenn Plas 2012年

也许您是rihgt,我无法在gEarth上获得更多的dedecmas,顺便说一句,在我的上一张照片中,路段长1000米,偏移量为〜110米
Colas

那就是我使用它的规模,仅此而已。我用它来查看公交车(公交)什么时候最靠近车站。我将对其进行仔细检查,并将其放入地图中以“查看”它是否在球体上很好地投影。
Glenn Plas 2012年

哦...我想该功能是为球形突出制作,所以现在我明白了偏移
科拉斯

1

您可以使用google map api中的 computeDistanceBetween()函数。

distance = google.maps.geometry.spherical.computeDistanceBetween(firstCoord, secondCoord);

两点之间的距离是两点之间最短路径的长度。该最短路径称为测地线。在一个球体上,所有测地线都是一个大圆的段。要计算此距离,请调用computeDistanceBetween(),并向其传递两个LatLng对象。

如果您有多个位置,则可以改为使用computeLength()计算给定路径的长度

我希望它可以帮助您...


首先,我需要知道该点(浅蓝色)以计算之间的距离
Colas

我下面的解决方案可以做到这一点,该分段上的点是未知的。我实际上有一个与上述类似的问题/解决方案。您可以小规模安全地使用它们。
Glenn Plas
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.