Как изменить атрибуты маркера круга (например, opacity & fillOpacity) в mapview :: addFeatures - PullRequest
0 голосов
/ 07 июня 2018

Мне удалось создать карту в приложении R-Shiny, которое позволяет многократно выбирать маркеры, комбинируя пакеты mapview, mapedit и leaflet.Функционально все в порядке, за исключением того, что я хочу изменить атрибуты маркера, более конкретно увеличить fillOpacity.

Документация для mapView AddFeatures предполагает, что он должен принимать те же аргументы, что и листовка для addCircleMarkers.Я также попытался использовать функцию addCircleMarkers вместо addFeatures без какого-либо успеха.

См. addFeatures doco

... Дальнейшие аргументы переданы соответствующей листовке:: добавить * функции.См. AddCircleMarkers, addPolylines и addPolygons.

Но, похоже, аргументы игнорируются;вес, непрозрачность и fillOpacity.Я отметил в автономном коде ниже, какие аргументы работают или нет.

Я что-то не так делаю или вы думаете, что это ошибка?

# devtools::install_github("r-spatial/sf")
# devtools::install_github("r-spatial/mapview@develop")
# devtools::install_github("bhaskarvk/leaflet.extras")
# devtools::install_github("r-spatial/mapedit")
library(tidyverse)
library(sf)
library(leaflet)
library(mapedit)
library(mapview)
library(shiny)
library(shinyjs)

locnCoord <-
  data.frame(location = c('Sit1','Site2','Site3'),
             lat=c(-18.1, -18.3, -18.4),
             lon=c(145.8, 145.9, 145.9)) %>%
  mutate(depth = runif(3))

locnSF <- st_as_sf(locnCoord, coords = c('lon','lat'), crs="+proj=longlat +datum=WGS84 +no_defs")

#### User input

ui <- fluidPage(
  shinyjs::useShinyjs(),
  shinyjs::extendShinyjs(text = "shinyjs.refresh = function() { location.reload(); }"),
  fluidRow(
    # edit module ui
    column(6,
           selectModUI("selectmap"),
           actionButton("refresh", "Refresh Map")
           ),
    column(6,
           h3("Point of Depth"),
           plotOutput("selectstat")
           )
    )
  )

#### Server

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

  observeEvent(input$refresh, {
    shinyjs::js$refresh()
  })

  g_sel <- callModule(
    selectMod,
    "selectmap",
    leaflet() %>%
      addTiles() %>%
      addFeatures(
      # addCircleMarkers(
        data = locnSF,
        layerId = ~location,
        stroke = TRUE, # This is effective
        color = 'red', # This is effective
        weight = 150, # This is ignored    ####
        opacity = 0, # This is ignored     ####
        fill = TRUE, # This is effective
        fillColor = 'blue', # This is effective
        fillOpacity=1, # This is ignored   ####
        radius=20) # This is effective
  )

  rv <- reactiveValues(selected=NULL)

  observe({
    gs <- g_sel()

    if(length(gs$id) > 0) {
      rv$selected <- locnSF %>% filter(location %in% gs$id)
    } else {
      rv$selected <- NULL
    }
  })

  output$selectstat <- renderPlot({
    ggplot()
    if(!is.null(rv$selected) && nrow(rv$selected) > 0) {
      ggplot(data=rv$selected, aes(location, depth))+
        geom_point(color='red', size=5)
    } else {
      ggplot()
    }
  })
}
shinyApp(ui, server)

1 Ответ

0 голосов
/ 07 июня 2018

Они не игнорируются.Если вы попробуете в качестве отдельного вызова mapview, вы увидите, что они работают.В вашем приложении они маскируются модулем mapedit selectMod, который позволяет вам установить opacity, fillOpacity и weight отдельно для случая, когда объекты выбраны, а не выбраны с помощью аргументов styleTrue и styleFalse,соответственно.Когда вы установите их, вы получите желаемое поведение.Таким образом, измените часть, где вы вызываете модуль selectMod, как показано ниже:

g_sel <- callModule(
    selectMod,
    "selectmap",
    leaflet() %>%
      addTiles() %>%
      addFeatures(
        # addCircleMarkers(
        data = locnSF,
        layerId = ~location,
        stroke = TRUE, # This is effective
        color = 'red', # This is effective
        # weight = 150, # This is ignored    ####
        # opacity = 0, # This is ignored     ####
        fill = TRUE, # This is effective
        fillColor = 'blue', # This is effective
        # fillOpacity=1, # This is ignored   ####
        radius=20), # This is effective
    styleFalse = list(fillOpacity = 0.5, weight = 0, opacity = 0), 
    styleTrue = list(fillOpacity = 1, weight = 5, opacity = 1)
  )
...