2010-12-27 12 views
8

この例とJavaスクリプトのコードはlink text
です。派生ラインのセクションを見てください。括弧のライン計算 - javascript to ph


一定のベアリングθに沿って開始点と距離dが与えられた場合、これは目的地点を計算します。あなたが菱形の線に沿って一定のベアリングを維持すると、徐々に極の1つに向かって渦巻くようになります。

α = 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の構文に変換しようとしていますが、私は望ましい結果を得ていないのです。私は緯度の部分が正常に動作している。私は私のテストデータも含めました。


MY 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する必要があり得ます。

今私は東西と極の可能性を無視してこれを動作させようとしています。

+1

正確なPHPコードを貼り付けて 'echo round($ projlong​​、2);という行を追加すると、' -104.63'という出力が表示されます。あなたは間違いなく '-104.84'の出力を得ますか? – thirtydot

+0

しかし、私は何を得ていたのか....しかし、私はあなたのリードに続いて、新しい裸のhtml/phpページに「自分の」コードを貼り付け、正しい答えを得ました....私の元のページを見て、 pi()の代わりにpiを使用し、結果に影響を与えるように見える....私は私の尾を追いかけていたと思う。 – brian

+7

エラーが見つかった場合は、それを回答として書き込み、受け入れ済みとして設定して、質問が開いたままにならないようにします。 –

答えて

0

javascriptのは、私がかつてのLuhnのアルゴリズムといくつかのIBANをチェックするために必要な、このジョークhttp://ru2.php.net/manual/en/function.doubleval.php

で を見て、PHPよりも精度を持っています。 JavaScriptコードがうまく機能しました。 しかし、私のPHPは失敗したので、いくつかの研究の後で、私は冗談を見つけて、数字ではなく文字列に基づいて基本的な操作(add、sub、compute、divide、modulo)をコードしなければならなかった。

予想される精度を得るには、あまりにもそれをコード化するべきでしょうか? 高精度の計算にphpを使うべきではありません。

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に近い場合