在许多线段上加速 st_buffer

Speeding up st_buffer on many line segments

我在一个有很多小线段的路网中缓冲,需要很长时间。当我尝试使用探查器查看是什么导致它花费这么长时间时,大部分时间都被“.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 它本身基本上是调用内部编译函数的包装器。