0Pricing
R Academy · Lezione

Mappe interattive con leaflet

Visualizzi mappe web interattive con marker, popup e layer di tile

Mappe interattive con leaflet è una lezione R Academy gratuita su CoddyKit. Questa è la lezione 4 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento R Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso R Academy include 4 lezioni in totale.

Introduzione a leaflet

Il pacchetto leaflet integra la libreria Leaflet.js per creare mappe web interattive e zoomabili direttamente da R. Le mappe sono widget HTML che vengono visualizzati nel Viewer di RStudio, in R Markdown e nelle app Shiny senza richiedere conoscenze di 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: layer di base della mappa

addTiles() aggiunge il layer predefinito di OpenStreetMap. Usare addProviderTiles(providers$) per passare a immagini satellitari, CartoDB, Esri, Stamen o qualsiasi altro provider di tile. I nomi dei layer si trovano nell'elenco integrato 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 con popup

addMarkers(lng, lat, popup) aggiunge marcatori a forma di puntina alla mappa. L'argomento popup accetta stringhe HTML, quindi è possibile includere testo in grassetto, link o immagini. L'argomento label mostra il testo al passaggio del mouse, senza fare clic.

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() visualizza cerchi le cui dimensioni sono fisse in pixel dello schermo (a differenza di addCircles(), che varia in base allo zoom). Sono ideali per rappresentare simboli proporzionali: associare radius a una variabile dei dati.

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: mappe coropletiche

addPolygons() visualizza direttamente le geometrie poligonali di un oggetto sf. Il colore di riempimento può essere associato a una colonna dei dati utilizzando le funzioni di palette colorNumeric() o colorBin(). L'opzione highlight aggiunge effetti al passaggio del mouse.

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

setView(lng, lat, zoom) centra la mappa su una posizione e un livello di zoom fissi. fitBounds(lng1, lat1, lng2, lat2) regola automaticamente lo zoom per includere un riquadro di delimitazione geografico, utile quando non si conosce in anticipo l'estensione dei dati.

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: attivazione e disattivazione dei layer

addLayersControl() aggiunge un controllo con pulsanti di opzione e caselle di controllo per attivare e disattivare le mappe di base e i layer sovrapposti. Utilizzare baseGroups per i layer di tile mutuamente esclusivi e overlayGroups per i layer di dati attivabili e disattivabili indipendentemente.

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

addPopups() aggiunge riquadri popup persistenti, sempre visibili. addLegend() crea una legenda della mappa collegata a una palette di colori. Entrambi supportano contenuti HTML e sono completamente personalizzabili con classi 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
  )

Palette di colori: colorNumeric e colorBin

Le funzioni colorNumeric(), colorBin(), colorQuantile() e colorFactor() creano funzioni di palette che associano i valori dei dati a colori esadecimali. Passare il risultato a fillColor e la stessa palette a 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: aggiornamento delle mappe in Shiny

leafletProxy('mapId') aggiorna una mappa leaflet esistente in un'app Shiny senza eseguire nuovamente il rendering dell'intera mappa da zero. Utilizzarlo con clearMarkers(), clearShapes() o addMarkers() per reagire in modo efficiente all'input dell'utente.

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

Mappa coropletica interattiva completa

Ecco una mappa coropletica di qualità pronta per la produzione, che combina tutte le funzionalità principali: tile del provider, riempimento dei poligoni, evidenziazioni al passaggio del mouse, popup dinamici, legenda dei colori e controlli dei layer, il tutto in meno di 25 righe.

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

Verifica rapida

In un'app Shiny, si desidera aggiornare le posizioni dei marker su una mappa leaflet esistente quando l'utente modifica un menu a discesa, senza eseguire nuovamente il rendering dell'intera mappa. Quale funzione è necessario utilizzare?

Riepilogo: pacchetto leaflet

Concetti chiave:

  • leaflet() |> addTiles() crea una mappa interattiva con tile OpenStreetMap
  • addProviderTiles(providers$) consente di passare ad altri provider di tile
  • addMarkers() / addCircleMarkers() per i dati puntuali; utilizzare popup e label
  • addPolygons(fillColor = ~pal(col)) per le mappe coropletiche
  • colorNumeric(), colorBin(), colorQuantile() creano funzioni di palette
  • addLegend() si abbina alle funzioni di palette; addLayersControl() attiva e disattiva i layer
  • leafletProxy() per aggiornare in modo efficiente le mappe Shiny
  • fitBounds() regola automaticamente lo zoom sull'estensione dei dati
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')

Domande Frequenti

La lezione «Mappe interattive con leaflet» è gratuita?

Sì — il testo completo di «Mappe interattive con leaflet» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso R Academy, passa a CoddyKit PRO. Il corso R Academy include 4 lezioni in totale.

Cosa imparerò in «Mappe interattive con leaflet»?

Visualizzi mappe web interattive con marker, popup e layer di tile Eserciti R Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare R Academy?

Non è richiesta alcuna esperienza precedente. R Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 4 di 4.

Quanto tempo richiede la lezione «Mappe interattive con leaflet»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione R Academy?

Sì. Ogni lezione R Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Simple Features con il pacchetto sf
  2. Sistemi di riferimento e proiezioni delle coordinate
  3. Join e operazioni spaziali
  4. Mappe interattive con leaflet
← Torna a R Academy