แผนที่เชิงโต้ตอบด้วย 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'
)
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() จะสร้างฟังก์ชันจานสีที่จับคู่ค่าข้อมูลกับสีเลขฐานสิบหก ส่งผลลัพธ์ไปยัง 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และ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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ฟีเจอร์เชิงเรขาคณิตอย่างง่ายด้วยแพ็กเกจ sf
- ระบบพิกัดอ้างอิงและการฉายแผนที่
- การเชื่อมตารางและการดำเนินการเชิงพื้นที่
- แผนที่เชิงโต้ตอบด้วย leaflet