优化从点创建的多边形
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))))
我有一个由 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))))