Java 从轴承和距离计算横向和纵向

Java 从轴承和距离计算横向和纵向,java,Java,我在三角学的问题上绞尽脑汁。我试图从起点纬度、对数、距离和方位推断目的地纬度和经度 幸运的是,我发现了一个令人惊叹的网站,它准确地描述了我需要的功能: “目标点与起点的给定距离和方位” 我在java程序中尝试了它,但它对我不起作用。我按照网站上说的部署了它。这是我的密码: double dist = 150/6371; double brng = Math.toRadians(90); double lat1 = Math.toRadians(26.88288045572338); double

我在三角学的问题上绞尽脑汁。我试图从起点纬度、对数、距离和方位推断目的地纬度和经度

幸运的是,我发现了一个令人惊叹的网站,它准确地描述了我需要的功能: “目标点与起点的给定距离和方位” 我在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提前支付。:-)

您的问题在第一行

试一试


原因是
150/6371
被计算为
0
,因为它执行整数除法(而不是浮点除法)。即使结果存储在
double
中,也是如此。您可以通过将两个数字中的一个设为浮点文字来强制进行浮点除法。

如果任何人需要一个函数来计算从移动一定距离的另一个点开始的点坐标,下面是工作代码。对我来说,它只是将一个点移动一段距离

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));
}
  • 纬度经度-入口点坐标
  • 距离以米为单位-要移动点的距离
  • 方位-要向其移动点的角度和方向。0朝北,90朝东,180朝南,270朝西。而这两者之间,即45是东北部
  • 地球半径米数地球半径米数

如果您想以公里为单位输入,可以将半径更改为6371;如果您想以英里为单位输入,可以将半径更改为英里。

有一些很好的小库可以帮助您实现这一点,例如Mark-非常感谢您的小连接。有人能告诉我150是什么,是英里吗?我正在考虑实现相同的场景,我认为它是公里,给定地球半径。我用它将纬度和经度:22.369131978392012114.11357168108225转换为起点纬度,经度:0.39041812966877465,1.991668182365113,移动距离(以公里为单位)作为0.06574748992919921,你能告诉我计算?150之间的距离的方法吗?肯定是以公里为单位的。请看下面我的答案。我只有x和y坐标,我如何才能得到很多的纬度和长腿。我在这上面呆了很长时间。
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));
}