Я строю интерактивную карту в 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
.