Интерактивные карты с leaflet
Создавайте интерактивные веб-карты с маркерами, всплывающими окнами и слоями тайлов
«Интерактивные карты с leaflet» — бесплатный урок R Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения R Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс R Academy содержит 4 уроков всего.
Введение в leaflet
Пакет leaflet оборачивает библиотеку Leaflet.js и позволяет создавать интерактивные веб-карты с масштабированием непосредственно из R. Карты представляют собой HTML-виджеты, отображаемые в окне Viewer RStudio, R Markdown и приложениях Shiny без знания 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: базовые слои карты
addTiles() добавляет стандартный слой тайлов OpenStreetMap. Используйте addProviderTiles(providers$, чтобы переключиться на спутниковые снимки, CartoDB, Esri, Stamen или другого поставщика тайлов. Имена слоёв находятся во встроенном списке 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 с всплывающими окнами
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() создают функции палитры, сопоставляющие значения данных с цветами в формате hex. Передайте результат в 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') обновляет существующую карту leaflet в приложении Shiny, не перерисовывая её целиком с нуля. Используйте её вместе с 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()создаёт интерактивную карту с тайлами OpenStreetMapaddProviderTiles(providers$переключает карту на тайлы других провайдеров) addMarkers()/addCircleMarkers()используются для точечных данных; применяйтеpopupиlabeladdPolygons(fillColor = ~pal(col))используется для картограммcolorNumeric(),colorBin(),colorQuantile()создают функции палитрыaddLegend()работает вместе с функциями палитры;addLayersControl()переключает слоиleafletProxy()используется для эффективного обновления карт ShinyfitBounds()автоматически масштабирует карту до охвата данных
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) и разблокировать остальной курс R Academy, подпишись на CoddyKit PRO. Курс R Academy содержит 4 уроков всего.
Чему я научусь в уроке «Интерактивные карты с leaflet»?
Создавайте интерактивные веб-карты с маркерами, всплывающими окнами и слоями тайлов Ты практикуешь R Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать R Academy?
Предыдущий опыт не требуется. R Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Интерактивные карты с leaflet»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке R Academy?
Да. Каждый урок R Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Простые пространственные объекты с пакетом sf
- Системы координат и проекции
- Пространственные объединения и операции
- Интерактивные карты с leaflet