السمات البسيطة باستخدام حزمة sf
اقرأ الأشكال الهندسية المكانية واكتبها وعالجها باستخدام معيار sf
السمات البسيطة باستخدام حزمة sf درس مجاني في R Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في R Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة R Academy 4 دروس في المجموع.
ما هي حزمة sf؟
حزمة sf (Simple Features) هي الأداة الأساسية في R لبيانات المتجهات الجغرافية المكانية. وتخزّن الأشكال الهندسية (النقاط والخطوط والمضلعات) في عمود قائمة خاص ضمن إطار بيانات عادي، مما يجعلها متوافقة بالكامل مع dplyr وggplot2.
library(sf)
# sf data frames look like regular data frames
# but have a special 'geometry' column
cat('sf version:', packageVersion('sf'), '\n')
# Supported geometry types
cat('Geometry types: POINT, LINESTRING, POLYGON,\n')
cat(' MULTIPOINT, MULTILINESTRING, MULTIPOLYGON,\n')
cat(' GEOMETRYCOLLECTION\n')read_sf: تحميل ملفات Shapefile
تقرأ read_sf("file.shp") أي تنسيق تدعمه OGR، مثل Shapefile وGeoJSON وGeoPackage وKML وغيرها، وتحمله في كائن sf. كما تقرأ تلقائيًا نظام الإسناد المكاني (CRS) وجدول السمات إلى جانب الأشكال الهندسية.
library(sf)
# Read a GeoJSON file from a URL
url <- 'https://raw.githubusercontent.com/datasets/geo-countries/master/data/countries.geojson'
# For demonstration, use the system example data
nc <- read_sf(system.file('shape/nc.shp', package = 'sf'))
cat('Class:', class(nc), '\n')
cat('Dimensions:', nrow(nc), 'rows x', ncol(nc), 'cols\n')
cat('CRS:', st_crs(nc)$epsg, '\n')
cat('Geometry type:', unique(st_geometry_type(nc)), '\n')
cat('Column names:', paste(names(nc)[1:5], collapse = ', '), '...\n')st_geometry_type وبنية البيانات
تعيد st_geometry_type() نوع الشكل الهندسي لكل معلم. ويكون العمود geometry عمودًا من نوع list column يحتوي على كائنات sfc. ويمكن فحصه وتحديد أجزاء منه ومعالجته مثل أي عمود آخر.
library(sf)
nc <- read_sf(system.file('shape/nc.shp', package = 'sf'))
# Geometry type for each feature
types <- st_geometry_type(nc)
cat('Unique types:', unique(as.character(types)), '\n')
# The geometry column
geom_col <- st_geometry(nc)
cat('Geometry class:', class(geom_col), '\n')
cat('First geometry:\n')
print(geom_col[[1]]) # MULTIPOLYGON coordinates
# Access as a normal column
nc$area_est <- st_area(nc) # adds an area column
cat('\nArea column class:', class(nc$area_est), '\n')st_coordinates: استخراج إحداثيات XY
تستخرج st_coordinates() مصفوفات الإحداثيات الخام من أي شكل هندسي. وبالنسبة إلى النقاط، تعيد مصفوفة من عمودين (X وY). أما بالنسبة إلى المضلعات، فتعيد جميع رؤوس الحلقات، إلى جانب أعمدة رقم الجزء ورقم المضلع.
library(sf)
# Create simple point features
pts <- st_sfc(
st_point(c(-80.0, 35.0)),
st_point(c(-79.5, 35.5)),
st_point(c(-79.0, 34.8))
)
pts_sf <- st_sf(id = 1:3, geometry = pts)
# Extract coordinates
coords <- st_coordinates(pts_sf)
cat('Coordinates:\n')
print(coords)
# For polygons: includes part (L1) and polygon (L2) columns
nc <- read_sf(system.file('shape/nc.shp', package = 'sf'))
ring_coords <- st_coordinates(nc[1, ])
cat('Polygon ring vertices:', nrow(ring_coords), '\n')
cat('Column names:', colnames(ring_coords), '\n')إنشاء sf من Data Frame
تحوّل st_as_sf(df, coords = c('lon', 'lat'), crs = 4326) إطار بيانات عاديًا يحتوي على أعمدة إحداثيات إلى كائن نقاط sf. وتحدد الوسيطة coords أسماء عمودي x (خط الطول) وy (خط العرض).
library(sf)
# Typical scenario: CSV with lon/lat columns
cities <- data.frame(
name = c('New York', 'Los Angeles', 'Chicago', 'Houston'),
lon = c(-74.006, -118.244, -87.629, -95.369),
lat = c(40.713, 34.052, 41.878, 29.760),
pop = c(8336817, 3979576, 2693976, 2304580)
)
# Convert to sf
cities_sf <- st_as_sf(
cities,
coords = c('lon', 'lat'),
crs = 4326
)
print(cities_sf)
cat('\nCRS:', st_crs(cities_sf)$epsg, '(WGS84)\n')st_point وst_linestring وst_polygon
يمكنكم إنشاء الأشكال الهندسية برمجيًا باستخدام دوال المُنشئات. إذ تنشئ st_point(c(x,y)) نقطة، وتنشئ st_linestring(matrix) خطًا من أزواج الإحداثيات، بينما تنشئ st_polygon(list(matrix)) مضلعًا من إحداثيات الحلقات.
library(sf)
# POINT
p <- st_point(c(-74.006, 40.713))
cat('Point:', class(p), '\n')
# LINESTRING: a route with 4 waypoints
route_coords <- matrix(
c(-74.0, 40.7,
-75.0, 41.0,
-76.0, 41.5,
-77.0, 42.0),
ncol = 2, byrow = TRUE
)
line <- st_linestring(route_coords)
cat('Linestring length:', st_length(line), '\n') # in degrees (no CRS yet)
# POLYGON: a simple bounding box
bbox_ring <- matrix(
c(0,0, 1,0, 1,1, 0,1, 0,0),
ncol = 2, byrow = TRUE
)
poly <- st_polygon(list(bbox_ring))
cat('Polygon area:', st_area(poly), '\n')رسم كائنات sf
تنشئ طريقة plot() الخاصة بكائنات sf خريطة سريعة لكل عمود من أعمدة السمات. مرّروا plot(st_geometry(sf_obj)) لرسم الشكل الهندسي فقط من دون لوحات السمات.
library(sf)
nc <- read_sf(system.file('shape/nc.shp', package = 'sf'))
# Plot all attributes (creates a panel per column)
# plot(nc) # too many panels
# Plot a single attribute
plot(nc['BIR74'],
main = 'North Carolina: Births 1974',
border = 'white',
lwd = 0.5)
# Plot geometry only
plot(st_geometry(nc),
col = 'lightblue',
border = 'gray40',
main = 'NC Counties')تحديد أجزاء من كائنات sf
تتصرف كائنات sf مثل إطارات البيانات؛ إذ يمكنكم تصفية الصفوف باستخدام [ أو subset() أو dplyr::filter(). ويُضمَّن عمود الشكل الهندسي تلقائيًا في جميع عمليات تحديد الصفوف.
library(sf)
library(dplyr)
nc <- read_sf(system.file('shape/nc.shp', package = 'sf'))
# Base R subsetting
western_nc <- nc[nc$CNTY_ID < 1830, ]
cat('Western counties:', nrow(western_nc), '\n')
# dplyr filter works identically
high_birth <- nc |>
filter(BIR74 > 3000) |>
select(NAME, BIR74, geometry)
cat('High-birth counties:', nrow(high_birth), '\n')
cat('Names:', paste(high_birth$NAME[1:3], collapse = ', '), '...\n')تكامل sf مع ggplot2
يدعم ggplot2 كائنات sf دعمًا أصليًا عبر geom_sf(). وتتولى الدالة تلقائيًا معالجة نظام الإحداثيات ورسم نوع الشكل الهندسي الصحيح — سواء كان نقاطًا أو خطوطًا أو مضلعات — من دون أي إعداد إضافي.
library(sf)
library(ggplot2)
nc <- read_sf(system.file('shape/nc.shp', package = 'sf'))
# Choropleth map with ggplot2
ggplot(nc) +
geom_sf(aes(fill = BIR74), color = 'white', lwd = 0.2) +
scale_fill_viridis_c(
option = 'plasma',
name = 'Births (1974)'
) +
labs(
title = 'North Carolina Birth Counts, 1974',
subtitle = 'County-level data'
) +
theme_minimal()كتابة sf إلى القرص
تحفظ write_sf(sf_obj, 'output.gpkg') (أو st_write()) الأشكال الهندسية والسمات على القرص. ويُفضَّل GeoPackage (.gpkg) على Shapefile لأنه يدعم أسماء الأعمدة الطويلة وUTF-8، ويخزن كل شيء في ملف واحد.
library(sf)
nc <- read_sf(system.file('shape/nc.shp', package = 'sf'))
# Write to GeoPackage
out_path <- tempfile(fileext = '.gpkg')
write_sf(nc, out_path)
cat('Written to:', out_path, '\n')
cat('File size:', file.info(out_path)$size / 1024, 'KB\n')
# Round-trip: read back
nc_rt <- read_sf(out_path)
cat('Round-trip features:', nrow(nc_rt), '\n')
cat('Round-trip CRS match:', identical(st_crs(nc), st_crs(nc_rt)), '\n')تلخيص sf وفحصه
استخدموا print() وst_bbox() وst_crs() وsummary() لفحص كائن sf سريعًا. وتعُد st_bbox() صندوق الإحاطة على هيئة متجه مسمّى (xmin, ymin, xmax, ymax) بوحدات نظام الإسناد المكاني للكائن.
library(sf)
nc <- read_sf(system.file('shape/nc.shp', package = 'sf'))
# Bounding box
bbox <- st_bbox(nc)
cat('Bounding box:\n')
cat(' xmin:', bbox['xmin'], ' xmax:', bbox['xmax'], '\n')
cat(' ymin:', bbox['ymin'], ' ymax:', bbox['ymax'], '\n')
# CRS
crs_info <- st_crs(nc)
cat('\nEPSG:', crs_info$epsg, '\n')
cat('Proj4:', crs_info$proj4string, '\n')
# Attribute summary
cat('\nBIR74 range:',
range(nc$BIR74)[1], 'to',
range(nc$BIR74)[2], '\n')تحقق سريع
لديكم إطار بيانات يحتوي على العمودين longitude وlatitude وفق WGS84. ما استدعاء الدالة الذي يحوّله إلى كائن نقاط sf؟
مراجعة: حزمة sf
أهم النقاط:
- تحمّل
read_sf()ملفات Shapefile وGeoJSON وGeoPackage وغيرها من التنسيقات - تعيد
st_geometry_type()النوع POINT أو LINESTRING أو POLYGON وغيرها لكل معلم - تستخرج
st_coordinates()مصفوفات إحداثيات XY الخام - تنشئ
st_as_sf(df, coords = c('x','y'), crs = 4326)كائن sf من إطار بيانات - منشئات برمجية:
st_point()وst_linestring()وst_polygon() - استخدموا
plot(sf_obj)أوgeom_sf()في ggplot2 للتصور - تحفظ
write_sf()البيانات في GeoPackage وShapefile وGeoJSON وغيرها
library(sf)
# Quick sf workflow
nc <- read_sf(system.file('shape/nc.shp', package = 'sf'))
cat('Features:', nrow(nc), '\n')
cat('CRS EPSG:', st_crs(nc)$epsg, '\n')
cat('Geom type:', unique(as.character(st_geometry_type(nc))), '\n')
cat('Bbox xmin:', st_bbox(nc)['xmin'], '\n')تعلم R مع معلم ذكاء اصطناعي — مجانًا
اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.
- الدورات
- 43
- الدروس
- 159
الأسئلة الشائعة
هل درس «السمات البسيطة باستخدام حزمة sf» مجاني؟
نعم — نص درس «السمات البسيطة باستخدام حزمة sf» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة R Academy، انتقل إلى CoddyKit PRO. تتضمن دورة R Academy 4 دروس في المجموع.
ماذا ستتعلم في «السمات البسيطة باستخدام حزمة sf»؟
اقرأ الأشكال الهندسية المكانية واكتبها وعالجها باستخدام معيار sf تتمرن على R Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ R Academy؟
لا تُشترط خبرة سابقة. R Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «السمات البسيطة باستخدام حزمة sf»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس R Academy هذا؟
نعم. كل درس في R Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- السمات البسيطة باستخدام حزمة sf
- أنظمة الإسناد والإسقاطات الإحداثية
- الضمليات والعمليات المكانية
- الخرائط التفاعلية باستخدام leaflet