Как управлять слоями в блестящем приложении, используя checkboxGroupInput? - PullRequest
0 голосов
/ 26 февраля 2019

Поскольку я относительно новичок в R и Shiny, я хотел бы задать несколько вопросов о нескольких слоях в приложении Shiny.Буду признателен за вашу помощь, поскольку я не уверен, что я на правильном пути.

Я пытаюсь создать приложение интерактивной карты, в котором будут отображаться следующие слои: 0. Базовая карта (OSM), 1Старые полигоны, 2. Новые полигоны определенной географической области.

Ниже вы можете найти мой код:

#IMPORTED LIBRARIES

library(leaflet)
library(shinyWidgets)
require(shiny)
require(shinythemes)
library(leaflet.extras)
library(htmlwidgets)
library(jsonlite)
library(RJSONIO)
library(shinyBS)


#UI

ui <- navbarPage("Interactive map",id="nav",

                 tabPanel("Interactive map of this area",
                          div(class="outer",

                              tags$head(
                                # Include our custom CSS
                                includeCSS("C:/Users/Korisnik/Desktop/R/30012019_int_mapa/www/styles.css")),

                              leafletOutput("m",height= "100%", width="100%"))),

                 absolutePanel(   id = "controls", class = "panel panel-default", fixed = TRUE,
                                  draggable = TRUE, top = 60, left = "auto", right = 20, bottom = "auto",
                                  width = 330, height = "auto",

                                  h2("Search polygons by number"),

                                  searchInput(
                                    inputId = "search", label = "write the number og parcel",
                                    btnSearch = icon("search"),
                                    btnReset = icon("remove"),
                                    width = "350px"),

                                  checkboxGroupInput("layers", label = h3("Choose layer"), 
                                                     choices = list("Old polygons", "New polygons"),
                                                     selected = NULL),


                                  hr(),
                                  uiOutput("tab")
                 )

)        



#SERVER

old_polygons<-fromJSON("old_polygons_wgs84.geojson")
new_polygons<-fromJSON("new_polygons_wgs84.geojson")

server <- function(input, output) {

  output$m <- renderLeaflet({
    leaflet() %>%
      addTiles(group = "OSM (default)") %>%
      setView(lng =#from file , lat=#from file, zoom = 11.9)%>%


    addMeasure(
      position = "bottomleft",
      primaryLengthUnit = "meters",
      primaryAreaUnit = "sqmeters",
      activeColor = "#3D535D",
      completedColor = "#7D4479")%>%

      addFullscreenControl( pseudoFullscreen = TRUE)%>%
      addResetMapButton()


  })
    output$layers<-({leafletProxy(m)%>%
      if(input$layers=="Old polygons"){
        addGeoJSON(old_polygons)%>%
        showGroup("Old polygons")%>%
        hideGroup("New polygons")%>%
      }

    })

  output$res <- renderPrint({
    input$search })

  url <- a("Find me the price", href="http://....")
  output$tab <- renderUI({
    tagList("In this page you can find a price for your parcel", url)
  })


}

# Run the application 
shinyApp(ui = ui, server = server)

Итак, я пытаюсь добиться того, чтобы, когда пользовательщелкает в групповом окне «Старые полигоны» на панели приложения, чтобы иметь возможность увидеть наложение полигонов на базовой карте OSM.Или то же самое, когда пользователь хочет видеть «Новые полигоны».

Я пытался, например, написать код с «оператором if», который я написал в своем коде ранее, но когда я пытаюсь запуститьApp инажмите на один из слоев, я вижу только базовую карту OSM.Полигоны не загружаются.

Еще одна вещь, которую я пробовал, - это добавить полигоны на стороне сервера вместе с функцией renderLeaflet, но когда я запускаюApp, загрузка занимает много времени, и, наконец, она вообще не загружается.,Я просто ждал, и приложение работало безрезультатно.

До этого я успешно создавал интерактивную карту такого типа, используя шейп-файлы вместо geoJSON, но когда я пытался сделать то же самое в среде приложения, я как быне удалось.

Код карты ниже:

    old_polygons <- readOGR(dsn = "C:/Users/Korisnik/Desktop/R/30012019_int_mapa/old_polygons_wgs84.shp")
    new_polygons <- readOGR(dsn = "C:/Users/Korisnik/Desktop/R/30012019_int_mapa/new_polygons_wgs84.shp")

    m<-leaflet() %>%
      addTiles(group = "OSM (default)") %>%
      setView(lng =, lat=, zoom = 11.9)%>%
      addPolygons(data=old_polygons,
                  color="#cc0000",
                  weight=1,
                  smoothFactor=0.5,
                  group="Old polygons")%>%

      addPolygons(data=new_polygons,
                  color="#bfff80",
                  weight=1,
                  smoothFactor=0.5,
                  group="New polygons")%>%


      addLayersControl(
        baseGroups = c("OSM (default)"),
        overlayGroups = c("Old polygons", "New polygons"),
        position="bottomleft",
        options = layersControlOptions(collapsed = FALSE))%>%


 addResetMapButton()%>%

       addMeasure(
         position = "topright",
         primaryLengthUnit = "meters",
         primaryAreaUnit = "sqmeters",
         activeColor = "#3D535D",
         completedColor = "#7D4479")
        m

Буду признателен, если кто-нибудь сможет дать мне несколько советов, рекомендаций, справку о том, как правильно управлять показом / скрытием моих слоев в приложении Shiny.

...