从具有不同形状的不同光栅文件中提取RGB值
我有一个包含50个不同光栅文件和50个不同形状文件的数据集。光栅文件是来自森林的正射影像,每个正射影像都有一个属于它的形状文件,其中树的形状文件用点标记。 现在我想用for循环提取皇冠的RGB值。 到目前为止,我编写了一个普通for循环,但问题是我只有一个迭代器,但实际上我需要两个(一个用于shapefile列表,一个用于正射影像列表)。我还尝试了嵌套for循环,但问题是一个shapefile与所有正射影像一起分析,因此以前的数据总是被覆盖 这是我的嵌套循环代码:从具有不同形状的不同光栅文件中提取RGB值,r,loops,rgb,R,Loops,Rgb,我有一个包含50个不同光栅文件和50个不同形状文件的数据集。光栅文件是来自森林的正射影像,每个正射影像都有一个属于它的形状文件,其中树的形状文件用点标记。 现在我想用for循环提取皇冠的RGB值。 到目前为止,我编写了一个普通for循环,但问题是我只有一个迭代器,但实际上我需要两个(一个用于shapefile列表,一个用于正射影像列表)。我还尝试了嵌套for循环,但问题是一个shapefile与所有正射影像一起分析,因此以前的数据总是被覆盖 这是我的嵌套循环代码: library(rgd
library(rgdal)
library(rgeos)
library(exactextractr)
library(sp)
library(sf)
library(raster)
#gets list of shapefiles
sites <- list.files("C:/Users/Kai/OneDrive - UT Cloud/Documents/Praktikum Mitacs/Data Files/ManualTreetops_2019_RGB/ManualTreetops_Finished",pattern = "*.shp")
#removes ".shp" file extension
sites <- sub(".shp","",sites)
orths <- list.files("C:/Users/Kai/OneDrive - UT Cloud/Documents/2019_ortho",pattern="*.tif", full.names = TRUE)
output <- list()
#loops through list of files
for (i.site in sites) {
#each time through i.site represents a different site
tt <- st_read("C:/Users/Kai/OneDrive - UT Cloud/Documents/Praktikum Mitacs/Data Files/ManualTreetops_2019_RGB/ManualTreetops_Finished", i.site)
#create 1 m radius circles around each treetop
crowns <- st_buffer(tt, 1)
for(i.orth in orths) {
setwd("C:/Users/Kai/OneDrive - UT Cloud/Documents/2019_ortho")
oo <- brick(i.orth)
#extracts the mean band values for each crown
#much faster than extract in raster package
crown.rgb <- exact_extract(oo,crowns,"mean")
}
output[[i.site]] <- crown.rgb
#add results to list of output from for loop
} #end of for loop
库(rgdal)
图书馆(rgeos)
图书馆(ExactExtractor)
图书馆(sp)
图书馆(sf)
图书馆(光栅)
#获取形状文件列表
站点您可以指定for
-循环来迭代数字1到50,然后从那里将站点
和或其
子集:for(沿(站点)顺序排列的i){i.site这能回答你的问题吗?谢谢你的快速回复。你能再详细解释一下你的意思吗?我真的不明白我应该用什么方式来子集站点
和或其
,以及为什么我应该迭代1到50次。对不起,我是R的初学者…好的,对于给你带来的不便,我想是我问题的答案!非常感谢,我应该能够实现它。不用担心,您做了很好的尝试!基本上,for
-循环在某个向量上迭代并应用“body”(for
-循环的中的代码)你所做的,是直接迭代站点
。然而,你想同时迭代站点
和orth
,从两者中获取相同的元素。基本上,你想要站点[1]
和orth[1]
,然后是站点[2]
和orth[2]
,等等……因此,我们只需将for
-循环写入1到50(整个站点的长度和orths
),然后将sites[i]
和orths[i]
写入正文。我希望这有意义!