2012-04-04 51 views
0

我正在嘗試使用下面的dest()函數來計算地球上的目標距離。但是,我的功能打印目標點(61.488580, 23.784896)這是從初始點(61.488414, 23.784976)僅0.018公里。正確的答案應該是(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 2012-04-04 15:23:49

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。然後你使用lat2rad(仍是0)來計算X:

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

也許第二個代碼塊應改爲:

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

感謝您的通知!現在我改變代碼片段如下。然而,距離僅有0.026km的距離改善很小。 「lat1rad = Math.toRadians(LAT1); lon1rad = Math.toRadians(lon1); dbyRrad = Math.toRadians(d/R); brrad = Math.toRadians(寬單峯); LAT2 =數學。 asin(Math.sin(lat1rad)* Math.cos(dbyRrad) + Math.cos(lat1rad)* Math.sin(dbyRrad)* Math.cos(brrad)); y = Math.sin(brrad)*數學公式(latby)Math.cos ; lon2 = Math.toDegrees(lon2); lon2 = lon1 + lon2;「 – abtmp 2012-04-04 14:58:48

+0

非常感謝它現在的作品。 d/R已經在弧度;所以需要再次以弧度改變。 – abtmp 2012-04-04 15:26:33