R/Shiny + leaflet으로지도에지도 키와 메모 쓰기

16638 단어 RleafletShiny

소개



R/Shiny + leaflet으로지도에 메모를 남기는 기능을 구현해 보았습니다. 구현한 것은 이하의 기능.
- 맵을 선택하면 키가 일시적으로 배치.
- 놓고 싶은 위치에서 [Place]를 누르면 놓은 키의 위도 경도를 테이블에 등록.
- 표시되는 모달에 메모를 기입하고, 모달의 [OK]를 누르면 메모 첨부의 키가 고정.
- 키를 선택하면 팝업에 메모를 표시합니다.
- 키를 선택하고 [Delete]를 누르면 삭제.

소스 코드



구체적인 코드는 이하.

mapkey.R
library(shiny)
library(leaflet)
library(leaflet.extras2)

ui <- fluidPage(
  leafletOutput(outputId="map", height="400"),
  actionButton(inputId="place", label="Place"),
  actionButton(inputId="delete", label="Delete"),
  tableOutput(outputId="table")
)

server <- function(input, output, session){
  r <- reactiveValues(
    i=0,
    id=NULL,
    lat=NULL,
    lng=NULL)

  ### Map display
  output$map <- renderLeaflet(expr={
    leaflet() %>% addTiles() %>% setView(lng=135, lat=35, zoom=9)
  })

  ### Place a marker temporarily
  observeEvent(
    eventExpr=input$map_click,
    handlerExpr={
      leafletProxy(mapId="map", session=session) %>%
        clearShapes() %>%
        addMapkeyMarkers(lng=input$map_click$lng, lat=input$map_click$lat, layerId = "marker")
    }
  )

  ### Fix a marker and write memorandum
  observeEvent(
    eventExpr=input$place,
    handlerExpr={
      r$i <- r$i + 1 # marker id
      r$lat <- append(r$lat, input$map_click$lat)
      r$lng <- append(r$lng, input$map_click$lng)
      r$table <- data.frame(r$lat, r$lng)
      r$table$index <- c(1:r$i) # rownames(r$table)

      output$table <- renderTable(expr={
        r$table
      })

      showModal(
        ui = modalDialog(
          textInput(inputId="content", label="Message:"),
          footer = actionButton(inputId = "set_content", label = "OK"),
          easyClose = TRUE
        )
      )
    }
  )

  ### Remove modal when clicking "OK" button
  observeEvent(
    eventExpr=input$set_content,
    handlerExpr={
      leafletProxy(mapId="map", session=session) %>%
        addMarkers(lng=r$lng, lat=r$lat, layerId=sprintf("%d", as.integer(r$i)), popup=r$content())
      removeModal()
    }
  )

  ### Getting marker id which is selected
  observeEvent(
    eventExpr=input$map_marker_click,
    handlerExpr={
      r$id <- input$map_marker_click$id
      # p <- input$map_marker_click
      # print(p)
    }
  )

  ### Delete a marker when clicking "Delete" button
  observeEvent(
    eventExpr=input$delete,
    handlerExpr={
      leafletProxy(mapId="map", session=session) %>% 
        removeMarker(layerId = r$id)
      r$id <- NULL
      r$lat <- NULL
      r$lng <- NULL
    }
  )


}

shinyApp(ui, server)

위의 결과는 다음 GIF와 같습니다. 간이적으로 작성했기 때문에 수정점은 많이 있지만, 지금까지로 한다.

좋은 웹페이지 즐겨찾기