protomapr/R/rules.R
2026-03-06 15:46:39 +11:00

106 lines
3.8 KiB
R

#' Create a Paint Rule
#'
#' @description
#' Creates a paint rule that specifies how to render features from a
#' particular data layer. Paint rules control the visual appearance of
#' polygon, line, and point features.
#'
#' @param dataLayer Character. The name of the data layer in the vector
#' tile source (e.g., "water", "earth", "roads").
#' @param symbolizer A symbolizer object created with one of the symbolizer
#' functions (e.g., \code{\link{pmPolygonSymbolizer}},
#' \code{\link{pmLineSymbolizer}}).
#' @param minzoom Numeric. Minimum zoom level at which this rule applies.
#' Default is NULL (applies at all zoom levels).
#' @param maxzoom Numeric. Maximum zoom level at which this rule applies.
#' Default is NULL (applies at all zoom levels).
#' @param filter Character. A JavaScript expression string that filters
#' features. The expression has access to \code{zoom} and \code{feature}
#' variables. Default is NULL (no filter).
#'
#' @return A list representing the paint rule configuration.
#'
#' @examples
#' # Render water polygons in blue
#' pmPaintRule("water", pmPolygonSymbolizer(fill = "steelblue"))
#'
#' # Render roads with zoom-dependent visibility
#' pmPaintRule("roads", pmLineSymbolizer(color = "gray", width = 2),
#' minzoom = 10)
#'
#' # Filter to only show highways
#' pmPaintRule("roads",
#' pmLineSymbolizer(color = "orange", width = 4),
#' filter = "feature.props.kind === 'highway'")
#'
#' @export
pmPaintRule <- function(dataLayer,
symbolizer,
minzoom = NULL,
maxzoom = NULL,
filter = NULL) {
rule <- list(
dataLayer = dataLayer,
symbolizer = symbolizer
)
if (!is.null(minzoom)) rule$minzoom <- minzoom
if (!is.null(maxzoom)) rule$maxzoom <- maxzoom
if (!is.null(filter)) rule$filter <- filter
rule
}
#' Create a Label Rule
#'
#' @description
#' Creates a label rule that specifies how to render text labels for
#' features from a particular data layer. Label rules control text
#' placement and styling, with automatic collision detection.
#'
#' @param dataLayer Character. The name of the data layer in the vector
#' tile source (e.g., "places", "roads").
#' @param symbolizer A text symbolizer object created with one of
#' \code{\link{pmTextSymbolizer}}, \code{\link{pmCenteredTextSymbolizer}},
#' \code{\link{pmLineLabelSymbolizer}}, or \code{\link{pmShieldSymbolizer}}.
#' @param minzoom Numeric. Minimum zoom level at which this rule applies.
#' Default is NULL (applies at all zoom levels).
#' @param maxzoom Numeric. Maximum zoom level at which this rule applies.
#' Default is NULL (applies at all zoom levels).
#' @param filter Character. A JavaScript expression string that filters
#' features. Default is NULL (no filter).
#'
#' @return A list representing the label rule configuration.
#'
#' @examples
#' # Label cities
#' pmLabelRule("places",
#' pmCenteredTextSymbolizer(font = "14px Arial",
#' fill = "black",
#' stroke = "white",
#' width = 2))
#'
#' # Label streets along their paths
#' pmLabelRule("roads",
#' pmLineLabelSymbolizer(font = "11px Arial",
#' fill = "#333"),
#' minzoom = 14)
#'
#' @export
pmLabelRule <- function(dataLayer,
symbolizer,
minzoom = NULL,
maxzoom = NULL,
filter = NULL) {
rule <- list(
dataLayer = dataLayer,
symbolizer = symbolizer
)
if (!is.null(minzoom)) rule$minzoom <- minzoom
if (!is.null(maxzoom)) rule$maxzoom <- maxzoom
if (!is.null(filter)) rule$filter <- filter
rule
}