22

我很难理解一些三角函数。我试图从一开始的纬度和日志以及距离和方位推导出目的地纬度和经度。

幸运的是,我找到了一个了不起的网站,它准确地描述了我需要的功能: 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

我没有得到我做错的地方。请任何人都可以帮助我找出问题所在。

提前感谢。:-)

4

2 回答 2

17

你的问题在你的第一行。

尝试

double dist = 150.0 / 6371.0;

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

于 2012-04-12T07:50:33.453 回答
13

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

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 - 要移动点的距离
  • 轴承- 一个角度,您要移动该点的方向。0 朝北,90 - 东,180 - 南,270 - 西。和所有之间,即 45 是东北。
  • earthRadiusInMetres - 以米为单位的地球半径。

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

于 2017-04-05T08:00:18.147 回答