计算距离没有给出正确的答案使用PHP,因为答案是不真实的

时间:2013-05-17 15:24:27

标签: php distance

任何人都可以告诉我,使用经度和纬度计算距离的公式是否正确?

就像两个城市之间的距离一样,公式显示超过135公里,这不是真实的

code.php

      <?php 

    $result="";
          if(isset($_POST['calculate'], $_POST['pt1'], $_POST['pt2']))
            {
                $pt1 = $_POST['pt1'];
                $pt2 = $_POST['pt2'];

                $points = array();

                $sql = mysql_query("SELECT longitude, lattitude, village_name FROM village WHERE id = '$pt1' OR id = '$pt2'")or die(mysql_error()); // See how I added the village name column !
                $num_row = mysql_num_rows($sql);
                if($num_row > 0)
                {
                    while($row = mysql_fetch_array($sql))
                    {
                        $points[] = array($row['longitude'], $row['lattitude'], $row['village_name']); // add point to array , [also adding the village_name]
                    }
                }
                if(count($points) == 2){ // Check if there are 2 points
                        $PI = acos(-1);
                        $lon_s = $points[0][0];
                        $lon_s = ($lon_s/180)*$PI;

                        $lat_s = $points[0][1];
                        $lat_s = ($lat_s/180)*$PI; 

                        $lon_e = $points[1][0];
                        $lon_e = ($lon_e/180)*$PI;

                        $lat_e = $points[1][1];
                        $lat_e = ($lat_s/180)*$PI;

                        $R = 6371; //km
                        $A = pow(sin(($lat_e - $lat_s)/2), 2) + cos($lat_s) * cos($lat_e) * pow(sin(($lon_e - $lon_s)/2) , 2);
                        $C = 2 * atan2(sqrt($A), sqrt(1 - $A));
                        $D = $R * $C;

                    $result= 'The distance between <br/>'. $points[0][2] . ' and '. $points[1][2].' <br /> is <br/>'. $D .'&nbsp;'.'km'; // Let's output something fancy
                }
            }
?>

因为它提供了与现实无关的距离我谈论一个小国

2 个答案:

答案 0 :(得分:1)

我的猜测是你可能直接使用纬度和经度度值而不将它们转换为弧度,例如sin()和cos()函数需要它。在您的公式中,简单地转换它们可能会为您解决问题:

$PI = acos(-1);
$lat_e = ($lat_e/180) * $PI;
$lat_s = ($lat_s/180) * $PI;
$lon ...

或者,从纬度和经度计算3D坐标的简便方法是使用以下公式:

$x = sin($lon/180*$PI)*cos($lat/180*$PI)*$alt;
$y = cos($lon/180*$PI)*cos($lat/180*$PI)*$alt;
$z = sin($lat/180*$PI)*$alt;

看起来你忽略了城市的高度,所以你可以省略$alt。从这里,您可以简单地在两个3D点之间应用基本距离,并将其乘以地球半径,在本例中为6371:

$x = ($x - $x2) * ($x - $x2);
$y = ($y - $y2) * ($y - $y2);
$z = ($z - $z2) * ($z - $z2);
$D = sqrt($x + $y + $z) * $R;

注意我仅出于性能原因避免使用pow()

答案 1 :(得分:0)

还要检查while($row = mysql_fetch_array($sql))是否给出了正确的结果。尝试

`$result=mrsql_query($sql);`$row = mysql_fetch_array($result)