【发布时间】:2020-03-08 14:15:57
【问题描述】:
我有两个空间数据集。一个数据集包含许多多边形(总共超过 150k)指定不同的特征,如河流、植被。另一个数据集包含更少的多边形 (500),指定不同的区域。 我需要将这两个数据集相交以获得不同区域的特征。 我可以通过不同的特征对第一个数据集进行子集化。如果我使用一个小特征(2,500 个多边形)的子集,则与这些区域的交集非常快(5 分钟)。但是,如果我想对更大的特征子集(20,000 个多边形)感兴趣,那么计算会运行很长时间(我在两小时后终止了它)。这甚至不是我需要相交的最大特征(50,000 个多边形)。
这是我运行的代码:
clean_intersect_save = function(geo_features, areas) {
# make geometries valid
data_valid_geoms = st_parallel(sf_df = st_geometry(geo_features),
sf_func = st_make_valid,
n_cores = 4)
# remove unnecessary columns
data_valid = st_drop_geometry(x) %>% select("feature")
data_valid = st_sf(data_clean, geometry = data_valid_geoms)
# intersect the geo-features and areas
data_valid_split = st_parallel(sf_df = bezirke,
sf_func = st_intersection,
n_cores = 4,
data_clean)
# save shp file
st_write(data_valid_split, "data_valid_splir.shp")
return(data_valid_split)
}
两个输入都是 sf 数据帧。 st_parallel 是我发现的一个函数 here.
我的问题是:经验丰富的空间数据人员通常如何解决这样的任务?我只需要更多的核心和/或更多的耐心吗?我使用 sf 错了吗? R/sf 是错误的工具吗?
感谢您的帮助。 这是我的第一个空间数据分析项目,如果我看到一些明显的想法,很抱歉。
【问题讨论】:
-
我建议将文件加载到空间数据库中,例如
postgis。如果您愿意,您仍然可以使用 R 和sf将查询发送到数据库。 -
有点难以确定,因为我们看不到您的数据,但首先通过
st_intersects识别实际重叠的特征可能会有所帮助。如果您有许多功能被另一层覆盖,您可以从代价高昂的st_intersection调用中排除这些功能。顺便说一句,这种方法与软件无关,适用于 R 和 PostGIS 或任何其他软件