【问题标题】:Passing selectInput values to map将 selectInput 值传递给映射
【发布时间】:2016-07-16 21:46:13
【问题描述】:

我试图弄清楚如何使用通过 UI 端的 selectInput 选择的变量来填充服务器端的地图数据。尽管我在手动设置变量以通过过滤数据显示时取得了一些成功,但对于可以动态更改的输入,它不能正常工作。是否有一些功能/解决方案可以帮助根据用户输入对数据进行子集化以显示在地图上?

UI.R

districts <- readOGR("location",layer)
metadata <- read.csv("metadata.csv")

#Prepare list of values for the selectInput boxes
COMMUNITYSAFETY<-as.list(metadata$variable[metadata$group == "Community Safety"])
names(COMMUNITYSAFETY)=metadata$description[metadata$group == "Community Safety"]

##CONTINUED FOR REST OF SELECTINPUT BOXES

ui <- fluidPage(
  titlePanel("Map"),
  sidebarPanel(
    selectInput("vr", "Would you like to show the variable by value or rank?",
                c("Value" = "_v",
                  "Rank" = "_r")
    ),
    selectInput("group", "Select Group:",
                c("Community Safety" = "COMMUNITYSAFETY",
                  "Demographics" = "DEMOGRAPHICS",
                  "Healthy People and Environments" = "HEALTHY_PEOPLE_ENVM",
                  "Housing" = "HOUSING",
                  "Income and Employment" = "INCOME_EMPL",
                  "Lifelong Learning" = "LIFE_LEARNING",
                  "Transportation" = "TRANSPORTATION")),
    #if user choses Community Safety
    conditionalPanel(
      condition = "input.group == 'COMMUNITYSAFETY'",
      selectInput("var", "Community Safety Variables:",
                  COMMUNITYSAFETY)),

    #repeat other conditional panels for inputs

  mainPanel(
    tabsetPanel(  
      tabPanel("Map", leafletOutput("map", height=800)),
      tabPanel("Histogram")
))))

服务器.R:

server <- function(input, output, session){
  filteredData <- reactive({
    subset(districts,select=input$var)
  })

...

  observe({
    leafletProxy("map", data=districts) %>%
      addPolygons(stroke=TRUE,
                  fillColor=pal(filteredData()),
                  color="black",
                  weight=.5)
  }) 
}

【问题讨论】:

    标签: r shiny gis


    【解决方案1】:

    我认为问题在于,你如何使用leafletProxy。输入?leafletProxy,你会看到,leafletProxy 没有任何data 参数!

    leafletProxy(mapId, session = shiny::getDefaultReactiveDomain(), 数据 = NULL,deferUntilFlush = TRUE)

    所以,你需要在你的代码的第二部分添加你的data districts,即这里:

    addPolygons(data = districts, stroke=TRUE,
        fillColor=pal(filteredData()),
        color="black", weight=.5)
    

    您应该记住的是,您的 districts 应该是 leaflet 可以理解的内容。 leaflet 的帮助page says 可以显示来自sp 包的spatial classobjects。因此,您必须将您的地区转换为SpatialPolygon

    假设您有一个包含lat lng 列的矩阵,其中每个条目是多边形的节点/点之一,此函数将矩阵转换为所需的输出以在地图上显示。

    makePoly

    if (nrow(myMatrix) >= 3) {
        # create Polygon
        myPolygon <- Polygon(myMatrix)
    
        # create Polygon List
        myPolygonList <- Polygons(list(myPolygon), 1)
    
        # create spatial Polygon 
        # why? -> can have a CRS associated with it!
        myPolygonSpatial <- SpatialPolygons(list(myPolygonList))
    
        # assign CRS
        proj4string(myPolygonSpatial) <- CRS("+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext  +no_defs")
    
        return(myPolygonSpatial)
    
    } else {
        print("Matrix to short")
    }
    

    【讨论】:

      【解决方案2】:

      我认为问题很简单,你可以简单地使用subset() 函数对数据进行子集化,然后将数据用于绘图。

      考虑以下代码:

      districts <- readOGR("location",layer)
      output$Map = renderLeaflet({
      filterData = subset(districts, districts$variable = input$var)
      mapStates = map("world",region= filterData$variable, fill = TRUE, plot = FALSE)
      mapa <- leaflet(mapStates) %>% addTiles()%>%
      addPolygons(stroke = FALSE, smoothFactor = 0.2, fillOpacity = 0.5,color = "black") %>%
      setView(lng = 31, lat = 35, zoom = 1)
      })  
      

      此外,您可以用不同地区/国家的名称代替“世界”。

      希望这会有所帮助:)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-05-12
        • 1970-01-01
        • 2017-06-19
        • 2015-10-23
        • 1970-01-01
        • 1970-01-01
        • 2020-06-16
        相关资源
        最近更新 更多