Interaktywne mapy za pomocą leaflet
Renderuj interaktywne mapy internetowe ze znacznikami, wyskakującymi oknami i warstwami kafelków.
Interaktywne mapy za pomocą leaflet to bezpłatna lekcja R Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej R Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs R Academy zawiera 4 lekcji w sumie.
Wprowadzenie do leaflet
Pakiet leaflet opakowuje bibliotekę Leaflet.js, umożliwiając tworzenie interaktywnych map internetowych z możliwością powiększania bezpośrednio w R. Mapy są widżetami HTML wyświetlanymi w przeglądarce RStudio, w R Markdown i w aplikacjach Shiny, bez znajomości JavaScript.
library(leaflet)
# Minimal leaflet map: tiles + one marker
leaflet() |>
addTiles() |> # OpenStreetMap base layer
setView(
lng = -74.006,
lat = 40.713,
zoom = 12
) |>
addMarkers(
lng = -74.006,
lat = 40.713,
popup = '<b>New York City</b>'
)addTiles: warstwy mapy bazowej
addTiles() dodaje domyślną warstwę kafelków OpenStreetMap. Użyj addProviderTiles(providers$, aby przełączyć się na zdjęcia satelitarne, CartoDB, Esri, Stamen lub dowolnego innego dostawcę kafelków. Nazwy warstw znajdują się na wbudowanej liście providers.
library(leaflet)
# Default OpenStreetMap
map1 <- leaflet() |> addTiles()
# CartoDB light theme (great for data overlay)
map2 <- leaflet() |>
addProviderTiles(providers$CartoDB.Positron)
# Satellite imagery
map3 <- leaflet() |>
addProviderTiles(providers$Esri.WorldImagery)
# Custom tile URL
custom <- leaflet() |>
addTiles(
urlTemplate = 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',
attribution = '(c) OpenStreetMap contributors'
)
map2addMarkers z wyskakującymi okienkami
addMarkers(lng, lat, popup) dodaje do mapy znaczniki pinezek. Argument popup przyjmuje ciągi HTML, dzięki czemu można umieszczać w nich pogrubiony tekst, łącza lub obrazy. Argument label wyświetla tekst po najechaniu kursorem, bez konieczności klikania.
library(leaflet)
cities <- data.frame(
name = c('New York', 'Los Angeles', 'Chicago'),
lon = c(-74.006, -118.244, -87.629),
lat = c( 40.713, 34.052, 41.878),
pop = c(8336817, 3979576, 2693976)
)
leaflet(cities) |>
addTiles() |>
addMarkers(
lng = ~lon,
lat = ~lat,
popup = ~paste0(
'<b>', name, '</b><br>',
'Population: ', format(pop, big.mark = ',')
),
label = ~name
)addCircleMarkers
addCircleMarkers() renderuje okręgi o stałym rozmiarze wyrażonym w pikselach ekranu (w przeciwieństwie do addCircles(), które skaluje je wraz ze zmianą powiększenia). Są idealne do przedstawiania symboli proporcjonalnych — promień należy powiązać ze zmienną danych za pomocą radius.
library(leaflet)
cities <- data.frame(
name = c('New York', 'Los Angeles', 'Chicago', 'Houston', 'Phoenix'),
lon = c(-74.006, -118.244, -87.629, -95.369, -112.074),
lat = c( 40.713, 34.052, 41.878, 29.760, 33.449),
pop = c(8336817, 3979576, 2693976, 2304580, 1608139)
)
leaflet(cities) |>
addProviderTiles(providers$CartoDB.Positron) |>
addCircleMarkers(
lng = ~lon,
lat = ~lat,
radius = ~sqrt(pop / 50000),
color = 'steelblue',
fill = TRUE,
fillOpacity = 0.6,
popup = ~paste0(name, ': ', format(pop, big.mark = ','))
)addPolygons: mapy choropletyczne
addPolygons() renderuje geometrie wielokątów bezpośrednio z obiektu sf. Kolor wypełnienia można powiązać z kolumną danych za pomocą funkcji palet colorNumeric() lub colorBin(). Opcja highlight dodaje efekty po najechaniu kursorem.
library(leaflet)
library(sf)
nc <- st_transform(
read_sf(system.file('shape/nc.shp', package = 'sf')), 4326
)
# Colour palette based on birth count
pal <- colorNumeric('YlOrRd', domain = nc$BIR74)
leaflet(nc) |>
addProviderTiles(providers$CartoDB.Positron) |>
addPolygons(
fillColor = ~pal(BIR74),
fillOpacity = 0.7,
color = 'white',
weight = 1,
popup = ~paste0('<b>', NAME, '</b><br>Births 1974: ', BIR74),
highlight = highlightOptions(
weight = 3,
color = '#333',
bringToFront = TRUE
)
) |>
addLegend('bottomright', pal = pal, values = ~BIR74, title = 'Births 1974')setView i fitBounds
setView(lng, lat, zoom) centruje mapę na określonej lokalizacji i ustawia stały poziom powiększenia. fitBounds(lng1, lat1, lng2, lat2) automatycznie dobiera powiększenie tak, aby wyświetlić prostokąt ograniczający obszar geograficzny. Jest to przydatne, gdy z wyprzedzeniem nie znają Państwo zasięgu danych.
library(leaflet)
library(sf)
nc <- st_transform(
read_sf(system.file('shape/nc.shp', package = 'sf')), 4326
)
bbox <- st_bbox(nc)
# fitBounds: auto-zoom to data extent
leaflet() |>
addTiles() |>
fitBounds(
lng1 = bbox['xmin'], lat1 = bbox['ymin'],
lng2 = bbox['xmax'], lat2 = bbox['ymax']
) |>
addPolygons(
data = nc,
fillColor = 'lightblue',
fillOpacity = 0.4,
color = 'steelblue',
weight = 1
)addLayersControl: przełączanie warstw
addLayersControl() dodaje przełącznik radiowy lub zestaw pól wyboru, który służy do włączania i wyłączania map bazowych oraz warstw nakładkowych. Należy użyć baseGroups dla wzajemnie wykluczających się warstw kafelkowych oraz overlayGroups dla niezależnie przełączanych warstw danych.
library(leaflet)
library(sf)
nc <- st_transform(
read_sf(system.file('shape/nc.shp', package = 'sf')), 4326
)
high_birth <- nc[nc$BIR74 > 3000, ]
low_birth <- nc[nc$BIR74 <= 3000, ]
leaflet() |>
addProviderTiles(providers$CartoDB.Positron, group = 'Light') |>
addProviderTiles(providers$Esri.WorldImagery, group = 'Satellite') |>
addPolygons(data = high_birth, color = 'red', group = 'High Births (>3000)') |>
addPolygons(data = low_birth, color = 'blue', group = 'Low Births (<=3000)') |>
addLayersControl(
baseGroups = c('Light', 'Satellite'),
overlayGroups = c('High Births (>3000)', 'Low Births (<=3000)'),
options = layersControlOptions(collapsed = FALSE)
)addPopups i addLegend
addPopups() dodaje trwałe pola wyskakujące, które są zawsze widoczne. addLegend() tworzy legendę mapy powiązaną z paletą kolorów. Obie funkcje obsługują zawartość HTML i można je w pełni dostosowywać za pomocą klas CSS.
library(leaflet)
leaflet() |>
addTiles() |>
setView(-79.0, 35.5, zoom = 7) |>
addPopups(
lng = -78.639,
lat = 35.779,
popup = '<b>Raleigh</b><br>State Capital of NC'
) |>
addLegend(
position = 'bottomleft',
colors = c('red', 'blue', 'green'),
labels = c('High', 'Medium', 'Low'),
title = 'Risk Level',
opacity = 0.8
)Palety kolorów: colorNumeric i colorBin
Funkcje colorNumeric(), colorBin(), colorQuantile() i colorFactor() tworzą funkcje palet, które mapują wartości danych na kolory w formacie szesnastkowym. Wynik należy przekazać do fillColor, a tę samą paletę do addLegend().
library(leaflet)
library(sf)
nc <- st_transform(
read_sf(system.file('shape/nc.shp', package = 'sf')), 4326
)
# Continuous palette
pal_num <- colorNumeric('Blues', domain = nc$BIR74)
# Binned palette (5 equal bins)
pal_bin <- colorBin('RdYlGn', domain = nc$BIR74, bins = 5)
# Quantile palette (equal number of features per class)
pal_qtl <- colorQuantile('YlOrRd', domain = nc$BIR74, n = 4)
# Use binned palette
leaflet(nc) |>
addTiles() |>
addPolygons(
fillColor = ~pal_bin(BIR74),
fillOpacity = 0.7, weight = 1, color = 'white'
) |>
addLegend('bottomright', pal = pal_bin, values = ~BIR74,
title = 'Births 1974 (5 bins)')leafletProxy: aktualizowanie map w Shiny
leafletProxy('mapId') aktualizuje istniejącą mapę leaflet w aplikacji Shiny bez ponownego renderowania całej mapy od podstaw. Należy używać jej wraz z clearMarkers(), clearShapes() lub addMarkers(), aby wydajnie reagować na dane wejściowe użytkownika.
library(shiny)
library(leaflet)
# Minimal Shiny app with leafletProxy
ui <- fluidPage(
selectInput('colour', 'Marker colour:', choices = c('red', 'blue', 'green')),
leafletOutput('map')
)
server <- function(input, output, session) {
output$map <- renderLeaflet({
leaflet() |> addTiles() |>
setView(-79.0, 35.5, zoom = 7)
})
observeEvent(input$colour, {
leafletProxy('map') |>
clearMarkers() |>
addCircleMarkers(
lng = -78.639, lat = 35.779,
color = input$colour,
label = paste('Raleigh -', input$colour)
)
})
}
# shinyApp(ui, server) # uncomment to runW pełni interaktywna mapa choropletyczna
Oto gotowa do użycia mapa choropletyczna łącząca wszystkie najważniejsze funkcje: kafelki dostawcy, wypełnienie wielokątów, wyróżnienia po najechaniu, dynamiczne pola wyskakujące, legendę kolorów i kontrolki warstw — wszystko w mniej niż 25 wierszach.
library(leaflet)
library(sf)
nc <- st_transform(
read_sf(system.file('shape/nc.shp', package = 'sf')), 4326
)
pal <- colorQuantile('YlOrRd', domain = nc$SID74, n = 5)
leaflet(nc) |>
addProviderTiles(providers$CartoDB.Positron) |>
addPolygons(
fillColor = ~pal(SID74),
fillOpacity = 0.75,
color = 'white',
weight = 0.5,
popup = ~paste0('<b>', NAME, '</b><br>SIDS 1974: ', SID74),
highlight = highlightOptions(
weight = 2, color = '#555', bringToFront = TRUE
)
) |>
addLegend(
position = 'bottomright',
pal = pal, values = ~SID74,
title = 'SIDS Deaths 1974<br>(Quintiles)'
) |>
addControl('<b>NC SIDS Data 1974</b>', position = 'topright')Szybkie sprawdzenie
W aplikacji Shiny chcą Państwo zaktualizować położenia znaczników na istniejącej mapie leaflet po zmianie listy rozwijanej przez użytkownika — bez ponownego renderowania całej mapy. Której funkcji należy użyć?
Podsumowanie: pakiet leaflet
Najważniejsze informacje:
leaflet() |> addTiles()tworzy interaktywną mapę z kafelkami OpenStreetMapaddProviderTiles(providers$przełącza mapę na kafelki innych dostawców) addMarkers()/addCircleMarkers()służą do danych punktowych; należy używaćpopupilabeladdPolygons(fillColor = ~pal(col))służy do tworzenia map choropletycznychcolorNumeric(),colorBin(),colorQuantile()tworzą funkcje paletaddLegend()współpracuje z funkcjami palet;addLayersControl()przełącza warstwyleafletProxy()służy do wydajnych aktualizacji map ShinyfitBounds()automatycznie dopasowuje powiększenie do zasięgu danych
library(leaflet)
# Three-line interactive map
leaflet() |>
addProviderTiles(providers$CartoDB.Positron) |>
addCircleMarkers(lng = c(-74, -118, -88), lat = c(41, 34, 42),
label = c('NYC', 'LA', 'Chicago'), color = 'steelblue')Ucz się R dzięki korepetycjom AI — za darmo
Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.
- Kursy
- 43
- Lekcje
- 159
Często zadawane pytania
Czy lekcja „Interaktywne mapy za pomocą leaflet” jest bezpłatna?
Tak — pełny tekst „Interaktywne mapy za pomocą leaflet” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu R Academy, przejdź na CoddyKit PRO. Kurs R Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Interaktywne mapy za pomocą leaflet”?
Renderuj interaktywne mapy internetowe ze znacznikami, wyskakującymi oknami i warstwami kafelków. Ćwiczysz R Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć R Academy?
Nie wymagamy żadnego doświadczenia. R Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.
Ile czasu zajmuje lekcja „Interaktywne mapy za pomocą leaflet”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji R Academy?
Tak. Każda lekcja R Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Proste obiekty przestrzenne za pomocą pakietu sf
- Układy odniesienia współrzędnych i odwzorowania
- Złączenia i operacje przestrzenne
- Interaktywne mapy za pomocą leaflet