如何在不让计算机崩溃的情况下在程序 R 中剪辑大型 shapefile?
How can I clip large shapefiles in program R without the computer crashing?
我想在程序 R 中剪辑一个大的 shapefile (67MB),并从大约 5% 的文件中导出一个小得多的栅格。加载后,shapefile 具有 221388 个特征和 5 个字段 - 并激增至 746 MB。
我的困难在于尝试将文件剪辑到可行的大小 - 程序在几分钟后崩溃。我尝试了 crop(来自 raster)和 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)))
正如@Pascal 所建议的,GDAL 的 ogr2ogr
对此很有用。您可以使用 system
从 R 中调用它,如下所示(包括 Windows),尽管这假设 (1) 您有一个有效的 GDAL 安装,并且 (2) GDAL 二进制文件的路径存在于您的PATH 环境变量:
下载并解压 PNG 形状文件:
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())
使用 system
从 R 调用 ogr2ogr
以剪辑 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)
我想在程序 R 中剪辑一个大的 shapefile (67MB),并从大约 5% 的文件中导出一个小得多的栅格。加载后,shapefile 具有 221388 个特征和 5 个字段 - 并激增至 746 MB。
我的困难在于尝试将文件剪辑到可行的大小 - 程序在几分钟后崩溃。我尝试了 crop(来自 raster)和 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)))
正如@Pascal 所建议的,GDAL 的 ogr2ogr
对此很有用。您可以使用 system
从 R 中调用它,如下所示(包括 Windows),尽管这假设 (1) 您有一个有效的 GDAL 安装,并且 (2) GDAL 二进制文件的路径存在于您的PATH 环境变量:
下载并解压 PNG 形状文件:
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())
使用
system
从 R 调用ogr2ogr
以剪辑 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)