从轴承和距离计算纬度和长度

我很难将头部缠绕在一些三角函数上。 我试图从开始lat和日志以及距离和方位推导出目的地纬度和经度。

幸运的是,我找到了一个惊人的网站,它描述了我需要的function: 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 

我没有得到我在做错的地方。 请任何人帮我解决问题。

Thanx提前。 🙂

你的问题出在你的第一行。

尝试

 double dist = 150.0 / 6371.0; 

原因是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)); } 
  • 纬度经度 – 入口点坐标
  • distanceInMetres – 要移动点的距离
  • 轴承 – 一个角度,您想要移动点的方向。 0朝向北,90-东,180-南,270-西。 所有之间,即45是东北。
  • earthRadiusInMetres – 以米为单位的地球半径。

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