With leaflet and mapview you can achieve something similar:
library(raster) library(mapview) library(leaflet) f <- system.file("external/test.grd", package="raster") r <- raster(f) leaflet() %>% addRasterImage(r, layerId = "values") %>% addMouseCoordinates() %>% addImageQuery(r, type="mousemove", layerId = "values")
Putting this in a brilliant application, you will receive:
library(raster) library(mapview) library(leaflet) library(shiny) f <- system.file("external/test.grd", package="raster") r <- raster(f) ui <- fluidPage( leafletOutput("map") ) server <- function(input, output){ output$map <- renderLeaflet({ leaflet() %>% addRasterImage(r, layerId = "values") %>% addMouseCoordinates() %>% addImageQuery(r, type="mousemove", layerId = "values") }) } shinyApp(ui, server)
The following example illustrates the idea of ​​converting a raster to simple objects / shapefiles. It cannot be used for large files, but tags can be developed individually, data is editable and can be easily displayed in a table.
library(raster) library(leaflet) library(shiny) library(sf) library(DT) library(dplyr) ## DATA f <- system.file("external/test.grd", package="raster") r <- raster(f) r1 = aggregate(r, 30) sp = st_as_sf(rasterToPolygons(r1)) cn = st_coordinates(st_transform(st_centroid(sp),4326)) sp = st_transform(sp, 4326) sp = cbind(sp, cn) sp$id <- 1:nrow(sp) colnames(sp)[1] <- "value" ## UI ui <- fluidPage( leafletOutput("map"), uiOutput("newValueUI"), textInput("newVal", label = "Enter new value"), actionButton("enter", "Enter new value"), hr(), dataTableOutput("table") ) ## SERVER server <- function(input, output){ ## Reactive Shapefile sp_react <- reactiveValues(sp = sp) ## Leaflet Map output$map <- renderLeaflet({ pal= colorNumeric(topo.colors(25), sp_react$sp$value) leaflet() %>% addPolygons(data = sp_react$sp, label= paste( "Lng: ", as.character(round(sp_react$sp$X,4)), "Lat: ", as.character(round(sp_react$sp$Y,4)), "Val: ", as.character(round(sp_react$sp$value,4))), color = ~pal(sp_react$sp$value), layerId = sp_react$sp$id ) }) ## Observe Map Clicks observeEvent(input$map_shape_click, { click_id = input$map_shape_click$id click_grid <- sp_react$sp[sp_react$sp$id == click_id,] }) ## Observe Action Button observeEvent(input$enter, { click_id <- input$map_shape_click$id sp_react$sp[sp_react$sp$id == click_id,]$value <- as.numeric(input$newVal) }) ## Data Table output$table <- DT::renderDataTable({ sp_react$sp %>% st_set_geometry(NULL) %>% dplyr::select(id,X,Y,value) }) proxy = dataTableProxy('table') ## Table Proxy observeEvent(input$map_shape_click$id, { req(input$map_shape_click$id) proxy %>% selectRows(as.numeric(input$map_shape_click$id)) }) } shinyApp(ui, server)