套用gdal_polygonizeR将栅格转换为多边形

时间:2018-10-16 18:26:36

标签: polygon lapply raster gdal rgdal

我正在使用John Baumgrtner的gdal_polygonizeRhttps://johnbaumgartner.wordpress.com/2012/07/26/getting-rasters-into-shape-from-r/)将栅格隐蔽到R中的多边形。-尝试了raster pkg rasterToPolygons函数,它花了很多时间; gdal_polygonizeR更快。无论如何,我都有一个要转换为多边形的533个栅格文件(不同范围)的列表。 gdal_polygonizeR函数在调用单个列表元素时有效,但是我尝试使用lapply在所有列表元素上使用它并获得错误消息。参见下面的代码:

#path to folder containing all .tif raster files
dir <- "/path/to/raster/files"

#create a list of the files in the folder
files <- list.files(path = dir, pattern = ".tif$")

#use lapply to import/create list of all files in folder
rasterl_50 <- lapply(paste0(dir, files), raster)

#test gdal_polygonizeR function on single list element
gdal_polygonizeR(rasterl_50[[1]])     #works properly

#loop thru all elements in list
lapply(rasterl_50, gdal_polygonizeR)

输出=前六(6)个元素似乎运行正常,但在[[7]]处出现以下错误消息:

  

wfp1 <-gdal_polygonizeR(rasterl_50 [[1]])   创建格式为ESRI Shapefile的输出/var/folders/s9/pm92gdl94h18k4n6026cb8x00000gn/T//RtmpvRRvA4/file23d4dc99d8d.shp。   0 ... 10 ... 20 ... 30 ... 40 ... 50 ... 60 ... 70 ... 80 ... 90 ... 100-完成   wfp2 <-gdal_polygonizeR(rasterl_50 [[2]])   创建格式为ESRI Shapefile的输出/var/folders/s9/pm92gdl94h18k4n6026cb8x00000gn/T//RtmpvRRvA4/file23d7698a853.shp。   0 ... 10 ... 20 ... 30 ... 40 ... 50 ... 60 ... 70 ... 80 ... 90 ... 100-完成   wfp3 <-gdal_polygonizeR(rasterl_50 [[3]])   创建格式为ESRI Shapefile的输出/var/folders/s9/pm92gdl94h18k4n6026cb8x00000gn/T//RtmpvRRvA4/file23d30d4d703.shp。   0 ... 10 ... 20 ... 30 ... 40 ... 50 ... 60 ... 70 ... 80 ... 90 ... 100-完成   wfp4 <-gdal_polygonizeR(rasterl_50 [[4]])   创建格式为ESRI Shapefile的输出/var/folders/s9/pm92gdl94h18k4n6026cb8x00000gn/T//RtmpvRRvA4/file23d24036d07.shp。   0 ... 10 ... 20 ... 30 ... 40 ... 50 ... 60 ... 70 ... 80 ... 90 ... 100-完成   wfp5 <-gdal_polygonizeR(rasterl_50 [[5]])   创建格式为ESRI Shapefile的输出/var/folders/s9/pm92gdl94h18k4n6026cb8x00000gn/T//RtmpvRRvA4/file23d4683ed87.shp。   0 ... 10 ... 20 ... 30 ... 40 ... 50 ... 60 ... 70 ... 80 ... 90 ... 100-完成   wfp6 <-gdal_polygonizeR(rasterl_50 [[6]])   创建格式为ESRI Shapefile的输出/var/folders/s9/pm92gdl94h18k4n6026cb8x00000gn/T//RtmpvRRvA4/file23d4e23b4d1.shp。   0 ... 10 ... 20 ... 30 ... 40 ... 50 ... 60 ... 70 ... 80 ... 90 ... 100-完成   wfp7 <-gdal_polygonizeR(rasterl_50 [[7]])   创建格式为ESRI Shapefile的输出/var/folders/s9/pm92gdl94h18k4n6026cb8x00000gn/T//RtmpvRRvA4/file23d6791d108.shp。   0 ... 10 ... 20 ... 30 ... 40 ... 50 ... 60 ... 70 ... 80 ... 90 ... 100-完成   readOGR(dirname(outshape),layer = basename(outshape),verbose =!quiet)中的错误:     找不到功能   另外:警告消息:   在ogrFIDs(dsn = dsn,layer = layer)中:    显示回溯

使用调试重新运行  readOGR(dirname(outshape),layer = basename(outshape),verbose =!quiet)中的错误:   找不到功能

如果有人对使用lapply或for循环等的解决方案有想法,请答复。谢谢

1 个答案:

答案 0 :(得分:0)

解决方案:我必须在每个单独的列表元素上运行distances, indices = model_knn.kneighbors( test_df.loc[query_index,:].values.reshape(1, -1), return_distance=True ) ,发现列表中的几个栅格文件不包含任何值(这是由于gdal_polygonizeR函数先前应用于栅格)的结果。我从列表中删除了这些文件,reclassify正常运行。这是代码:

lapply

更新: 更好的做法是,首先删除所有NA的栅格:

#remove 'no value' elements from the list
new_rastlist <- 
rasterlist[c(-7,-14,-36,-89,-191,-310,-432,-436,-476,-493,-494,-501)]

#then try again to use lapply
polyl <- lapply(rastlist, gdal_polygonizeR)