簡體   English   中英

如何找到 R 中連續坐標之間的距離?

[英]How can I find the distance between consecutive coordinates in R?

我有一個 dataframe 結構類似於下面創建的:

id <- rep(c("a", "b", "c", "d"), each = 3)
date <- seq(as.Date("2019-01-30"), as.Date("2019-02-10"), by="days")
lon <- c(-87.1234, -86.54980, -86.234059, -87.2568, -87.65468, -86.54980, -86.234059, -86.16486, -87.156546, -86.234059, -86.16486, -87.156546)
lat <- c(26.458, 26.156, 25.468, 25.157, 24.154, 24.689, 25.575, 25.468, 25.157, 24.154, 26.789, 26.456)
data <- data.frame(id, date, lon, lat)
data <- data %>% arrange(id, date)

我想測量按 id 分組的連續點之間的距離。 我不想要距離矩陣,這就是我不使用 raster::pointDistance 的原因。 我嘗試將每個唯一 ID 分成它自己的 sf dataframe(實際上我有 ~400 個 ID,因此由於大小的原因我不得不為實際計算分開)並使用以下代碼:

#put rows for each id in their own dataframes
un1 <- unique(data$id)
for(i in seq_along(un1)) 
  assign(paste0('id', i), subset(data, id == un1[i]))
#create point distance function
pt.dist <- function(dat){dat$pt.dist <- st_distance(dat, by_element=TRUE)
  return(dat)}
#run function across every dataframe in working environment
e <- .GlobalEnv
nms <- ls(pattern = "id", envir = e)
for(nm in nms) e[[nm]] <- pt.dist(e[[nm]])

當我運行它時,我得到的只是一個幾何列,其中 lon 和 lat 成對列出。 我也試過 segclust2d::calc_distance 如下:

distance <- function(dat){calc_dist(dat, coord.names = c("lon", "lat"), smoothed = FALSE)}
for(nm in nms) e[[nm]] <- distance(e[[nm]])

它返回一列,其中距離均為 0 米。

任何幫助將不勝感激!

geosphere::dist*支持這個。 最准確的是distVincentyEllipsoid (盡管對於較大的數據它可能會更慢),其次是distVincentySpheredistHaversine 它的返回值以米為單位。

dplyr

library(dplyr)
data %>%
  group_by(id) %>%
  mutate(dist = c(NA, geosphere::distVincentyEllipsoid(cbind(lon, lat)))) %>%
  ungroup()
# # A tibble: 12 x 5
#    id    date         lon   lat    dist
#    <chr> <date>     <dbl> <dbl>   <dbl>
#  1 a     2019-01-30 -87.1  26.5     NA 
#  2 a     2019-01-31 -86.5  26.2  66334.
#  3 a     2019-02-01 -86.2  25.5  82534.
#  4 b     2019-02-02 -87.3  25.2     NA 
#  5 b     2019-02-03 -87.7  24.2 118175.
#  6 b     2019-02-04 -86.5  24.7 126758.
#  7 c     2019-02-05 -86.2  25.6     NA 
#  8 c     2019-02-06 -86.2  25.5  13744.
#  9 c     2019-02-07 -87.2  25.2 105632.
# 10 d     2019-02-08 -86.2  24.2     NA 
# 11 d     2019-02-09 -86.2  26.8 291988.
# 12 d     2019-02-10 -87.2  26.5 105423.

基地 R

我們可以用ave得到同樣的結果。 因為它只迭代單個列,所以我們將行索引作為要分組的第一個參數傳遞。 因為它將返回值強制為與第一個參數相同的class ,所以我們將行索引轉換為numeric

data$dist2 <- ave(
  as.numeric(seq_len(nrow(data))),  # values to use in calc
  data$id,                          # grouping variable(s)
  FUN = function(i) c(NA, geosphere::distVincentyEllipsoid(data[i, c("lon", "lat")]))
)
data
#    id       date       lon    lat     dist2
# 1   a 2019-01-30 -87.12340 26.458        NA
# 2   a 2019-01-31 -86.54980 26.156  66334.13
# 3   a 2019-02-01 -86.23406 25.468  82534.47
# 4   b 2019-02-02 -87.25680 25.157        NA
# 5   b 2019-02-03 -87.65468 24.154 118175.40
# 6   b 2019-02-04 -86.54980 24.689 126757.93
# 7   c 2019-02-05 -86.23406 25.575        NA
# 8   c 2019-02-06 -86.16486 25.468  13743.74
# 9   c 2019-02-07 -87.15655 25.157 105631.82
# 10  d 2019-02-08 -86.23406 24.154        NA
# 11  d 2019-02-09 -86.16486 26.789 291988.42
# 12  d 2019-02-10 -87.15655 26.456 105422.87

在內部,對FUN function 的第二次調用為"b" id 組傳遞了i=c(4,5,6) 這些數字不需要連續; 事實上, ave優於其他組處理函數的一個優勢是它始終以與輸入相同的順序返回,因此將其值重新分配回原始幀是安全的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM