leaflet으로 인터랙티브 지도 만들기
마커, 팝업 및 타일 레이어가 있는 인터랙티브 웹 지도를 렌더링합니다.
leaflet으로 인터랙티브 지도 만들기은(는) CoddyKit의 무료 R Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 R Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. R Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
leaflet 소개
leaflet 패키지는 Leaflet.js 라이브러리를 감싸 R에서 직접 대화형 확대·축소 웹 지도를 만들 수 있게 합니다. 지도는 RStudio의 Viewer, R Markdown 및 Shiny 앱에서 JavaScript 지식 없이 렌더링되는 HTML 위젯입니다.
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: 기본 지도 레이어
addTiles()는 기본 OpenStreetMap 타일 레이어를 추가합니다. 위성 영상, CartoDB, Esri, Stamen 또는 다른 타일 제공자로 전환하려면 addProviderTiles(providers$을 사용하십시오. 레이어 이름은 내장 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와 팝업
addMarkers(lng, lat, popup)은 지도에 핀 마커를 추가합니다. popup 인수에는 HTML 문자열을 사용할 수 있으므로 굵은 텍스트, 링크 또는 이미지를 포함할 수 있습니다. label 인수는 클릭하지 않고 마우스를 올렸을 때 텍스트를 표시합니다.
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()는 화면 픽셀 기준으로 크기가 고정된 원을 그립니다. 확대 수준에 따라 크기가 조정되는 addCircles()와는 다릅니다. 비례 기호를 표현하는 데 적합하므로 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: 단계구분도
addPolygons()는 sf 객체의 다각형 도형을 직접 그립니다. colorNumeric() 또는 colorBin() 팔레트 함수를 사용하면 채우기 색상을 데이터 열에 매핑할 수 있습니다. highlight 옵션을 사용하면 마우스를 올렸을 때 효과가 추가됩니다.
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와 fitBounds
setView(lng, lat, zoom)은 고정된 위치와 확대 수준을 기준으로 지도의 중심을 설정합니다. fitBounds(lng1, lat1, lng2, lat2)는 지리적 경계 상자에 맞도록 확대 수준을 자동으로 조정하므로, 데이터의 범위를 미리 알 수 없을 때 유용합니다.
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: 레이어 전환
addLayersControl()은 기본 지도와 오버레이 레이어를 켜고 끌 수 있는 라디오 버튼/체크박스 컨트롤을 추가합니다. 서로 배타적인 타일 레이어에는 baseGroups를 사용하고, 독립적으로 전환할 수 있는 데이터 레이어에는 overlayGroups를 사용합니다.
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와 addLegend
addPopups()는 계속 표시되는 팝업 상자를 추가합니다. addLegend()는 색상 팔레트와 연결된 지도 범례를 만듭니다. 두 기능 모두 HTML 콘텐츠를 지원하며 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
)색상 팔레트: colorNumeric과 colorBin
colorNumeric(), colorBin(), colorQuantile(), colorFactor() 함수는 데이터 값을 16진수 색상에 매핑하는 팔레트 함수를 만듭니다. 결과를 fillColor에 전달하고, 같은 팔레트를 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: Shiny에서 지도 업데이트하기
leafletProxy('mapId')는 지도를 처음부터 전체적으로 다시 렌더링하지 않고 Shiny 앱의 기존 leaflet 지도를 업데이트합니다. clearMarkers(), clearShapes() 또는 addMarkers()와 함께 사용하면 사용자 입력에 효율적으로 응답할 수 있습니다.
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완전한 대화형 단계구분도
다음은 주요 기능을 모두 결합한 실제 배포 수준의 단계구분도입니다. 공급자 타일, 다각형 채우기, 마우스 오버 강조, 동적 팝업, 색상 범례, 레이어 컨트롤을 25줄 이내에 모두 담았습니다.
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')빠른 확인
Shiny 앱에서 사용자가 드롭다운을 변경할 때 기존 leaflet 지도의 마커 위치를 업데이트하려고 합니다. 지도 전체를 다시 렌더링하지 않으려면 어떤 함수를 사용해야 할까요?
복습: leaflet 패키지
핵심 내용:
leaflet() |> addTiles()는 OpenStreetMap 타일을 사용하는 대화형 지도를 만듭니다addProviderTiles(providers$는 다른 타일 공급자로 전환합니다) - 점 데이터에는
addMarkers()/addCircleMarkers()를 사용하고,popup과label을 활용합니다 - 단계구분도에는
addPolygons(fillColor = ~pal(col))을 사용합니다 colorNumeric(),colorBin(),colorQuantile()은 팔레트 함수를 만듭니다addLegend()는 팔레트 함수와 함께 사용하고,addLayersControl()은 레이어를 전환합니다- Shiny 지도를 효율적으로 업데이트하려면
leafletProxy()를 사용합니다 fitBounds()는 데이터 범위에 맞춰 확대 수준을 자동으로 조정합니다
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')자주 묻는 질문
“leaflet으로 인터랙티브 지도 만들기” 강의는 무료인가요?
네 — “leaflet으로 인터랙티브 지도 만들기” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 R Academy 강의 전체를 잠금 해제할 수 있습니다. R Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“leaflet으로 인터랙티브 지도 만들기”에서 뭘 배우나요?
마커, 팝업 및 타일 레이어가 있는 인터랙티브 웹 지도를 렌더링합니다. 브라우저에서 직접 실행하는 실습 코드로 R Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
R Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 R Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.
“leaflet으로 인터랙티브 지도 만들기” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 R Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 R Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- sf 패키지로 단순 피처 다루기
- 좌표 참조 체계와 투영
- 공간 조인과 연산
- leaflet으로 인터랙티브 지도 만들기