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