2012-04-12 34 views
16

私はいくつかの三角法の周りを頭で覆うのに苦労しています。私は開始緯度とログと距離と方位から目的地の緯度と経度を推測しようとしています。私は私のJavaプログラムでそれを試してみましたが、それは私のために働いていない http://www.movable-type.co.uk/scripts/latlong.html「宛先ポイント与えられた距離と開始点からベアリング」:ベアリングと距離から緯度と経度を計算する

は幸いなことに、私は私が必要とする正確に機能を説明する素晴らしいサイトを発見しました。私はウェブサイトが言ったようにそれを展開した。ここに私のコードです:

double dist = 150/6371; 
double brng = Math.toRadians(90); 
double lat1 = Math.toRadians(26.88288045572338); 
double lon1 = Math.toRadians(75.78369140625); 

double lat2 = Math.asin(Math.sin(lat1)*Math.cos(dist) + Math.cos(lat1)*Math.sin(dist)*Math.cos(brng)); 
double a = Math.atan2(Math.sin(brng)*Math.sin(dist)*Math.cos(lat1), Math.cos(dist)-Math.sin(lat1)*Math.sin(lat2)); 
System.out.println("a = " + a); 
double lon2 = lon1 + a; 

lon2 = (lon2+ 3*Math.PI) % (2*Math.PI) - Math.PI; 

System.out.println("Latitude = "+Math.toDegrees(lat2)+"\nLongitude = "+Math.toDegrees(lon2)); 

しかし、それが出力されている示しています。私はミスをやっているところ

a = 0.0 
Latitude = 26.882880455723377 
Longitude = 75.78369140625 

私はなっておりません。誰かが私に問題を見つけるのを手伝ってください。

Thanx in Advance。 :-)

+4

これを手助けするいくつかの素晴らしいライブラリがあります。 http://code.google.com/p/simplelatlng/wiki/GettingStarted –

+0

マーク - この小さなつながりに感謝します。 – Vaiden

答えて

13

問題は最初の行にあります。

は、(むしろ浮動小数点除算以外の)整数の除算を実行するための理由は、150/63710のように計算されることをある

double dist = 150.0/6371.0; 

を試してみてください。これは、結果がdoubleに格納されていても当てはまります。浮動小数点除算は、2つの数値のうちの1つを浮動小数点リテラルにすることで強制的に行うことができます。

+1

誰かが150が何であるか教えてもらえますか?マイルですか?私はこの同じシナリオを実行することを検討しています – devdar

+2

地球の半径を考えれば、それはキロメートルだと思います。 – lcguida

+0

Iは、緯度と経度に変換するためにこれを使用した:0として(KM)に移動した距離と0.39041812966877465,1.991668182365113 :22.369131978392012,114.11357168108225 の始点の緯度、経度を。06574748992919921 距離を計算する方法を教えてください。 –

5

誰かがある距離だけ移動した他のポイントからポイント座標を計算する関数を必要とする場合、以下は作業コードです。私のために、それはちょっとした距離を移動しているだけです。

import static java.lang.Math.*; 

void movePoint(double latitude, double longitude, double distanceInMetres, double bearing) { 
    double brngRad = toRadians(bearing); 
    double latRad = toRadians(latitude); 
    double lonRad = toRadians(longitude); 
    int earthRadiusInMetres = 6371000; 
    double distFrac = distanceInMetres/earthRadiusInMetres; 

    double latitudeResult = asin(sin(latRad) * cos(distFrac) + cos(latRad) * sin(distFrac) * cos(brngRad)); 
    double a = atan2(sin(brngRad) * sin(distFrac) * cos(latRad), cos(distFrac) - sin(latRad) * sin(latitudeResult)); 
    double longitudeResult = (lonRad + a + 3 * PI) % (2 * PI) - PI; 

    System.out.println("latitude: " + toDegrees(latitudeResult) + ", longitude: " + toDegrees(longitudeResult)); 
} 
  • 緯度経度 - 方向に向かってあなたの角度、 - あなたは
  • 軸受によってポイントを移動する距離 - エントリポイントが
  • distanceInMetres座標ポイントを移動したい。 0は北、90 - 東、180 - 南、270 - 西に向かっています。そして、その間、すなわち45は北東です。
  • earthRadiusInMetres - 地球半径(メートル)。

入力をキロメートル単位で入力する場合は6371、マイル単位で入力したい場合は6371に半径を変更できます。