原谅我的新手,但是我觉得我已经到了机智的尽头。
我有一个(空间多边形)数据框(tri.extract
),其中包含我的所有数据。此数据帧中的每一行都对应一个图像。数据帧中的每个图像都对应一个宗地,因此具有属性parcel_id
,该属性表示该图像属于哪个宗地。我希望将所有图像保存在子文件夹中,以便每个图像都位于其各自包裹的文件夹中。
parcels <- data.frame(unique(tri.extract@data$parcel_id))
save.dir <- "/home/iordamo/Documents/GIS_Workload/bbox/DemoGrasslandTIMED_END_ImagesMapillary/"
#create sub-folders named after parcel_ids
for (i in 1:nrow(parcels)){
dir.create(paste0(save.dir,parcels[i,]))
}
#the save loop itself
for (i in 1:nrow(tri.extract@data)){
#generate URLs for each image in the dataframe
img_url<-paste0('https://d1cuyjsrcm0gby.cloudfront.net/',
tri.extract@data$key[i],
'/thumb-2048.jpg')
#create a dataframe of all the folder names within save.dir - the parcels
dirs.to.save1 <- data.frame(list.files(save.dir, recursive = F))
dirs.to.save1[] <- lapply(dirs.to.save1, as.character)
for (g in 1:nrow(dirs.to.save1)){
if (g==1){
row <- dirs.to.save1[g,]
#print(row)
img_path <- file.path(paste0(save.dir,row, "/"), paste0("i_",tri.extract@data$key[i], ".jpg"))
download.file(img_url, img_path, quiet=TRUE, mode="wb")
#next
}
else if (g>1){
row <- dirs.to.save1[g,]
#print(row)
img_path <- file.path(paste0(save.dir,row, "/"), paste0("i_",tri.extract@data$key[i], ".jpg"))
download.file(img_url, img_path, quiet=TRUE, mode="wb")
#next
}
}
}
使用当前形式的代码,所有图像都保存在所有子文件夹中。谁能解释为什么?据我了解,我正在遍历数据帧(tri.extract
)的每个记录,生成一个URL,然后(在第一个嵌套循环中)遍历每个宗地,并从{{1} }和file.path
数据框中的每一行以及相应的图像ID(save.dir
)。这应该在每个相应的文件夹中输出,因为我在嵌套循环中对其进行循环。有人可以向我解释我的逻辑未能转化为执行的地方吗?
答案 0 :(得分:0)
好吧,这并不难。
与往常一样,解决方案比我最初想象的要简单:
for (i in 1:nrow(tri.extract@data)){
img_url<-paste0('https://d1cuyjsrcm0gby.cloudfront.net/',
tri.extract@data$key[i],
'/thumb-2048.jpg')
for (g in 1:nrow(parcels)){
row <- droplevels(parcels[g,])
if(tri.extract@data$parcel_id[i] == parcels[g,]) {
img_path <- file.path(paste0(save.dir,row), paste0("i_",tri.extract@data$key[i], ".jpg"))
download.file(img_url, img_path, quiet=TRUE, mode="wb")
}}
}