R传单-在地图上添加一个新标记,并且已经打开了弹出窗口

nd091680

我有一个显示单张地图的闪亮应用程序该应用程序的功能之一允许用户在地图上添加新的地理标记。但是,我想使这样的标记的弹出窗口在添加到地图上后就已经打开,但是始终保持使用“ x”按钮或通过单击地图将其关闭的可能性。

我已经阅读了传单文档的“标记”指南(“从图层继承的弹出方法”小节,很详细的指南显然没有R语言提供),并且找到了这个选项openPopup()不幸的是,这似乎不适用于我的代码。这是一个简单的例子:

library(leaflet)

leaflet() %>% 
  addTiles() %>% 
  addMarkers(lng = -100,
             lat = 50,
             popup = "ALE",
             options = popupOptions(openPopup = TRUE))

预期的行为是此在线工具中显示的使用传单的行为。请尝试搜索地址,然后看看新标记会立即打开其自己的弹出窗口。

在此先感谢您的帮助!

杀人的

代码

我猜可能需要一些JavaScript,因为该接口似乎不支持此功能。

在一个闪亮的示例下面:

library(shiny)
library(leaflet)
library(shinyjs)

js_save_map_instance <- HTML(
   paste(
      "var mapsPlaceholder = [];",
      "L.Map.addInitHook(function () {",
      "   mapsPlaceholder.push(this); // Use whatever global scope variable you like.",
      "});", sep = "\n"
   )
)

js_open_popup <- HTML(
   paste("function open_popup(id) {",
         "   console.log('open popup for ' + id);",
         "   mapsPlaceholder[0].eachLayer(function(l) {",
         "      if (l.options && l.options.layerId == id) {",
         "         l.openPopup();",
         "      }",
         "   });",
         "}", sep = "\n"
   )
)

ui <- fluidPage(
   tags$head(
      tags$script(type = "text/javascript",
                  js_save_map_instance,
                  js_open_popup),
      useShinyjs()
   ),
   wellPanel(
      fluidRow(
         sliderInput("lng", "Longitude:", 10, 60, 35, 0.01),
         sliderInput("lat", "Latitude:", 35, 75, 42.5, 0.01),
         actionButton("add", "Add Marker")
      )
   ),
   fluidRow(
      leafletOutput("map")
   )
)

server <- function(input, output, session) {
   map <- leaflet() %>% 
      addTiles() %>%
      fitBounds(10, 35, 60, 75)
   
   output$map <- renderLeaflet(
      map
   )
   
   observeEvent(input$add, {
      id <- paste0("marker", input$add)
      leafletProxy("map") %>%
         addMarkers(input$lng, input$lat, id,
                    "mymarkers", 
                    popup = sprintf("%.2f / %.2f: %s", input$lng, input$lat, 
                                    id))
      runjs(sprintf("setTimeout(() => open_popup('%s'), 10)", id))
   })
}

shinyApp(ui, server)

评论

  • leaflet.js初始化后没有提供开箱即用的功能来检索地图实例。因此,我们必须使用一种变通方法来在初始化时显式保存映射。这是通过存储在中的JS代码完成的js_save_map_instance这个想法是从初始化后的Find Leaflet地图对象获取的
  • 我们创建一个JS函数,该函数采用我们要为其打开弹出窗口的标记的ID。在此函数中,我们采用数组的第一个元素,其中存储了所有地图实例(如果页面上应有多个传单地图,则需要对此进行调整。
  • 在此地图实例上,我们可以遍历所有图层,如果layerId等于我们要查找的图层,则可以openPopup在此图层上调用注意,理想情况下,我们可以直接访问该层(同样,我没有在API中找到任何功能),并且可以使用private _layer属性,但是由于它是私有的,因此我使用循环方法。)
  • 剩下的就是open_popupshiny侧面的正确位置调用我需要添加一个小的延迟,以避免在添加标记之前调用函数。

结果

创建时弹出

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章