同一坐标上出现多个标记

16

使用r软件包leaflet绘制交互式世界地图时,具有完全相同坐标的数据标记会重叠在一起。

请参见下面的示例:

library(leaflet)

Data <- structure(list(Name = structure(1:3, .Label = c("M1", "M2", "M3"), class = "factor"), Latitude = c(52L, 52L, 51L), Longitude = c(50L, 50L, 50L), Altitude = c(97L, 97L, 108L)), .Names = c("Name", "Latitude", "Longitude", "Altitude"), class = "data.frame", row.names = c(NA, -3L))

leaflet(data = Data) %>% 
              addProviderTiles("Esri.WorldImagery", options = providerTileOptions(noWrap = TRUE)) %>%
              addMarkers(~Longitude, ~Latitude, popup = ~as.character(paste(sep = "",
                                                                          "<b>",Name,"</b>","<br/>", "Altitude: ",Altitude)))

有可能通过集群选项显示所有坐标,但这远远不是我的目标。我不想要聚类,只有当完全缩放时才显示重叠的标记。当完全缩放时,背景地图变为灰色(“地图数据尚不可用”)。我想要的是重叠标记的蜘蛛视图,但在完全缩放时不需要。

请见下面的示例:

leaflet(data = Data) %>% 
  addProviderTiles("Esri.WorldImagery", options = providerTileOptions(noWrap = TRUE)) %>%
  addMarkers(~Longitude, ~Latitude, popup = ~as.character(paste(sep = "",
                                                                "<b>",Name,"</b>","<br/>", "Altitude: ",Altitude)), clusterOptions = markerClusterOptions())
我找到了一些关于我想要的解决方案的文献,但我不知道如何在r leaflet代码/包中实现它。 https://github.com/jawj/OverlappingMarkerSpiderfier-Leaflet 另外,如果有其他处理重叠标记的方法,请随意回答。(例如在一个弹出窗口中包含多个标记的信息)
2个回答

19

你可以稍微抖动(jitter)一下你的坐标:

library(mapview)
library(sp)

Data <- structure(list(Name = structure(1:3, .Label = c("M1", "M2", "M3"), 
                                        class = "factor"), 
                       Latitude = c(52L, 52L, 51L), 
                       Longitude = c(50L, 50L, 50L), 
                       Altitude = c(97L, 97L, 108L)), 
                  .Names = c("Name", "Latitude", "Longitude", "Altitude"), 
                  class = "data.frame", row.names = c(NA, -3L))

Data$lat <- jitter(Data$Latitude, factor = 0.0001)
Data$lon <- jitter(Data$Longitude, factor = 0.0001)

coordinates(Data) <- ~ lon + lat
proj4string(Data) <- "+init=epsg:4326"

mapview(Data)

这种方式仍然需要缩放才能使标记分开,需要缩放的程度取决于 jitter() 中的 factor 属性。

请注意,为了简单起见,在示例中我使用了 library(mapview)


sf 包含 sf_jitter 函数,使得这个任务变得更加简单! - D. Woods

4

为了跟进我的评论,这里提供了一个更加现代的解决方案(约2020年左右),它利用了一些新的包来简化我们的生活(tidyversesf)。我像@TimSalabim一样使用sf:st_jittermapview。最后,我选择了稍微更大的抖动系数,这样您就不必缩放得那么远才能看到效果:

library(mapview)
library(sf)

Data <- tibble(Name = c("M1", "M2", "M3"),
               Latitude = c(52L, 52L, 51L), 
               Longitude = c(50L, 50L, 50L), 
               Altitude = c(97L, 97L, 108L))

Data %>% 
  st_as_sf(coords = c("Longitude", "Latitude"), crs = 4326) %>% 
  st_jitter(factor = 0.001) %>%
  mapview

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