在R SF中交叉处理大型空间数据集

3
我有两个空间数据集。其中一个数据集包含许多多边形(总共超过150,000个),指定不同的特征,例如河流、植被等。另一个数据集包含较少的多边形(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是我在这里找到的函数。

我的问题是:有经验的空间数据专业人士通常会如何解决这样的任务?我只需要更多的核心和/或更多的耐心吗?我是否使用了错误的sf?R/sf是否为错误的工具?

感谢任何帮助。 这是我非常第一次进行的空间数据分析项目,如果我忽略了一些显然的问题,请见谅。


2
我建议将文件加载到空间数据库中,例如 postgis。如果您愿意,仍然可以使用 R 和 sf 将查询发送到数据库。 - Chris
很难确定,因为我们看不到您的数据,但首先通过st_intersects识别实际重叠的要素可能会有所帮助。如果您有许多要素被其他图层覆盖,则可以将这些要素从昂贵的st_intersection调用中排除。顺便说一下,这种方法与软件无关,适用于R以及PostGIS或任何其他软件。 - TimSalabim
1个回答

2
由于这个模糊的问题可能不会得到真正的答案,所以我将自己回答它。
感谢@Chris和@TimSalabim的帮助。我最终采用了两种方法的组合。
我最终使用了PostGIS,这是根据我的经验处理空间数据的一种相当直观的方式。加速计算交集的三个因素是:

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接