0Pricing
R Academy · บทเรียน

แผนที่เชิงโต้ตอบด้วย leaflet

แสดงแผนที่เว็บเชิงโต้ตอบพร้อมเครื่องหมาย ป๊อปอัป และชั้นแผนที่

แผนที่เชิงโต้ตอบด้วย leaflet เป็นบทเรียน R Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 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() จะสร้างฟังก์ชันจานสีที่จับคู่ค่าข้อมูลกับสีเลขฐานสิบหก ส่งผลลัพธ์ไปยัง 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() สร้างแผนที่โต้ตอบพร้อมแผนที่กระเบื้องจาก OpenStreetMap
  • addProviderTiles(providers$) เปลี่ยนไปใช้ผู้ให้บริการแผนที่กระเบื้องรายอื่น
  • addMarkers() / addCircleMarkers() ใช้กับข้อมูลจุด โดยใช้ popup และ label ได้
  • addPolygons(fillColor = ~pal(col)) ใช้สร้างแผนที่โคโรเพลท
  • colorNumeric(), colorBin(), colorQuantile() สร้างฟังก์ชันจานสี
  • addLegend() ใช้คู่กับฟังก์ชันจานสี และ addLayersControl() ใช้สลับชั้นข้อมูล
  • leafletProxy() ใช้อัปเดตแผนที่ Shiny อย่างมีประสิทธิภาพ
  • 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” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส R Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส R Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “แผนที่เชิงโต้ตอบด้วย leaflet”

แสดงแผนที่เว็บเชิงโต้ตอบพร้อมเครื่องหมาย ป๊อปอัป และชั้นแผนที่ คุณปฏิบัติ R Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน R Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน R Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “แผนที่เชิงโต้ตอบด้วย leaflet” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน R Academy นี้ได้ไหม

ได้ บทเรียน R Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ฟีเจอร์เชิงเรขาคณิตอย่างง่ายด้วยแพ็กเกจ sf
  2. ระบบพิกัดอ้างอิงและการฉายแผนที่
  3. การเชื่อมตารางและการดำเนินการเชิงพื้นที่
  4. แผนที่เชิงโต้ตอบด้วย leaflet
← กลับไปที่ R Academy