在两个经纬度坐标之间计算所有坐标,精确到小数点后x位。

3
如何在PHP中计算两个经纬度坐标之间的所有经纬度坐标?假设我有坐标A:
(39.126331, -84.113288) 

并且坐标为B:

(39.526331, -84.213288)

如何计算在直线上的两个经纬度坐标之间所有可能的坐标,精确到小数点后五位(例如39.12633,-84.11328),并获取它们之间的坐标列表?

另外,我有另一组坐标C,它们稍微偏离A和B之间的轨迹。

如何计算坐标C和A、B之间最接近的坐标之间的距离?


“坐标列表”是什么意思?您是否想要在两个点之间列出所有可能的坐标,精确到6位有效数字?或者您需要这两个点之间的线段方程?还是您需要其他完全不同的东西? - Madison May
是的,两者之间的每个可能坐标,保留5个有效数字即可。我会澄清我的问题。谢谢。 - Jacob R
如果您包括您的最终用途和已经尝试过的内容,将有助于SO用户。 您的计算将产生一个非常庞大的排列列表。 当算法效果更好时,为什么要列出它们所有呢? - nickhar
我正在尝试用PHP编写一个函数或一系列函数,它将接收用户的新GPS坐标集、旧的坐标集以及与用户无关的第三个坐标集。该函数基本上需要检查第三个坐标集是否靠近第一或第二个坐标集中的任何一个坐标或两者之间的任何坐标。 - Jacob R
1
构建两个坐标之间所有可能坐标的列表是一个非常糟糕的方法。你学过向量吗? - Beta
请查看此页面中的横向距离(Cross-track distance)[look at the Cross-track distance in this page],示例使用js编写,但数学公式可以轻松转换为PHP。 - Wrikken
2个回答

0

这是解决我的方法,

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

        $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);

        $closest_point_on_segment_X = $px;
        $closest_point_on_segment_Y = $py;

        $distance = user_bomb_distance_calc($closest_point_on_segment_X, $closest_point_on_segment_Y, $pointX, $pointY);

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

function user_bomb_distance_calc($uLat , $uLong , $bLat , $bLong)
{
    $earthRadius = 6371; #km
    $dLat = deg2rad((double)$bLat - (double) $uLat);
    $dlong = deg2rad((double)$bLong - (double) $uLong);

    $a = sin($dLat / 2 ) * sin($dLat / 2 ) + cos(deg2rad((double)$uLat)) * cos(deg2rad((double)$bLat)) * sin($dlong / 2) * sin($dlong / 2);


    $c = 2 * atan2(sqrt($a), sqrt(1 - $a));
    $distance = $earthRadius * $c;

    $meter = 1000; //convert to meter 1KM = 1000M

    return  intval( $distance * $meter ) ;
}

0

您可以从所有的经纬度对计算出一个 Voronoi 图,并查找相邻的单元。请注意,经纬度是角度,而不是世界坐标或笛卡尔坐标。您可以在 phpclasses.org 上下载我的 PHP 类 Voronoi 图。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接