rhumb行计算 - javascript到php

时间:2010-12-27 19:11:28

标签: php javascript

此示例和java脚本代码来自link text
请看有关直线的部分。


给定起始点和沿恒定方位θ的距离d,这将计算目标点。如果沿着垂直线保持恒定的方向,则会逐渐向一个极点旋转。

公式

  α = d/R (angular distance)   
  lat2 = lat1 + α.cos(θ)   
  Δφ = ln(tan(lat2/2+π/4)/tan(lat1/2+π/4)) [= the ‘stretched’ latitude difference] 
if E:W line q = cos(lat1)    
otherwise q = Δlat/Δφ   
  Δlon = α.sin(θ)/q   
  lon2 = (lon1+Δlon+π) % 2.π − π   
  where ln is natural log and % is modulo, Δlon is taking shortest route (<180°), and R is the earth’s radius 

JavaScript

lat2 = lat1 + d*Math.cos(brng);
var dPhi = Math.log(Math.tan(lat2/2+Math.PI/4)/Math.tan(lat1/2+Math.PI/4));
var q = (!isNaN(dLat/dPhi)) ? dLat/dPhi : Math.cos(lat1);  // E-W line gives dPhi=0
var dLon = d*Math.sin(brng)/q;
// check for some daft bugger going past the pole, normalise latitude if so
if (Math.abs(lat2) > Math.PI/2) lat2 = lat2>0 ? Math.PI-lat2 : -(Math.PI-lat2);
lon2 = (lon1+dLon+Math.PI)%(2*Math.PI) - Math.PI; 

我正在尝试将其转换为php语法,但我没有得到所需的结果。我的纬度部分工作正常。我还包括了我的测试数据。


我的PHP代码

// test data
$R = 6371;
$tlatitude = 50.7;
$tlongitude = -105.214;
$theading = 124;
$d = 50;  

$projlat = $tlatitude +  rad2deg(($d/$R)*COS(deg2rad($theading)));

//Δφ = ln(tan(lat2/2+π/4)/tan(lat1/2+π/4))
$delta_phi = log(tan(deg2rad($projlat/2) + pi()/4)/(tan(deg2rad($tlatitude/2) + pi()/4)));

//q = Δlat/Δφ 
$delta_lat = deg2rad($projlat - $tlatitude);

$q = $delta_lat/$delta_phi;


//Δlon = α.sin(θ)/q
$delta_long = rad2deg($d/$R*sin(deg2rad($theading))/$q);

$projlong = $tlongitude + $delta_long;

我得到$projlong = -104.84

根据引用的页面,答案应为-104.63

现在我正试图让这个工作无视东西方和极地的可能性。

2 个答案:

答案 0 :(得分:1)

我在进行距离计算时遇到了一些问题,我的错误会在一段时间后会有所增加。我发现如果我在代码中进行了(双重)转换,则精度会提高。我没有查看PHP中的C代码,看看是什么导致了这一点。我可以在废弃我的BC版本的代码之后。

如果您需要额外的精度,请查看PHP中的BC函数。 http://php.net/manual/en/book.bc.php

另外,请记住,在计算机中进行计算的顺序会影响精度。也就是说,计算如下:

$d/$R*sin(deg2rad($theading))/$q

不会呈现与

相同的结果
$d*sin(deg2rad($theading))/$q/$R

这也可以给出第三个结果

 $d*sin(deg2rad($theading))/($q*$R)

这与计算机中接近零(0)的数字的有限精度有关。

答案 1 :(得分:0)

javascript比php更精确 看看这个笑话http://ru2.php.net/manual/en/function.doubleval.php

我曾经需要用Luhn算法检查一些IBAN。 我的javascript代码很好用。 但是我的php失败了,所以经过一些研究,我找到了这个笑话,并且不得不根据字符串而不是数字重新编码基本操作(添加,子,计算,除法,模数)。

也许你应该重新编码,以获得预期的精确度。 我们不应该使用php进行高精度计算。