同一坐标上的多个标记

时间:2016-04-07 07:25:17

标签: r shiny leaflet

当从r包中绘制出交互式worlmap上的标记时,具有完全相同坐标的数据将相互重叠。

请参阅以下示例:

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)))

使用群集选项显示所有坐标是可能的,但这远非我的目标。我不想要聚类,只有在完全放大时才会显示重叠的标记。完全放大后,背景地图会变成灰色(&#34;地图数据尚未可用&#34;)。重叠标记的蜘蛛视图是我想要的,但不是在完全放大时。

见下面的例子:

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传单代码/包中实现它。 https://github.com/jawj/OverlappingMarkerSpiderfier-Leaflet

此外,如果还有其他方法来处理重叠标记,请随时回答。 (例如,在一个弹出窗口中显示多个标记信息)

2 个答案:

答案 0 :(得分:10)

您可以稍微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)

通过这种方式,您仍需要放大标记以便分开,您需要放大多远取决于factor中的jitter()属性。

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

答案 1 :(得分:0)

在我的评论之后,这是一个更为现代的解决方案(大约2020年),它利用了一些旨在使我们的生活更轻松的更新软件包(tidyversesf)。我使用sf:st_jitter以及mapview就像@TimSalabim一样。最后,我选择了一个稍大的抖动因子,这样您就不必放大那么远就能看到效果:

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