【发布时间】:2021-06-05 22:35:19
【问题描述】:
我有很多点,想根据它们相交的网格单元分配一个 ID。我知道使用sf 包你可以使用st_intersections 或st_intersects 来做到这一点。但是,对于具有数百万个特征/点的大型数据集,这可能需要很长时间(或者只会导致 R 崩溃)。
在投影的 CRS(在我的示例中为英国国家网格)上有一个网格系统意味着存在一致的形状,并且坐标(xmin、ymin、xmax 和 ymax)将始终提供每个单元格的完整范围。是否有使用 tidyverse 或 data.table 中的某些东西的非空间方法,例如可以利用它来分配网格 ID。
这是我的示例数据(如果有人可以向我展示一种更简洁的方法来提取每个网格单元的 xmin、ymin、xmax 和 ymax,我也将不胜感激):
library(sf)
library(dplyr)
BBox <- st_bbox(c(xmin = 0, xmax = 10000, ymax = 10000, ymin = 0), crs = st_crs(27700))
Grid <- st_as_sfc(BBox) %>%
st_make_grid(square = TRUE, cellsize = c(1e3, 1e3)) %>%
cbind(data.frame(ID = sprintf(paste("GID%0",nchar(length(.)),"d",sep=""), 1:length(.)))) %>%
st_sf()
Points <- st_sample(st_as_sfc(BBox), 3000, exact = TRUE) %>%
st_sf('ID' = seq(length(.)), 'geometry' = .) %>%
mutate(X = st_coordinates(.)[,1],
Y = st_coordinates(.)[,2])
Table <- NULL
for(i in 1:nrow(Grid)) {
Row <- cbind(as.numeric(st_bbox(Grid[i,])[1]),
as.numeric(st_bbox(Grid[i,])[2]),
as.numeric(st_bbox(Grid[i,])[3]),
as.numeric(st_bbox(Grid[i,])[4]))
Table <- as.data.frame(rbind(Table, Row))
}
names(Table) <- c("xmin","ymin","xmax","ymax")
Grid <- cbind(Grid,Table)
【问题讨论】:
-
我建议坚持使用空间方法。如果您反对内存限制,您可以将数据卸载到 PostgreSQL 数据库(它非常支持空间数据格式)并在数据库中运行空间连接 = 将内存约束转换为磁盘空间约束。这可能需要一段时间,但您不太可能用完磁盘...
标签: r data.table tidyverse spatial sf