I would like to determine the size of leaflet icons based on lat/long distance rather than pixels. How can I accomplish this with the leaflet R package?
Ideally, I would like markers to fit within sf polygons. I can determine the lat/long distance of the largest marker that would fit within the polygon if located at the centroid, but I cannot convert this lat/long distance value to pixels.
Reproducible Example:
Loading in packages, data, and inscription function.
library(sf)
# creates inscribed circle on any polygon
inscribed_circle <- function(poly) {
# Get centroid of polygon
centroid <- sf::st_centroid(poly)
# Get nearest point
radius <- sf::st_length(sf::st_nearest_points(poly, centroid, pairwise = TRUE))
# Create circle as a point with a buffer around it
circle <- sf::st_buffer(centroid, radius)
return(circle)
}
# loading spatial data
nc <- st_read(system.file("shape/nc.shp", package="sf")) |>
sf::st_transform("+proj=longlat +datum=WGS84")
Selecting the first polygon in the nc dataset.
Determining the distance between the centroid of the polygon and the closest point on the polygon. Creating an inscribed circle with a radius equal to this distance and plotting.
Adding a marker that is scaled based on the radius of the inscribed circle. Marker size is in pixels and circle radius is in meters (lat/long calculation). Not sure how to do this conversion.
polytest <- nc[1,15]
# creating geometry of inscribed circle
inscribed <- inscribed_circle(polytest)
# calculating size of inscribed polygon
polytest$centroid <- sf::st_centroid(polytest)
iconsize_max <- sf::st_length(sf::st_nearest_points(polytest$geometry,
polytest$centroid,
pairwise = TRUE))
# scaling the marker relative to the inscribed polygon size
icons <- leaflet::icons(
iconUrl = c("https://cdn-icons-png.flaticon.com/512/985/985331.png"),
iconWidth = iconsize_max/100, # scaling by 100 otherwise icon would not be visible
iconHeight = iconsize_max/100
)
# Creating leaflet map with polygons and markers
leaflet::leaflet() |>
leaflet::addPolygons(data = polytest,
fillOpacity = 0,
color = "red",
weight = 1) |>
leaflet::addPolygons(data = inscribed,
fillOpacity = 0,
color = "blue",
weight = 1) |>
leaflet::addMarkers(data = polytest$centroid,
icon = icons)