【问题标题】:Click on leaflet marker and get info单击传单标记并获取信息
【发布时间】:2018-12-23 12:09:53
【问题描述】:

基于下面的 cmets,我在空间数据框中明确划分了纬度/经度。

添加

addCircleMarkers( ~ longitude, ~ latitude)

添加

observeEvent(input$map_marker_click, { 
    p <- input$map_marker_click
    print(p)
  })

但是,当我单击标记时,控制台中没有显示任何内容,所以我仍然感到困惑。

修改后的代码

# Click on circle and get info

library(shiny)
library(leaflet)

ui <- fluidPage(
  leafletOutput("mymap"),
  fluidRow(verbatimTextOutput("click_text"))
)

server <- function(input, output, session) {

  # Create tree geometries
  tree_1g <- st_point(c(-79.2918671415814, 43.6760766531298))
  tree_2g <- st_point(c(-79.4883669334101, 43.6653747165064))
  tree_3g <- st_point(c(-79.2964680812039, 43.7134458013647))

  # Create sfc object with multiple sfg objects
  points_sfc <- st_sfc(tree_1g, tree_2g, tree_3g, crs = 4326)

  # Create tree attributes
  data <- data.frame (
    layerId = c("001", "002", "003"),
    address = c(10, 20, 30),
    street = c("first", "second", "third"),
    tname = c("oak", "elm", "birch"),
    latitude = c(43.6760766531298, 43.6653747165064, 43.7134458013647),
    longitude = c(-79.2918671415814, -79.4883669334101, -79.2964680812039)  
)

  tree_data <- st_sf(data, geometry = points_sfc)

  output$mymap <- renderLeaflet({
    leaflet(data = tree_data) %>%
      addProviderTiles(providers$Stamen.Watercolor) %>%

      # Centre the map in the middle of Toronto
      setView(lng = -79.384293, 
              lat = 43.685, 
              zoom = 11) %>% 

      addCircleMarkers( ~ longitude, ~ latitude)
  })

  observeEvent(input$map_marker_click, { 
    p <- input$map_marker_click
    print(p)
  })


}

shinyApp(ui, server)

当用户点击每个标记时,我希望在地图下方显示一些相关信息。基于这个早先post我试过这个。但是,当我单击标记时没有任何反应。这可能与我不了解如何将标记与 layerIds 相关联?

# Click on circle and get info

library(shiny)
library(leaflet)

ui <- fluidPage(
  leafletOutput("mymap"),
  fluidRow(verbatimTextOutput("click_text"))
)

server <- function(input, output, session) {

  # Create tree geometries
  tree_1g <- st_point(c(-79.2918671415814, 43.6760766531298))
  tree_2g <- st_point(c(-79.4883669334101, 43.6653747165064))
  tree_3g <- st_point(c(-79.2964680812039, 43.7134458013647))

  # Create sfc object with multiple sfg objects
  points_sfc <- st_sfc(tree_1g, tree_2g, tree_3g, crs = 4326)

  # Create tree attributes
  data <- data.frame (
    layerId = c("001", "002", "003"),
    address = c(10, 20, 30),
    street = c("first", "second", "third"),
    tname = c("oak", "elm", "birch")
)

  tree_data <- st_sf(data, geometry = points_sfc)

  output$mymap <- renderLeaflet({
    leaflet(data = tree_data) %>%
      addProviderTiles(providers$Stamen.Watercolor) %>%

      # Centre the map in the middle of Toronto
      setView(lng = -79.384293, 
              lat = 43.685, 
              zoom = 11) %>% 

      addCircleMarkers()
  })

  observe({
    click <- input$map_marker_click
    if(is.null(click))
      return()

    address <- paste("Address: ", click$street)
    output$click_text <- renderText({
      address
    })

  })

}

shinyApp(ui, server)

【问题讨论】:

  • addCircleMarkers 有参数 popuppopupOptions 用于在用户单击时弹出标签。您可能会发现使用它们比摆弄observe 要容易得多
  • 我要求在侧边栏中使用信息,而不是在弹出窗口中使用。我查看了 SymbolixAU 提到的链接并修改了我的问题,但仍然无法从点击事件中获取信息。
  • 当你点击圆圈标记时,有没有办法从弹出窗口中获取信息?

标签: r r-leaflet


【解决方案1】:

当您在地图上“观察”某物时,您需要参考您正在观察的地图。你使用这个结构来做到这一点

output$<map_id>_event_to_observe

因此,在您的示例中,您的 map_idmymap,因此您需要使用

observeEvent(input$mymap_marker_click, { 
    p <- input$mymap_marker_click
    print(p)
  })

【讨论】:

  • 谢谢。现在 p
  • @ixodid 在我在您的问题下的评论中链接的答案中,它说“id 值与您在形状绘图函数中指定的layerId 相关”。您需要在绘图函数中指定layerId 值。这将在 click 事件中作为 id 返回给您。然后,您可以使用它来关联您的数据。
  • 好的。我现在明白了。感谢您的耐心等待。
  • 当你点击圆圈标记时,有没有办法从弹出窗口中获取信息?
  • @ACE 这将取决于您如何填充弹出窗口。当您观察点击时,您可以获得一个“id”值,该值将指向您数据中的一个“id”。如果您的弹出信息是一列数据,您可以从此处获取。要获得更详细的答案,您可能应该提出一个新问题。
猜你喜欢
  • 1970-01-01
  • 2013-05-23
  • 1970-01-01
  • 2022-01-09
  • 2013-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多