sf パッケージによる Simple Features
sf 標準を使って、空間ジオメトリの読み込み、書き出し、操作を行います。
「sf パッケージによる Simple Features」はCoddyKit上の無料R Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これは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オブジェクトのプロット
sfオブジェクトに対するplot()メソッドは、各属性列について簡易マップを作成します。属性ごとのパネルを表示せず、ジオメトリだけをプロットするには、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はgeom_sf()を通じて、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)は、長い列名やUTF-8をサポートし、すべてを1つのファイルに保存できるため、Shapefileよりも推奨されます。
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()は、オブジェクトのCRSの単位による境界ボックスを、名前付きベクトル(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)、またはggplot2のgeom_sf()を使います 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 パッケージによる Simple Features」レッスンは無料ですか?
はい。「sf パッケージによる Simple Features」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、R Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 R Academyコースには全4レッスンが含まれています。
「sf パッケージによる Simple Features」で何を学びますか?
sf 標準を使って、空間ジオメトリの読み込み、書き出し、操作を行います。 ブラウザで直接実行するハンズオンコードでR Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
R Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのR Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「sf パッケージによる Simple Features」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このR Academyレッスンでコードを書いて実行できますか?
はい。すべてのR Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- sf パッケージによる Simple Features
- 座標参照系と投影法
- 空間結合と空間演算
- leaflet によるインタラクティブマップ