如何在R的Leaflet地图中仅显示搜索到的单个点位?
R语言Leaflet地图问题解决方案
一、原始实现代码
1. 加载依赖库
library(leaflet) library(leaflet.extras) library(dplyr)
2. 模拟随机数据
myFun <- function(n = 5000) { a <- do.call(paste0, replicate(5, sample(LETTERS, n, TRUE), FALSE)) paste0(a, sprintf("%04d", sample(9999, n, TRUE)), sample(LETTERS, n, TRUE)) } Lat = abs(rnorm(1000, 42.2, 0.1)) Long = abs(rnorm(1000, -70, 0.1)) City = myFun(1000) cities = data.frame(Lat, Long, City)
3. 地图制作代码
# 需提前下载图标文件:leaf-green.png leaflet(cities) %>% addProviderTiles(providers$OpenStreetMap) %>% addMarkers(clusterOptions = markerClusterOptions(), popup = ~paste("title: ", City)) %>% addResetMapButton() %>% # 用于搜索的"隐形"标记 addMarkers( data = cities, lng = ~Long, lat = ~Lat, label = cities$City, group = 'cities', icon = makeIcon( iconUrl = "leaf-green.png", iconWidth = 1, iconHeight = 1 ) ) %>% addSearchFeatures( targetGroups = 'cities', options = searchFeaturesOptions( zoom=12, openPopup = TRUE, firstTipSubmit = TRUE, autoCollapse = TRUE, hideMarkerOnCollapse = TRUE ) )
二、问题解答
问题1:搜索单个点位时仅展示目标标记,隐藏其他点位
通过图层分组+事件监听实现动态显示控制,修改后的代码如下:
leaflet(cities) %>% addProviderTiles(providers$OpenStreetMap) %>% # 给聚类标记添加分组 addMarkers(clusterOptions = markerClusterOptions(), popup = ~paste("title: ", City), group = "clustered_markers") %>% addResetMapButton() %>% addMarkers( data = cities, lng = ~Long, lat = ~Lat, label = ~City, group = 'cities', icon = makeIcon( iconUrl = "leaf-green.png", iconWidth = 1, iconHeight = 1 ) ) %>% addSearchFeatures( targetGroups = 'cities', options = searchFeaturesOptions( zoom=12, openPopup = TRUE, firstTipSubmit = TRUE, autoCollapse = TRUE, hideMarkerOnCollapse = TRUE ), # 搜索触发时隐藏聚类图层 searchEventHandler = htmlwidgets::JS(" function(e) { map.removeLayer('clustered_markers'); map.addLayer('cities'); } "), # 搜索框折叠时恢复聚类图层显示 collapseEventHandler = htmlwidgets::JS(" function(e) { map.addLayer('clustered_markers'); } ") ) %>% # 可选:添加手动图层切换控件 addLayersControl( overlayGroups = c("clustered_markers", "cities"), options = layersControlOptions(collapsed = FALSE) )
问题2:低缩放级别搜索时自动展示目标点位及标签
通过提高搜索缩放级别、强制标签显示、优化图标可见性解决,修改后的代码如下:
leaflet(cities) %>% addProviderTiles(providers$OpenStreetMap) %>% addMarkers(clusterOptions = markerClusterOptions(), popup = ~paste("title: ", City), group = "clustered_markers") %>% addResetMapButton() %>% addMarkers( data = cities, lng = ~Long, lat = ~Lat, # 设置标签始终可见 label = ~City, labelOptions = labelOptions(permanent = TRUE, direction = 'top'), group = 'cities', # 放大图标确保可见 icon = makeIcon( iconUrl = "leaf-green.png", iconWidth = 8, iconHeight = 8, iconAnchorX = 4, iconAnchorY = 4 ) ) %>% addSearchFeatures( targetGroups = 'cities', options = searchFeaturesOptions( zoom=14, # 提高缩放级别确保聚类展开 openPopup = TRUE, firstTipSubmit = TRUE, autoCollapse = TRUE, hideMarkerOnCollapse = TRUE, moveToLocation = function(latlng) { map.setView(latlng, 14); return latlng; } ), searchEventHandler = htmlwidgets::JS(" function(e) { map.removeLayer('clustered_markers'); e.target.openPopup(); } "), collapseEventHandler = htmlwidgets::JS(" function(e) { map.addLayer('clustered_markers'); } ") )
内容的提问来源于stack exchange,提问作者stats_noob
相关产品推荐
相关产品推荐

