# 1) Daten in ein sf-Objekt überführen (Punktgeometrie aus lon/lat)
adv_sf <- st_as_sf(df, coords = c("lon", "lat"), crs = 4326, remove = FALSE) %>%
# fehlende/leer Kategorien konsistent füllen
mutate(advertising = if_else(is.na(advertising) | advertising == "", "unknown", advertising))
# 2) (Optional) seltene Kategorien zusammenfassen, damit die Karte nicht überfrachtet
top_types <- adv_sf %>% count(advertising, sort = TRUE) %>% slice_head(n = 8) %>% pull(advertising)
adv_sf <- adv_sf %>%
# alle anderen Kategorien auf "other" bündeln
mutate(advertising2 = if_else(advertising %in% top_types, advertising, "other"))
# 3) Farbpalette: Set2 erlaubt max. 8 Farben -> Palette dynamisch erweitern
n_cats <- length(unique(adv_sf$advertising2))
pal_cols <- colorRampPalette(RColorBrewer::brewer.pal(8, "Set2"))(n_cats)
pal <- colorFactor(pal_cols, domain = adv_sf$advertising2)
# 4) Karte aufbauen: Tiles -> Marker -> Legende
leaflet(adv_sf) %>%
# Hintergrundkarte (hell, gut für Punkte)
addProviderTiles("CartoDB.Positron") %>%
# Punktmarker je Standort
addCircleMarkers(
lng = ~lon, lat = ~lat,
radius = 5,
color = ~pal(advertising2),
stroke = FALSE, fillOpacity = 0.8,
# Popup zeigt Originalkategorie + Name
popup = ~paste0("<b>", advertising, "</b><br>", name)
) %>%
# Legende erklärt die Farben
addLegend("bottomright", pal = pal, values = ~advertising2, title = "advertising")