0

谁能告诉我使用经度和纬度计算距离的公式是否正确?

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

代码.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
                }
            }
?>

因为它给出了与现实无关的距离我说的是一个小国

4

2 回答 2

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()请注意,我只是出于性能原因而避免使用。

于 2013-05-17T15:47:28.530 回答
0

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

`$result=mrsql_query($sql);`$row = mysql_fetch_array($result) 
于 2013-05-17T17:54:29.497 回答