我想在程序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)))
答案 0 :(得分:1)
根据@Pascal的建议,GDAL的ogr2ogr
对此非常有用。您可以使用system
从R调用它,如下所示(包括在Windows上),但这假定(1)您有一个正在运行的GDAL安装和(2)您的PATH环境变量中存在GDAL二进制文件的路径:
下载并解压缩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())
从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
之类的警告 - 不确定那是什么。)
加载剪切的shapefile:
library(rgdal)
p <- readOGR('.', 'png_clip')
plot(p)