R: Create a list of icon data

icons {leaflet} | R Documentation

## Create a list of icon data

### Description

An icon can be represented as a list of the form `list(iconUrl, iconSize, ...)`. This function is vectorized over its arguments to create a list of icon data. Shorter argument values will be re-cycled. `NULL` values for these arguments will be ignored.

### Usage

    icons(iconUrl = NULL, iconRetinaUrl = NULL, iconWidth = NULL,
      iconHeight = NULL, iconAnchorX = NULL, iconAnchorY = NULL,
      shadowUrl = NULL, shadowRetinaUrl = NULL, shadowWidth = NULL,
      shadowHeight = NULL, shadowAnchorX = NULL, shadowAnchorY = NULL,
      popupAnchorX = NULL, popupAnchorY = NULL, className = NULL)

### Arguments

`iconUrl` | the URL or file path to the icon image
`iconRetinaUrl` | the URL or file path to a retina sized version of the icon image
`iconWidth, iconHeight` | size of the icon image in pixels
`iconAnchorX, iconAnchorY` | the coordinates of the "tip" of the icon (relative to its top left corner, i.e. the top left corner means `iconAnchorX = 0` and `iconAnchorY = 0)`, and the icon will be aligned so that this point is at the marker's geographical location
`shadowUrl` | the URL or file path to the icon shadow image
`shadowRetinaUrl` | the URL or file path to the retina sized version of the icon shadow image
`shadowWidth, shadowHeight` | size of the shadow image in pixels
`shadowAnchorX, shadowAnchorY` | the coordinates of the "tip" of the shadow
`popupAnchorX, popupAnchorY` | the coordinates of the point from which popups will "open", relative to the icon anchor
`className` | a custom class name to assign to both icon and shadow images

### Value

A list of icon data that can be passed to the `icon` argument of `addMarkers()`.

### Examples

    library(leaflet)

    # adapted from http://leafletjs.com/examples/custom-icons.html

    iconData = data.frame(
      lat = c(rnorm(10, 0), rnorm(10, 1), rnorm(10, 2)),
      lng = c(rnorm(10, 0), rnorm(10, 3), rnorm(10, 6)),
      group = rep(sort(c('green', 'red', 'orange')), each = 10),
      stringsAsFactors = FALSE
    )

    leaflet() %>% addMarkers(
      data = iconData,
      icon = ~ icons(
        iconUrl = sprintf('http://leafletjs.com/docs/images/leaf-%s.png', group),
        shadowUrl = 'http://leafletjs.com/docs/images/leaf-shadow.png',
        iconWidth = 38, iconHeight = 95, shadowWidth = 50, shadowHeight = 64,
        iconAnchorX = 22, iconAnchorY = 94, shadowAnchorX = 4, shadowAnchorY = 62,
        popupAnchorX = -3, popupAnchorY = -76
      )
    )

    # use point symbols from base R graphics as icons
    pchIcons = function(pch = 0:14, width = 30, height = 30, ...) {
      n = length(pch)
      files = character(n)
      # create a sequence of png images
      for (i in seq_len(n)) {
        f = tempfile(fileext = '.png')
        png(f, width = width, height = height, bg = 'transparent')
        par(mar = c(0, 0, 0, 0))
        plot.new()
        points(.5, .5, pch = pch[i], cex = min(width, height) / 8, ...)
        dev.off()
        files[i] = f
      }
      files
    }

    iconData = matrix(rnorm(500), ncol = 2)
    res = kmeans(iconData, 10)
    iconData = cbind(iconData, res$cluster)
    colnames(iconData) = c('lat', 'lng', 'group')
    iconData = as.data.frame(iconData)

    # 10 random point shapes for the 10 clusters in iconData
    shapes = sample(0:14, 10)
    iconFiles = pchIcons(shapes, 40, 40, col = 'steelblue', lwd = 2)

    # note the data has 250 rows, and there are 10 icons in iconFiles; they are
    # connected by the `group` variable: the i-th row of iconData uses the
    # group[i]-th icon in the icon list
    leaflet() %>% addMarkers(
      data = iconData,
      icon = ~ icons(
        iconUrl = iconFiles[group],
        popupAnchorX = 20, popupAnchorY = 0
      ),
      popup = ~ sprintf(
        'lat = %.4f, long = %.4f, group = %s, pch = %s', lat, lng, group, shapes[group]
      )
    )

    unlink(iconFiles)  # clean up the tmp png files that have been embedded

[Package leaflet version 1.1.0 Index]