2012-02-26 127 views
15

我實現了http://www.movable-type.co.uk/scripts/latlong.html的「軸承」公式。但看起來高度不準確 - 我懷疑我的實施中存在一些錯誤。你能幫我找到它嗎?我的代碼如下:從一個座標到另一個座標

protected static double bearing(double lat1, double lon1, double lat2, double lon2){ 

double longDiff= lon2-lon1; 
double y = Math.sin(longDiff)*Math.cos(lat2); 
double x = Math.cos(lat1)*Math.sin(lat2)-Math.sin(lat1)*Math.cos(lat2)*Math.cos(longDiff); 

return Math.toDegrees((Math.atan2(y, x))+360)%360; 
} 

回答

13

你只是有你的括號()在錯誤的地方。

您正在向以弧度表示的值添加度數,這不起作用。 toDegrees()將爲你做從弧度到度的轉換,然後你做了規範化,一旦你有一個度數值。

您有:

Math.toDegrees((Math.atan2(y, x))+360) % 360; 

但是,你需要:

(Math.toDegrees(Math.atan2(y, x)) + 360) % 360; 

也請記住,所有輸入Math.sin()Math.cos()和所有其他的三角函數必須弧度。如果您的輸入是度數,則需要先使用Math.toRadians()進行轉換。

+0

權!但仍然輸入參數是 ProcJobLocation.bearing(53.944592,27.595215,55.745752,37.630768); 和輸出是359.11592632310266。 仍然有一些錯誤。 – 2012-02-26 23:03:44

+1

您的輸入似乎是度數。你需要使用'Math.toRadians()'將它們轉換爲弧度,否則'Math.sin()','Math.cos()'等會給出錯誤的結果。 – DNA 2012-02-26 23:07:00

+0

謝謝你的幫助! – 2012-02-27 09:33:14

43

下面是最終代碼:

protected static double bearing(double lat1, double lon1, double lat2, double lon2){ 
    double longitude1 = lon1; 
    double longitude2 = lon2; 
    double latitude1 = Math.toRadians(lat1); 
    double latitude2 = Math.toRadians(lat2); 
    double longDiff= Math.toRadians(longitude2-longitude1); 
    double y= Math.sin(longDiff)*Math.cos(latitude2); 
    double x=Math.cos(latitude1)*Math.sin(latitude2)-Math.sin(latitude1)*Math.cos(latitude2)*Math.cos(longDiff); 

    return (Math.toDegrees(Math.atan2(y, x))+360)%360; 
} 
+0

其中lat1,lon1,lat2和lon2以弧度表示!可能不會。那麼爲什麼你重命名經度1和經度2? – Radu 2016-12-12 14:13:01

8

從一個軸承座標到另一個,找到北,東,南,weast :) enter image description here

 public class FindBearing { 
      public static void main(String[] args) { 
       System.out.println(" Your Result >>> "+FindBearing.bearing(19.2859590, 73.4966430, 19.2861020, 73.4988090));  
      } 
      protected static String bearing(double lat1, double lon1, double lat2, double lon2){ 
      double longitude1 = lon1; 
      double longitude2 = lon2; 
      double latitude1 = Math.toRadians(lat1); 
      double latitude2 = Math.toRadians(lat2); 
      double longDiff= Math.toRadians(longitude2-longitude1); 
      double y= Math.sin(longDiff)*Math.cos(latitude2); 
      double x=Math.cos(latitude1)*Math.sin(latitude2)-Math.sin(latitude1)*Math.cos(latitude2)*Math.cos(longDiff); 
      double resultDegree= (Math.toDegrees(Math.atan2(y, x))+360)%360; 
      String coordNames[] = {"N","NNE", "NE","ENE","E", "ESE","SE","SSE", "S","SSW", "SW","WSW", "W","WNW", "NW","NNW", "N"}; 
      double directionid = Math.round(resultDegree/22.5); 
      // no of array contain 360/16=22.5 
      if (directionid < 0) { 
       directionid = directionid + 16; 
       //no. of contains in array 
      } 
      String compasLoc=coordNames[(int) directionid]; 

      return resultDegree+" "+compasLoc; 
     } 
      } 
2

一點點清理@IvanT answer

public static double bearingInRadians(LatLng src, LatLng dst) { 
    double srcLat = Math.toRadians(src.getLatitude()); 
    double dstLat = Math.toRadians(dst.getLatitude()); 
    double dLng = Math.toRadians(dst.getLongitude() - src.getLongitude()); 

    return Math.atan2(Math.sin(dLng) * Math.cos(dstLat), 
      Math.cos(srcLat) * Math.sin(dstLat) - 
       Math.sin(srcLat) * Math.cos(dstLat) * Math.cos(dLng)); 
} 

public static double bearingInDegrees(LatLng src, LatLng dst) { 
    return Math.toDegrees((bearingInRadians(src, dst) + Math.PI) % Math.PI); 
} 

其中LatLng是:

public final class LatLng { 
    private final double latitude; 
    private final double longitude; 

    public LatLng(double latitude, double longitude) { 
     this.latitude = latitude; 
     this.longitude = longitude; 
    } 

    public double getLatitude() { 
     return latitude; 
    } 

    public double getLongitude() { 
     return longitude; 
    } 
} 
相關問題