2016-10-21 225 views
1

我找到了計算第二個座標here的公式。但是當我將它轉換爲Java時,結果並不如我預期的那樣。Java - 根據給定的座標,方位和距離計算第二個座標

private Point get(double lat1, double lon1, double tc, int d) { 
    double lat = Math.asin(
          Math.sin(lat1) * Math.cos(d) 
         + Math.cos(lat1) * Math.sin(d) * Math.cos(tc) 
         ); 

    double dlon= Math.atan2(
          Math.sin(tc) * Math.sin(d) * Math.cos(lat1) 
         , Math.cos(d) - Math.sin(lat1) * Math.sin(lat)); 
    double lon = ((lon1 - dlon + Math.PI) % (2 * Math.PI)) - Math.PI; 

    return new Point(lat, lon); 
} 

我測試了上面的代碼,用get(50,10,0,0)等簡單的例子。因此,預計結果將作爲第一個點作爲相同,但是這是我得到的結果是:用正確的公式來計算第二座標

Lat: 1.4432701894877245, lon: -3.8108244707674395 

我是誰?

[編輯] 這裏是我嘗試轉換爲Java代碼中的公式

lat =asin(sin(lat1)*cos(d)+cos(lat1)*sin(d)*cos(tc)) 
dlon=atan2(sin(tc)*sin(d)*cos(lat1),cos(d)-sin(lat1)*sin(lat)) 
lon=mod(lon1-dlon +pi,2*pi)-pi 
+0

爲什麼d是int? –

+0

tc的單位是弧度,d是km。我不認爲主要類型會影響這個算法的結果。 – Hien

+1

我認爲你的公式出了問題,因爲cos(d)沒有任何意義。 – talex

回答

1

正如在評論中指出,您的公式預計,緯度,經度,真航向和距離都在弧度。

如果你想在緯度,經度,以度的航向和距離海里數通過,你需要做以下的任何數學以下轉換:

// convert to radians 
lat1 = lat1 * Math.PI/180; 
lon1 = lon1 * Math.PI/180; 
tc = tc * Math.PI/180; 
d = (Math.PI/(180*60)) * d; 

,然後轉換您的緯度和經度從背部弧度度:

// convert to degrees 
lat = lat * 180/Math.PI; 
lon = lon * 180/Math.PI; 

然而,和其它兩個音符:

1)java.awt.Point中的(不清楚這是你所使用的)只能^ h舊整數;你可能想用Point2D.Double來代替;和

2)距離也應測量,包括海里或弧度的分數,所以應該是雙倍。

通過這些編輯,get(50,10,0,0)將起作用。從你的頁面上得到的LAX 66度徑向座標100nm(請記住,分鐘轉換成分數度)的頁面上的工作示例返回34.6141 lat和116.5499 lon,匹配34d 37m和116d 33m。

+0

爲什麼不使用['Math.toRadians'](https://docs.oracle.com/javase/8/docs/api/java/lang/Math.html#toRadians-double-)和['Math.toDegrees' ](https://docs.oracle.com/javase/8/docs/api/java/lang/Math.html#toDegrees-double-)? – bradimus

+1

因爲我正在盯着Hien鏈接的公式網頁,並且在那裏有弧度<-->度數轉換。 –

相關問題