【问题标题】:PHP and GPS Coordinates, getting the total distance along paths made up of several pointsPHP 和 GPS 坐标,获取由多个点组成的路径的总距离
【发布时间】:2012-01-17 01:57:50
【问题描述】:

我似乎无法弄清楚如何制作高效且外观简洁的代码来解决这个问题。

我有一串坐标,每个点自然由经度、纬度和高度组成(我现在完全不担心高度,我知道我计算镜头的功能不支持高度) :

$coordinates = "-82.36554110283872,26.15200821551467,0 -82.420692,26.097404,0 -82.52855700000001,26.186567,0 -82.41250599999999,25.996422,0 -82.50644510379755,26.05431354409091,0" 

我需要找出每个坐标之间的英尺距离并将总和相加。 我有以下函数(效果很好)来计算两点之间的距离:

function coordDistance($lat1, $lon1, $lat2, $lon2) {
$delta_lat = $lat2 - $lat1;
$delta_lon = $lon2 - $lon1;

$earth_radius = 20908800.00; //Distance around the earth in feet

$alpha  = $delta_lat/2;
$beta   = $delta_lon/2;
$a          = sin(deg2rad($alpha)) * sin(deg2rad($alpha)) + cos(deg2rad($lat1)) *    cos(deg2rad($lat2)) * sin(deg2rad($beta)) * sin(deg2rad($beta)) ;
$c      = asin(min(1, sqrt($a)));
$distance = 2*$earth_radius * $c;
$distance = round($distance, 4);

return $distance;
}

我目前分解坐标字符串并尝试将其传递给函数的方式是完全可笑的。关于如何分割坐标并将它们分解以以一种不错的方式获得路径的总镜头的任何建议?

【问题讨论】:

  • 从您的字符串值中,我可以假设 , comma 将组成一个点的高度、经度和纬度分开,而 space 将这些点分开,对吗?

标签: php coordinates


【解决方案1】:

本质上是一个要累积的变量。在空间上拆分字符串以获得单个点。循环n-1。计算 i 和 i+1 之间的距离。

$total = 0;

$points = explode(' ', $coordinates);
$count = count($points);

for ($i = 0; $count - 1 > $i; ++$i) {
    list($lon1, $lat1, $alt1) = explode(',', $points[$i]);
    list($lon2, $lat2, $alt2) = explode(',', $points[$i + 1]);

    $total += coordDistance($lat1, $lon1, $lat2, $lon2);
}

我没有完全测试代码。在我看来,您的坐标字符串在减号后有一个额外的空格。

确保 lon 和 lat 也以正确的顺序读取。

【讨论】:

  • 啊,谢谢,我会试试这个。顺便说一句,修复了我的示例中搞砸的几个坐标。这只是格式化我的帖子时的一次意外。 :[
  • 非常感谢。这工作得非常好,而且比我要走的方向简洁得多!另外,我使用的是 split,它看起来几乎与 explode 相同。将不得不查找差异。再次感谢! - 编辑 - Oh Split 已弃用,哎呀。
【解决方案2】:

如果我正确读取了您的输入字符串,请首先使用 explode function 将所有坐标分解为一个数组:

$coordinatesArray = explode(" ", $coordinates);

现在您可以将每个坐标作为数组传递,但您需要更新您的函数签名。例如,

coordDistance($coordinatesArray[i], $coordinatesArray[i+1],); // in a loop 

或者,您可以进一步分解坐标以使用您现有的函数签名。

$coordinateA = explode(",", $coordinatesArray[i]); // again, in a loop
$coordinateB = explode(",", $coordinatesArray[i+1]);

coordDistance($coordinateA[0], $coordinateB[0], $coordinateA[1], $coordinateB[1])

更多:http://php.net/manual/en/function.explode.php

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-03
    • 1970-01-01
    相关资源
    最近更新 更多