如何在R

时间:2019-05-03 08:51:18

标签: r leaflet leaflet.markercluster

我正在使用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,也可以将标记布置成圆形,如pagehere所示。

由于该子插件尚未包含在传单包中,因此我想使用突出显示的方法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文件上重新进行编辑。

0 个答案:

没有答案