从一个坐标到另一个坐标的轴承

2022-09-02 11:08:50

我从 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;
}

答案 1

以下是最终代码:

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;
}

答案 2

你只是把括号放在了错误的地方。()

您正在以弧度为单位向值添加度数,这不起作用。 将为您进行从弧度到度的转换,然后一旦您具有度值,就可以进行归一化。toDegrees()

你有:

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

但您需要:

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

还要记住,所有 输入和所有其他三角函数都必须以弧度为单位。如果输入是度数,则需要先使用它们进行转换。Math.sin()Math.cos()Math.toRadians()


推荐