为什么R的Douglas-Peucker算法实现如此之慢?

时间:2013-06-20 15:14:09

标签: r algorithm gis

绘制地理多边形不是R的强度,但如果done well,它可能会非常有益。我正在使用来自英国的数据,并且多边形边界中的细节非常高,使得任何绘图或操作功能(特别是在强化之后运行以使其成为ggplot-able)变慢。

逻辑方法是简化多边形几何,因此它们不那么复杂。

我按照post来实现Douglas-Peucker算法在R中执行此操作,但速度非常慢。应用于this dataset(英格兰地区),以下代码需要大约10分钟才能在我的英特尔®酷睿™i7-3630QM机器上运行,内存为16 Gb:

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实现需要很长时间。任何想法如何使其更快或以更有效的方式实现算法非常感谢。

1 个答案:

答案 0 :(得分:10)

我认为你可以使用rgeos函数gSimplify哪个接口GEOS::simplify

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

  

简化几何

     

说明

 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,但是我的规格不如你的那么令人印象深刻,所以我希望你试试这个功能会更快。