r - 在许多线段上加速 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)})
解决方案
请注意,.Call
指的是内部调用st_buffer
。它可能会调用c
库或其他优化的编译代码。您不太可能轻松加快速度。简化你的线条可能是一种在不降低结果质量的情况下加快速度的方法,这可以通过st_simplify
.
如果你看一下sf:::st_buffer.sfc
你看到它调用的代码,更详细一点:sf:::CPL_geos_op
它本身基本上是一个用于调用内部编译函数的包装器。
推荐阅读
- rsync - 种子(和单个文件)是否有可证明的最佳块(片)大小?
- python - 检索非类型对象不是可迭代错误
- java - 如何在 java swing 上的游戏中添加计时器
- kotlin - Kotlin 中类定义和子类中的泛型类型
- sql - Oracle DB - 不存在匹配数据时的表连接问题
- vb.net - 复制文件时如何隐藏windows复制对话框
- javascript - 在 React 网站上使用 JS 脚本自动填充输入值
- mysql - 为什么 find 总是返回两行?
- python - 熊猫在很多列之间采取成对差异
- python - 我怎样才能获得这个改变列表值以适用于不同整数值的函数?