Java - 根据给定的坐标,方位和距离计算第二个坐标

时间:2016-10-21 16:14:26

标签: java algorithm distance haversine

我找到了计算第二个坐标here的公式。但是当我将它转换为Java时,结果并不像我预期的那样。

private Point get(double lat1, double lon1, double tc, int d) {
    double lat = Math.asin(
                          Math.sin(lat1) * Math.cos(d) 
                        + Math.cos(lat1) * Math.sin(d) * Math.cos(tc)
                        );

    double dlon= Math.atan2(
                          Math.sin(tc) * Math.sin(d) * Math.cos(lat1)
                        , Math.cos(d) - Math.sin(lat1) * Math.sin(lat));
    double lon = ((lon1 - dlon + Math.PI) % (2 * Math.PI)) - Math.PI;

    return new Point(lat, lon);
}

我用简单的例子测试了上面的代码,例如get(50,10,0,0)。所以预期结果将与第一点相同,但这是我得到的结果:

Lat: 1.4432701894877245, lon: -3.8108244707674395

我使用正确的公式计算第二个坐标吗?

[编辑] 这是我尝试转换为java代码的公式

 lat =asin(sin(lat1)*cos(d)+cos(lat1)*sin(d)*cos(tc))
 dlon=atan2(sin(tc)*sin(d)*cos(lat1),cos(d)-sin(lat1)*sin(lat))
 lon=mod( lon1-dlon +pi,2*pi )-pi 

1 个答案:

答案 0 :(得分:1)

如评论中所述,您的公式期望纬度,经度,真实路线和距离都是弧度。

如果你想传递纬度,经度,度数的真实路线和海里距离,你需要在数学下面进行以下转换:

// convert to radians
lat1 = lat1 * Math.PI / 180; 
lon1 = lon1 * Math.PI / 180; 
tc = tc * Math.PI / 180;
d = (Math.PI / (180*60)) * d;

然后将纬度和经度从弧度转换回度:

// convert to degrees
lat = lat * 180 / Math.PI;
lon = lon * 180 / Math.PI;

然而,另外两个注意事项:

1)java.awt.Point(不清楚这是你正在使用的)只能保存整数;你可能想要使用Point2D.Double;和

2)还应测量距离,包括海里或弧度的分数,因此应该是双倍。

通过这些编辑,get(50,10,0,0)将起作用。从你的页面得到的工作示例来自LAX的66nm径向上的100nm的航点 - 得到(33.95,118.4,66,100)(记住分钟转换成分数度)返回34.6141 lat和116.5499 lon,匹配34d 37m和116d 33m。