5

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

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

圆圈的数量因标记而异,即一些标记有 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))

地图=带有标记的原始地图 df=lat lng 的圆圈以及地图中所选标记的相关属性

显示标记的原始地图

圆圈显示在标记点击事件上

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

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

问候,

4

3 回答 3

10

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

setView(lng, lat, zoom = zoom_level)

这直接来自文档

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

于 2018-01-25T19:29:03.723 回答
1

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

我将点击存储在标记上,根据点击的 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)
于 2018-06-13T19:38:02.717 回答
0

可能你可以定义一个区间 varint <- 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))
) 

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

于 2018-01-25T19:31:20.160 回答