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

时间:2019-11-06 20:13:10

标签: r dplyr sp haversine

我正在尝试找到一种基于接近度对多个地址进行聚类的方法。我具有经度和纬度,在这种情况下,这是理想的选择,因为某些集群将跨越城市/邮政编码边界。我的起点与此类似,但是表中最多有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个单个点之间的Haversine距离。我们可能会简化数学运算,并大致估计1英里为经度或经度的0.016度。

一个理想的输出是可以验证波士顿的3个医院位置在第1组中(彼此之间都在1英里之内),纽黑文的医院就在第2组中(而不是在任何1英里之内)否则,纽约州的3个医院位置都属于第3组(彼此之间相距1英里以内)。

我正在寻找group_near(),而不是group_by()。

任何建议都将不胜感激!

1 个答案:

答案 0 :(得分:3)

实际上,geosphere软件包中的GraphServiceClient graphClient = new GraphServiceClient(authProvider); var document = await graphClient.Sites[_siteId].Drive.Items[remoteId].Request().GetAsync(); var url = document.AdditionalData["@microsoft.graph.downloadUrl"].ToString(); HttpClient http = new HttpClient(); var response = await http.GetAsync(url); var content = await response.Content.ReadAsStreamAsync(); 函数可以在短短几分钟内处理10,000对,在我的机器上,与编写此解决方案所花费的时间相比,还算不错。 10,000个随机点的dist矩阵消耗的内存少于一千兆字节。

使用distm进行聚类并使用从Geosphere包生成的距离矩阵可以清楚地显示每个点的距离。

hclust