在 R SF 中交叉大空间数据集
Intersecting big spatial datasets in R SF
我有两个空间数据集。一个数据集包含许多多边形(总共超过 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.
我的问题是:经验丰富的空间数据人员通常如何解决这样的任务?我是否只需要更多内核 and/or 更多耐心?我使用 sf 错了吗? R/sf 是不是用错了工具?
感谢您的帮助。
这是我的第一个空间数据分析项目,如果我监督了一些明显的想法,我很抱歉。
因为这个模糊的问题可能不会有真正的答案,所以我会自己回答。
感谢@Chris 和@TimSalabim 的帮助。我最终结合了这两种想法。
我最终使用了 PostGIS,根据我的经验,这是一种处理空间数据的非常直观的方法。
对我来说加速交集计算的三件事是:
- 在我的追踪过程中,空间数据在从 shapefile 加载时存储在 MULTIPOLYGONS 中。我使用 ST_DUMP 将它们扩展为 POLYGONS:
https://postgis.net/docs/ST_Dump.html
- 我在 POLYGONS 上创建了空间索引:https://postgis.net/workshops/postgis-intro/indexing.html
- 我使用了 ST_Intersection 和 ST_Intersects 的组合,只在真正需要的时候调用昂贵的 ST_Intersection (正如@TimSalabim 所建议的,这种方法也可以加快 R 中的速度。 ...但我目前没有时间测试这种方法):https://postgis.net/2014/03/14/tip_intersection_faster/
我有两个空间数据集。一个数据集包含许多多边形(总共超过 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.
我的问题是:经验丰富的空间数据人员通常如何解决这样的任务?我是否只需要更多内核 and/or 更多耐心?我使用 sf 错了吗? R/sf 是不是用错了工具?
感谢您的帮助。 这是我的第一个空间数据分析项目,如果我监督了一些明显的想法,我很抱歉。
因为这个模糊的问题可能不会有真正的答案,所以我会自己回答。
感谢@Chris 和@TimSalabim 的帮助。我最终结合了这两种想法。
我最终使用了 PostGIS,根据我的经验,这是一种处理空间数据的非常直观的方法。 对我来说加速交集计算的三件事是:
- 在我的追踪过程中,空间数据在从 shapefile 加载时存储在 MULTIPOLYGONS 中。我使用 ST_DUMP 将它们扩展为 POLYGONS: https://postgis.net/docs/ST_Dump.html
- 我在 POLYGONS 上创建了空间索引:https://postgis.net/workshops/postgis-intro/indexing.html
- 我使用了 ST_Intersection 和 ST_Intersects 的组合,只在真正需要的时候调用昂贵的 ST_Intersection (正如@TimSalabim 所建议的,这种方法也可以加快 R 中的速度。 ...但我目前没有时间测试这种方法):https://postgis.net/2014/03/14/tip_intersection_faster/