можно преобразовать растры в полигоны, используя gdal_polygonizeR - PullRequest
0 голосов
/ 16 октября 2018

Я использую gdal_polygonizeR (https://johnbaumgartner.wordpress.com/2012/07/26/getting-rasters-into-shape-from-r/)) Джона Баумгртнера для преобразования растров в многоугольники R. Помимо этого - я попробовал функцию raster pkg rasterToPolygons, и это заняло вечность; gdal_polygonizeR намного быстрее.В любом случае, у меня есть список из 533 растровых файлов (разных экстентов), которые я хочу преобразовать в полигоны. Функция gdal_polygonizeR работает, когда вызывается один элемент списка, но я пытался использовать его для всех элементов списка, используя * 1008.* и получите сообщение об ошибке. См. код ниже:

#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]]) Создание выходных данных /var/folders/s9/pm92gdl94h18k4n6026cb8x00000gn/T//RtmpvRRvA4/file23d4dc99d8d.shp .. 0pef .. 0pef.Shile.File.Spef .. 0pef .. 0pef..20 ... 30 ... 40 ... 50 ... 60 ... 70 ... 80 ... 90 ... 100 - выполнено. Wfp2 <- gdal_polygonizeR (rasterl_50 [[2]]) Созданиевывод /var/folders/s9/pm92gdl94h18k4n6026cb8x00000gn/T//RtmpvRRvA4/file23d7698a853.shp в формате ESRI Shapefile. 0 ... 10 ... 20 ... 30 ... 40 ... 50 ... 60 ... 70 ... 80 ... 90 ... 100 - сделано.wfp3 <- gdal_polygonizeR (rasterl_50 [[3]]) Создание выходных данных /var/folders/s9/pm92gdl94h18k4n6026cb8x00000gn/T//RtmpvRRvA4/file23d30d4d703.shp формата ESRI Shapefile.0 ... 10 ... 20 ... 30 ... 40 ... 50 ... 60 ... 70 ... 80 ... 90 ... 100 - сделано.wfp4 <- gdal_polygonizeR (rasterl_50 [[4]]) Создание выходных данных /var/folders/s9/pm92gdl94h18k4n6026cb8x00000gn/T//RtmpvRRvA4/file23d24036d07.shp в формате ESRI Shapefile.0 ... 10 ... 20 ... 30 ... 40 ... 50 ... 60 ... 70 ... 80 ... 90 ... 100 - сделано.wfp5 <- gdal_polygonizeR (rasterl_50 [[5]]) Создание выходных данных /var/folders/s9/pm92gdl94h18k4n6026cb8x00000gn/T//RtmpvRRvA4/file23d4683ed87.shp формата ESRI Shapefile.0 ... 10 ... 20 ... 30 ... 40 ... 50 ... 60 ... 70 ... 80 ... 90 ... 100 - сделано.wfp6 <- gdal_polygonizeR (rasterl_50 [[6]]) Создание выходных данных /var/folders/s9/pm92gdl94h18k4n6026cb8x00000gn/T//RtmpvRRvA4/file23d4e23b4d1.shp формата ESRI Shapefile.0 ... 10 ... 20 ... 30 ... 40 ... 50 ... 60 ... 70 ... 80 ... 90 ... 100 - сделано.wfp7 <- gdal_polygonizeR (rasterl_50 [[7]]) Создание выходных данных /var/folders/s9/pm92gdl94h18k4n6026cb8x00000gn/T//RtmpvRRvA4/file23d6791d108.shp формата ESRI Shapefile.0 ... 10 ... 20 ... 30 ... 40 ... 50 ... 60 ... 70 ... 80 ... 90 ... 100 - сделано.Ошибка в readOGR (dirname (outshape), layer = basename (outshape), verbose =! Quiet): функции не найдены. Дополнительно: Предупреждающее сообщение: В ogrFID (dsn = dsn, layer = layer): Показать трассировку </p>

Перезапустите с ошибкой отладки в readOGR (dirname (outshape), layer = basename (outshape), verbose =! Quiet): функции не найдены

#

Если у кого-то есть идеи длярешение, используя lapply или цикл и т. д., пожалуйста, ответьте.Спасибо

1 Ответ

0 голосов
/ 17 октября 2018

Решение: мне пришлось запустить gdal_polygonizeR для каждого отдельного элемента списка, и я обнаружил, что несколько растровых файлов в списке не содержат значений (это было результатом функции reclassify, примененной ранее к растрам).Я удалил эти файлы из списка, и lapply сработало.Вот код:

#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)

ОБНОВЛЕНИЕ: еще лучше, сначала удалите растры со всеми NA с помощью этого:

batch_reclass <- function(rastlist){
  for (i in 1:length(wfrastlist)) {
    #read in raster
    r <-raster(paste0("/path/to/rasterfiles/", rastlist[i]))
    #perform the reclassifcation
    rc <- reclassify(r, rclmat)
    #write each reclass to a new file 
    if (!is.na(minValue(rc))) {
    writeRaster(rc,  filename = paste0("/path/to/new/rasterfiles/", "rc_", 
    rastlist[i]), format="GTiff", overwrite=TRUE)
  }}
}

#run the function
batch_reclass(rastlist)
...