2010-11-18 133 views
1

我試圖使用公式(www.movable-type.co.uk/scripts/latlong.html)返回目標點,給出一個起點點,距離和方位。這是我的價值觀:使用vincenty公式時,我總是提出錯誤的計算

int radius_km = 6371; 
double d = 74.02; 
double st_lat = 39.4450; 
st_lat = Math.toRadians(st_lat); 
double bearing = 106.1607; 
bearing = Math.toRadians(bearing); 

double end_lat = Math.asin(Math.sin(st_lat)*Math.cos(d/radius_km) + 
      Math.cos(st_lat)*Math.sin(d/radius_km)*Math.cos 
      (bearing)); 

end_lat = Math.toDegrees(end_lat); 

當我進入d,st_lat並在網站軸承,我得到這樣的:39°33'28「N。 當我使用上面的代碼(我從網站複製),我得到這個:39.25679699255662。

我看了看周圍越來越有人說師可能不會返回小數量,所以我換成師帶:

BigDecimal distance = new BigDecimal("74.02"); 
BigDecimal strradius = new BigDecimal("6371"); 
BigDecimal d2 = distance.divide(strradius, 6, RoundingMode.HALF_EVEN); 
double d = d2.doubleValue(); 

,改變了公式:

end_lat=Math.asin(Math.sin(st_lat)* 
Math.cos(d)+Math.cos(st_lat)*Math.sin(d)*Math.cos(bearing)); 

答案我現在得到是39.25680143864117。 我確定我錯過了一些東西,但我無法通過計算的每一步來查看我在哪裏。有沒有人有關於如何做到這一點的分步說明?我將不勝感激。 謝謝。

+0

爲什麼半徑是一個整數? – 2010-11-18 15:37:00

+1

如果您使用trig函數,小距離將不會非常準確 – 2010-11-18 15:52:44

+0

您認爲它會是什麼? – Dave 2010-11-18 18:29:47

回答

0

你確定你正在從分鐘/秒到小數進行正確的轉換嗎?

有60分鐘的學位,每分鐘60秒。如果起始緯度是39.4450;假設積極意味着赤道以北。假設106.1607的方位是從北向順時針測量的;意味着你正在東南旅行。

你說網站告訴你答案是39°33'28「N,但是如果我把它轉換成十進制,那就等於39+(33 + 28/60)/ 60 = 39.5578。這個結果比你的出發點要大,也就是說,你正在東南方向旅行,但是結束了你的觀點。

我還沒有看過你的代碼中的數學,但我想說你的問題在於從分/秒到小數的轉換和返回。

+0

鑑於原始海報沒有做任何轉換爲​​分鐘/秒,您是否建議問題是他用作參考的網站是錯誤的?我無法自己加載該網站,所以我實際上不能檢查它在做什麼...... – Chris 2010-11-18 15:56:39

+0

我懷疑網站正在以分鐘/秒的形式輸入並且他將它作爲十進制輸入...... 39°44'50「 N,而不是39°26'42「N – aepryus 2010-11-18 16:00:33

+0

啊,我明白你的意思了。絕對有可能。我想知道自己是不是像網站截取輸入整數或類似的東西,在外形和距離上。 – Chris 2010-11-18 16:08:53