2012-04-12 156 views
16

我很難繞過一些三角函數。我試圖從一開始經緯度和日誌以及距離和方位推導出一個目標緯度和經度。根據方位角和距離計算緯度和長度

幸運的是,我發現了一個驚人的網站,它描述正是我所需要的功能: http://www.movable-type.co.uk/scripts/latlong.html「目標點一定距離,並從起始點軸承」 我想在我的Java程序,但它不是爲我工作。我按照網站的說法部署了它。這裏是我的代碼:

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提前。 :-)

+4

這是一些不錯的小型圖書館來幫助這一點,例如http://code.google.com/p/simplelatlng/wiki/GettingStarted – 2012-04-12 07:51:30

+0

馬克 - 非常感謝這個小小的聯結。 – Vaiden 2013-07-17 14:05:50

回答

13

你的問題在你的第一行。

嘗試

double dist = 150.0/6371.0; 

其原因是,被150/6371作爲0計算,因爲它執行整數除法(而不是浮點除法)。即使結果存儲在double中也是如此。您可以通過使兩個數字中的一個成爲浮點數字來強制進行浮點除法。

+1

有人能告訴我150是什麼,是幾英里嗎?我正在考慮實施這個相同的場景 – devdar 2013-05-06 02:15:27

+2

我認爲這是千米,因爲地球半徑。 – lcguida 2013-06-26 21:27:46

+0

我已經使用這個轉換緯度和經度:22.369131978392012,114.11357168108225到 起始點緯度,經度:0.39041812966877465,1.991668182365113 與移動距離(單位:公里)爲0。06574748992919921 請問您能告訴我計算距離的方法嗎? – 2016-10-14 09:48:16

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。