5

绘制地理多边形不是 R 的强项,但如果做得好,它会非常有回报。我正在使用来自英国的数据,多边形边界中的细节高得离谱,这使得任何绘图或操作功能(尤其是在运行 fortify 以使其支持 ggplot 之后)都很慢。

合乎逻辑的方法是简化多边形几何形状,因此它们不太复杂。

我按照这篇文章在 R 中实现了 Douglas-Peucker 算法来执行此操作,但速度非常慢。应用于此数据集(英格兰地区),以下代码在我的配备 16 Gb RAM 的 Intel® Core™ i7-3630QM 机器上运行大约需要 10 分钟:

for(i in 1:length(gors@polygons)){
  for(j in 1:length(gors@polygons[[i]]@Polygons)){
    temp <- as.data.frame(gors@polygons[[i]]@Polygons[[j]]@coords)
    names(temp) <- c("x", "y")
    temp2 <- dp(temp, 0.01)
    gors@polygons[[i]]@Polygons[[j]]@coords <- as.matrix(cbind(temp2$x, temp2$y))
  }QGIS
}

QGIS中,相同的功能大约需要一秒钟。当然,我将来可能会使用 QGIS 实现,但只是发现 R 实现需要很长时间才令人困惑。非常感谢任何如何使其更快或以更有效的方式实现算法的想法。

4

1 回答 1

10

好吧,我认为您可以使用接口GEOS::simplifyrgeos的函数gSimplify

在帮助文件中,您将获得更多信息,例如这是标题

简化几何

描述:

 Function simplifies the given geometry using the Douglas-Peuker
 algorithm

沿着这条线使用你的数据应该做到这一点

require(rgeos)
require(rgdal)

gors <- readOGR(dsn = "/tmp/gor", layer = "GOR_st121")

system.time(gor_topo <- gSimplify(gors, tol = 0.01))
##  user  system elapsed 
## 0.713   0.010   0.727

我有一个 I7,但我的规格不如你的那么令人印象深刻,所以我希望这个功能在你尝试时会更快。

于 2013-06-20T16:56:14.983 回答