R/Shiny + leaflet으로지도에지도 키와 메모 쓰기
소개
R/Shiny + leaflet으로지도에 메모를 남기는 기능을 구현해 보았습니다. 구현한 것은 이하의 기능.
- 맵을 선택하면 키가 일시적으로 배치.
- 놓고 싶은 위치에서 [Place]를 누르면 놓은 키의 위도 경도를 테이블에 등록.
- 표시되는 모달에 메모를 기입하고, 모달의 [OK]를 누르면 메모 첨부의 키가 고정.
- 키를 선택하면 팝업에 메모를 표시합니다.
- 키를 선택하고 [Delete]를 누르면 삭제.
소스 코드
구체적인 코드는 이하.
mapkey.Rlibrary(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와 같습니다. 간이적으로 작성했기 때문에 수정점은 많이 있지만, 지금까지로 한다.
Reference
이 문제에 관하여(R/Shiny + leaflet으로지도에지도 키와 메모 쓰기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/honda28/items/5e52d3470f154e7016e1
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
구체적인 코드는 이하.
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와 같습니다. 간이적으로 작성했기 때문에 수정점은 많이 있지만, 지금까지로 한다.
Reference
이 문제에 관하여(R/Shiny + leaflet으로지도에지도 키와 메모 쓰기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/honda28/items/5e52d3470f154e7016e1텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)