2016-03-11 6 views
0

У меня есть большое количество shapefiles, все различные размеры, так как они представляют различные виды распределений. Я пытаюсь пропустить все эти shapefiles и обрезать другие растровые файлы (переменные BioClim) этими shapefiles. Кажется, что моя проблема возникает из-за самих shapefiles. Я попробовал укладку, и это не работает. Учитывая мой недостаток опыта работы с shapefiles в цикле, может ли кто-нибудь объяснить, почему поднабор кода, приведенный ниже, не будет работать?Обрезка шейп-фигур в петле в R

library(raster) 
library (sp) 
library(rgeos) 
library(rgdal) 
library (raster) 
library (maps) 
library (mapproj) 
library(sp) 
library(maptools) 

raster("alt.bil") -> alt 
raster("bio_1.bil") -> bio1 

shape.files=list.files(path="PathToFolderWithShapefiles", pattern="*.shp", full.names=T, recursive=FALSE) 


lapply(shape.files, function(x){ 
    masking= altc = crop(alt, shape.files) 
    bio1 = crop(bio1, shape.files) 
setwd("/Volumes/LaCie/LoopTestOutput") 
writeRaster(altc, filename="alt.asc", bylayer=T, overwrite=FALSE) 
writeRaster(bio1, filename="bio1.asc", bylayer=T, overwrite=FALSE) 
}) 

Ниже приведен код, который работает для одного, определенного, шейп-файла. Я хотел бы, как бы цитировать функцию обрезки во всех шейп-файлах внутри папки и выводить обрезанный растровый файл.

require(raster) 
library (sp) 
install.packages('rgeos',repos="http://www.stats.ox.ac.uk/pub/RWin") 
install.packages('rgdal',repos="http://www.stats.ox.ac.uk/pub/RWin") 
library (raster) 
library (maps) 
library (mapproj) 
library(sp) 
library(maptools) 

setwd("PathToGlobalRasterLayers") 

raster("alt.bil") -> alt 
raster("bio_1.bil") -> bio1 

setwd("PathTofolderContainingSpeciesDelimitedShapefiles")#all files necessary for working with shapefiles are here, .shp, .dbf, etc.# 
mask <- readShapeSpatial("ReadInSpeciesDelimitedShapefile") 

altc = crop(alt, mask) 
bio1 = crop(bio1, mask) 


setwd("OutputFolderForCroppedFiles") 

writeRaster(altc, filename="alt.asc", bylayer=T, overwrite=TRUE) 
writeRaster(bio1, filename="bio1.asc", bylayer=T, overwrite=TRUE) 
+0

использовать 'x' вместо' shape.files' (который есть список) в вашей функции? – Tensibai

+0

Tensibai, спасибо за ваш быстрый ответ! Я изменил функцию, чтобы отразить 'x', а не' shape.files', но я получил следующую ошибку ... 'Ошибка в .local (x, y, ...): Не удается получить объект Extent из аргумента y' .... вот почему я думаю, что эта проблема имеет отношение к тому, что я делаю петлевые шейп-файлы конкретно – Sally

+0

Когда у меня возникают проблемы со сложными функциями lapply, я переписываю их как статические стили для циклов, а затем прорабатываю их по очереди, чтобы каждый шаг работал. Вы можете попробовать это, и вы можете попробовать обновить свой вопрос с помощью простого воспроизводимого примера того, что вы пытаетесь сделать. – Ben

ответ

0

В своем первом блоке кода, кажется, что вы забыли запустить masking = readShapeSpatial(x).

Кроме того, не используйте setwd(), просто введите путь в аргумент . Это сделает ваш код более явным и читаемым.