10

我有一个纬度和经度值列表,我试图找出它们之间的距离。使用标准的大圆方法,我需要找到:

acos(sin(lat1)*sin(lat2) + cos(lat1)*cos(lat2) * cos(long2-long1))

并将其乘以地球的半径,以我使用的单位表示。只要我们取 acos 的值在 [-1,1] 范围内,这就是有效的。如果它们稍微超出这个范围,它会返回NaN,即使差异是由于四舍五入造成的。

我遇到的问题是,有时,当两个纬度/经度值相同时,这会给我一个NaN错误。并非总是如此,即使对于同一对数字,但总是列表中的相同数字。例如,我让一个人停在沙漠的路上:

Time  |lat     |long
1:00PM|35.08646|-117.5023
1:01PM|35.08646|-117.5023
1:02PM|35.08646|-117.5023
1:03PM|35.08646|-117.5023
1:04PM|35.08646|-117.5023

例如,当我计算连续点之间的距离时,第三个值将始终为NaN,即使其他值不是。这似乎是 R 舍入的一个奇怪错误。

4

2 回答 2

8

如果不查看您的数据(尝试),则无法准确判断dput,但这很可能是常见问题解答 7.31的结果。

(x1 <- 1)
## [1] 1
(x2 <- 1+1e-16)
## [1] 1
(x3 <- 1+1e-8)
## [1] 1
acos(x1)
## [1] 0
acos(x2)
## [1] 0
acos(x3)
## [1] NaN

也就是说,即使您的值非常相似以至于它们的印刷表示相同,它们仍可能不同:有些会在内部.Machine$double.eps,有些则不会...

确保输入值受 [-1,1] 限制的一种方法是使用pmaxand pminacos(pmin(pmax(x,-1.0),1.0))

于 2012-12-24T23:02:28.233 回答
0

一个简单的解决方法是使用 pmin(),如下所示:

acos(pmin(sin(lat1)*sin(lat2) + cos(lat1)*cos(lat2) * cos(long2-long1),1))

它现在确保精度损失导致的值不高于 1。

然而,这并不能解释正在发生的事情。

(编辑:Matthew Lundberg 指出我需要使用 pmin 让它与矢量化输入一起工作。这解决了让它工作的问题,但我仍然不确定它为什么舍入不正确。)

于 2012-12-24T22:55:16.390 回答