R Academy · leksjon

Interaktive kart med leaflet

Generer interaktive nettkart med markører, popup-vinduer og kartlag.

Leksjon 4 av 413 trinn

Interaktive kart med leaflet er en gratis leksjon i R Academy på CoddyKit. Dette er leksjon 4 av 4. Du kan lese valgfritt 3 leksjoner fra denne læringsstien gratis i sin helhet – deretter låser CoddyKit PRO opp alle leksjoner, samt praktisk øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i R Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i R Academy inneholder totalt 4 leksjoner.

Introduksjon til leaflet

leaflet-pakken pakker inn Leaflet.js-biblioteket og gjør det mulig å opprette interaktive webkart som kan zoomes, direkte fra R. Kartene er HTML-widgeter som vises i RStudio-visningen, R Markdown og Shiny-apper uten at De trenger JavaScript-kunnskaper.

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: Bakgrunnskartlag

addTiles() legger til standardflislaget fra OpenStreetMap. Bruk addProviderTiles(providers$) for å bytte til satellittbilder, CartoDB, Esri, Stamen eller en annen flisleverandør. Lagnavnene finnes i den innebygde listen 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'
  )

map2

addMarkers med popup-vinduer

addMarkers(lng, lat, popup) legger til markører som viser nåler på kartet. Argumentet popup godtar HTML-strenger, slik at De kan inkludere fet tekst, lenker eller bilder. Argumentet label viser tekst ved hovering uten at brukeren trenger å klikke.

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() gjengir sirkler med en fast størrelse i skjermpiksler (i motsetning til addCircles(), som skaleres med zoomnivået). De egner seg godt til å representere proporsjonale symboler – knytt radius til en datavariabel.

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: Koroplettkart

addPolygons() gjengir polygongeometrier direkte fra et sf-objekt. Fyllfargen kan knyttes til en datakolonne ved hjelp av palettfunksjonene colorNumeric() eller colorBin(). Et highlight-alternativ legger til effekter ved pekerbevegelse.

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 og fitBounds

setView(lng, lat, zoom) sentrerer kartet på en fast posisjon og et fast zoomnivå. fitBounds(lng1, lat1, lng2, lat2) zoomer automatisk slik at en geografisk avgrensningsboks passer i kartet. Dette er nyttig når De ikke kjenner dataenes utstrekning på forhånd.

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: Slå lag av og på

addLayersControl() legger til en kontroll med alternativknapper eller avkrysningsbokser for å slå grunnkart og overlagslag av og på. Bruk baseGroups for gjensidig utelukkende flislag og overlayGroups for datalag som kan slås av og på uavhengig av hverandre.

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 og addLegend

addPopups() legger til vedvarende popup-bokser som alltid er synlige. addLegend() oppretter en kartforklaring som er koblet til en fargepalett. Begge støtter HTML-innhold og kan tilpasses fullt ut med CSS-klasser.

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
  )

Fargepaletter: colorNumeric og colorBin

Funksjonene colorNumeric(), colorBin(), colorQuantile() og colorFactor() oppretter palettfunksjoner som knytter dataverdier til heksadesimale farger. Send resultatet til fillColor, og bruk den samme paletten i 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: Oppdatere kart i Shiny

leafletProxy('mapId') oppdaterer et eksisterende leaflet-kart i en Shiny-app uten å gjengi hele kartet på nytt fra grunnen av. Bruk den sammen med clearMarkers(), clearShapes() eller addMarkers() for å reagere effektivt på brukerinndata.

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 run

Fullstendig interaktivt koroplettkart

Her er et produksjonsklart koroplettkart som kombinerer alle de viktigste funksjonene: leverandørfliser, polygonfyll, utheving ved pekerbevegelse, dynamiske popup-vinduer, en fargeforklaring og lagkontroller – alt på under 25 linjer.

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')

Kort kontrollspørsmål

I en Shiny-app ønsker De å oppdatere markørposisjoner på et eksisterende leaflet-kart når brukeren endrer en rullegardinliste – uten å gjengi hele kartet på nytt. Hvilken funksjon bør De bruke?

Oppsummering: leaflet-pakken

Viktigste punkter:

  • leaflet() |> addTiles() oppretter et interaktivt kart med OpenStreetMap-fliser
  • addProviderTiles(providers$) bytter til andre flisleverandører
  • addMarkers() / addCircleMarkers() brukes for punktdata; bruk popup og label
  • addPolygons(fillColor = ~pal(col)) brukes for koroplettkart
  • colorNumeric(), colorBin() og colorQuantile() oppretter palettfunksjoner
  • addLegend() kobles sammen med palettfunksjoner; addLayersControl() slår lag av og på
  • leafletProxy() brukes til effektive kartoppdateringer i Shiny
  • fitBounds() zoomer automatisk til dataenes utstrekning
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')
Gratis å komme i gang

Lær deg R med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
43
Leksjoner
159

Ofte stilte spørsmål

Er leksjonen «Interaktive kart med leaflet» gratis?

Ja – du kan lese valgfritt 3 av leksjonene i læringsstien R Academy, inkludert «Interaktive kart med leaflet», gratis i sin helhet her på nettet. Deretter låser CoddyKit PRO opp alle leksjoner, samt interaktiv øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Kurset i R Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «Interaktive kart med leaflet»?

Generer interaktive nettkart med markører, popup-vinduer og kartlag. Du øver på R Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med R Academy?

Ingen tidligere erfaring er nødvendig. R Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 4 av 4.

Hvor lang tid tar leksjonen «Interaktive kart med leaflet»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne R Academy-leksjonen?

Ja. Alle R Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Simple Features med sf-pakken
  2. Koordinatreferansesystemer og projeksjoner
  3. Romlige koblinger og operasjoner
  4. Interaktive kart med leaflet
← Tilbake til R Academy