मैं एक आर चमकदार वेब ऐप में दो मानचित्रों को सिंक करना चाहता हूं (एक मानचित्र पर ज़ूम इन करना दूसरे मानचित्र और पैनिंग इत्यादि पर ज़ूम इन करना चाहिए), मैं नीचे दिखाए गए कोड का उपयोग करके इसे अंतःक्रियात्मक रूप से करने में कामयाब रहा लेकिन मैं यह नहीं समझ सकता कि कैसे इसे एक शाइनी वेब ऐप में करें। किसी भी सहायता की सराहना की जाएगी

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)
3
theBean 11 जुलाई 2019, 18:11

2 जवाब

सबसे बढ़िया उत्तर

क्या मानचित्र हमेशा यूजर इंटरफेस निर्माण से पहले बनाए जाएंगे? यदि ऐसा है तो:

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)

संपादित करें:

आपकी टिप्पणी के जवाब में, मैंने जावास्क्रिप्ट दृष्टिकोण (https://github सहित मानचित्रों को सिंक करने के विकल्पों पर ध्यान दिया है। .com/jieter/Leaflet.Sync) और सिंकविथ (https:// github.com/rte-antares-rpackage/leaflet.minicharts)। मैंने इनके साथ समय नहीं बिताया है।

एक त्वरित समाधान यह नीचे हो सकता है (एक मानचित्र की सीमा दूसरे मानचित्र की सीमा से मेल खाती है, लेकिन इसके विपरीत नहीं)। इसके लिए सर्वर फ़ंक्शन में अवलोकन जोड़ने और एक मानचित्र से दूसरे मानचित्र पर सीमा निर्धारित करने की आवश्यकता होती है। http://rstudio.github.io/leaflet/shiny.html से:

input$MAPID_bounds वर्तमान में दृश्यमान मानचित्र क्षेत्र की अक्षांश/देशांतर सीमा प्रदान करता है; मान एक सूची है () जिसमें उत्तर, पूर्व, दक्षिण और पश्चिम के तत्वों का नाम दिया गया है

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)
2
Ben 11 जुलाई 2019, 20:59

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)      
})
1
Cris Silva 31 जुलाई 2019, 02:59