从方位角和距离计算纬度和经度

23

我很难理解一些三角学问题。我试图从起点纬度和经度以及距离和方位角推导出目标纬度和经度。

幸运的是,我发现了一个很棒的网站,它描述了我所需要的确切函数: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

我不知道哪里出错了。请问有人能帮我找出问题吗?

先行致谢。:-)


马克 - 非常感谢这个小连接。 - Vaiden
2个回答

19

您的问题在第一行。

尝试

double dist = 150.0 / 6371.0;
原因是 150/6371 被计算为 0,因为它进行整数除法(而不是浮点除法)。即使结果被存储在一个 double 中,这也是正确的。您可以通过将其中一个数字设置为浮点数字面值来强制执行浮点除法。

1
有人能告诉我这里的150是什么,是英里吗?我正在考虑实现相同的情况。 - devdar
2
我认为是公里,考虑到地球半径。 - lcguida
我已经使用这个工具将纬度和经度: 22.369131978392012,114.11357168108225 转换为起点纬度,经度: 0.39041812966877465,1.991668182365113,并且移动距离(以公里为单位)为0.06574748992919921。请问您能告诉我计算两点之间距离的方法吗? - Jeff Bootsholz
150 绝对是公里。请看下面我的回答。 - kiedysktos

14

如果有人需要一个函数,可以根据某个点移动一定距离来计算点的坐标,请看下面的可用代码。对我而言,这只是将一个点移动了一些距离。

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 - 您希望将该点移动的距离(以米为单位)
  • bearing - 角度,指向您希望移动点的方向。 0表示向北,90表示向东,180表示向南,270表示向西。 包括所有中间角度,例如45表示东北。
  • earthRadiusInMetres - 地球半径(以米为单位)。

如果要以公里为单位输入,请将半径更改为6371;如果要以英里为单位输入,请将其更改为英里。


我只有 x 和 y 坐标,如何获取纬度和经度? - Gen
1
非常感谢。我卡在这里有一段时间了。 - Dinesh Shekhawat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接