有没有一种有效的方法可以根据经度和纬度对附近的位置进行分组?

Is there an efficient way to group nearby locations based on longitude and latitude?

我正在尝试找出一种基于接近度对多个地址进行聚类的方法。我有纬度和经度,在这种情况下这是理想的,因为一些集群会跨越 City/Zip 边界。我的起点与此类似,但 table:

中最多 10,000 行
Hospital.Addresses <- tibble(Hospital_Name = c("Massachusetts General Hospital","MGH - Blake Building","Shriners Hospitals for Children — Boston","Yale-New Haven Medical Center", "Memorial Sloan Kettering", "MSKCC Urgent Care Center", "Memorial Sloan Kettering Blood Donation Room"),
  Address = c("55 Fruit St", "100 Blossom St", "51 Blossom St", "York St", "1275 York Ave", "425 E 67th St", "1250 1st Avenue Between 67th and 68th Streets"),
  City = c("Boston", "Boston", "Boston", "New Haven", "New York", "New York", "New York"),
  State = c("MA", "MA", "MA", "CT", "NY", "NY","NY"),
  Zip = c("02114","02114","02114", "06504", "10065", "10065", "10065"),
  Latitude = c(42.363230, 42.364030, 42.363090, 41.304507, 40.764390, 40.764248, 40.764793),
  Longitude = c(-71.068680, -71.069430, -71.066630, -72.936781, -73.956810, -73.957127, -73.957818))

我想对彼此相距约 1 英里以内的地址组进行聚类,可能不计算 10,000 个单独点之间的半正弦距离。我们可能会使数学变得简单,并粗略估计 1 英里为纬度或经度的 0.016 度。

理想的输出是验证波士顿的 3 家医院位置属于第 1 组(彼此相距不超过 1 英里),纽黑文的医院属于第 2 组(不在 1 英里内)其他任何东西),纽约的 3 个医院地点都在第 3 组(彼此相距不到 1 英里)。

而不是group_by(),我更想寻找group_near()。

非常感谢任何建议!

实际上,geosphere 包中的 distm 函数可以在短短几分钟内处理 10,000 对,与编写此解决方案所花费的时间相比,在我的机器上并不算太糟糕。 10,000 个随机点的 dist 矩阵消耗的内存不到 1 gig。

hclust进行聚类,利用geosphere包生成的距离矩阵,可以清楚的显示每个点的接近程度。

#create fake data
lat<-runif(10000, min=28, max=42)
long<-runif(10000, min=-109, max=-71)
df<-data.frame(long, lat)

library(geosphere)

start<-Sys.time()
#create a distance matrix in miles
dmat<-distm(df)/1000*.62
print(Sys.time()-start)

#cluster
clusted<-hclust(as.dist(dmat))
#plot(clusted)
#find the clusters ids for 2 mile distances
clustersIDs<-(cutree(clusted, h=2))