我有从位置(纬度,经度)和到位置(纬度,经度)。经过计算,它应该告诉我离罗盘最近的方法是什么。以下是PHP代码,但它显示错误的方向,我需要一些帮助。
function GreatCircleDirection ($OrigLat, $DestLat, $OrigLong, $DestLong, $Distance)
{
$Result = 0.0;
$L1 = deg2rad($OrigLat);
$L2 = deg2rad($DestLat);
$D = deg2rad($Distance / 60); # divide by 60 for nautical miles NM to degree
$I1 = deg2rad($OrigLong);
$I2 = deg2rad($DestLong);
$Dlong = $I1 - $I2;
$A = sin($L2) - cos($D + $L1 - pi() / 2);
$B = acos($A / (cos($L1) * sin($D)) + 1);
if ((abs($Dlong) < pi() and $Dlong < 0) or (abs($Dlong) > pi() and $Dlong > 0))
{
//$B = (2 * pi()) - $B;
}
$Result = $B;
return rad2deg($Result);
}
function GreatCircleDistance ($OrigLat , $DestLat, $OrigLong, $DestLong)
{
$L1 = deg2rad($OrigLat);
$L2 = deg2rad($DestLat);
$I1 = deg2rad($OrigLong);
$I2 = deg2rad($DestLong);
$D = acos(cos($L1 - $L2) - (1 - cos($I1 - $I2)) * cos($L1) * cos($L2));
# One degree of such an arc on the earth's surface is 60 international nautical miles NM
return rad2deg($D * 60);
}
条件错误: 这是greatCircleDirection函数的if条件中的值,需要知道要修改的内容才能修复它。
if (0.57700585070933 < 3.1415926535898 and 0.57700585070933 < 0) or (0.57700585070933 > 3.1415926535898 and 0.57700585070933 > 0)
示例:
from lat: 33.71,
to lat: 21,
from long: 73.06,
to long: 40 ,
distance: 1908.842544944
direction 104.96527938779 (direction should be 255.87 or so)
答案 0 :(得分:1)
嗯,你的距离计算检查出来。但我看到你得到的初始方位的答案是(0 + 105)mod360而不是(0-105)mod360(大约)所以我怀疑你的GreatCircleDirection函数中的if语句中某处有错误的符号。
答案 1 :(得分:1)
计算距离是不必要的;它只是增加了更多操作,并且可能引入更多数值错误。使用你的编码风格,这样的事情应该有效:
function GreatCircleDirection($OrigLat, $OrigLong, $DestLat, $DestLong)
{
$L1 = deg2rad($OrigLat);
$I1 = deg2rad($OrigLong);
$L2 = deg2rad($DestLat);
$I2 = deg2rad($DestLong);
return rad2deg(atan2((sin($I2-$I1),cos($L1)*tan($L2)-sin($L1)*cos($I2-$I1)));
}
atan2函数负责识别方向的正确象限,并给出从真北测量的-180到180之间的角度,例如,GreaterCircleDirection(39,-77,21,40)评估为56.76度。使用的符号约定:北纬时为正,南时为负;东经时为正,西经为负。
计算在http://patriot.net/~abdali/ftp/qibla.pdf等其他地方进行了讨论。
答案 2 :(得分:0)
在http://www.krysstal.com/sphertrig.html下“使用正弦规则”下的工作示例可能会有所帮助。