【问题标题】:Calculating great circle distance in r programming with high data resolution在具有高数据分辨率的 r 编程中计算大圆距离
【发布时间】:2013-03-22 12:04:00
【问题描述】:

我是 R 编程新手,但我正在计算长途客机飞行的大圆距离,我尝试了 Fields 包中的 rdist.earth()sp 包中的 soDistsN1() 和其他命令.另外,我在搜索中几乎用尽了谷歌。在 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)

【问题讨论】:

  • 顺便看看geosphere包
  • 这也有助于人们测试您是否可以将dput(head(data)) 的输出粘贴到您问题的代码块中。然后我们可以在 R 中复制/粘贴并重新创建您的部分数据,以检查您的数据是否符合预期以及我们的代码是否正常工作。干杯!

标签: r geospatial distance


【解决方案1】:

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 的内容,您会发现它或多或少是在做的。

【讨论】:

    【解决方案2】:

    您可以像这样使用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 以公里为单位,您的大圆距离将为公里。

    【讨论】:

      【解决方案3】:

      如果您只对 gcd 矩阵中的非对角矩阵值(大小为 1)求和,则应该得到您需要的值。正如 Ben Bolker 上面所说, rdis.earth() 计算“所有配对”之间的距离。 现在它是如何工作的: 例如,如果您有三个位置:1、2 和 3。您需要 距离(1,2)+距离(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)
      

      【讨论】:

      • 除了效率较低之外,这与我的解决方案有何不同? (我示例中的最后一行代码将非对角线值相加。)
      • 很公平。我同意我的代码更“神奇”,并且在短期内for 循环更容易理解。从长远来看,矢量化解决方案 (1) 更高效(有时效率更高)和 (2) 通常更紧凑,这有助于以自己的方式提高代码的可读性(例如,比较 v=0; for (i in 1:nrow(m)) { for (j in 1:ncol(m)) v &lt;- v + m[i,j] }sum(m) ...
      猜你喜欢
      • 2017-03-09
      • 2011-01-06
      • 1970-01-01
      • 2011-05-02
      • 2012-12-23
      • 2022-01-20
      • 1970-01-01
      • 2018-09-25
      • 2022-09-29
      相关资源
      最近更新 更多