我想在R Shiny Web应用程序中同步两张地图(放大一张地图应放大另一张地图并平移等),我设法使用下面显示的代码以交互方式进行此操作,但我无法确定了解如何在Shiny Web应用程序中执行此操作。任何帮助将不胜感激
my_map <- function(x){
m <- leaflet() %>%
addTiles() %>% # Add default OpenStreetMap map tiles
addMarkers(lng=x[1], lat=x[2], popup="The birthplace of R")
m
}
y <- c(174.968, 37.852)
x <- c(0.112281, 51.523001)
sync(my_map(x), my_map(y), no.initial.sync = TRUE)
答案 0 :(得分:1)
是否总是在创建用户界面之前制作地图?如果是这样:
library(leaflet)
library(leafsync)
library(shiny)
my_map <- function(x){
m <- leaflet() %>%
addTiles() %>% # Add default OpenStreetMap map tiles
addMarkers(lng=x[1], lat=x[2], popup="The birthplace of R")
m
}
y <- c(174.968, 37.852)
x <- c(0.112281, 51.523001)
ui <- sync(my_map(x), my_map(y), no.initial.sync = TRUE)
server = function(input,output){
}
shinyApp(ui, server)
修改:
为回应您的评论,我研究了同步地图的选项,包括JavaScript方法(https://github.com/jieter/Leaflet.Sync)和syncWith(https://github.com/rte-antares-rpackage/leaflet.minicharts)。我还没有花时间在这些上。
下面是一种快速的解决方法(一个地图的边界与另一张地图的边界匹配,反之则不然)。它需要向服务器功能添加观察,并设置从一个地图到另一个地图的边界。来自http://rstudio.github.io/leaflet/shiny.html:
input $ MAPID_bounds提供了地图的纬度/经度范围 当前可见的地图区域;该值是已命名的list() 北,东,南和西元素
library(leaflet)
library(leafsync)
library(shiny)
my_map <- function(x){
m <- leaflet() %>%
addTiles() %>% # Add default OpenStreetMap map tiles
addMarkers(lng=x[1], lat=x[2], popup="The birthplace of R")
m
}
y <- c(174.968, 37.852)
x <- c(0.112281, 51.523001)
ui <- fluidPage(
leafletOutput("mymap1"),
leafletOutput("mymap2")
)
server = function(input, output){
output$mymap1 = renderLeaflet({
my_map(x)
})
output$mymap2 = renderLeaflet({
my_map(y)
})
observe({
coords <- input$mymap1_bounds
if (!is.null(coords)) {
leafletProxy("mymap2") %>%
fitBounds(coords$west,
coords$south,
coords$east,
coords$north)
}
})
}
shinyApp(ui, server)
答案 1 :(得分:0)
使用sync()
作为UI输出,而不是像leafletOutput
那样为我工作。
在ui
中:
uiOutput(synced_maps)
在server
中:
output$synced_maps <- renderUI({
m1 <- leaflet() %>% addTiles() %>% addMarkers(~lon1, ~lat1)
m2 <- leaflet() %>% addTiles() %>% addMarkers(~lon2, ~lat2)
sync(m1, m2)
})