代码之家  ›  专栏  ›  技术社区  ›  Neal Barsch

确定数据中彼此最远的一组坐标。表R

  •  0
  • Neal Barsch  · 技术社区  · 6 年前

    我有这样的数据:

     library(data.table)
     dtorig <- data.table(x=1:100,lat=(sample(c(800:900),100))/100, lon=(sample(c(3800:3900),100))/100)
    

    我想知道DTorig中彼此最远的行的位置。我的尝试(不起作用)如下:

     ###NOT WORK
      library(geosphere)
      extremep <- chull(dtorig[, c(3,2)])
      extremepoints <- dtorig[extremep,]
      wmax <- sapply(1:NROW(extremepoints), function(i) which.max(distm(extremepoints[i, c(3,2)],fun=distHaversine)))
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   Ameya    6 年前

    这有帮助吗?

    library(data.table)
    library(geosphere)
    dtorig <- data.table(x=1:100,lat=(sample(c(800:900),100))/100, lon=(sample(c(3800:3900),100))/100)
    x <- distm(x = as.matrix(dtorig[, .(lon, lat)]), fun=distHaversine)
    which(x == max(x), arr.ind = TRUE)
    #      row col
    # [1,]  50  27
    # [2,]  27  50
    

    第27排和第50排相距最远。

        2
  •  1
  •   Calum You    6 年前

    不使用 data.table geosphere ,但这里有一个 sf 另一种方法说明如何从密度矩阵中找到正确的距离 st_distance . 在这里您可以看到:

    1. 使用 set.seed 所以你应该能够复制这个
    2. 将坐标列转换为 SF 分数 st_as_sf 一个合适的 crs
    3. 获取所有行之间的距离 by_element = FALSE 在里面 St_距离
    4. 移除距离矩阵的复制下三角形 lower.tri
    5. 添加rowid列以便 gather 将矩阵的其余部分上移到单个距离列中
    6. 按距离排序以查看 arrange(desc()) .
    7. 突出显示 plot .
    library(tidyverse)
    library(sf)
    set.seed(12345)
    dtorig <- tibble(
      x = 1:100,
      lat = (sample(c(800:900), 100)) / 100,
      lon = (sample(c(3800:3900), 100)) / 100
    )
    
    sforig <- st_as_sf(dtorig, coords = c("lon", "lat"), crs = 4326)
    
    distances <- sforig %>%
      st_distance(by_element = FALSE) %>%
      unclass %>% 
      `[<-`(lower.tri(., diag = TRUE), NA) %>%
      as_tibble() %>%
      rowid_to_column %>%
      gather(colid, distance, starts_with("V"), na.rm = TRUE) %>%
      arrange(desc(distance))
    distances
    #> # A tibble: 4,950 x 3
    #>    rowid colid distance
    #>    <int> <chr>    <dbl>
    #>  1    30 V68    138244.
    #>  2    30 V75    137957.
    #>  3    19 V30    135068.
    #>  4    48 V78    131849.
    #>  5    40 V90    131280.
    #>  6    48 V90    130946.
    #>  7    40 V78    130035.
    #>  8    50 V68    128851.
    #>  9    45 V48    128805.
    #> 10    40 V45    128531.
    #> # ... with 4,940 more rows
    
    sforig %>%
      st_geometry %>% 
      plot(col = "red", pch = 19)
    
    sforig %>% 
      filter(x %in% c(30, 68)) %>%
      st_geometry %>% 
      plot( add = TRUE, col = "blue", pch = 19)
    

    创建于2018-07-25 reprex package (v0.2.0版)。