2016-11-29 58 views
0

给定一个包含纬度和经度的数据帧,我想添加一个简单包含某个半径范围内其他点(同一个数据帧)的点数的列,例如在特定点的10公里内。计算某个半径内的点数

示例数据:

set.seed(1) 
radius<-10 
lat<-runif(10,-90,90) 
long<-runif(10,-180,180) 
id<-1:10 
dat<-cbind(id,lat,long) 

     id  lat   long 
[1,] 1 -42.20844 -105.8491530 
[2,] 2 -23.01770 -116.4395691 
[3,] 3 13.11361 67.3282248 
[4,] 4 73.47740 -41.7226614 
[5,] 5 -53.69725 97.1429112 
[6,] 6 71.71014 -0.8282728 
[7,] 7 80.04155 78.3426630 
[8,] 8 28.94360 177.0861941 
[9,] 9 23.24053 -43.1873354 
[10,] 10 -78.87847 99.8802797 

现在给出的半径可变我希望有一个新的列说,“X”为每个点只包含有不到“半径”,其他的点数。我不关心这些是哪一点。

虽然这R - Finding closest neighboring point and number of neighbors within a given radius, coordinates lat-long主题和答案关闭它并不能解决简单计数的具体问题。这个问题是不同的,因为我需要的半径内的所有点的次数,而不是点

+0

勾股定理,'distance²=(point1x - point2x)²+(point1y - point2y) ²',或者如果你想保存CPU并且不计算平方根,你可以简单地测试'10 2 <((point 1 x - point 2 x)2 +(point 1 y - point 2 y)2)'来知道它是否在半径内。我不知道'R'的语法,所以我无法帮助你,但我相信你可以从这里弄明白。 – Havenard

+0

我实际上是在寻找地理距离,R语法是这里的关键,特别是如何获得该半径内所有点的数量。 – Kathi

+0

@Havenard我们需要使用像Haversine这样的距离度量来找到地球上两个点之间的距离(用经纬度表示),Euclidean距离度量在这里不起作用。 –

回答

2

试试这个:

library(geosphere) 
cbind(dat, X=rowSums(distm (dat[,3:2], 
     fun = distHaversine)/1000 <= 10000)) # number of points within distance 10000 km 

     id  lat   long X 
[1,] 1 -42.20844 -105.8491530 5 
[2,] 2 -23.01770 -116.4395691 5 
[3,] 3 13.11361 67.3282248 5 
[4,] 4 73.47740 -41.7226614 6 
[5,] 5 -53.69725 97.1429112 4 
[6,] 6 71.71014 -0.8282728 6 
[7,] 7 80.04155 78.3426630 6 
[8,] 8 28.94360 177.0861941 5 
[9,] 9 23.24053 -43.1873354 6 
[10,] 10 -78.87847 99.8802797 4 
+0

申请是非常低效的,在这种情况下 –

+0

distm的输出是什么指标?米或公里? – Kathi

+1

@Kathi以米为单位。 –