我试图弄清楚如何使用 Shiny App,用户可以通过 fileInput 提交 shapefile,然后将其映射到传单 basemap 上。我被困在 server.R 脚本上,不确定如何处理用户提交的 shapefile 并将其转换为空间数据框对象。
最佳答案
这在 Ubuntu Shiny 服务器中对我有用。
#You need a folder with write permissions
ruta_conpermiso= "/srv/shiny-server/app"
substrRight <- function(x, n){
substr(x, nchar(x)-n+1, nchar(x))
}
ui <- fluidPage(
column(10,
fileInput(inputId = "shp", label = "Importar un Shape :", multiple = TRUE,
accept = c('.shp', '.dbf','.sbn', '.sbx', '.shx', '.prj')),
verbatimTextOutput("value"),
tableOutput("finalizado"),
)
)
server_v2 <- function(input, output, session) {
uploadShpfile <- reactive({
if (!is.null(input$shp)) {
shp <<- input$shp
for(i in (1:length(shp$datapath))){
print(i)
ruta_temp<<-shp$datapath[i]
sub<-str_split(as.character(ruta_temp), "/",n=3)
#ruta archivo
sub1<-str_split(as.character(ruta_temp), paste("/",as.character(i-
1),".",sep=""),n=3)
ruta_archivo<-sub1[[1]][1]
#nombre archivo
nombre_archivo<-sub[[1]][3]
#nuevo nombre archivo
nuevo_nombre<-gsub(as.character(i-1),"shapetemp",nombre_archivo)
#nuevo nombre
#nueva_dir<-paste(ruta_conpermiso,nuevo_nombre,sep="/")
nueva_dir<-paste(ruta_conpermiso)
#copio el archivo el directorio de trabajo
file.copy(ruta_temp, nueva_dir)
#Lo renombro
#nombre original
nombre_archivo<- substrRight(nombre_archivo, 5)
nombre_org<<-paste(ruta_conpermiso,nombre_archivo,sep="/")
#nombre final
nuevo_nombre<-substrRight(nuevo_nombre, 13)
nombre_final<<-paste(ruta_conpermiso,nuevo_nombre,sep="/")
file.copy(nombre_org, nombre_final)
}
#aca armo el shapefile
if(1 == 1){output$value <- renderText({paste(nombre_final)})
try(shapefile<<-
readOGR(paste(ruta_conpermiso,"shapetemp.shp",sep="/")),silent=T)
if (!exists("shapefile")){ output$value <-
renderText({"No se puede abrir el archivo"})}
if (exists("shapefile")) { output$finalizado <-
renderTable(shapefile@data)}
}
}
})
observeEvent(input$shp, {
uploadShpfile()
})
}
shinyApp(ui=ui, server=server_v2)
我希望这很有用。此致。
关于r - 如何将shapefile上传到Shiny App,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45337936/