【问题标题】:Intersecting big spatial datasets in R SF与 R SF 中的大空间数据集相交
【发布时间】: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 或任何其他软件

标签: r gis sf


【解决方案1】:

由于这个模糊的问题可能没有真正的答案,我将自己回答。

感谢@Chris 和@TimSalabim 的帮助。我最终将这两种想法结合起来。

我最终使用了 PostGIS,根据我的经验,这是一种非常直观的空间数据处理方式。 对我来说加快交点计算的三件事是:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-22
    • 2019-11-22
    • 1970-01-01
    • 1970-01-01
    • 2023-01-22
    • 1970-01-01
    • 2018-11-08
    • 2022-01-09
    相关资源
    最近更新 更多