叶片聚类标记间距,或者在缩小时如何拥有更小的分组

12
使用聚合标记制作传单地图。 markerClusterOptions()中是否有一个参数可以控制基于缩放级别的组数?例如,在默认缩放级别下,我的地图仅显示1800个观测值的3个聚类。但是,如果在默认缩放级别下至少有两倍的聚类,那会更好。
我不想使用freezeAtZoom,因为用户将无法缩放并查看每个单独的观测值。
数据来源:https://data.sccgov.org/Public-Safety/Crime-Reports/n9u6-aijz/data
library(tidyverse);library(leaflet);library(lubridate)

crime_reports <- read_csv("Crime_Reports.csv")
car_burglaries <- crime_reports %>% filter(incident_type_primary=="VEHICLE BURGLARY") %>%
  mutate(datetime=mdy_hms(incident_datetime)) %>% 
  arrange(datetime)

leaflet(car_burglaries) %>% addTiles() %>% 
  addMarkers(
    popup = ~paste(as.character(incident_datetime),",","Case number",as.character(case_number)), 
    label = ~as.character(address_1),
    clusterOptions = markerClusterOptions()
)

1
添加了包和代码。 - dkae
谢谢你这么做。现在这是一个很好的问题。我删除了我的过时评论,撤回了关闭投票并点赞了它。我希望它能得到答案,因为我的初步尝试并不成功。 - IRTFM
即使它先得到答案,我可能会附加一个相当大的赏金。如果我现在尝试回答,我可能会尝试使用 https://rstudio.github.io/leaflet/showhide.html 上的代码进行实验。 - IRTFM
Camille的回答看起来不错(我可能会授予奖励),但我不是常规用户。你觉得呢? - IRTFM
1个回答

15
R的leaflet包文档提到,聚类是通过一个叫做Leaflet.markercluster的Leaflet JavaScript库插件完成的,该插件的文档在这里。R leaflet包中的许多函数提到,在...中添加其他参数将传递给底层JavaScript库,但要使用这些参数,熟悉JavaScript文档会很有帮助。对于聚类,你注意到了markerClusterOptions将传递更高级的选项。 markercluster文档说明有一个参数maxClusterRadius
“集群从中心标记开始覆盖的最大半径(以像素为单位)。默认值为80。减小该值将生成更多、更小的集群。您还可以使用一个接受当前地图缩放并返回以像素为单位的最大聚类半径的函数。”
因此,我尝试了一些选项。下面是来自我的RStudio View窗格的截图:
默认半径为80像素:
leaflet(car_burglaries) %>% 
  addTiles() %>% 
  addMarkers(
    popup = ~paste(as.character(incident_datetime),",","Case number",as.character(case_number)), 
    label = ~as.character(address_1),
    clusterOptions = markerClusterOptions()
  )

default radius

半径越小,聚类越多:

leaflet(car_burglaries) %>% 
  addTiles() %>% 
  addMarkers(
    popup = ~paste(as.character(incident_datetime),",","Case number",as.character(case_number)), 
    label = ~as.character(address_1),
    clusterOptions = markerClusterOptions(maxClusterRadius = 50)
  )

smaller radius

半径越大,聚类数量越少:

leaflet(car_burglaries) %>% 
  addTiles() %>% 
  addMarkers(
    popup = ~paste(as.character(incident_datetime),",","Case number",as.character(case_number)), 
    label = ~as.character(address_1),
    clusterOptions = markerClusterOptions(maxClusterRadius = 200)
  )

bigger radius

如果您的默认设置是在悬停在标记上时显示覆盖区域,这应该有助于确定您想要的半径。
值得注意的是,半径是以像素为单位测量的,因为地图当前正在显示。这意味着显示的聚类数将取决于地图的大小(以像素为单位)。如果您需要更复杂的内容,例如将半径设置为与窗口大小成比例,以便用户可以调整窗口大小并保持聚类数量大致恒定,则可以编写一个函数将该半径作为变量传递,或者可能编写JavaScript并以某种方式传递它。我会在另一篇文章中介绍。

谢谢。看起来解决了问题。我暂时不授予奖励,因为我无法撤销它,而且我想可能会有人提出更好的答案。我之前见过那个函数,但没有理解聚类半径如何影响输出。 - IRTFM
@42- 没问题,不用着急。其他人可能会编写一个函数来根据窗口大小缩放半径 - 我对此没有明确的想法。 - camille
这个答案对我的目的来说足够了。谢谢! - dkae
我以为我几天前已经授予了它,但收到了一个警告,说它即将过期,所以尝试再次授予。 - IRTFM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接