簡體   English   中英

循環提取特定的柵格/空間點對

[英]Loop to extract specific raster/spatial point pairs

我有許多不重疊的點 shapefile,我想將其歸因於類似柵格,也不重疊。 我想將這些點歸因於柵格數據。 對於我正在使用的某些柵格數據類型,我能夠先合並柵格,然后再合並屬性。 但是,我最后一組柵格數據的來源不同,所以我無法合並/拼接它們。 我正在嘗試將點歸因於柵格而不合並柵格。 這將要求我在特定的空間點 - 柵格對上使用 extract()。 我用唯一的 4 字母名稱命名了每個空間點文件,這也是我希望 extract() 使用的柵格名稱的一部分。

我在下面創建了一個可重現的示例來模仿我的數據和問題。 任何人都可以就我如何編碼 extract() 的循環以獲取空間點文件以提取到類似命名的柵格提出建議嗎?

或者,如果將所有空間點組合在一起並循環提取所有柵格,然后管理數據以使所有提取的值都位於 dataframe 的一個向量或列中,那可能會更好/可能會更好/可能。

我正在使用 RStudio 1.2.1335

注意:我將此問題發布到 GIS Stack Exchange,但沒有收到任何答案,希望交叉發布可以。

library(raster)
library(sp)   

#create point shapefiles
loc1 <- data.frame(x = c(-100,-90, -80, -70),
                  y = c(-100,-90, -80, -70))
loc2 <- data.frame(x = c(-100,-90, -80, -70),
                   y = c(100,90, 80, 70))
loc3 <- data.frame(x = c(100,90, 80, 70),
                   y = c(100,90, 80, 70))
coordinates(loc1) <- ~x+y
sp.loc1<- SpatialPoints(loc1,proj4string = CRS("+proj=longlat +datum=WGS84 +no_defs"))
coordinates(loc2) <- ~x+y
sp.loc2<- SpatialPoints(loc2,proj4string = CRS("+proj=longlat +datum=WGS84 +no_defs"))
coordinates(loc3) <- ~x+y
sp.loc3<- SpatialPoints(loc3,proj4string = CRS("+proj=longlat +datum=WGS84 +no_defs"))
plot(sp.loc1)

#create rasters which have a common part of the naming convention of point shapefiles targeting for attribution
loc1_blablabla<- raster(xmn=-200, xmx=0, ymn=-200, ymx=0)
loc1_blablabla
ncell(loc1_blablabla)
#it has 64800 cells
values(loc1_blablabla)<-1:64800
plot(loc1_blablabla, add=TRUE)
plot(sp.loc1, add=TRUE)
loc2_blablabla<- raster(xmn=-200, xmx=0, ymn=0, ymx=200)
values(loc2_blablabla)<-1:64800
loc3_blablabla<- raster(xmn=0, xmx=200, ymn=0, ymx=200)
values(loc3_blablabla)<-1:64800

#plot all, but first create extent poly
#borrowed some code from here:https://gis.stackexchange.com/questions/206929/r-create-a-boundingbox-convert-to-polygon-class-and-plot/206952
library(rgeos)
ext.box<-rgeos::bbox2SP(n=250, s=-250, w=-250, e=250)
plot(ext.box)
plot(loc1_blablabla, add=TRUE)
plot(loc2_blablabla, add=TRUE)
plot(loc3_blablabla, add=TRUE)
plot(sp.loc1, add=TRUE)
plot(sp.loc2, add=TRUE)
plot(sp.loc3, add=TRUE)

#now attempt to extract raster values at points for multiple non-overlapping point and raster files ie. extract(loc1_blablabla, loc1)
#try lapply as in: https://stackoverflow.com/questions/59164538/create-a-loop-to-extract-data-from-multiple-raster
#create list as below, however, with my real data I would use list.files()
loc.list<-list(loc1,loc2,loc3)
rast.list<-list(loc1_blablabla,loc2_blablabla,loc3_blablabla)
attr.data<-lapply(rastlist.extract,loc.list)
#this doesn't work -- i think I need coordinates as the last term, not a list of spatial points

#also tried a for loop, but this gave error:  "Error in (function (classes, fdef, mtable): unable to find an inherited method for function ‘shapefile’ for signature ‘"list"’"
for (i in 1:length(loc.list)) {
  #this reads in each spatialpoint file and assigns each sp's name to the variable 'sp.name'
  sp.name<-shapefile(loc.list[i]) 
  attr.data<-data.frame(coordinates(sp.name),
                             extract(rast.list[grep(sp.name,rast.list)],sp.name))
  #eventually add this line to affix the new vector attr.data to the coordinates for each plot:  names(attr.data)<-c("x","y","raster.value")
}

你不能通過他們的文件名來匹配它們嗎? 如果是這樣,那是你應該做的。 您提出的建議不止一種方式,但似乎您正在嘗試解決您自己創造的問題——避免所有這些可能會容易得多。

我會使用

library(raster)
r <- lapply(raster_file_names, raster)
s <- lapply(shapefile_names, shapefile)

然后循環這些

使用您的示例數據

library(raster)
p1 <- SpatialPoints(cbind(x = c(-100,-90, -80, -70), y = c(-100,-90, -80, -70)))
p2 <- SpatialPoints(cbind(x = c(-100,-90, -80, -70), y = c(100,90, 80, 70)))
p3 <- SpatialPoints(cbind(x = c(100,90, 80, 70), y = c(100,90, 80, 70)))
pts <- list(p1, p2, p3)

r1 <- raster(xmn=-200, xmx=0, ymn=-200, ymx=0, vals=1:64800)
r2 <- raster(xmn=-200, xmx=0, ymn=0, ymx=200, vals=1:64800)
r3 <- raster(xmn=0, xmx=200, ymn=0, ymx=200, vals=1:64800)
ras <- list(r1, r2, r3)

e <- list()
for (i in 1:length(ras)) {
    e[[i]] <- extract(ras[[i]], pts[[i]])
}
e
#[[1]]
#[1] 32581 29359 26137 22915
#[[2]]
#[1] 32581 35839 39097 42355
#[[3]]
#[1] 32581 35803 39025 42247

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM