我在有许多小线段的道路网络周围进行缓冲,这需要很长时间。当我尝试使用探查器查看是什么原因导致花费如此长的时间时,大部分时间都被“.Call”占用。所以我想知道 .Call 部分发生了什么,我可以做些什么来加快这个过程?
这是一个可重现的示例:
library(sf)
my_linestring_sfc <- st_sfc(
st_linestring(matrix(c(-10, -10, -1, -1, 0, 0), ncol = 2, byrow = TRUE)),
st_linestring(matrix(c(10, -10, 1, -1, 0, 0), ncol = 2, byrow = TRUE)),
st_linestring(matrix(c(0, 0, 0, 1, 0, 10), ncol = 2, byrow = TRUE))
)
line_lst <- map(1:10000 *5, ~my_linestring_sfc + .x)
lins <- do.call(c, line_lst)
profvis::profvis({st_buffer(lins, 100)})
最佳答案
请注意,.Call
指的是 st_buffer
内的内部调用。它可能调用 c
库或其他优化的编译代码。您不太可能轻松地加快速度。简化线路可能是一种加快速度而又几乎不会降低结果质量的方法,这可以通过 st_simplify
来完成。
如果你查看sf:::st_buffer.sfc
的代码,你会看到它调用:sf:::CPL_geos_op
,它本身是基本上是调用内部编译函数的包装器。
关于r - 在许多线段上加速 st_buffer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69438335/