2015-12-18 7 views
-4

Привет, ребята, я пробовал это в течение нескольких недель, но я не мог этого сделать. Интернет-ресурсов для R-листов тоже недостаточно. На самом деле нужно сделать это.R листовки Как нажимать на карту и добавить круг

Пожалуйста, помогите, большое вам спасибо.

ui.R ->

library(shiny) 
library(ggmap) 
library(leaflet) 

shinyUI(bootstrapPage(
    leafletOutput("map"), 
    br(), 
    verbatimTextOutput("out") 
) 
) 

server.R ->

library(shiny) 
library(ggmap) 
library(leaflet) 


shinyServer(function(input, output, session) { 


output$map <- renderLeaflet({ 

p <- input$map_click 

if(is.null(p)){ 
    leaflet() %>% setView(lng = -43.1729, lat = -22.9068, zoom = 11) %>% 
    addTiles(options = providerTileOptions(noWrap = TRUE)) 
} 

else{ 
    address <- revgeocode(c(p$lng,p$lat)) 

    leaflet() %>% setView(lng = p$lng, lat = p$lat, zoom = 16) %>% 
    addTiles(options = providerTileOptions(noWrap = TRUE)) %>% 
    addCircles(p$lng, p$lat, weight = 1, radius = 100, color = "black", 
        fillColor = "orange", popup = address, fillOpacity=0.5, opacity=1) 
} 


}) 

output$out <- renderPrint({ 
validate(need(input$map_click, FALSE)) 
click <- input$map_click 
clat <- click$lat 
clng <- click$lng 
address <- revgeocode(c(clng,clat)) 
print(clat) 
print(clng) 
print(address) 

}) 

}) 
+1

Пожалуйста, создайте [воспроизводимый пример] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example). Покажите, какой код вы пробовали, и опишите, как он не работает. – MrFlick

+1

Привет, MrFlick, я поставил код. Он работает, но мне интересно, есть ли лучший способ улучшить это. – bubibu

+2

Проголосовали за повторное открытие теперь, когда вы показали, что вы пытались, но, как предположил г-н Флик, также расскажите, что вы пытаетесь сделать и где вы застряли , – A5C1D2H2I1M1N2O1R2T1

ответ

7

TL; DR

  1. Создать начальную карту так не зависит от пользовательского ввода.
  2. Используйте наблюдателя, который отвечает на клики пользователей, чтобы обновить карту.
  3. Используйте leafletProxy, чтобы обновить карту, не отображая все заново.

Я бы сделал это, создав исходную карту и используя функцию leafletProxy, чтобы обновить карту, когда пользователь нажимает на местоположения. На сайте Rstudio есть учебное пособие, где показано, как это сделать. Он, мы надеемся, сохранит некоторые вычисления, так как карта не будет повторно отображаться каждый раз, когда будет добавлен круг.

Я также добавлю пару дополнительных вещей, которые я бы рассмотрел: помещая данные о круге в реактивный набор данных и поддерживая круги в группе, что позволяет легко скрыть/показать их с помощью дополнительной кнопки-наблюдателя /.

Здесь приведен рабочий пример. Для записи я использую версию буклета из github (и рекомендую это, так как этот пакет находится в активной разработке). Вы можете получить его с помощью devtools::install_github('rstudio/leaflet'). Есть, по крайней мере, несколько новых функций, которые я пока не думаю о CRAN - как легко можно создавать пользовательские маркеры.

library(shiny) 
library(ggmap) 
library(leaflet) 

ui <- shinyUI(bootstrapPage(
    leafletOutput("map") 
)) 

server <- shinyServer(function(input, output, session) { 
    ## One alternative: store circles data? 
    ## I dont actually implement this, but you would do this in the observer as well 
    dat <- reactiveValues(circs = data.frame(lng=numeric(), lat=numeric())) 

    ## Make your initial map 
    output$map <- renderLeaflet({ 
    leaflet() %>% 
     setView(lng = -43.1729, lat = -22.9068, zoom = 11) %>% 
     addTiles(options = providerTileOptions(noWrap = TRUE)) 
    }) 

    ## Observe mouse clicks and add circles 
    observeEvent(input$map_click, { 
    ## Get the click info like had been doing 
    click <- input$map_click 
    clat <- click$lat 
    clng <- click$lng 
    address <- revgeocode(c(clng,clat)) 

    ## Add the circle to the map proxy 
    ## so you dont need to re-render the whole thing 
    ## I also give the circles a group, "circles", so you can 
    ## then do something like hide all the circles with hideGroup('circles') 
    leafletProxy('map') %>% # use the proxy to save computation 
     addCircles(lng=clng, lat=clat, group='circles', 
       weight=1, radius=100, color='black', fillColor='orange', 
       popup=address, fillOpacity=0.5, opacity=1) 
    }) 

}) 

shinyApp(ui=ui, server=server) 

Результат должен выглядеть примерно так (я увеличил масштаб, добавил круги и активировал всплывающее окно).

enter image description here

+1

Привет, человек, ваш пример работает как шарм. Это именно то, что я пытаюсь сделать. Да благословит вас Бог и все лучшее в вашем будущем. ;) – bubibu

Смежные вопросы