如何解决通过R Shiny的downloadHandler下载多个GeoTIFF格式的光栅文件时出错
我正在尝试制作一个基于 Shiny 的 Web 应用程序,它可以接受多个二进制文件作为用户的输入,并为每个输入文件创建一个 GeoTiff 光栅文件供用户下载。但是,我无法使用 R Shiny 的 DownloadHandler 将多个输出 GeoTiff 文件下载为 zip 文件夹。我试过的代码如下。
#Import required packages
library(shiny)
library(raster)
library(rgdal)
library(zip)
library(stringr)
#User Interface
ui = fluidPage(
titlePanel(title = "Convert Binary raster data to GeoTiff"),sidebarLayout(position = "right",sidebarPanel(
fileInput(inputId = "layer",label = "Upload your binary raster
data",multiple = TRUE)
),mainPanel(tableOutput("files"),tableOutput("path"),downloadButton(outputId = "downloadTiff",label = "Download GoeTiff
file")
)
)
)
#Function to convert binary file to GeoTIFF raster data
bin_raster = function(x){
rf.file = file(x,'rb')
bin_data = readBin(rf.file,what = 'double',n = 120705,size = 4,endian = "big")
rf_matrix = matrix(data = bin_data,nrow = 301,ncol = 401,byrow =
T)
rf_rast1 = flip(raster(rf_matrix,xmn = 70,xmx = 110,ymn = 5,ymx =
35,crs = "+proj=longlat +datum=wgs84"),direction = 2)
return(rf_rast1)
}
#Server
server = function(input,output){
inFile = reactive({
if(is.null(input$layer$datapath)){return()}
else{
for (i in input$layer$datapath) {
wb = bin_raster(i)
return(wb)
}
}
})
output$files = renderTable(input$layer)
output$path = renderTable(input$layer$datapath)
output$downloadTiff = downloadHandler(
filename = "GeoTiff.zip",content = function(file){
#go to a temp dir to avoid permission issues
owd <- setwd(tempdir())
on.exit(setwd(owd))
files <- NULL;
for (i in 1:input$layer$datapath){
fileName <- paste(input$layer$name,i,".tif",sep = "")
writeraster(inFile()$wb[i],fileName,format = "GTiff",overwrite =
TRUE)
files <- c(fileName,files)
}
#create the zip file
zip(file,files)
}
)
}
shinyApp(ui = ui,server = server)
它向我显示以下错误: 1:input$layer$datapath 中的警告: 数值表达式有 2 个元素:仅第一个使用 download$func(tmpdata) 中的警告:强制引入的 NA 警告::: NA/NaN 参数中的错误 [没有可用的堆栈跟踪]
请帮帮我。
解决方法
这是一些运行的代码。
library(shiny)
library(raster)
library(rgdal)
library(zip)
library(stringr)
ui = fluidPage(
titlePanel(title = "Convert Binary raster data to GeoTiff"),sidebarLayout(
position = "right",sidebarPanel(
fileInput(
inputId = "layer",label = "Upload your binary raster data",multiple = TRUE
)
),mainPanel(
tableOutput("files"),tableOutput("path"),downloadButton(outputId = "downloadTiff",label = "Download GoeTiff file")
)
)
)
bin_raster = function(x) {
rf.file = file(x,'rb')
bin_data = readBin(
rf.file,what = 'double',n = 120705,size = 4,endian = "big"
)
rf_matrix = matrix(
data = bin_data,nrow = 301,ncol = 401,byrow = T
)
rf_rast1 = flip(
raster(
rf_matrix,xmn = 70,xmx = 110,ymn = 5,ymx = 35,crs = "+proj=longlat +datum=WGS84"
),direction = 2
)
return(rf_rast1)
}
server = function(input,output) {
inFile = reactive({
if (is.null(input$layer$datapath)) {
return()
}
else{
for (i in input$layer$datapath) {
wb = bin_raster(i)
return(wb)
}
}
})
output$files = renderTable(input$layer)
output$path = renderTable(input$layer$datapath)
output$downloadTiff = downloadHandler(
filename = "GeoTiff.zip",content = function(file) {
#go to a temp dir to avoid permission issues
owd <- setwd(tempdir())
on.exit(setwd(owd))
files <- NULL
for (i in 1:length(input$layer$datapath)) {
fileName <- paste(input$layer$name[i],".tif",sep = "")
rr <- bin_raster(input$layer$datapath[i])
writeRaster(rr,fileName,format = "GTiff",overwrite = TRUE)
files <- c(fileName,files)
}
#create the zip file
zip::zip(file,files)
}
)
}
shinyApp(ui = ui,server = server)
我更改了以下内容
-
for
循环必须使用输入的长度 - 必须读取每个文件并将其转换为光栅,因此我在将其写入为
bin_raster
光栅之前调用了gtiff
。inFile()
函数将不起作用,因为它返回输入列表中的第一项,而不是所有项的列表。
读取栅格的代码产生了一个奇怪的结果,但我认为这是一个单独的问题。通常您会使用 raster()
,但如果栅格由许多文件组成,这将不起作用。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。