1

我是 R 编程的新手,但我正在计算长途客机飞行的大圆距离,我已经尝试过rdist.earth()使用 Fields 包、soDistsN1()sp和其他命令。另外,我在搜索中几乎用尽了谷歌。在 Matlab 中很容易做到这一点,但我似乎无法在 R 中找到方法。

问题是当我增加数据分辨率(计算的航点数量)时,我的总距离变得混乱。我猜这是因为我如何总结航点之间的总距离。有任何想法吗?

我尝试过的一个例子:

data <- read.csv("FDM_test_Flight.csv")
library(fields)
fix <- cbind(data$LON, data$LAT)
fix_2 <- window(fix, deltat=500) # every 500th position I have 25,540 position readings                      
gcd <- rdist.earth(fix_2, miles=FALSE, R=6371)
sum(gcd)
4

3 回答 3

4

rdist.earth计算所有对之间的距离,因此通过对整个矩阵求和,您不仅仅是获得连续观察之间的距离之和。

library(fields)
lonlat <- matrix(-92:-80,c(1:7,6:1))
out<- rdist.earth ( ozone2$lon.lat)
sum(out[row(out)==col(out)+1])  ## add first off-diagonal

但是@SimonO101 的解决方案更有效:如果你仔细观察rdist.earth你会发现它或多或少是在做什么。

于 2013-03-22T14:38:22.753 回答
3

您可以使用像这样的大圆距离公式自己计算它们......

r <- 6371 # radius of the Earth
data <- read.csv("FDM_test_Flight.csv")

# Convert to radians and make two vectors of point A and point B
x <- length(data$LON)
lon <- data$LON[1:(x-1)] * pi/180
lat <- data$LAT[1:(x-1)] * pi/180
lon2 <- data$LON[2:x] * pi/180
lat2 <- data$LAT[2:x] * pi/180

#Calculate distances
dist <- sum(acos(sin( lat ) * sin( lat2 ) + cos( lat ) * cos( lat2 ) * cos( lon2 -lon ) ) * r )

由于r以 Km 为单位给出,因此您的大圆距离将为 Km。

于 2013-03-22T12:25:41.950 回答
0

如果您只对 gcd 矩阵中的非对角矩阵值(大小为一)求和,您应该得到您需要的东西。正如 Ben Bolker 上面所说, rdis.earth() 计算“所有配对”之间的距离。现在它是如何工作的:例如,如果您有三个位置:1、2 和 3。您需要 dist(1,2) + dist(2,3) 任何 n 个点的相同模式都将成立。因此,这些信息已经在 rdis.earth 中。只需提取您需要的内容并总结它们。这里-(对不起 for 循环)

sum(gcd) #but this is too large, it's summing all the pairings!


limit <- dim(gcd)[1] - 1

for(i in 1 :limit ){
  sum_off_dia[i]<- gcd_data[i,i+1]
}
sum(sum_off_dia)
于 2013-03-22T17:01:22.883 回答