优化从点创建的多边形

Optimize polygons creating from points

我有一个由 X 和 Y 坐标及其偏移量组成的矩阵 (nXSize, nYSize)。基于它,我循环创建多边形。下面的代码对于大量的点来说很慢,我能以某种方式优化它吗?

mat = structure(c(1, 1, 1, 1, 1, 1, 1, 65, 129, 193, 257, 321, 64,
                  64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64), .Dim = c(6L, 4L),
                .Dimnames = list(
                  c("1", "2", "3", "4", "5", "6"),
                  c("x", "y", "nXSize", "nYSize")))

lst = sf::st_sfc(sf::st_polygon())

for (i in seq_len(nrow(mat))) {
  p1 = c(mat[i, 1], mat[i, 2])
  p2 = c(mat[i, 1] + mat[i, 3], mat[i, 2])
  p3 = c(mat[i, 1] + mat[i, 3], mat[i, 2] + mat[i, 4])
  p4 = c(mat[i, 1], mat[i, 2] + mat[i, 4])

  pts = matrix(c(p1, p2, p3, p4, p1), ncol = 2, byrow = TRUE)
  pts = pts - 1 # align matrix to P(0, 0)

  polygon = sf::st_sfc(sf::st_polygon(list(pts)))
  lst = c(lst, polygon)
}

# remove empty geometry
lst = lst[-1]

这应该会更快。首先使用向量化计算所有顶点并将它们居中:

p1 <- cbind(mat[, 1], mat[, 2]) - 1
p2 <- cbind(mat[, 1] + mat[, 3], mat[, 2]) - 1
p3 <- cbind(mat[, 1] + mat[, 3], mat[, 2] + mat[, 4]) - 1
p4 <- cbind(mat[, 1], mat[, 2] + mat[, 4]) - 1
ply <- cbind(p1, p2, p3, p4, p1)

现在 ply 是一个矩阵,每个多边形一行。接下来将 ply 转换为矩阵列表 (plys),然后将矩阵列表转换为多边形列表 (lst):

plys <- lapply(1:nrow(ply), function(i) matrix(ply[i, ], ncol=2, byrow=TRUE))
lst <- sapply(plys, function(x) sf::st_sfc(sf::st_polygon(list(x))))