R简化shapefile

时间:2014-01-07 16:12:16

标签: r shapefile simplify

我有一个亚马逊大河的形状文件。 shapefile单独有37.9 MB,与属性表一起达到42.1 MB。我正在生成所有巴西亚马逊的PNG图像,每个像素为1260x940像素,而shapefile中的所有这些数据只会减慢每张地图的绘制速度,所以我想简化它。

gSimplify函数,在rgeos包中,似乎只是简化了每个多边形,而不是去除较小的多边形。我尝试了它的公差为0.1和1000,并且我总是得到长度(shp @polygons)相同的值:27633。并且最终的情节需要几乎相同的时间来绘制。我需要一个函数,我告诉我最终的光栅将是1260x940像素,所以它可以删除每个不必要的点。有没有这样做的功能?

提前致谢。

1 个答案:

答案 0 :(得分:2)

非常全面的解决方案:http://www.r-bloggers.com/simplifying-polygon-shapefiles-in-r/

总之,您需要获取多边形的区域:

area <- lapply(rivers@polygons, function(x) sapply(x@Polygons, function(y) y@area))

其中河流是你在R中的shapefile对象。

然后你找出大的多边形并保留它们:

    sizeth <- 0.001 #size threshold of polygons to be deleted
    mainPolys <- lapply(area, function(x) which(x > sizeth))

    rivers@data <- rivers@data[-c(1:2),] 
    rivers@polygons <- rivers@polygons[-c(1:2)] 
    rivers@plotOrder <- 1:length(rivers@polygons)
    mainPolys <- mainPolys[-c(1:2)]

    for(i in 1:length(mainPolys)){   if(length(mainPolys[[i]]) >= 1 &&
    mainPolys[[i]][1] >= 1){
         rivers@polygons[[i]]@Polygons <- rivers@polygons[[i]]@Polygons[mainPolys[[i]]]
         rivers@polygons[[i]]@plotOrder <- 1:length(rivers@polygons[[i]]@Polygons)   } }

这可能不够好,你可能不想删除任何多边形,在这种情况下,shapefiles包中的dp()函数可以解决这个问题:

res <- 0.01 #the argument passed to dp() which determines extent of simplification. Increase or decrease as required to simplify more/less    
for(i in 1:length(rivers@polygons)){
      for(j in 1:length(rivers@polygons[[i]]@Polygons)){
        temp <- as.data.frame(rivers@polygons[[i]]@Polygons[[j]]@coords)
        names(temp) <- c("x", "y")
        temp2 <- dp(temp, res)
        rivers@polygons[[i]]@Polygons[[j]]@coords <- as.matrix(cbind(temp2$x, temp2$y))
      }
    }