如何在程序R中剪切大型shapefile而不会导致计算机崩溃?

时间:2015-02-13 05:30:15

标签: r gis ram raster shapefile

我想在程序R中剪切一个大的shapefile(67MB),并从它的约5%左右得到一个小得多的光栅。一旦加载,shapefile就有221388个功能和5个字段 - 并且会爆炸到746 MB。

当我试图将文件剪辑到可行的大小时,我遇到了困难 - 几分钟后程序崩溃了。我尝试了两种裁剪(来自栅格)和gIntersection(来自rgeos)都没有成功。我有8GB的RAM - 显然存在内存问题。

我猜可能有一个解决方法。我知道那里有一些大的内存包 - 但是它们中的任何一个都可以帮助我的情况吗?我目前的代码如下:

# dataset can be found at 
# http://data.fao.org/map?entryId=271096b2-8a12-4050-9ff2-27c0fec16c8f

# location of files
ogrListLayers("C:/Users/Me/Documents/PNG Glob")

# import shapefile
ogrDrivers()[10,]

# shapefiles
Glob<-readOGR("C:/Users/Me/Documents/PNG Glob", layer="png_gc_adg_1")

# assign projection
Glob@proj4string<- CRS("+proj=longlat")

#object size
object.size(Glob) 

# clipping
crop(Glob, extent(c(144,146,-7,-5)))

1 个答案:

答案 0 :(得分:1)

根据@Pascal的建议,GDAL的ogr2ogr对此非常有用。您可以使用system从R调用它,如下所示(包括在Windows上),但这假定(1)您有一个正在运行的GDAL安装和(2)您的PATH环境变量中存在GDAL二进制文件的路径:

  1. 下载并解压缩PNG shapefile:

    download.file('http://www.fao.org/geonetwork/srv/en/resources.get?id=37162&fname=png_gc_adg.zip&access=private', 
                  f <- tempfile(fileext='.zip'))
    unzip(f, exdir=tempdir())
    
  2. 从R用ogr2ogr调用system剪辑PNG shapefile并将生成的.shp保存到工作目录:

    system(sprintf('ogr2ogr -clipsrc 144 -7 146 -5 png_clip.shp %s', 
                   file.path(tempdir(), 'png_gc_adg_1.shp')))
    

    在我的系统上,这花了大约70秒,内存使用量似乎没有增加超过大约100MB。 (我确实收到了很多关于Warning 1: Value 138717513240 of field AREA of feature 0 not successfully written. Possibly due to too larger number with respect to field width之类的警告 - 不确定那是什么。)

  3. 加载剪切的shapefile:

    library(rgdal)
    p <- readOGR('.', 'png_clip')
    plot(p)
    

    png clip