任何人都可以告诉我,使用经度和纬度计算距离的公式是否正确?
就像两个城市之间的距离一样,公式显示超过135公里,这不是真实的
<?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 .' '.'km'; // Let's output something fancy
}
}
?>
因为它提供了与现实无关的距离我谈论一个小国
答案 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)