2012-04-04 3 views
0

以下のdest()関数を使って地球上の目的地距離を計算しようとしています。しかし私の機能は、最初の点(61.488414, 23.784976)からわずか0.018km離れた目的地点(61.488580, 23.784896)を印刷します。正解は(61.49806, 23.765)です。地球上の目的地を計算しようとするときの問題

誰かが私が間違っていたことを理解できたら助けてくれますか?ここで

Source for how I calculate a destination point on the globe

lat2 = asin(sin(lat1)*cos(d/R) + cos(lat1)*sin(d/R)*cos(br)) 
lon2 = lon1 + atan2(sin(θ)*sin(d/R)*cos(lat1), cos(d/R)−sin(lat1)*sin(lat2)) 

私の出発点です:ここ

lat1= 61.488414 (degree) 
lon1= 23.784976 (degree) 
br= 315 (degree) 
d= 1.5 (km) 
R= 6371 (km) 
lat2= ? (degree) 
lon2= ? (degree) 

は、次の関数の私の実装です:

void dest(){ 
    double lat1, lon1, lat2, lon2, x, y, R, d, br; 
    double lat1rad, lat2rad, lon1rad, dbyRrad, brrad; 

    lat1=61.488414; 
    lon1=23.784976; 
    br=315; 
    d=1.5; 
    R=6371; 

    lat1rad=Math.toRadians(lat1); 
    lat2rad=Math.toRadians(lat2); 
    lon1rad=Math.toRadians(lon1); 
    dbyRrad=Math.toRadians(d/R); 
    brrad=Math.toRadians(br); 

    lat2 = Math.asin(Math.sin(lat1rad)*Math.cos(dbyRrad)   
     +Math.cos(lat1rad)*Math.sin(dbyRrad)*Math.cos(brrad)); 
    lat2=Math.toDegrees(lat2); 

    y=Math.sin(brrad)*Math.sin(dbyRrad)*Math.cos(lat1rad); 
    x=Math.cos(dbyRrad)-Math.sin(lat1rad)*Math.sin(lat2rad); 
    lon2 = Math.atan2(y,x); 
    lon2 = Math.toDegrees(lon2); 
    lon2 = lon1 + lon2; 

    System.out.println("lat2 = "+ lat2); // correct lat2= 61.49806, lon2=23.765 
    System.out.println("lon2 = "+ lon2); 
}    

答えて

0

私はD/Rがすでにあることを考えますラジアンの場合は、再度変換する必要はありません。

+0

はい、今では動作します!多くのありがとう.. – abtmp

1
lat2rad=Math.toRadians(lat2); 

しかし、この時点であなたはまだそれは後で、あなたがLAT2を含むいくつかの計算を行う続いて0の値を使用していますので、LAT2初期化されていませんでした:

lat2 = Math.asin(Math.sin(lat1rad)*Math.cos(dbyRrad)   
    +Math.cos(lat1rad)*Math.sin(dbyRrad)*Math.cos(brrad)); 
lat2=Math.toDegrees(lat2); 

しかし、あなたは戻って、この値をマッピングすることはありませんlat2radに入れる。そして、あなたがXを計算する(まだ0である)lat2radを使用します。

x=Math.cos(dbyRrad)-Math.sin(lat1rad)*Math.sin(lat2rad); 

おそらく2番目のコードブロックではなく、次のようになります。

lat2rad = Math.asin(Math.sin(lat1rad)*Math.cos(dbyRrad)   
    +Math.cos(lat1rad)*Math.sin(dbyRrad)*Math.cos(brrad)); 
lat2=Math.toDegrees(lat2rad); 
+0

あなたの通知をありがとう!今度は以下のようにスニペットを変更します。しかし、まだわずか0.26kmの距離の改善はほとんどありません。 「lat1rad = Math.toRadians(LAT1); lon1rad = Math.toRadians(lon1); dbyRrad = Math.toRadians(D/R); brrad = Math.toRadians(BR); LAT2 =数学。 asin(Math.sin(lat1rad)* Math.cos(dbyRrad) + Math.cos(lat1rad)* Math.sin(dbyRrad)* Math.cos(brrad)); y = Math.sinx = Math.cos(dbyRrad)-Math.sin ; lon2 = Math.toDegrees(lon2); lon2 = lon1 + lon2; " – abtmp

+0

多くのおかげでそれは今働きます。 d/Rは既にラジアンである。再びラジアンで変更する必要があります。 – abtmp