r语言 - Geosphere distHaversine() 和向量的错误长度,应该是 2



我无法解决错误:"错误的长度向量,应该是2"当试图计算(跑道长度)两点之间的距离(跑道阈值/结束)。更糟糕的是,我无法理解像这里的答案R错误:向量的长度错误,应该是2,并将它们应用到我的情况。(跑道末端)位置的简化数据框如下所示:

runways <-  data.frame(
 RWY_ID = c(1,2,3)
,RWY    = c("36R", "36L","01")
,LAT    = c(40.08, 40.12, 40.06)
,LON    = c(116.59, 116.57, 116.62)
,LAT2   = c(40.05, 40.07,40.09)
,LON2   = c(116.6, 116.57, 116.61)
)

使用来自geosphere的distHaversine()函数,我尝试计算距离:

runways <- mutate(runways
                 , CTD = distHaversine( c(LON, LAT), c(LON2, LAT2))
                 )

我不确定我做错了什么。如果我拉出LON LAT位置,它是一个长度合适的数值向量。

myv <- c(runways$LON[1], runways$LAT[1])
myv
[1] 116.59  40.08
str(myv)
num [1:2] 116.6 40.1

您需要操作rowwise,因此distHaversine一次传递一组对,而不是所有行:

runways %>% rowwise() %>% 
    mutate(CTD = distHaversine(c(LON, LAT), c(LON2, LAT2)))
## Source: local data frame [3 x 7]
## Groups: <by row>
## 
## # A tibble: 3 × 7
##   RWY_ID    RWY   LAT    LON  LAT2   LON2      CTD
##    <dbl> <fctr> <dbl>  <dbl> <dbl>  <dbl>    <dbl>
## 1      1    36R 40.08 116.59 40.05 116.60 3446.540
## 2      2    36L 40.12 116.57 40.07 116.57 5565.975
## 3      3     01 40.06 116.62 40.09 116.61 3446.509

或者,distHaversine可以处理矩阵,因此您可以使用cbind代替c:

runways %>% mutate(CTD = distHaversine(cbind(LON, LAT), cbind(LON2, LAT2)))
##   RWY_ID RWY   LAT    LON  LAT2   LON2      CTD
## 1      1 36R 40.08 116.59 40.05 116.60 3446.540
## 2      2 36L 40.12 116.57 40.07 116.57 5565.975
## 3      3  01 40.06 116.62 40.09 116.61 3446.509

在规模上,后一种方法几乎肯定更好,因为按行操作不会利用向量化,因此会变得很慢。

相关内容

  • 没有找到相关文章

最新更新