Nothing
mapkeyIconDependency <- function() {
list(
htmltools::htmlDependency(
"lfx-mapkeyicon", version = "1.0.0",
src = system.file("htmlwidgets/lfx-mapkeyicon", package = "leaflet.extras2"),
script = c("L.Icon.Mapkey.js",
"lfx-mapkeyicon-bindings.js"),
stylesheet = c("L.Icon.Mapkey.css"),
all_files = TRUE
)
)
}
#' Make Mapkey-icon set
#' @param ... icons created from \code{\link{makeMapkeyIcon}()}
#' @family Mapkey Functions
#' @references \url{https://github.com/mapshakers/leaflet-mapkey-icon}
#' @export
#' @return A list of class \code{"leaflet_mapkey_icon_set"}
#' @examples
#' iconSet = mapkeyIconList(
#' red = makeMapkeyIcon(color = "#ff0000"),
#' blue = makeMapkeyIcon(color = "#0000ff")
#' )
#' iconSet[c("red", "blue")]
mapkeyIconList = function(...) {
res = structure(
list(...),
class = "leaflet_mapkey_icon_set"
)
cls = unlist(lapply(res, inherits, "leaflet_mapkey_icon"))
if (any(!cls))
stop("Arguments passed to mapkeyIconList() must be icon objects returned from makeMapkeyIcon()")
res
}
#' leaflet_mapkey_icon_set
#' @param x icons
#' @param i offset
#' @export
#' @family Mapkey Functions
`[.leaflet_mapkey_icon_set` = function(x, i) {
if (is.factor(i)) {
i = as.character(i)
}
if (!is.character(i) && !is.numeric(i) && !is.integer(i)) {
stop("Invalid subscript type '", typeof(i), "'")
}
structure(.subset(x, i), class = "leaflet_mapkey_icon_set")
}
mapkeyIconSetToMapkeyIcons = function(x) {
cols = names(formals(makeMapkeyIcon))
cols = structure(as.list(cols), names = cols)
# Construct an equivalent output to mapkeyIcons().
leaflet::filterNULL(lapply(cols, function(col) {
# Pluck the `col` member off of each item in mapkeyIconObjs and put them in an
# unnamed list (or vector if possible).
colVals = unname(sapply(x, `[[`, col))
# If this is the common case where there"s lots of values but they"re all
# actually the same exact thing, then just return one value; this will be
# much cheaper to send to the client, and we'll do recycling on the client
# side anyway.
if (length(unique(colVals)) == 1) {
return(colVals[[1]])
} else {
return(colVals)
}
}))
}
#' Make Mapkey Icon
#' @inheritParams mapkeyIcons
#' @export
#' @family Mapkey Functions
#' @references \url{https://github.com/mapshakers/leaflet-mapkey-icon}
#' @return A list of mapkey-icon data that can be passed to the argument \code{icon}
#' @examples
#' makeMapkeyIcon(icon = "traffic_signal",
#' color = "#0000ff",
#' iconSize = 12,
#' boxShadow = FALSE,
#' background="transparent")
makeMapkeyIcon <- function(
icon = 'mapkey',
color = "#ff0000",
iconSize = 12,
background = '#1F7499',
borderRadius = '100%',
hoverScale = 1.4,
hoverEffect = TRUE,
additionalCSS = NULL,
hoverCSS = NULL,
htmlCode = NULL,
boxShadow = TRUE
) {
icon = leaflet::filterNULL(list(
icon = icon,
color = color,
size = iconSize,
background = background,
borderRadius = borderRadius,
hoverScale = hoverScale,
hoverEffect = hoverEffect,
additionalCSS = additionalCSS,
hoverCSS = hoverCSS,
htmlCode = htmlCode,
boxShadow = boxShadow
))
structure(icon, class = "leaflet_mapkey_icon")
}
#' Create a list of Mapkey icon data
#'
#' An icon can be represented as a list of the form \code{list(color, iconSize,
#' ...)}. This function is vectorized over its arguments to create a list of
#' icon data. Shorter argument values will be re-cycled. \code{NULL} values for
#' these arguments will be ignored.
#' @param icon ID of the mapkey Icon you want to use.
#' @param color Any CSS color (e.g. 'red','rgba(20,160,90,0.5)', '#686868', ...)
#' @param iconSize Size of Icon in Pixels. Default is 12
#' @param background Any CSS color or false for no background
#' @param borderRadius Any number (for circle size/2, for square 0.001)
#' @param hoverScale Any real number (best result in range 1 - 2, use 1 for no
#' effect)
#' @param hoverEffect Switch on/off effect on hover
#' @param hoverCSS CSS code (e.g. \code{"background-color:#992b00 !important;
#' color:#99defc !important;"})
#' @param additionalCSS CSS code (e.g. \code{"border:4px solid #aa3838;"})
#' @param htmlCode e.g. \code{''}.
#' @param boxShadow Should a shadow be visible
#' @export
#' @family Mapkey Functions
#' @references \url{https://github.com/mapshakers/leaflet-mapkey-icon}
#' @return A list of mapkey-icon data that can be passed to the argument \code{icon}
#' @examples \dontrun{
#' library(leaflet)
#' leaflet() %>%
#' addMapkeyMarkers(data = breweries91,
#' icon = mapkeyIcons(
#' color = "red",
#' borderRadius = 0,
#' iconSize = 25))
#' }
mapkeyIcons <- function(
icon = 'mapkey',
color = "#ff0000",
iconSize = 12,
background = '#1F7499',
borderRadius = '100%',
hoverScale = 1.4,
hoverEffect = TRUE,
hoverCSS = NULL,
additionalCSS = NULL,
htmlCode = NULL,
boxShadow = TRUE
) {
leaflet::filterNULL(list(
icon = icon,
color = color,
size = iconSize,
background = background,
borderRadius = borderRadius,
hoverScale = hoverScale,
hoverEffect = hoverEffect,
hoverCSS = hoverCSS,
additionalCSS = additionalCSS,
htmlCode = htmlCode,
boxShadow = boxShadow
))
}
#' Add Mapkey Markers
#' @param map the map to add mapkey Markers to.
#' @inheritParams leaflet::addAwesomeMarkers
#' @param options a list of extra options for markers. See
#' \code{\link[leaflet]{markerOptions}}
#' @family Mapkey Functions
#' @references \url{https://github.com/mapshakers/leaflet-mapkey-icon}
#' @inherit leaflet::addMarkers return
#' @export
#' @examples
#' library(leaflet)
#'
#' leaflet() %>%
#' addTiles() %>%
#' addMapkeyMarkers(data = breweries91,
#' icon = makeMapkeyIcon(icon = "mapkey",
#' iconSize = 30,
#' boxShadow = FALSE,
#' background = "transparent"),
#' group = "mapkey",
#' label = ~state, popup = ~village)
addMapkeyMarkers = function(
map, lng = NULL, lat = NULL, layerId = NULL, group = NULL,
icon = NULL,
popup = NULL,
popupOptions = NULL,
label = NULL,
labelOptions = NULL,
options = leaflet::markerOptions(),
clusterOptions = NULL,
clusterId = NULL,
data = leaflet::getMapData(map)
) {
map$dependencies <- c(map$dependencies,
mapkeyIconDependency())
if (!is.null(icon)) {
# If formulas are present, they must be evaluated first so we can pack the
# resulting values
icon = leaflet::evalFormula(list(icon), data)[[1]]
if (inherits(icon, "leaflet_mapkey_icon_set")) {
icon = mapkeyIconSetToMapkeyIcons(icon)
}
icon = leaflet::filterNULL(icon)
}
if (!is.null(clusterOptions))
map$dependencies = c(map$dependencies, leaflet::leafletDependencies$markerCluster())
pts = leaflet::derivePoints(
data, lng, lat, missing(lng), missing(lat), "addMapkeyMarkers")
leaflet::invokeMethod(
map, data, "addMapkeyMarkers", pts$lat, pts$lng, icon, layerId,
group, options, popup, popupOptions,
clusterOptions, clusterId, leaflet::safeLabel(label, data), labelOptions
) %>%
expandLimits(pts$lat, pts$lng)
}
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.