#leaflet #raster #sf #shinyapps
Вопрос:
Я хочу, чтобы пользователи могли создавать кучу полигонов на карте, а затем использовать эти полигоны для создания нового растра, а затем изменять карту. Пока я могу просто загрузить свою карту, отобразить ее, затем пользователь может создавать полигоны, и я могу сохранить их на диск. Однако я понятия не имею, как перенести эти новые фигуры, чтобы затем создать новый растр, который я хочу затем построить. Приведенный ниже код не работает, но, надеюсь, кто-то сделал что-то подобное, чтобы указать мне правильное направление. Спасибо
library(shiny)
library(raster)
library(leaflet)
library(leaflet.extras)
library(sf)
World_bio <- getData('worldclim', var='bio', res=10)
myraster <- projectRaster(World_bio$bio1,crs = CRS(" init=epsg:3857"))
ui <- bootstrapPage(
leafletOutput("mymap"),
absolutePanel(top = 10, right = 10, width = 300,
style = "padding: 8px",
actionButton("printShapes", h5(strong("Generate New Map"))))
)
server <- function(input, output, session) {
output$mymap <- renderLeaflet({
map <- leaflet() %>%
addTiles() %>%
addDrawToolbar(polylineOptions = F,
markerOptions = F,
circleMarkerOptions = F,
targetGroup = "draw",
editOptions = editToolbarOptions(edit=TRUE)) %>%
addRasterImage(myraster,project = F,
opacity = 0.3,group = "myraster")
map
})
# Capture user generated polygons
observeEvent(input$printShapes, {
# Get polys
polys <- input$mymap_draw_all_features
# Turn them into sf polygons
polys <- lapply(polys$features,FUN = function(X){
coords <- matrix(unlist(X$geometry$coordinates),ncol = 2,byrow = T)
poly <- st_polygon(list(coords))
poly
})
# Modify the raster using these polygons, the raster doesn't exist here
new_raster <- myraster
for(i in 1:length(polys)){
new_raster[cellFromPolygon(object = new_raster,polys[[i]])] <- 0 # Turn to 0
}
# Save the raster since I don't know how to send it over
writeRaster(new_raster,"new_raster")
})
# Modify the map, remove the previous raster and load the new one
observe({
# Load new rasters
new_raster <- raster("new_raster")
leafletProxy("mymap") %>%
clearImages() # Remove the rasters %>%
addRasterImage(new_raster,project = F,
opacity = 0.3,group = "XGB") %>%
leaflet::addLegend(pal = pal,values = seq(0,1,0.1),title = "Use") %>%
addRasterImage(keras_after,project = F,
colors = pal,
opacity = 0.3,group = "myraster")
})
}
# Run the application, doesn't work since
shinyApp(ui = ui, server = server)