0Pricing
R Academy · درس

الخرائط التفاعلية باستخدام leaflet

اعرض خرائط ويب تفاعلية تحتوي على علامات ونوافذ منبثقة وطبقات بلاطات

الخرائط التفاعلية باستخدام leaflet درس مجاني في R Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في R Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة R Academy 4 دروس في المجموع.

مقدمة إلى leaflet

تغلف حزمة leaflet مكتبة Leaflet.js لإنشاء خرائط ويب تفاعلية قابلة للتكبير مباشرةً من R. والخرائط عبارة عن عناصر HTML تفاعلية تُعرض في عارض 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() عنصر تحكم من نوع radio/checkbox لتبديل خرائط الأساس وطبقات التراكب بين التشغيل والإيقاف. استخدم baseGroups لطبقات التجانب المتنافية، وoverlayGroups لطبقات البيانات التي يمكن تبديلها independently.

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» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 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 يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. السمات البسيطة باستخدام حزمة sf
  2. أنظمة الإسناد والإسقاطات الإحداثية
  3. الضمليات والعمليات المكانية
  4. الخرائط التفاعلية باستخدام leaflet
← العودة إلى R Academy