2017-05-16 13 views
0

Shiny의 R에 대한 전단지 및 전단지에 레이어 그룹을 기반으로 WMS 범례를 표시하려고합니다. here에 설명 된대로 $ map_groups 입력을 사용하고 있지만 WMS 범례를 숨기거나 토글하는 방법에 대한 아이디어는 없습니다.R for Leaflet의 레이어 그룹을 기반으로 WMS 범례를 표시하는 방법은 무엇입니까?

감사합니다,

후안

library(shiny) 
library(leaflet) 
library(leaflet.extras) 

# User Interface 
ui <- bootstrapPage(
    tags$style(type="text/css", "html, body {width:100%;height:100%}"), 
    leafletOutput("map", width="100%", height="100%") 
) 

##### Shiny function server side 

    server = function(input, output, session) { 

    output$map <- renderLeaflet({ 
     leaflet() %>% 
     addProviderTiles("CartoDB.DarkMatter", options = tileOptions(minZoom = 0))%>% 
     addTiles(urlTemplate ="http://dataportal-dev.aquacross.eu/geoserver/gwc/service/tms/1.0.0/general:[email protected]:[email protected]/{z}/{x}/{y}.png", 
       options = tileOptions(noWrap = TRUE, tms = TRUE, opacity =0.9),group ="P1", layerId ="test")%>% 
     addTiles(urlTemplate ="http://dataportal-dev.aquacross.eu/geoserver/gwc/service/tms/1.0.0/general:[email protected]:[email protected]/{z}/{x}/{y}.png", 
        options = tileOptions(noWrap = TRUE, tms = TRUE, opacity =1),group ="P2", layerId ="test2")%>% 
     # addWMSLegend(position = "topright",uri='http://dataportal-dev.aquacross.eu/geoserver/wms?REQUEST=GetLegendGraphic&VERSION=1.0.0&FORMAT=image/png&WIDTH=50&HEIGHT=20&LAYER=g2015_simplified', layerId ="test")%>% 
     addLayersControl(
     baseGroups = c("P1", "P2"), 
     options = layersControlOptions(collapsed =FALSE) 
    ) 
     }) 

## This is an attempt to show WMS legend maps based in groups 

     observeEvent(input$map_groups,{ 
     map <- leafletProxy("map") %>% clearControls() 
     if (input$map_groups == 'P1') 
     { 
     map %>% addWMSLegend(position = "topright",uri='http://dataportal-dev.aquacross.eu/geoserver/wms?REQUEST=GetLegendGraphic&VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=50&LAYER=g2015_simplified', layerId ="test") 
     } 
     else if (input$map_groups == 'P2') 
     { 
     map %>% addWMSLegend(position = "topright",uri='http://dataportal-dev.aquacross.eu/geoserver/wms?REQUEST=GetLegendGraphic&VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=topp:states', layerId ="test2") 
     } 
    }) 
} 

shinyApp(ui, server) 
+0

질문을 구체적으로 적어주십시오. – jsb

+0

아이디어는 레이어 그룹을 기반으로 WMS 범례를 숨기거나 전환하는 것이지만 그 방법을 찾을 수는 없습니다 .. – arevaju

+0

P1 및 P2 버튼의 의도 된 효과는 무엇입니까? – jsb

답변

0

나는 코드로 주위 재생, 그리고 addWMSLegend 함수가 if 문 내에서 작동하지 않는 것 같다. 그러나 이것은 일반적인 파이프 관용구에서 작동하지만 원하는 것은 아닙니다. 표준 addLegend 함수는 다음 코드와 같이 if 문에서 정상적으로 작동합니다. 나는 당신의 코드를 일부 정리했다.

library(shiny) 
library(leaflet) 
# devtools::install_github('bhaskarvk/leaflet.extras') 
library(leaflet.extras) 

link1 <- "http://dataportal-dev.aquacross.eu/geoserver/gwc/service/tms/1.0.0/general:[email protected]:[email protected]/{z}/{x}/{y}.png" 
link2 <- "http://dataportal-dev.aquacross.eu/geoserver/gwc/service/tms/1.0.0/general:[email protected]:[email protected]/{z}/{x}/{y}.png" 
link3 <- "http://dataportal-dev.aquacross.eu/geoserver/wms?REQUEST=GetLegendGraphic&VERSION=1.0.0&FORMAT=image/png&WIDTH=50&HEIGHT=20&LAYER=g2015_simplified" 
link4 <- "http://dataportal-dev.aquacross.eu/geoserver/wms?REQUEST=GetLegendGraphic&VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=50&LAYER=g2015_simplified" 

ui <- bootstrapPage(
    tags$style(type = "text/css", "html, body {width:100%;height:100%}"), 
    leafletOutput("map", width = "100%", height = "100%") 
) 

server = function(input, output, session) { 
    output$map <- renderLeaflet({ 
    leaflet() %>% 
     addProviderTiles("CartoDB.DarkMatter", options = tileOptions(minZoom = 0), group = "P0", layerId = "DM") %>% 
     addTiles(urlTemplate = link1, options = tileOptions(noWrap = TRUE, tms = TRUE, opacity = 1), group = "P1", layerId = "test") %>% 
     addTiles(urlTemplate = link2, options = tileOptions(noWrap = TRUE, tms = TRUE, opacity = 1), group = "P2", layerId = "test2") %>% 
     addWMSLegend(uri = link3, position = "topleft", layerId = "legend") %>% 
     addLayersControl(baseGroups = c("P0", "P1", "P2"), options = layersControlOptions(collapsed = FALSE)) 
    }) 

    observeEvent(input$map_groups, { 
    map <- leafletProxy("map") %>% clearControls() 
    if (input$map_groups == "P0") { 
     map <- map %>% addLegend(
     layerId = "legend", 
     title = "Legend", 
     position = "topleft", 
     values = c(1, 2), 
     labels = c("Gray", "Black"), 
     colors = c("gray", "black")) 
    } else if (input$map_groups == "P1") { 
     map <- map %>% addLegend(
     layerId = "legend", 
     title = "Legend", 
     position = "topleft", 
     values = c(1, 2), 
     labels = c("Gray", "Lemonchiffon"), 
     colors = c("gray", "lemonchiffon")) 
     # map <- map %>% addWMSLegend(layerId = "legend", uri = link3, position = "topleft") 
    } else if (input$map_groups == "P2") { 
     map <- map %>% addLegend(
     layerId = "legend", 
     title = "Legend", 
     position = "topleft", 
     values = c(1, 2), 
     labels = c("Gray", "Tan"), 
     colors = c("gray", "tan")) 
    } 
    }) 

} 

shinyApp(ui, server) 
+0

감사! 이게 잘 작동하지만, 문제는 기본적으로 WMS 범례를 손으로 생성해야한다는 것입니다. 그리고 내가 가진 것처럼 좀 더 복잡한 전설로 꽤 많은 시간이 소요될 수 있습니다. 아마도이 문제는 "leafletProxy"함수와 관련이있을 수 있습니다. 왜냐하면 addWMSLegend는 leaflet.extras에서 온 것입니다. – arevaju

+0

그래,'leaflet'과'leaflet.extras' 패키지 사이에 상호 운용성이 부족한 것 같습니다. – jsb