从 R 中的传单获取边界框

h.l*_*l.m 6 r leaflet shiny

我正在使用 R、RStudio 和leaflet软件包来可视化地图。

我想获取传单对象边界框的最小和最大经纬度。我认为这可以使用 Shiny 来完成(通过使用类似的东西input$mapobj_bounds),但是有没有一种非闪亮的方法可以做到这一点。

m <- leaflet(width=500,height=400) %>% 
   addTiles() %>% 
   setView(lng = -0.106831, lat = 51.515328, zoom = 18) %>%
   addCircleMarkers(lng = -0.106831, lat = 51.515328)
Run Code Online (Sandbox Code Playgroud)

我需要的是一个使用输入参数获取边界框的函数m

这可以做到吗?

此外,查看对象时的参数值m看起来不正确。

例如

> m$x$limits
$lat
[1] 51.51533 51.51533

$lng
[1] -0.106831 -0.106831
Run Code Online (Sandbox Code Playgroud)

编辑

我认为 javascript 函数map.getBounds()可能在这里有帮助...正如这里所建议的(获取可见传单地图的边界框?),但不知道如何将其应用于我们的问题。对此的任何帮助将不胜感激。

Big*_*ist 10

如果你稍微调整 Jeremys 的原始答案,你实际上可以在没有 JavaScript 的情况下做到这一点:

可重现的例子:

library(magrittr)
library(leaflet)

m <- leaflet(width = 500,height = 400) %>% 
  addTiles() %>% 
  setView(lng = -0.106831, lat = 51.515328, zoom = 18) %>%
  addCircleMarkers(lng = -0.106831, lat = 51.515328)
m
getBox <- function(m){
  view <- m$x$setView
  lat <- view[[1]][1]
  lng <- view[[1]][2]
  zoom <- view[[2]]
  zoom_width <- 360 / 2^zoom
  lng_width <- m$width / 256 * zoom_width
  lat_height <- m$height / 256 * zoom_width
  return(c(lng - lng_width/2, lng + lng_width/2, lat - lat_height/2, lat + lat_height/2))
}
getBox(m)
Run Code Online (Sandbox Code Playgroud)

闪亮中,您可以简单地使用:input$MAPID_bounds

可重现的例子:

library(shiny)
library(leaflet)
library(magrittr)

app <- shinyApp(

  ui = fluidPage(leafletOutput('myMap')),

  server = function(input, output) {

    output$myMap = renderLeaflet({
      leaflet() %>% 
        addTiles() %>% 
        setView(
          lng = 50, 
          lat = 10, 
          zoom = 17
        )
    })

    observeEvent(input$myMap_bounds, {
      print(input$myMap_bounds)
    })

  }
)
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅此处: https: //rstudio.github.io/leaflet/shiny.html

这是一个 javscript 版本(初始解决方法)。对于更好的版本,请参见上文。

  leaflet() %>% addTiles()  %>% 
  setView(lng = -0.106831, lat = 51.515328, zoom = 18) %>%
  addEasyButton(easyButton(
    states = list(
      easyButtonState(
        stateName="unfrozen-markers",
        icon="ion-toggle",
        title="Get Bounding box",
        onClick = JS("
                     function(btn, map) {
                        alert(map.getBounds().getEast());
                        alert(map.getBounds().getWest());
                        alert(map.getBounds().getNorth());
                        alert(map.getBounds().getSouth());
                     }")
      )
    )
  )
)
Run Code Online (Sandbox Code Playgroud)