我正在使用 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)