【问题标题】:Geodesic Distance function in R for sets of usersR中用于用户集的测地距离函数
【发布时间】:2015-02-17 23:53:32
【问题描述】:

我正在尝试计算社交网络用户之间的测地线距离。假设我有 2 个用户 U1 和 U2,我该如何在 R 中声明该函数,以便测地距离函数从包含 1000 个用户的大型数据集中返回任意两个用户之间的距离。

d <- function (U1(lat1,lon1),U2(lat2,lon2))
{
  rad <- pi/180
  a1 <- lat1 * rad
  a2 <- lon1 * rad
  b1 <- lat2 * rad
  b2 <- lon2 * rad
  dlon <- b2 - a2
  dlat <- b1 - a1
  a <- (sin(dlat/2))^2 + cos(a1) * cos(b1) * (sin(dlon/2))^2
  c <- 2 * atan2(sqrt(a), sqrt(1 - a))
  R <- 6378.145
  d <- R * c
  miles <- d*0.621
  return(c(d,miles))
}

上面的代码不起作用。我不确定如何在 R 中的函数定义中声明两个具有 (lat,lon) 坐标的用户。有没有其他方法可以做到这一点,如果我有 1000 个用户的数据集,我可能能够计算测地线任意 2 个用户之间的距离。

【问题讨论】:

    标签: r function social-networking distance euclidean-distance


    【解决方案1】:

    这个库看起来很有前途:

    library(geosphere)
    distm(c(lon1,lat1), c(lon2,lat2))
    

    有两个矩阵:

    distm(
      matrix( c(
        1, 3, 
        2, 2,
        3, 1
      ), nrow = 3, ncol = 2),
    
      matrix( c(
        4, 6, 
        5, 5,
        6, 4,
        3, 1
      ), nrow = 4, ncol = 2)
    )
    

    n 个用户的矩阵和他们之间的距离: # 用户数 n

    # positions
    lat <- rnorm(n, 46, 1) 
    lon <- rnorm(n, 14, 1) 
    
    #distm also accepts a matrix (2 x n):
    cmat <- matrix( c(lat, lon), nrow = n, ncol = 2)
    distm(cmat)
    

    【讨论】:

    • 谢谢您的回答。它工作得很好,但我可以在没有 rnorm 的情况下做到这一点吗?是否有任何具体原因 r norm 的平均值对于 lat 为 46,对于 long 为 14。
    • 我将 rnorm 用作(随机)数据生成器。在您的情况下,将从某些数据库生成 lat 和 lon 向量
    • 我已经从一个数据集中读取了我的 lon1,lat1,类似地从另一个数据集中读取了 lon2,lat2 到上面的 distm 函数中。那么我会读到多少纬度的位置。我有点困惑,因为#positions 和 cmat 矩阵中只有一个纬度
    • 你可以用两个矩阵调用 distm。或者有两点,例如:distm(c(lon1,lat1), c(lon2,lat2))
    • 是的,我已经调用它并成功执行了第 2 行,但我对 cmat c(lat, lon) 部分持怀疑态度,因为我有两个 lon,lat 如何执行 c(lat, lon) 或应该是 cmat
    猜你喜欢
    • 2010-12-14
    • 2018-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-21
    • 2014-07-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多