mapview for shiny

你说的曾经没有我的故事 提交于 2019-11-29 17:00:58

问题


I create an interactive map using mapView

the mapview() function works fine with my gridded data (SpatialPixelsDataFrame):

Code:

library(sp)
library(ggplot2)
library(gstat)
library(rgdal)
library(mapview)
library(RMySQL)

con <- dbConnect(MySQL(),
                 user="root",
                 password="",
                 host="127.0.0.1",
                 dbname="rstudio")
data<-dbReadTable(con,"data")
on.exit(dbDisconnect(con))

data_test <- data
data_test$x <- data$long
data_test$y <- data$lat
coordinates(data_test) = ~x + y
x.range <- as.numeric(c(-5.99, -5.74))  
y.range <- as.numeric(c(35.57, 35.81))  
grd <- expand.grid(x = seq(from = x.range[1], to = x.range[2], by = 0.002), 
                   y = seq(from = y.range[1], to = y.range[2], by = 0.002))  # expand points to grid
coordinates(grd) <- ~x + y
gridded(grd) <- TRUE

idw <- idw(formula = temp ~ 1, locations = data_test, newdata = grd)
idw.output = as.data.frame(idw)  # output is defined as a data table

names(idw.output)[1:3] <- c("long", "lat", "temp")
idw.output <- idw.output[,1:3]

coordinates(idw.output) <- ~long+lat
morocco <- readOGR("Data/morocco/TNG", "TNG")
proj4string(idw.output)<-proj4string(morocco)
tempData <- idw.output[morocco,]
proj4string(data_test)<-proj4string(morocco)
gridded(tempData) <- TRUE
m<-mapView(tempData, zcol = "temp") + data_test
m

Result:

Now

I want to move to shiny, the problem is that there is no render function for mapview. I've tried to use fpView() bView() but no result.

My try with Shiny

Code:

ui.R

library(shiny)
library(shinydashboard)
library(mapview)

header <- dashboardHeader(title="Ardusky")

sidebar <- dashboardSidebar(
)

body <- dashboardBody(
  # Define UI for application
  fluidPage(
    mainPanel(
      mapview:::fpViewOutput("mapplot"),
      mapview:::plainViewOutput("test")
    ))
)

ui <- dashboardPage(header, sidebar, body, skin="black")

server.R

library(shiny)
library(mapview)
library(ggplot2)
library(sp)
library(gstat)
library(rgdal)
library(RMySQL)

shinyServer(function(input, output, session) {

  repInput <- reactive({
                    con <- dbConnect(MySQL(),
                                     user="root",
                                     password="",
                                     host="127.0.0.1",
                                     dbname="rstudio")
                    data<-dbReadTable(con,"data")
                    on.exit(dbDisconnect(con))
                    data_test <- data
                    data_test$x <- data$long
                    data_test$y <- data$lat
                    coordinates(data_test) = ~x + y
                    x.range <- as.numeric(c(-5.99, -5.74))  
                    y.range <- as.numeric(c(35.57, 35.81))  
                    grd <- expand.grid(x = seq(from = x.range[1], to = x.range[2], by = 0.002), 
                                       y = seq(from = y.range[1], to = y.range[2], by = 0.002))  # expand points to grid
                    coordinates(grd) <- ~x + y
                    gridded(grd) <- TRUE
                    idw <- idw(formula = temp ~ 1, locations = data_test, newdata = grd)
                    idw.output = as.data.frame(idw)  # output is defined as a data table
                    names(idw.output)[1:3] <- c("long", "lat", "temp")
                    idw.output <- idw.output[,1:3]
                    coordinates(idw.output) <- ~long+lat
                    morocco <- readOGR("/home/bloodesu/Data/morocco/TNG", "TNG")
                    proj4string(idw.output)<-proj4string(morocco)
                    tempData <- idw.output[morocco,]
                    proj4string(data_test)<-proj4string(morocco)
                    gridded(tempData) <- TRUE
                    tempData
  })

  output$mapplot <- mapview:::renderfpView({
    mapview:::fpView(repInput(), zcol = "temp")
  })

  output$test <- mapview:::renderPlainView({
    mapview:::plainview(repInput(), zcol = "temp")
  })


})

Result

Conclusion

As you can see only the plainView gives some acceptable results but without leaflet support


回答1:


mapview and shiny are not naturally made for each other. However, mapview is based on leaflet so we can leverage shiny support from leaflet. The trick is to set up your map object using mapview and then calling the @map slot (the leaflet part) inside renderLeaflet()

ui.R

library(shiny)
library(shinydashboard)
library(mapview)

header <- dashboardHeader(title="Ardusky")

sidebar <- dashboardSidebar(
)

body <- dashboardBody(
  # Define UI for application
  fluidPage(
    mainPanel(
      leafletOutput("mapplot"),
      mapview:::plainViewOutput("test")
    ))
)

ui <- dashboardPage(header, sidebar, body, skin="black")

server.ui

library(shiny)
library(mapview)
library(sp)

shinyServer(function(input, output, session) {

  data(meuse)
  coordinates(meuse) <- ~x+y
  proj4string(meuse) <- CRS("+init=epsg:28992")

  data(meuse.grid)
  coordinates(meuse.grid) <- ~x+y
  proj4string(meuse.grid) <- CRS("+init=epsg:28992")
  gridded(meuse.grid) <- TRUE

  m <- mapview(meuse.grid, zcol = "dist") + meuse

  output$mapplot <- renderLeaflet({
    m@map
  })

})

Does this solve your problem?


UPDATE: I have just added mapviewOutput and renderMapview to the development version on github. This means that we can now skip the explicit call to the @map slot of the mapview object. So something like output$mapplot <- renderMapview(m) should work now.

The development version of mapview can be installed with devtools::install_github("environmentalinformatics-marburg/mapview", ref = "develop")

UPDATE (2018/04/01): renderMapview and mapviewOutput currently do not work! Thus, calling renderLeaflet({ m@map }) is currently the way to use mapview with shiny.



来源:https://stackoverflow.com/questions/36679944/mapview-for-shiny

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!