用高数据分辨率计算r编程中的大圆距离

时间:2013-03-22 12:04:01

标签: r geospatial distance

我是R编程的新手,但我正在计算一架长途客机飞行的大圆距离,我已尝试rdist.earth()来自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)

3 个答案:

答案 0 :(得分: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的胆量,你会发现它或多或少都在做什么。

答案 1 :(得分:3)

您可以使用Great Circle distances的公式自行计算它们......

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。

答案 2 :(得分:0)

如果你只从你的gcd矩阵求出非对角矩阵值(大小为1),你应该得到你需要的东西。正如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)