首页 > 解决方案 > 在许多线段上加速 st_buffer

问题描述

我在一个有许多小线段的道路网络周围进行缓冲,这需要很长时间。当我尝试使用分析器查看是什么让它花费了这么长时间时,大部分时间都被“.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)})

对我来说,轮廓火焰图是什么样的: 火焰图

标签: rsf

解决方案


请注意,.Call指的是内部调用st_buffer。它可能会调用c库或其他优化的编译代码。您不太可能轻松加快速度。简化你的线条可能是一种在不降低结果质量的情况下加快速度的方法,这可以通过st_simplify.

如果你看一下sf:::st_buffer.sfc你看到它调用的代码,更详细一点:sf:::CPL_geos_op它本身基本上是一个用于调用内部编译函数的包装器。


推荐阅读