Uzamsal Birleştirmeler ve İşlemler
st_join(), st_intersection(), st_buffer() ve st_distance() işlevlerini uygulayın.
Uzamsal Birleştirmeler ve İşlemler, CoddyKit'te ücretsiz bir R Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, R Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. R Academy kursu toplamda 4 dersten oluşur.
st_join ile Mekânsal Birleştirmeler
st_join(x, y) bir mekânsal sol birleştirme gerçekleştirir: x içindeki her özellik için y içinde bir mekânsal koşulu (varsayılan: st_intersects) sağlayan özellikleri bulur ve bunların özniteliklerini ekler. Birden çok eşleşme, birden çok satır oluşturur.
library(sf)
nc <- st_transform(
read_sf(system.file('shape/nc.shp', package = 'sf')), 4326
)
# Create random points within NC bounding box
set.seed(42)
bbox <- st_bbox(nc)
pts <- data.frame(
lon = runif(20, bbox['xmin'], bbox['xmax']),
lat = runif(20, bbox['ymin'], bbox['ymax'])
)
pts_sf <- st_as_sf(pts, coords = c('lon', 'lat'), crs = 4326)
# Spatial join: assign county attributes to each point
pts_with_county <- st_join(pts_sf, nc['NAME'])
cat('Points with county:\n')
print(head(pts_with_county[, c('NAME', 'geometry')], 5))st_within: Noktanın Poligon İçinde Olması
st_within(x, y), x içindeki her özelliğin y içindeki bir özelliğin tamamen içinde bulunup bulunmadığını belirten mantıksal değerlerden oluşan seyrek bir matris döndürür. st_intersects'ten daha katıdır; sınıra temas etme durumu sayılmaz.
library(sf)
nc <- st_transform(
read_sf(system.file('shape/nc.shp', package = 'sf')), 4326
)
# Random points
set.seed(7)
bbox <- st_bbox(nc)
pts_sf <- st_as_sf(
data.frame(
lon = runif(30, bbox['xmin'], bbox['xmax']),
lat = runif(30, bbox['ymin'], bbox['ymax'])
),
coords = c('lon', 'lat'), crs = 4326
)
# Which points are within NC at all?
within_nc <- st_within(pts_sf, st_union(nc), sparse = FALSE)[, 1]
cat('Points within NC:', sum(within_nc), '/ 30\n')
# Keep only points inside NC
pts_inside <- pts_sf[within_nc, ]
cat('Kept:', nrow(pts_inside), 'points\n')st_intersects: Örtüşme Denetimi
st_intersects(x, y), özellikler herhangi bir geometriyi (sınırı veya iç kısmı) paylaştığında TRUE döndürür. En esnek topolojik koşuldur. İndeks vektörleri listesinin yerine mantıksal bir matris almak için sparse = FALSE iletin.
library(sf)
# Create two overlapping polygons
poly1 <- st_polygon(list(matrix(c(0,0, 2,0, 2,2, 0,2, 0,0), ncol=2, byrow=TRUE)))
poly2 <- st_polygon(list(matrix(c(1,1, 3,1, 3,3, 1,3, 1,1), ncol=2, byrow=TRUE)))
poly3 <- st_polygon(list(matrix(c(5,5, 6,5, 6,6, 5,6, 5,5), ncol=2, byrow=TRUE)))
sfc <- st_sfc(poly1, poly2, poly3, crs = 32119)
# Intersects matrix
mat <- st_intersects(sfc, sparse = FALSE)
cat('Intersects matrix:\n')
print(mat)
cat('\npoly1 intersects poly2:', mat[1, 2], '\n')
cat('poly1 intersects poly3:', mat[1, 3], '\n')st_buffer: Tamponlar Oluşturma
st_buffer(sf_obj, dist), her özelliğin çevresinde belirtilen mesafede bir tampon poligonu oluşturur. Coğrafi CRS'de mesafe derece, projeksiyonlu CRS'de metre cinsindendir; doğru sonuçlar için tampon oluşturmadan önce her zaman yeniden projekte edin.
library(sf)
# City points in WGS84
cities <- data.frame(
city = c('Raleigh', 'Charlotte', 'Greensboro'),
lon = c(-78.639, -80.843, -79.792),
lat = c(35.779, 35.227, 36.073)
)
cities_sf <- st_as_sf(cities, coords = c('lon', 'lat'), crs = 4326)
# Project to metres for accurate buffering (NC State Plane)
cities_proj <- st_transform(cities_sf, 32119)
# 25 km buffer around each city
buffers <- st_buffer(cities_proj, dist = 25000)
cat('Buffer geometry type:', unique(as.character(st_geometry_type(buffers))), '\n')
cat('Buffer area (km2):', round(as.numeric(st_area(buffers[1, ])) / 1e6, 2), '\n')
cat('Expected (pi*25^2):', round(pi * 25^2, 2), 'km2\n')st_area: Poligon Alanları
st_area(sf_obj), her poligonun alanını hesaplar. Coğrafi CRS'de steradyan cinsinden (kullanışlı değildir), metre birimli projeksiyonlu CRS'de metrekare cinsinden değer döndürür. Sonuçlar units paketindeki birimleri taşır.
library(sf)
library(units)
nc <- read_sf(system.file('shape/nc.shp', package = 'sf'))
nc_proj <- st_transform(nc, 32119) # NC State Plane, metres
# Area in m2 with units
nc_proj$area_m2 <- st_area(nc_proj)
# Convert to km2
nc_proj$area_km2 <- set_units(nc_proj$area_m2, 'km^2')
# Summary statistics
cat('Smallest county:', nc_proj$NAME[which.min(nc_proj$area_km2)],
round(min(as.numeric(nc_proj$area_km2)), 1), 'km2\n')
cat('Largest county: ', nc_proj$NAME[which.max(nc_proj$area_km2)],
round(max(as.numeric(nc_proj$area_km2)), 1), 'km2\n')st_distance: İkili Mesafeler
st_distance(x, y), x içindeki tüm özelliklerle y içindeki tüm özellikler arasındaki mesafelerin matrisini hesaplar. WGS84 üzerinde jeodezik, projeksiyonlu CRS üzerinde Öklid mesafelerini kullanır. Sonuçlar units meta verilerini taşır.
library(sf)
cities <- data.frame(
city = c('Raleigh', 'Charlotte', 'Greensboro', 'Wilmington'),
lon = c(-78.639, -80.843, -79.792, -77.909),
lat = c(35.779, 35.227, 36.073, 34.226)
)
cities_sf <- st_as_sf(cities, coords = c('lon', 'lat'), crs = 4326)
# Geodesic distance matrix (metres)
dist_m <- st_distance(cities_sf)
dist_km <- round(dist_m / 1000)
rownames(dist_km) <- cities$city
colnames(dist_km) <- cities$city
cat('Distance matrix (km):\n')
print(dist_km)
# Nearest neighbour for Raleigh
raleigh_dist <- as.numeric(dist_km['Raleigh', -1])
cat('\nNearest to Raleigh:',
cities$city[-1][which.min(raleigh_dist)],
min(raleigh_dist), 'km\n')st_union: Geometrileri Birleştirme
st_union(sf_obj), tüm özellikleri tek bir geometride birleştirerek iç sınırları kaldırır. Birden çok ilçe poligonundan tek bir dış sınır poligonu oluşturmak veya bir tampon kümesini birleştirmek için kullanışlıdır.
library(sf)
nc <- st_transform(
read_sf(system.file('shape/nc.shp', package = 'sf')), 32119
)
# Dissolve all counties into the NC state outline
nc_state <- st_union(nc)
cat('Counties before union:', nrow(nc), '\n')
cat('Features after union:', length(nc_state), '(single geometry)\n')
cat('Geometry type:', as.character(st_geometry_type(nc_state)), '\n')
# Area check: sum of counties == state area
county_area_sum <- sum(as.numeric(st_area(nc)))
state_area <- as.numeric(st_area(nc_state))
cat('Sum of county areas:', round(county_area_sum / 1e9, 2), 'km2\n')
cat('State area: ', round(state_area / 1e9, 2), 'km2\n')st_intersection: Kırpma
st_intersection(x, y), her özellik çifti arasındaki geometrik kesişimi, yani her iki geometrinin paylaştığı alanı döndürür. Bir katmanı diğerinin kapsamına göre kırpmak için kullanılır.
library(sf)
nc <- st_transform(
read_sf(system.file('shape/nc.shp', package = 'sf')), 4326
)
# Clip NC counties to a bounding rectangle (eastern NC)
clip_box <- st_as_sfc(st_bbox(c(
xmin = -78, xmax = -75,
ymin = 33.5, ymax = 36.5
), crs = 4326))
eastern_nc <- st_intersection(nc, clip_box)
cat('Original features:', nrow(nc), '\n')
cat('Clipped features: ', nrow(eastern_nc), '\n')
cat('Geometry types: ', paste(unique(as.character(st_geometry_type(eastern_nc))), collapse = ', '), '\n')dplyr ile Mekânsal Toplulaştırma
Nokta verilerini poligonlara göre toplulaştırmak için st_join() işlevini dplyr::group_by() ve summarise() ile birleştirin. Bir sf nesnesi gruplanırken geometri sütunu otomatik olarak özetlenir (varsayılan olarak birleştirilir).
library(sf)
library(dplyr)
nc <- st_transform(
read_sf(system.file('shape/nc.shp', package = 'sf')), 4326
)
# Generate random sales events in NC
set.seed(99)
bbox <- st_bbox(nc)
pts <- st_as_sf(
data.frame(
lon = runif(200, bbox['xmin'], bbox['xmax']),
lat = runif(200, bbox['ymin'], bbox['ymax']),
sales = runif(200, 100, 1000)
),
coords = c('lon', 'lat'), crs = 4326
)
# Join then aggregate
result <- st_join(pts, nc['NAME']) |>
filter(!is.na(NAME)) |>
st_drop_geometry() |>
group_by(NAME) |>
summarise(total_sales = sum(sales), n_events = n()) |>
arrange(desc(total_sales))
cat('Top 5 counties by sales:\n')
print(head(result, 5))st_nearest_feature
st_nearest_feature(x, y), x içindeki her özellik için y içindeki en yakın özelliğin indeksini döndürür. st_distance() ile birlikte kullanıldığında hem en yakın komşuyu hem de mesafesini verir; atama problemleri için kullanışlıdır.
library(sf)
# Hospitals (facilities)
hospitals <- data.frame(
name = c('Hospital A', 'Hospital B', 'Hospital C'),
lon = c(-79.5, -80.2, -78.8),
lat = c(35.8, 35.3, 36.1)
)
hosp_sf <- st_as_sf(hospitals, coords = c('lon', 'lat'), crs = 4326)
# Patient locations
patients <- data.frame(
id = 1:5,
lon = c(-79.9, -80.5, -79.0, -78.5, -80.1),
lat = c(35.7, 35.2, 35.9, 35.5, 36.0)
)
pt_sf <- st_as_sf(patients, coords = c('lon', 'lat'), crs = 4326)
# Find nearest hospital for each patient
nearest_idx <- st_nearest_feature(pt_sf, hosp_sf)
pt_sf$nearest_hospital <- hospitals$name[nearest_idx]
print(st_drop_geometry(pt_sf))Uygulamalı İş Akışı: Tamponlama ve Sayma
Yaygın bir gerçek dünya örüntüsü şöyledir: bir özellik kümesine (ör. okullar) tampon uygulayın, ardından st_join() ve dplyr::count() kullanarak her tamponun içinde kaç ilgi noktası (ör. otobüs durağı) bulunduğunu sayın.
library(sf)
library(dplyr)
# Schools as points
schools <- data.frame(
id = 1:3,
lon = c(-79.8, -80.2, -79.4),
lat = c(35.9, 35.5, 36.1)
)
schools_sf <- st_as_sf(schools, coords = c('lon', 'lat'), crs = 4326) |>
st_transform(32119) # project to metres
# Random bus stops
set.seed(5)
stops <- data.frame(
stop_id = 1:50,
lon = rnorm(50, -79.8, 0.3),
lat = rnorm(50, 35.8, 0.2)
) |>
st_as_sf(coords = c('lon', 'lat'), crs = 4326) |>
st_transform(32119)
# 2 km buffer around each school
buffers <- st_buffer(schools_sf, dist = 2000)
buffers$school_id <- schools$id
# Count bus stops within each school buffer
joined <- st_join(stops, buffers['school_id'])
counts <- count(st_drop_geometry(joined), school_id)
cat('Bus stops within 2km:\n')
print(counts)Hızlı Kontrol
B katmanındaki her poligonla örtüşen tüm poligon özelliklerini bulmak ve B'nin özniteliklerini A'ya eklemek istiyorsunuz. Hangi işlevi kullanmalısınız?
Özet: Mekânsal Birleştirmeler ve İşlemler
Temel çıkarımlar:
st_join(x, y)— bir koşul kullanan mekânsal sol birleştirme (varsayılan:st_intersects)st_within()— x tamamen y'nin içindeyken TRUE döndürür (sınır hariç)st_intersects()— x'in herhangi bir kısmı y'ye temas ettiğinde TRUE döndürür (en esnek)st_buffer(sf_obj, dist)— tamponlar oluşturur; metre hassasiyetinde tamponlar için projeksiyonlu CRS kullanınst_area()/st_distance()— alanları ve mesafeleri hesaplar (doğruluk için önce yeniden projekte edin)st_union()— tüm özellikleri birleştirir;st_intersection()— bir katmanı diğerine göre kırparst_nearest_feature(x, y)— en yakın komşuyu bulur
library(sf)
nc <- st_transform(
read_sf(system.file('shape/nc.shp', package = 'sf')), 32119
)
# Quick operations summary
cat('Largest county:', nc$NAME[which.max(st_area(nc))], '\n')
nc_outline <- st_union(nc)
cat('State area km2:', round(as.numeric(st_area(nc_outline)) / 1e6, 0), '\n')Sıkça Sorulan Sorular
“Uzamsal Birleştirmeler ve İşlemler” dersi ücretsiz mi?
Evet — “Uzamsal Birleştirmeler ve İşlemler” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve R Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. R Academy kursu toplamda 4 dersten oluşur.
“Uzamsal Birleştirmeler ve İşlemler” dersinde ne öğreneceğim?
st_join(), st_intersection(), st_buffer() ve st_distance() işlevlerini uygulayın. R Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
R Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te R Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.
“Uzamsal Birleştirmeler ve İşlemler” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu R Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her R Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- sf Paketiyle Basit Öznitelikler
- Koordinat Referans Sistemleri ve İzdüşümler
- Uzamsal Birleştirmeler ve İşlemler
- leaflet ile Etkileşimli Haritalar