使用lon和lat坐标在R中查找半径内的点数

时间:2016-08-18 02:01:16

标签: r

我有一组经度和纬度坐标的点。 我想找出每个点的特定半径内的点数。 我查看了RANN和FNN包,我找到的唯一相关函数是RANN包中的nn2()。但是,我不想预设必须识别的最大或最小点(nn2函数中的k变量)。另外,即使我在nn2中尝试了k(点数)和半径的几个不同值,我总能得到相同的结果。即使半径设置为非常小或为零。 这是我用过的代码的一个例子

points<- nn2(mydata, k=100, radius = 0.02)

如何在R中做到这一点?

1 个答案:

答案 0 :(得分:4)

要从nn2获得您想要的内容,您需要:

  1. 指定searchtype"radius"。如果未指定searchtypesearchtype将设置为standard,并忽略radius输入。
  2. k指定为nrow(mydata),因为k是要计算的最大邻居数。
  3. 您呼叫nn2的方式将返回100 mydatamydataradius中每个点的library(RANN) set.seed(123) ## simulate some data lon = runif(100, -99.1, -99) lat = runif(100, 33.9, 34) ## data is a 100 x 2 matrix (can also be data.frame) mydata <- cbind(lon, lat) radius <- 0.02 ## your radius res <- nn2(mydata, k=nrow(mydata), searchtype="radius", radius = radius) ## prints total number of nearest neighbors (for all points) found using "radius" print(length(which(res$nn.idx>0))) ##[1] 1224 res1 <- nn2(mydata, k=100, radius = radius) ## prints total number of nearest neighbors (for all points) found using your call print(length(which(res1$nn.idx>0))) ##[1] 10000 radius <- 0.03 ## increase radius res <- nn2(mydata, k=nrow(mydata), searchtype="radius", radius = radius) ## prints total number of nearest neighbors (for all points) found using "radius" print(length(which(res$nn.idx>0))) ##[1] 2366 res1 <- nn2(mydata, k=100, radius = radius) ## prints total number of nearest neighbors (for all points) found using your call print(length(which(res1$nn.idx>0))) ##[1] 10000 最近邻居。因此,您将获得任何?nn2的相同结果。例如:

    nn2

    请注意,根据其文档nn.idxnrow(query) x k会返回包含两个元素的列表:

    1. kmydata矩阵,其中每一行包含queryquery=mydata最近邻居的行索引到集合中该行的点searchtype="radius"中的查询点数。在我们的两个电话中,m < k。使用k - m进行调用时,如果给定半径内有0个邻居,则这些索引值的mydata将设置为nn.dist。由于查询点集与nrow(query) x k相同,因此将包含该点本身的索引。

    2. nn.idxnn.idx矩阵,其中每个元素包含0中相应最近邻居的欧几里德距离。在这里,如果nn.dist中的相应元素为100,则mydata中的值设置为1.340781e + 154。

    3. 通过您的通话,您length(which(res1$nn.idx>0))==10000中的每个点都会获得radius最近邻居,因此nn2无论该示例中的nrow(mydata) x nrow(mydata)是什么。

      最后,你应该注意,因为radius在你的情况下会返回两个nn2,如果你有很多分数,它很容易压倒你的记忆。

      更新以专门生成获取给定半径内邻居数量的结果。

      要计算数据中每个点的res <- nn2(mydata, k=nrow(mydata), searchtype="radius", radius = radius) 内的邻居数量,请拨打count <- rowSums(res$nn.idx > 0) - 1

      query=mydata

      然后,执行此操作:

      k=nrow(mydata)

      注意:

      1. 由于res$nn.idxnrow(mydata) x nrow(mydata)生成的i将是res$nn.idx,如上所述。
      2. i 的每一行query与<{1}}中的行i对应,这是query=mydata点中的ip[i]。请致电i - 点res$nn.idx
      3. p[i] 的每一行mydata包含 radius 的邻居的行索引,以填充该行矩阵(因为并非p[i]中的所有点都在p[i]的{​​{1}}内。
      4. 因此,可以通过在行中查找大于0的值然后计算它们来找到rowSums(res$nn.idx > 0)的邻居数。这是res$nn.idxquery=mydata的每一行所做的事情。
      5. 最后,因为1,被查询的点在于计数本身。也就是说,一个点是它自己最近的邻居。因此,从这些计数中减去count以排除它。
      6. 结果i将是计数的向量。第radius个元素是iquery=mydata到{{1}}点内的邻居数。{{1}}。

        希望这很清楚。