Как использовать вложенный плагин Leaflet.MarkerCluster.PlaceStrategies в R - PullRequest
0 голосов
/ 03 мая 2019

Я строю интерактивную карту в Leaflet, используя R, и я хотел бы использовать подпрограмму Leaflet.MarkerCluster.PlaceStrategies , чтобы управлять размещением маркеров в кластере (когда «spiderfied») щелчком мыши по кластеру) и всегда размещайте их по кругу вокруг значка кластера, а не по спирали, как это происходит, когда в кластере более 8 маркеров со стандартным плагином Leaflet.MarkerCluster, который встроен в листовка htmlWidget. Код, который я использую для построения карты, выглядит примерно так:

library(leaflet)

data_example <- data.frame(name = rep("site A", times = 14),
                   lon = rep(14.25000, times = 14),
                   lat = rep(40.83333, times = 14),
                   issue = paste("Issue", LETTERS[1:14]),
                   severity = sample(c("Mild", "Moderate", "Severe"), size = 14, replace = TRUE))

issues_pal <- colorFactor(brewer.pal(3, "RdYlBu"), levels = c("Mild", "Moderate", "Severe"), reverse = TRUE)

leaflet(data_example, options = leafletOptions(maxZoom = 7)) %>% 
  setView(lng = 8, lat = 50, zoom = 4) %>% 
  addProviderTiles(providers$Esri.WorldStreetMap) %>% 
  addCircleMarkers(
    lng = ~ lon,
    lat = ~ lat,
    radius = 10,
    color = "grey",
    weight = 2,
    fillColor = ~ issues_pal(severity),
    #stroke = FALSE, 
    fillOpacity = 0.8,
    label = ~ paste(issue, severity),
    clusterOptions = markerClusterOptions(
        spiderfyDistanceMultiplier = 1.1, 
        spiderLegPolylineOptions = list(weight = 0)),
    group = df,
    clusterId = df
  )

На карте, если щелкнуть значок кластера, отображаются маркеры, расположенные по спиральной траектории, исходящей из кластера. Это связано с тем, что плагин Leaflet.MarkerCluster, который контролирует кластеризацию маркеров в листовке, размещает их по кругу только при наличии до 8 маркеров. Но Leaflet.MarkerCluster.PlacementStrategies должен позволять указывать другую стратегию размещения и иметь маркеры, расположенные по кругу, даже если их больше 8, как показано на этих страницах и здесь .

Поскольку подплагин еще не включен в пакет листовок, я хотел бы использовать выделенный здесь метод для использования в R любых листовочных плагинов JS, но я изо всех сил пытаюсь найти способ чтобы это сработало для моего случая. Согласно методу, я должен в первую очередь включить в свой код следующее:

placement.strategies <- htmlDependency(
  "Leaflet.MarkerCluster.PlacementStrategies",
  "0.0.1", 
  src = c(href = "https://github.com/adammertel/Leaflet.MarkerCluster.PlacementStrategies/blob/master/dist/"),
  script = "leaflet-markercluster.placementstrategies.src.js"
)

registerPlugin <- function(map, plugin) {
  map$dependencies <- c(map$dependencies, list(plugin))
  map
}

И тогда я должен позвонить registerPlugin(placement.strategies) в трубу для листовок. Однако я не могу понять, как адаптировать следующий пользовательский код JS к моим потребностям:

leaflet() %>% setView(lng = 8, lat = 50, zoom = 4) %>%
  # Register plugin on this map instance
  registerPlugin(placement.strategies) %>%
  # Add your custom JS logic here. The `this` keyword
  # refers to the Leaflet (JS) map object.
  onRender("function(el, x) {
    L.esri.basemapLayer('Topographic').addTo(this);
  }")

Я пытался просто указать в вызове addCircleMarkers() elementsPlacementStrategy = 'one-circle' как параметр clusterOption в markerClusterOptions(), но он не работает. Я подозреваю, что код JS, из которого мне нужно вызвать, должен каким-то образом изменить свойство опции elementsPlacementStrategy для кластера, но как это сделать, я не знаю. Может кто-нибудь помочь с этим? Заранее спасибо!

post scriptum

Я нашел способ получить расположение круга, не используя подплагин, который включает в себя изменение в файле leaflet.markercluster.js свойства _circleSpiralSwitchover на число больше 14 (то есть количество маркеров, которые у меня есть) в кластере). Хотя этот обходной путь достигает желаемого результата, он является неоптимальным, поскольку, если я не решу изменить файл .js по умолчанию, расположенный в:

/ Библиотека / Каркасы / R.framework / Версии / 3.2 / Ресурсы / Библиотека / Брошюра / htmlwidgets / Плагины / Leaflet.markercluster

Мне нужно будет заново редактировать файл .js каждый раз, когда я экспортирую карту с saveWidget.

...