有没有办法找到与纬度/经度点关联的值,该值落在其他纬度/经度点的半径之内?

时间:2019-05-30 12:44:27

标签: r latitude-longitude

我在数据表中有超过1000行的纬度/经度数据,用于美国不同社区。这些社区中有一些是竞争对手,而其他则是我们自己的。每个社区都有许多单元(公寓)。在许多情况下,多个社区之间的距离都在3英里之内。我正在寻找一种方法来执行以下操作:1)确定每个站点是否位于所有其他站点的3英里半径之内,然后2)对位于该3英里半径之内的站点的“单位”列求和。我想将两列添加到数据表中……第一列称为“网站数量”,第二列为“单位数量”

我已经编写了代码来检查是否有其他经纬度落在彼此之间3英里的半径之内,但这已达到我的理解范围。

main_df有超过400列。为简化此操作,我重做以仅显示必需的列。

名字(main_df) 结果:纬度,经度,单位

因此该问题中使用的代码将是

main_df<-cbind(main_df, X=((X=rowSums(distm (main_df[,2:1], 
     fun = distHaversine) / 1000<= 4.828032)/3)-1))

如前所述,我希望结果将两个额外的列添加到main_df中。 列名(main_df) 结果:纬度,经度,单位,站点数,单位数

有点像这样...

Lat         Lon      Units  #of Sites   #of Units
40.06127    -86.05604   80    2           184
41.15241    -85.12709   123   3           262
42.91640    -83.62937   125   1           200
39.67114    -86.07211   59    0           0
41.24905    -81.83060   200   4           387

1 个答案:

答案 0 :(得分:0)

根据我之前的评论:
“我的建议是将distm函数的输出另存为变量。 然后,您可以搜索rowSums> 1的行,然后使用which函数查找附近单位的列(因此是原始数据框的行)。“

#Last rows added for testing
main_df<-read.table(header=TRUE, text="Lat    Lon  Units  
40.06127    -86.05604   80
41.15241    -85.12709   123
42.91640    -83.62937   125
39.67114    -86.07211   59
41.24905    -81.83060   200
40.061    -86.056   100
40.060    -86.0561   300")

library(geosphere)

#create and store distance matrix
#this will be a square matrix the length and width of as the number of rows in main_df.
# be aware of memory use.
distmat<-distm (main_df[,2:1], fun = distHaversine)/1000
# convert to logical matrix of units nearby, exclude same location.
distmat<-(distmat >0 & distmat <= 4.828032)

main_df$nearbysites <- rowSums(distmat)

#find rows where there is at least one other nearby sites
rowsnearby<-which(main_df$nearby >0)

#add place holding columns
main_df$sumunits<-0

#loop through all of the rows with more than 1 nearby site
for (i in rowsnearby){
  #find columns which are nearby, the column number is the same as the rows of main df that are close by
  targetrows<-which(distmat[i,]==TRUE)
  #find sum  
  main_df$sumunits[i]<-sum(main_df$Units[targetrows])
}
print(main_df)