从一个坐标到另一个坐标

Iva*_*n T 17 java geolocation bearing

我实施了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;
}
Run Code Online (Sandbox Code Playgroud)

Iva*_*n T 49

这是最终的代码:

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;
}
Run Code Online (Sandbox Code Playgroud)


DNA*_*DNA 18

你的括号()在错误的地方.

您正在以弧度为单位添加度数,这将无效.toDegrees()将为您进行从弧度到度数的转换,然后在获得度数值后进行标准化.

你有:

 Math.toDegrees( (Math.atan2(y, x))+360 ) % 360;
Run Code Online (Sandbox Code Playgroud)

但你需要:

( Math.toDegrees(Math.atan2(y, x)) + 360 ) % 360;
Run Code Online (Sandbox Code Playgroud)

也请记住,所有的投入Math.sin(),Math.cos()和所有其他的三角函数必须弧度.如果您的输入是度数,则需要先使用它们进行转换Math.toRadians().


MAn*_*aik 8

从一个坐标到另一个坐标和找到北,东,南,weast :)在此输入图像描述

     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;
        }
            }
Run Code Online (Sandbox Code Playgroud)