【问题标题】:how to set zoom level/view of leaflet map如何设置传单地图的缩放级别/视图
【发布时间】:2018-07-05 03:20:00
【问题描述】:

我在 RShiny 中的 leaflet 中有一张地图,其中绘制了标记,一旦我单击标记,它就会添加圆圈以显示与标记相关的所有点。

我想要做的是设置地图的缩放/视图,使所有相关的圆圈都可见。

圆圈的数量因标记而异,即一些标记有 1 或 2 个圆圈,而一些标记有更多。此外,圆圈的位置在美国各地有所不同,因此可以放置在一个城市或另一个州。

以下是我用来向现有地图添加圆圈的代码

  proxy <-leafletProxy("map",data = df)%>%
  clearMarkers()%>%
  addCircleMarkers(lat = ~lat,lng = ~lng,layerId = ~circle_pt,fillColor = 
 'green',opacity = 0.5,color = 'red',fillOpacity = 1)%>% clearPopups()%>%
  addPopups(lat=~lat,lng=~lng,~as.character(circle_pt))

map=带标记的原始地图 df=lat lng 与地图中选定标记的相关属性的圆圈

我想设置如图 2 所示的缩放级别。

请帮助我确定如何计算 shiny 传单中的最佳缩放级别。

问候,

【问题讨论】:

  • 请尝试提供一个可重现的例子。

标签: r shiny leaflet r-leaflet


【解决方案1】:

如果要设置初始视图,可以使用:

setView(lng, lat, zoom = zoom_level)

直接来自documentation

除非您提供更多信息,否则没有人能够理解您所说的“所有相关圈子都可见”的部分。

【讨论】:

  • 我已添加图片以供进一步说明。图 2 显示了所需的缩放级别。
【解决方案2】:

我不确定您的应用程序是如何工作的,以及对传单的原始调用中的内容。但也许下面的例子可能会对你有所帮助。

我将点击存储在标记上,根据点击的layerId过滤数据,得到结果数据的最小/最大纬度/经度,然后使用fitBounds()设置“缩放”级别。 (你也可以使用 flyToBounds 和相同的参数,这样可以更平滑地过渡到选定的标记,但至少对我来说仍然太麻烦了)

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

cords <- data.frame(
  lng = runif(100, 14, 18),
  lat = runif(100, 54, 58),
  circle_pt = sample(1:20, size = 100, replace = T)
)

ui <- fluidPage(
  leafletOutput("map", height = "700px")
) 

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

  output$map <- renderLeaflet({
    leaflet(data = cords) %>% 
      addTiles() %>% 
      addCircleMarkers(lat = ~lat,lng = ~lng, layerId = ~circle_pt, fillColor = 'green',
                     opacity = 0.5,color = 'red',fillOpacity = 1) 
  })

  observeEvent(input$map_marker_click, {
    clickid = input$map_marker_click$id
    cordsNew = cords[cords$circle_pt==clickid,]

    maxLong = max(cordsNew$lng)
    maxLat = max(cordsNew$lat)
    minLong = min(cordsNew$lng)
    minLat = min(cordsNew$lat)

    proxy <-leafletProxy("map", data = cordsNew)
    proxy %>%
      addCircleMarkers(lat = ~lat,lng = ~lng, layerId = ~circle_pt, fillColor = 'green',
                       opacity = 0.5,color = 'red',fillOpacity = 1) %>% 

      fitBounds(minLong,minLat,maxLong,maxLat) %>% 

      clearPopups() %>%
      addPopups(lat=~lat,lng=~lng,~as.character(circle_pt))
  })
}

shinyApp(ui = ui, server = server)

【讨论】:

    【解决方案3】:

    也许你可以定义一个区间 varint

    varint <- findInterval()
    setView(lng= lng,lat = lat, zoom = varint)
    

    在findInterval中,尝试把某个范围的数据与所有点之间的距离放在一起

    编辑:

    尝试计算出现的最远点之间的距离。

        proxy <-leafletProxy("map",data = df) %>%
            setView(
              lng = click$lng, 
              lat=click$lat,
              zoom=findInterval(someaverageofyourpoints, c(25,75,100,250,400,750,1000))
    ) 
    

    如果 findinterval 设置一个很小的值,您可以将其他值相加到 findinterval,findinterval()+ 1 .. 2.. 4 ...5 用于设置缩放级别

    【讨论】:

    • 我添加了图片以供进一步说明。图 2 显示了所需的缩放级别。
    • @AwaisHassan 我不知道是否是最好的选择,但我试图帮助你;)
    • 如果我在代理命令中使用 setView,它会给我以下错误:元数据中的错误:参数“数据”丢失,没有默认值
    • 我编辑了我的代码,删除了错误的 %>% 代理 %>% 我不知道是不是这个错误。
    猜你喜欢
    • 1970-01-01
    • 2011-08-01
    • 2011-08-23
    • 2020-02-25
    • 2021-04-18
    • 1970-01-01
    • 1970-01-01
    • 2012-07-12
    • 2017-04-10
    相关资源
    最近更新 更多