计算未来位置

4

我收到了一个实体的信息:

纬度/经度位置 航向(弧度) 速度(以节为单位)

如果假设该实体在恒定高度上沿直线以恒定速度运动,如何计算该实体在任意时间点的纬度/经度位置(或在间隔期内确定其位置)?

(您可以看出,我的数学技能很差)


这是离题的(应该是http://math.stackexchange.com或类似的网站)。 - Oliver Charlesworth
1
@Oli,这个在这里没问题。数学SE真的是针对比这更高级的数学。 - Mike Daniels
@Mike:也许你对于Math SE是正确的。但是这个问题完全独立于编程,所以我不同意它在这里是相关话题。 - Oliver Charlesworth
我该如何将它转移到Math.stackexchange? - hammstacker
1
如果迁移到数学SE,这可能很快被关闭。即使不起作用,您能用代码给我们举个例子吗? - Tim Post
2个回答

2
考虑到Hyperboreus的答案,这里有一个航空公式表:http://williams.best.vwh.net/avform.htm,其中包含了给出起点、角度和距离后计算新的纬度/经度的公式。但需要自己计算距离。不过听起来你已经有了计算距离所需的一切,因为速度只是距离/时间,如果你将其乘以想要使用的时间偏移量,那么就得到了距离。

1节 = 1海里/小时 距离 = 你的时间(十进制小时)* 速度;

以下是示例代码(从上述链接复制):

double lat1 = 0, lon1 = 0;                      // NOTE: these are in radians - remember PI/2 radians = 90 degrees
double d = timeInDecimalHours * speedInKnots;   // so a half hour at 35 knots would be .5 * 35
double tc = usersTrueCourse;                    // aka user's heading
double lat=                                     // this will be in radians!!
    Math.asin(
        Math.sin(lat1) 
        * Math.cos(d)
        + Math.cos(lat1)
        * Math.sin(d)
        * Math.cos(tc)
    );
double lon = 0;
if (Math.cos(lat) == 0) {
    lon = lon1      // endpoint a pole
} else {
    lon = (lon1 - Math.asin(Math.sin(tc)*Math.sin(d)/Math.cos(lat)) + Math.PI % (2*Math.PI))-Math.PI;
}

另外,关于 Hyperboreus 的评论,我相信航空公式考虑到了这样一个事实,即你无法沿着真正的直线移动且仍然保持相对于地球球面的恒定高度。航空公式的炫酷之处在于它们考虑到了这一点,并且计算中全部采用了“大圆”数学。 - Travis
虽然这已经过去了一些年,但这似乎是我能找到的唯一有关该问题的参考资料。 我已经运行了您的代码,但结果似乎不正确。以50.912220795471718 / 11.938057949491478为起点,其弧度值为0.88858588238330805 / 0.20835841751250919,距离为0.666,航向为14.23,我将得到一个结果为0.61090132801892361 / -0.64214850458155048,转换回度数为35.002068 / -36.792399。 由于上面的链接已经不存在,而我也无法找到类似的资源,您能否检查一下结果? - user826955
实际上我已经解决了这个问题。我找到了https://gis.stackexchange.com/questions/5821/calculating-latitude-longitude-x-miles-from-point和http://www.edwilliams.org/avform147.htm#Dist,这些帮了我很多。我在`mod(a, b)部分犯了一个错误,此外距离需要用弧度表示。在你的例子中,你需要添加double d = (M_PI/(180*60))*distanceNm;。当然,在计算lat之前必须完成这个步骤,因为它使用了d`。 - user826955

2
首先,你不能在一条直线上移动并同时保持恒定高度。你的纬度/经度坐标是基于一个参考椭球体(很可能是WGS84)的。 有各种库或数据库扩展程序具有大量函数来解决这些问题。例如,Postgis就是其中之一。它们大多数都是免费的、经过测试的并且有效。我不建议尝试自己实现此功能(假设地球是半径为r的完美球体),因为你必须考虑你所使用的参考椭球体。

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