R中的传单:如何生成多个图标

Leaflet in R: How to generate multiple icons

我有一个数据框,其中包含我所在州所有体育场馆的列表。

这是我的数据框中的列名列表(非常自我解释):

[1] "City"       "latitude"   "longitude"  "Rank"       "Population" "County"    
[7] "Desc"  

我已经创建了以下所有图标:

library(leaflet)
NHL <- makeIcon(
    iconUrl = "https://www-league.nhlstatic.com/images/logos/league-dark/133-flat.svg",
    iconWidth = 31*215/230,
    iconHeight = 31, 
    iconAnchorY = 16,
    iconAnchorX = 31*215/230/2)
MLB <- makeIcon(
    iconUrl = "https://www.mlbstatic.com/team-logos/league-on-dark/1.svg",
    iconWidth = 31*215/230,
    iconHeight = 31, 
    iconAnchorY = 16,
    iconAnchorX = 31*215/230/2)
MLS <-makeIcon(
    iconUrl = "https://league-mp7static.mlsdigital.net/styles/non-retina_desktop_logo/s3/logo25-77x77_0.png?LzMdhn2DU4GXKEjKfJ2QYWMaQKQIk7VQ&itok=ZtYZ58tI",
    iconWidth = 31*215/230,
    iconHeight = 31, 
    iconAnchorY = 16,
    iconAnchorX = 31*215/230/2)
NBA <-makeIcon(
    iconUrl = "https://seeklogo.net/wp-content/uploads/2014/09/NBA-logo.png",
    iconWidth = 31*215/230,
    iconHeight = 31, 
    iconAnchorY = 16,
    iconAnchorX = 31*215/230/2)
NFL <-makeIcon(
    iconUrl = "https://static.nfl.com/static/content/public/static/wildcat/assets/img/application-shell/shield/default.svg",
    iconWidth = 31*215/230,
    iconHeight = 31, 
    iconAnchorY = 16,
    iconAnchorX = 31*215/230/2)

我正在尝试创建一个传单图,通过显示相关图标突出显示我所在州的每个运动队场地。下面的代码将只显示一个图标(以 icon = 列表中的第一个为准)

df %>%
    leaflet() %>%
    addTiles() %>%
    addMarkers(lat = df$Latitude, lng = df$Longitude, icon = c(MLB, NHL, NFL, MLS, NBA))

我还创建了另一个数据框(df2;下面),其中包含每个场馆(体育场名称)和相关联赛(NFL/NHL/etc),我试图将其传递给 "icon = df2$League" 但它不将其识别为对象。有什么想法吗?

> colnames(df2)
[1] "Club"      "Sport"     "League"    "Symbol"    "Venue"     "City"      "Latitude" 
[8] "Longitude"

你没有提供可重现的数据,所以我假设你的 df 有一个包含联赛名称的列,我们可以用它来匹配图标的名称,因此我编写了一些示例数据:

library(leaflet)
library(sf)

# generate example data
set.seed(2020)
venues <- c('NHL', 'MLB', 'MLS', 'NBA', 'NFL')
nc <- st_read(system.file("shape/nc.shp", package="sf"))

df <- st_sample(nc, 5) %>%
  st_coordinates() %>%
  as.data.frame 
df$league <- venues

df

#>           X        Y league
#> 1 -78.58785 35.94350    NHL
#> 2 -80.82830 35.88732    MLB
#> 3 -78.83967 36.11236    MLS
#> 4 -80.09532 35.01562    NBA
#> 5 -83.72636 35.33204    NFL

我们需要做的就是创建一个命名的 iconList,其中图标的名称与数据框 "league" 列中的名称相匹配。使用 ~iconSet[league] 我们可以确保为 df 中的每个点使用正确的图标。

# create iconSet
iconSet <- iconList(NHL= NHL,
                    MLB =MLB, 
                    MLS = MLS,
                    NBA = NBA,
                    NFL = NFL)

# map
leaflet(df) %>%
  addTiles() %>%
  addMarkers(lng=~X, lat=~Y, icon = ~iconSet[league])