我正在使用R在Leaflet中构建交互式地图,并且我想使用Leaflet.MarkerCluster.PlacementStrategies子插件来控制标记在集群中的位置(当鼠标单击集群时被“蜘蛛化”) ),并始终将它们围绕集群图标排列成一个圆圈,而不是沿着螺旋形排列,因为在带有htmlWidget的标准Leaflet.MarkerCluster插件的集群中有8个以上的标记时会发生这种情况。我用来构建地图的代码是这样的:
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,也可以将标记布置成圆形,如page和here所示。
由于该子插件尚未包含在传单包中,因此我想使用突出显示的方法here在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'
指定为markerClusterOptions()
中的clusterOption,但是它不起作用。我怀疑应该以某种方式修改集群的选项属性elementsPlacementStrategy
,但是需要执行的JS代码,但我不知道该怎么做。有人能帮忙吗?预先谢谢你!
我找到了一种无需使用子插件即可获得圆放置的方法,该方法涉及在leaflet.markercluster.js文件中将_circleSpiralSwitchover
属性修改为大于14的数字(即标记的数量)我在集群中)。尽管此解决方法可以达到我想要的结果,但它不是最佳的,因为除非我决定修改位于以下位置的默认.js文件:
/Library/Frameworks/R.framework/Versions/3.2/Resources/library/leaflet/htmlwidgets/plugins/Leaflet.markercluster
每次使用saveWidget
导出地图时,都需要在.js文件上重新进行编辑。