如何在R Shiny中同步地图

时间:2019-07-11 15:11:55

标签: r shiny leaflet

我想在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)

2 个答案:

答案 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)      
})