我需要能够在不丢失点的情况下缩小纬度/经度数据的多边形;更重要的是,我需要在正确的方向上有效地“平滑”这些点。通常,gBuffer
工作正常,但不能保证点的数量和它们的相对间距。最终,我需要保留每个点的属性,而样条曲线、平滑和其他“良好的效率”gBuffer
以及多边形的增长/收缩不允许我以对 1 对 1 映射的足够置信度来保留这些属性.
例子:
library(rgeos) # gBuffer
dat <- structure(list(x = c(6, 5.98, 5.94, 5.86, 5.75, 5.62, 5.47, 5.31, 5.13, -4.87, -5.04, -5.22, -5.39, -5.55, -5.69, -5.81, -5.9, -5.96, -6, -6, -6, -5.96, -5.9, -5.81, -5.69, -5.55, -5.39, -5.22, -5.04, -3.04, -2.87, -2.69, -2.53, -2.38, -2.25, -2.14, -2.06, -2.02, -2, -2, -1.96, -1.9, -1.81, -1.69, -1.55, -1.39, -1.22, -1.04, -0.87, 1.13, 1.31, 1.47, 1.62, 1.75, 1.86, 1.94, 1.98, 2, 2, 2, 2.04, 2.1, 2.19, 2.31, 2.45, 2.61, 2.78, 2.96, 4.96, 5.13, 5.31, 5.47, 5.62, 5.75, 5.86, 5.94, 5.98, 6), y = c(5, 5.18, 5.35, 5.51, 5.66, 5.78, 5.88, 5.95, 5.99, 5.99, 6, 5.97, 5.92, 5.83, 5.72, 5.59, 5.43, 5.27, 5.09, -4.91, -5.09, -5.27, -5.43, -5.59, -5.72, -5.83, -5.92, -5.97, -6, -6, -5.99, -5.95, -5.88, -5.78, -5.66, -5.51, -5.35, -5.18, -5, -1.91, -1.73, -1.57, -1.41, -1.28, -1.17, -1.08, -1.03, -1, -1.01, -1.01, -1.05, -1.12, -1.22, -1.34, -1.49, -1.65, -1.82, -2, -4.91, -5.09, -5.27, -5.43, -5.59, -5.72, -5.83, -5.92, -5.97, -6, -6, -5.99, -5.95, -5.88, -5.78, -5.66, -5.51, -5.35, -5.18, 5)), row.names = c(NA, -78L), class = "data.frame")
# "shrink-wrap"
sp <- sp::SpatialPolygons(list(sp::Polygons(list(sp::Polygon( as.matrix(dat) )), "dat")))
sp2 <- gBuffer(sp, width = -0.5)
dat2 <- as.data.frame(sp2@polygons[[1]]@Polygons[[1]]@coords)
c(nrow(dat), nrow(dat2))
# [1] 78 97
我们立即看到点数的变化。我认识到,大多数时候,这是 的理想特性gBuffer
,因此也许rgeos
不是这种转换的最佳工具。
library(ggplot2) # just for vis here
ggplot(dat, aes(x, y)) +
geom_path() + geom_point() +
geom_path(data = dat2, color = "red") + geom_point(data = dat2, color = "red")
这个图像对我想要的整体形状有效果,但是增加了点数,这意味着我不能再依赖与原始点的一对一关系。
通常,多边形不是对称的,并且许多多边形都有这样的内切,其中许多在特定方向上“拉”点的方法会出现偏差或方向错误。
我找不到任何选项,gBuffer
也找不到其他功能rgeos
来保留点的数量和基本空间关系。我不需要“完美”的缩小,如果这改变了事情,但它不应该有很大的偏差。