【问题标题】:distance between lat and long using a matrix使用矩阵的纬度和经度之间的距离
【发布时间】:2019-01-08 03:34:22
【问题描述】:

这是我在矩阵中的数据。它是经纬的。我想要点1和2、2和3、3和4等之间的距离。

    > mat<-as.matrix(b)
    > mat
            buoy.LON buoy.LAT
      [1,] -86.34816 43.19014
      [2,] -86.34337 43.18656
      [3,] -86.34013 43.18268
      [4,] -86.33468 43.17484
      [5,] -86.33091 43.16549
      [6,] -86.32912 43.15925
      [7,] -86.32786 43.14887

    dis<-distGeo(mat[2,],mat[3,])  #distance in meters
    did
    [1] 505.1605

上述公式效果很好,但我想创建一个循环来快速完成此操作,并且我希望将数据添加到矩阵中。

我创建了这个循环

    for (i in mat[1:169,]) {
      distGeo(mat[i,], mat[i+1,])
      }

但我总是得到回报

    196

如何使 for 循环正常工作,以及如何将答案添加到矩阵中?

【问题讨论】:

  • 我对该链接问题的回答使用distHaversine,但我认为您使用geosphere::distGeo 是更好的(椭圆体)计算。 (我可能应该更新那个答案......)
  • 我很难遵循这个例子,当我使用它时,n 项会产生问题。我应该定义 n n
  • 答案不使用n 变量,它使用dplyr::n() 函数......你指的是什么? (不要使用问题本身的任何代码。)

标签: r for-loop matrix geospatial euclidean-distance


【解决方案1】:

在安娜堡?我愿意帮忙。

看起来 distgeo 可以在没有循环的情况下做你想做的事。

distGeo(p1, p2, a=6378137, f=1/298.257223563)

参数

p1 点的经度/纬度。可以是两个数字的向量、2 列的矩阵(第一列是经度,第二列是纬度)或 SpatialPoints* 对象

所以...

distGeo(mat)
#[1]  556.6029  505.1605  977.2286 1083.0404  708.3580 1157.7188

要将其作为列添加到矩阵中,您需要为第一个插槽(或最后一个插槽,具体取决于您希望表示距离的点)添加一个空格:

geodists <- distGeo(mat)
mat <- cbind(mat, dists = c(NA,geodists))
mat
#                            dists
#[1,] -86.34816 43.19014        NA
#[2,] -86.34337 43.18656  556.6029
#[3,] -86.34013 43.18268  505.1605
#[4,] -86.33468 43.17484  977.2286
#[5,] -86.33091 43.16549 1083.0404
#[6,] -86.32912 43.15925  708.3580
#[7,] -86.32786 43.14887 1157.7188

变蓝。

【讨论】:

  • 比我想要的要简单得多,非常感谢!
猜你喜欢
  • 1970-01-01
  • 2021-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-11
  • 2011-04-20
  • 1970-01-01
相关资源
最近更新 更多