如何设置传单地图的缩放级别/视图

时间:2018-01-25 19:12:28

标签: r shiny leaflet r-leaflet

我在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 of circle,其中包含地图中所选标记的相关属性

original map where markers are shown

circles are shown on marker click event

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

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

此致

3 个答案:

答案 0 :(得分:3)

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

setView(lng, lat, zoom = zoom_level)

直接来自documentation

除非您提供更多信息,否则任何人都无法理解您所说的部分“以便所有相关的圈子都可见。”

答案 1 :(得分:0)

可能是你可以定义一个区间varint&lt; - findInterval()并传递给setView

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))
) 

如果findintervalset值很小,你可以将其他值加到findinterval,findinterval()+ 1 .. 2 .. 4 ... 5来设置缩放级别

答案 2 :(得分:0)

我不确定你的应用程序是如何工作的,以及最初的传单调用中是什么。但也许以下示例可能会对您有所帮助。

我将点击存储在标记上,根据点击的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)