Как установить Leaflet layerId с помощью mapview - PullRequest
0 голосов
/ 21 сентября 2018

В моем блестящем приложении я хотел бы щелкнуть по многоугольнику моей карты карты и иметь возможность извлечь атрибут layerId в переменную, используя input$map_shape_click.В следующем коде, когда вы щелкаете по многоугольнику, он печатает идентификатор, но по умолчанию он имеет значение null в просмотре карты.

library(shiny)
library(tmap)
library(leaflet)
library(mapview)

ui <- bootstrapPage(
  title = "Standardized Crop Production Index",
  tags$style(type = "text/css", "html, body {width:100%;height:100%}"),
  mapview::mapviewOutput("map", width = "100%", height = "100%")
)

data("World") #from the tmap library

server <- function(input, output, session) {

  out_plot <- observeEvent(input$map_shape_click, {
    p <- input$map_shape_click
    print(p)
  })

  output$map <- renderLeaflet({

    test <- mapview(World)
    test@map
  })
}

shinyApp(ui = ui, server = server)

Есть ли способ установить layerId объекта карты?Я знаю, что я мог бы установить его, используя addPolygons(), если бы я просто использовал Leaflet вместо mapview.Однако в конечном итоге я хотел бы использовать данные, собранные в результате нажатия на многоугольник, в качестве входных данных для карты popupGraph().

Еще лучше было бы, если бы был способ извлечь атрибуты из таблицы, которая появляется при нажатии на многоугольник.Например, если я нажму на Антарктиду, появится следующая таблица атрибутов: Таблица атрибутов Антарктики .Есть ли способ получить атрибут name и сохранить его как переменную при нажатии на многоугольник?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

Немного поздно, но можно установить layerId в просмотре карты.mapview передает любые дополнительные (действительные) аргументы соответствующим функциям листовки через аргумент ..., включая layerId.Единственное отличие состоит в том, что вы не можете использовать формульную нотацию с mapview, поскольку она передает только геометрическую часть (в данном случае) addPolygons.Таким образом, во время оценки формулы нет данных, привязанных к геометрии, и, следовательно, она не работает.Тем не менее, вы можете передать соответствующий вектор в layerId.

Чтобы подвести итог, следующее должно вернуть layerId в input$map_shape_click:

library(shiny)
library(tmap)
library(leaflet)
library(mapview)

ui <- bootstrapPage(
  title = "Standardized Crop Production Index",
  tags$style(type = "text/css", "html, body {width:100%;height:100%}"),
  mapview::mapviewOutput("map", width = "100%", height = "100%")
)

data("World") #from the tmap library

server <- function(input, output, session) {

  out_plot <- observeEvent(input$map_shape_click, {
    p <- input$map_shape_click
    print(p)
  })

  output$map <- renderLeaflet({

    test <- mapview(World, layerId = World$iso_a3)
    test@map
  })
}

shinyApp(ui = ui, server = server)
0 голосов
/ 05 октября 2018

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

library(dplyr)
library(shiny)
library(leaflet)
library(leaflet.extras)
library(rgdal)
library(sp)
library(tigris)
library(htmltools)

setwd(dirname(rstudioapi::getActiveDocumentContext()$path))  # set your working directory

philly <- tracts(state = 'PA', county = c('Philadelphia'))

ui <- fluidPage(
  title = "Test Map",
  leafletOutput("mymap", width = 600)
)


server <- function(input, output, session) {

  RV <- reactiveValues(Clicks=list()) # used for storing leaflet variables

  tract_labels <- sprintf( # labels for mouseover tooltip
    "<strong>%s</strong>, <strong>%s</strong>
    <br/><b>Land Area:</b> %s",
    philly$COUNTYFP,
    philly$STATEFP,
    philly$ALAND
  ) %>% lapply(htmltools::HTML)


  output$mymap <- renderLeaflet({  # leaflet map
    leaflet(data = philly) %>%
      setView(-75.16, 39.9523, zoom = 10) %>%
      addTiles(urlTemplate = "https://{s}.tile.openstreetmap.se/hydda/full/{z}/{x}/{y}.png",
               attribution = NULL) %>%
      addPolygons(data = philly,
                  layerId = philly@data$ALAND,
                  group = "regions",
                  fillColor = "#bdd7e7",
                  weight = 1,
                  opacity = 1.0, 
                  fillOpacity = 0.5,
                  smoothFactor = 0.5,
                  label = tract_labels,
                  labelOptions = labelOptions(
                    style = list("font-weight" = "normal", padding = "3px 8px"),
                    textsize = "12px",
                    direction = "auto"),
                  highlightOptions = highlightOptions(color = "white",
                                                      weight = 2,
                                                      bringToFront = TRUE))
  })


  observeEvent({input$mymap_shape_click}, {

    #create object for clicked polygon
    click <- input$mymap_shape_click
    RV$Clicks <- c(RV$Clicks,click$id)

    #define leaflet proxy for second regional level map
    proxy <- leafletProxy("mymap")

    #subset regions shapefile by the clicked on polygons
    selectedReg <- philly[philly@data$ALAND == click$id,]

    #map clicked on polygons
    proxy %>% addPolygons(data = selectedReg,
                          fillColor = "red",
                          fillOpacity = 1,
                          weight = 1,
                          color = "black",
                          stroke = T,
                          group = "selected",
                          layerId = selectedReg@data$ALAND)

    # remove polygon group that are clicked twice
    if(click$group == "selected"){
      proxy %>%
        clearGroup(group = "selected")

      RV$Clicks <- 0  # resets values if polygons are clicked twice
    }

    mean.land <- mean(as.numeric(RV$Clicks))  # stores the values of polygons that are clicked
    print(mean.land)

  })


}

shinyApp(ui, server)

По сути, карта имеет два слоя: слой базовых участков и еще один полигон участков, который выделяет то, что вы щелкнули.Вы можете щелкнуть по каждому многоугольнику, чтобы «извлечь» значение (в данном случае это площадь земли или переменная ALAND) из каждого многоугольника и произвести на нем вычисления.Здесь я выбрал три полигона и использовал переменную mean.land, чтобы отобразить среднюю площадь суши всех трех.

enter image description here

реактивное значение RV объект используется для хранения числового значения переменной layerId на любом полигоне, который вы щелкнете.Это позволяет вам сохранять и «извлекать» его для других вычислений, которые вы, возможно, захотите сделать.

[1] 717210  # first click, first value
[1] 571940  # second click, averaged value
[1] 488678.3  # third click, averaged value

Вы можете изменить извлечение атрибута layerId, изменив любые ссылки на переменную ALAND в коде.

...