【问题标题】:Finding nearest neighbours in time and space in R using sf使用 sf 在 R 中查找时间和空间上最近的邻居
【发布时间】:2020-11-18 21:01:34
【问题描述】:

我有一个威尔士投票站的数据集,并在其中附加了一个日期列。我们可以想象这个日期是访问这个投票站以检查设施的日期(例如)。

我想做的是锻炼:

我想知道地理点是否在一定距离内

  • 这个我已经通过self_joining管理,使用st_buffer和st_within计算1000m以内,然后计算邻居数。

还有采样日期之间的间隔

  • 这个我有点问题

我想,我想做的是 每个投票站

  • 计算邻居的数量(到目前为止很容易)
  • 为每个邻居确定采样日期之间的间隔
  • 返回一个空间对象(可能用于在 tmap 中绘图)

这是我得到的一些测试代码,它生成 sf 数据集,计算邻居的数量并返回它。 这真的是让我难过的日期间隔。这不是日期间隔的计算,而是生成这些具有日期间隔的投票站集群的方法。 生成(在这种情况下)108 个投票站集群会更好吗?

我试图在我的更大数据集中做的是随着时间的推移计算点的集群。 我有约 2000 条带日期的记录。我想说: 对于这 2000 条记录中的每一条,计算一段距离内和一个时间范围内的邻居数。

我认为这可能更好 计算每个相邻点簇并可视化 然后 从集群中删除超出时间范围的邻居并将其可视化

虽然,在键入此内容时,我想知道是否先排除不在时间范围内的点然后计算邻居会更有效?

polls<-st_as_sf(read.csv(url("https://www.caerphilly.gov.uk/CaerphillyDocs/FOI/Datasets_polling_stations_csv.aspx")),
                coords = c("Easting","Northing"),crs = 27700)%>%
        mutate(date = sample(seq(as.Date('2020/01/01'), as.Date('2020/05/31'), by="day"), 147))

test_stack<-polls%>%st_join(polls%>%st_buffer(dist=1000),join=st_within)%>%
  filter(Ballot.Box.Polling.Station.x!=Ballot.Box.Polling.Station.y)%>%
  add_count(Ballot.Box.Polling.Station.x)%>%
  rename(number_of_neighbours = n)%>%
  mutate(interval_date = date.x-date.y)%>%
  subset(select = -c(6:8,10,11,13:18))## removing this comment will summarise the data so that only number of neighbours is returned %>%
  distinct(Ballot.Box.Polling.Station.x,number_of_neighbours,date.x)%>%
  filter(number_of_neighbours >=2)

【问题讨论】:

  • 您可以使用 distance 阈值将层与自身连接起来,从而导致所有可能的对达到该阈值。然后计算 'time_diff' 列,并过滤以仅保留那些低于 time 阈值的对。如果可以的话,将很乐意尝试使用特定代码进行回答,请发布一个小的可重复样本数据并明确定义您需要什么结果(所需的距离和时间阈值是多少?)。
  • 我想我要去探索这个链接
  • 好的。有点挖泥船。还有一点时间考虑一下。上面的示例可以按时间和距离进行过滤。我正在尝试考虑将其可视化的最佳方法。目前,您只会看到一个代表集群的点(您可以根据邻居的数量对其进行颜色编码)。是否有可能,使用 html/leaflet/tmap,这样当您在交互式地图中选择一个集群时,它会显示邻居?

标签: r spatial sf tmap


【解决方案1】:

我想可能就这么简单

tm_shape(test_stack)+tm_dots(col = "number_of_neighbours", clustering =T, size = 0.5)

我不确定在传单中聚类是如何工作的,但在这个测试数据上效果很好。

【讨论】:

    最近更新 更多