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

ฟีเจอร์เชิงเรขาคณิตอย่างง่ายด้วยแพ็กเกจ sf

อ่าน เขียน และจัดการเรขาคณิตเชิงพื้นที่โดยใช้มาตรฐาน sf

ฟีเจอร์เชิงเรขาคณิตอย่างง่ายด้วยแพ็กเกจ sf เป็นบทเรียน R Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 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 เป็น คอลัมน์แบบรายการ ของออบเจ็กต์ 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() ดึงเมทริกซ์พิกัดดิบจากเรขาคณิตทุกชนิด สำหรับจุด ฟังก์ชันนี้จะส่งคืนเมทริกซ์ 2 คอลัมน์ (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 จากกรอบข้อมูล

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) ในหน่วยของ CRS ของออบเจ็กต์

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')

คำถามที่พบบ่อย

บทเรียน “ฟีเจอร์เชิงเรขาคณิตอย่างง่ายด้วยแพ็กเกจ sf” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “ฟีเจอร์เชิงเรขาคณิตอย่างง่ายด้วยแพ็กเกจ sf” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส R Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส R Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “ฟีเจอร์เชิงเรขาคณิตอย่างง่ายด้วยแพ็กเกจ sf”

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

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

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

บทเรียน “ฟีเจอร์เชิงเรขาคณิตอย่างง่ายด้วยแพ็กเกจ sf” ใช้เวลานานแค่ไหน

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

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

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

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

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