【问题标题】:R Shiny Leaflet How to Change Circles Size Based on Zoom LevelR Shiny Leaflet 如何根据缩放级别更改圆圈大小
【发布时间】:2020-07-19 06:32:31
【问题描述】:

我正在使用 Leaflet 地图创建一个闪亮的应用程序。它上面绘制了数千个小圆圈,圆圈的颜色讲述了一个故事。缩小时,圆圈保持较小(权重=1),因此它们重叠较少。然而,当用户放大时,小圆圈变得难以看到。我希望根据缩放级别增加圆圈的大小。我知道有一个input$MAPID_zoom 功能可以将缩放级别作为整数返回。

以下是一些可重现的代码,它将德克萨斯州达拉斯的 15 个随机点绘制到一张传单地图上,缩放设置为 6。当缩放级别增加到 8 时,我将如何将圆圈的权重从 1 更改为 2 , 放大到 10 时从 2 变为 3?

我在网上看到了一些讨论,但没有什么对我有用。请参阅下面的代码。提前致谢。

## app.R ##
library(leaflet)

ui <- dashboardPage(
  dashboardHeader(title = "Basic dashboard"),
  dashboardSidebar(),
  dashboardBody(
    leafletOutput("Map", width = "100%", height = "500px")
    
  )
)

server <- function(input, output) {

  df <- data.frame("Lat"=c(32.921821,32.910853,32.793803,32.995084,32.683745,32.759999,32.800652,32.958861,32.835963,32.762578,32.649651,32.862843,32.862217,32.936876,32.963381),
                   "Long"=c(-96.840609,-96.738831,-96.689232,-96.857858,-96.825345,-96.684475,-96.794144,-96.816111,-96.676371,-96.897331,-96.944426,-96.754719,-96.856976,-96.752718,-96.770249))

   output$Map <- renderLeaflet({
     leaflet(df) %>%
       addTiles(urlTemplate = "//{s}.tiles.mapbox.com/v3/jcheng.map-5ebohr46/{z}/{x}/{y}.png",
                attribution = 'Maps by <a href="http://www.mapbox.com/">Mapbox</a>') %>% 
       setView(lng = -96.84, lat = 32.92, zoom = 6) %>%
       addCircles(lng = ~Long, lat = ~Lat, weight = 1,
                        opacity = 1, fill = TRUE,  fillOpacity = 1 )
   })
}
shinyApp(ui, server)

【问题讨论】:

    标签: r shiny leaflet


    【解决方案1】:

    好吧,这最终比我想象的更复杂,但我终于让它工作了。有一个观察者是关键。我还必须了解什么是 leafletProxy()(如果您不知道,请研究它)。最后,在观察者中使用 clearShapes() 清除形状是在放大和缩小时使其正常工作的关键。请参阅下面的代码。

    ## app.R ##
    library(leaflet)
    library(shinydashboard)
    library(shinydashboardPlus)
    library(dplyr)
    ui <- dashboardPage(
      dashboardHeader(title = "Basic dashboard"),
      dashboardSidebar(),
      dashboardBody(
        leafletOutput("map", width = "100%", height = "500px")
        
      )
    )
    
    server <- function(input, output,session) {
      
      df <- data.frame("Lat"=c(32.921821,32.910853,32.793803,32.995084,32.683745,32.759999,32.800652,32.958861,32.835963,32.762578,32.649651,32.862843,32.862217,32.936876,32.963381),
                       "Long"=c(-96.840609,-96.738831,-96.689232,-96.857858,-96.825345,-96.684475,-96.794144,-96.816111,-96.676371,-96.897331,-96.944426,-96.754719,-96.856976,-96.752718,-96.770249))
      
      observeEvent(
        eventExpr = input$map_zoom, {
          print(input$map_zoom)           # Display zoom level in the console
          leafletProxy(
            mapId = "map", 
            session = session
          )%>% clearShapes() %>%
            addCircles(data=df,lng = ~Long, lat = ~Lat, 
                       weight = case_when(input$map_zoom <=4 ~1, 
                                          input$map_zoom ==5 ~2, 
                                          input$map_zoom ==6 ~3, 
                                          input$map_zoom ==7 ~5, 
                                          input$map_zoom ==8 ~7, 
                                          input$map_zoom ==9 ~9, 
                                          input$map_zoom >9 ~11),
                       opacity = 1, fill = TRUE, fillOpacity = 1 )
        }
      )
      
      output$map <- renderLeaflet({
        leaflet() %>%
          addTiles(urlTemplate = "//{s}.tiles.mapbox.com/v3/jcheng.map-5ebohr46/{z}/{x}/{y}.png",
                   attribution = 'Maps by <a href="http://www.mapbox.com/">Mapbox</a>') %>%
          setView(lng = -96.84, lat = 32.92, zoom = 6) 
      })
    }
    shinyApp(ui, server)
    

    【讨论】:

      【解决方案2】:

      试试这个

      output$Map <- renderLeaflet({
          new_zoom <- 6
          wt <- 2
          if(!is.null(input$Map_zoom)) new_zoom <- input$Map_zoom
          
          leaflet(df) %>%
            addTiles(urlTemplate = "//{s}.tiles.mapbox.com/v3/jcheng.map-5ebohr46/{z}/{x}/{y}.png",
                     attribution = 'Maps by <a href="http://www.mapbox.com/">Mapbox</a>') %>% 
            setView(lng = -96.84, lat = 32.92, zoom=new_zoom ) %>%
            addCircles(lng = ~Long, lat = ~Lat, weight = wt, # radius=radius,
                       opacity = 1, fill = TRUE,  fillOpacity = 1 )
        })
      

      【讨论】:

      • 不幸的是,当用户放大时,这似乎并没有调整圆圈的大小。我的目的是找到一种方法,让圆圈在用户更改缩放级别时动态改变大小。将您的代码代替我的代码似乎不会使动态调整大小发生。但感谢您的尝试。
      猜你喜欢
      • 1970-01-01
      • 2016-02-09
      • 2021-10-23
      • 2013-11-18
      • 1970-01-01
      • 1970-01-01
      • 2011-10-26
      • 2017-04-09
      • 1970-01-01
      相关资源
      最近更新 更多