我很难将头部包裹在一些三角函数中。我试图从开始lat和日志以及距离和方位推断出目的地纬度和经度。
幸运的是,我找到了一个惊人的网站,它描述了我需要的功能: 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
我没有得到我在做错的地方。请任何人帮我解决问题。
提前完成。 : - )
答案 0 :(得分:13)
您的问题出在第一行。
尝试
double dist = 150.0 / 6371.0;
原因是150/6371
计算为0
,因为它执行整数除法(而不是浮点除法)。即使结果存储在double
中也是如此。您可以通过使两个数字之一成为浮点字面值来强制浮点除法。
答案 1 :(得分:7)
如果有人需要一个计算从其他点移动一定距离的点坐标的函数,下面是工作代码。对我来说,它只是移动了一点距离。
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));
}
如果您希望以英里为单位输入,则可以将半径更改为6371;如果您想以英里为单位输入,则可以将半径更改为英里。