Coördinatenreferentiesystemen en projecties
Transformeer CRS'en correct met st_crs() en st_transform().
Coördinatenreferentiesystemen en projecties is een gratis R Academy-les op CoddyKit. Dit is les 2 van 4. Je kunt 3 lessen uit dit leerpad gratis volledig lezen — daarna ontgrendelt CoddyKit PRO alle lessen, plus praktische oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject R Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus R Academy bevat in totaal 4 lessen.
Waarom CRS belangrijk is
Een coördinatenreferentiesysteem (CRS) vertelt R wat de getallen in je geometriekolom betekenen — graden lengtegraad/breedtegraad, meters in een geprojecteerd raster of iets anders. Als je gegevens met verschillende CRS combineert zonder ze opnieuw te projecteren, kunnen ruimtelijke koppelingen ongemerkt mislukken en kunnen afstandsberekeningen onjuist zijn.
library(sf)
# Two sf objects in the same CRS: operations work
nc <- read_sf(system.file('shape/nc.shp', package = 'sf'))
# sf will error or warn when CRS do not match during operations
# This is the CRS metadata attached to the object
crs <- st_crs(nc)
cat('EPSG:', crs$epsg, '\n')
cat('Input is geographic (lon/lat)?', st_is_longlat(nc), '\n')
cat('Units:', crs$units_gdal, '\n')st_crs: CRS-informatie lezen
st_crs(sf_obj) geeft een crs-object terug met een EPSG-code, WKT-tekenreeks, Proj4-tekenreeks en informatie over de eenheden. Je kunt ook rechtstreeks een geheel EPSG-getal doorgeven om de CRS-definitie op te halen.
library(sf)
nc <- read_sf(system.file('shape/nc.shp', package = 'sf'))
# Inspect the CRS object
crs <- st_crs(nc)
cat('Class:', class(crs), '\n')
cat('EPSG:', crs$epsg, '\n')
cat('Proj4:', substr(crs$proj4string, 1, 60), '...\n')
# Lookup a CRS by EPSG code
wgs84 <- st_crs(4326)
web_mercator <- st_crs(3857)
cat('\nWGS84 name:', wgs84$Name, '\n')
cat('Web Mercator name:', web_mercator$Name, '\n')EPSG:4326 — WGS84
EPSG:4326 is het World Geodetic System 1984 — de standaard voor GPS-coördinaten. Coördinaten worden uitgedrukt in decimale graden: de lengtegraad (X) loopt van −180 tot 180 en de breedtegraad (Y) van −90 tot 90. Dit is een geografische CRS, geen geprojecteerde CRS.
library(sf)
# Create points in WGS84 (GPS coordinates)
cities <- data.frame(
city = c('London', 'Tokyo', 'Sydney', 'New York'),
lon = c(-0.118, 139.692, 151.209, -74.006),
lat = c(51.509, 35.689, -33.869, 40.713)
)
cities_sf <- st_as_sf(cities,
coords = c('lon', 'lat'),
crs = 4326
)
cat('CRS:', st_crs(cities_sf)$Name, '\n')
cat('Units:', st_crs(cities_sf)$units_gdal, '\n')
# Naive distance in degrees (not meaningful for real distances)
d <- st_distance(cities_sf[1, ], cities_sf[2, ])
cat('London-Tokyo distance (degrees):', round(as.numeric(d), 2), '\n')EPSG:3857 — Web Mercator
EPSG:3857 is de projectie Web Mercator die wordt gebruikt door Google Maps, OpenStreetMap en Leaflet. Coördinaten worden uitgedrukt in meters, met het nulpunt op de nulmeridiaan en de evenaar. De projectie vervormt gebieden bij de polen, maar is geschikt voor webvisualisatie.
library(sf)
cities <- data.frame(
city = c('London', 'Tokyo'),
lon = c(-0.118, 139.692),
lat = c(51.509, 35.689)
)
cities_sf <- st_as_sf(cities, coords = c('lon', 'lat'), crs = 4326)
# Transform to Web Mercator
cities_merc <- st_transform(cities_sf, 3857)
cat('WGS84 coords (degrees):\n')
print(st_coordinates(cities_sf))
cat('\nWeb Mercator coords (metres):\n')
print(st_coordinates(cities_merc))
# Distance is now in metres
d <- st_distance(cities_merc[1, ], cities_merc[2, ])
cat('\nLondon-Tokyo distance (km):', round(as.numeric(d) / 1000, 0), '\n')st_set_crs: een CRS toewijzen
st_set_crs(sf_obj, crs) wijst een CRS toe zonder coördinaten te transformeren. Gebruik dit alleen wanneer de CRS-metagegevens ontbreken of onjuist zijn. Als je coördinaten naar een nieuwe CRS wilt herprojecteren, gebruik je in plaats daarvan st_transform().
library(sf)
# Create geometry with NO CRS
pts <- st_sfc(
st_point(c(-74.006, 40.713)),
st_point(c(-87.629, 41.878))
)
cat('CRS before:', is.na(st_crs(pts)), '(NA = no CRS)\n')
# Assign WGS84 (no coordinate transformation)
pts_wgs84 <- st_set_crs(pts, 4326)
cat('CRS after assignment:', st_crs(pts_wgs84)$epsg, '\n')
# Compare with st_transform (DOES transform coordinates)
pts_sf <- st_sf(id = 1:2, geometry = pts_wgs84)
pts_merc <- st_transform(pts_sf, 3857)
cat('Original lon:', st_coordinates(pts_sf)[1, 'X'], '\n')
cat('Mercator X: ', st_coordinates(pts_merc)[1, 'X'], '\n')st_transform: herprojecteren
st_transform(sf_obj, crs) herprojecteert alle geometrieën van hun huidige CRS naar de doel-CRS en past daarbij de volledige geodetische transformatie toe. Het argument crs accepteert een EPSG-geheel getal, een Proj4-tekenreeks of een WKT-tekenreeks.
library(sf)
nc <- read_sf(system.file('shape/nc.shp', package = 'sf'))
cat('Original CRS:', st_crs(nc)$epsg, '\n')
# Re-project to WGS84
nc_wgs84 <- st_transform(nc, 4326)
cat('Transformed CRS:', st_crs(nc_wgs84)$epsg, '\n')
# Re-project to a local projected CRS (NC State Plane)
nc_stateplane <- st_transform(nc, 32119) # NAD83 / North Carolina
cat('State Plane CRS:', st_crs(nc_stateplane)$Name, '\n')
# Area calculation is more accurate in a projected CRS
area_deg <- st_area(nc[1, ])
area_m2 <- st_area(nc_stateplane[1, ])
cat('Area (degrees^2):', format(area_deg, big.mark = ','), '\n')
cat('Area (m^2): ', format(area_m2, big.mark = ','), '\n')De juiste projectie kiezen
Verschillende projecties optimaliseren verschillende eigenschappen: oppervlakgetrouw (bijvoorbeeld Mollweide), hoekgetrouw (Mercator) of afstandgetrouw. Gebruik voor lokale analyses een geprojecteerde CRS in meters; voor globale overzichten werkt WGS84 goed; gebruik voor webkaarten Web Mercator.
library(sf)
# Common EPSG codes cheat sheet
epsg_table <- data.frame(
EPSG = c(4326, 3857, 4269, 32637, 27700),
Name = c(
'WGS84 (GPS, global)',
'Web Mercator (web maps)',
'NAD83 (North America geographic)',
'UTM zone 37N (Middle East)',
'British National Grid (UK)'
),
Units = c('degrees', 'metres', 'degrees', 'metres', 'metres')
)
print(epsg_table, row.names = FALSE)
# Look up any EPSG online: https://epsg.io/<code>
cat('\nTip: use st_crs(epsg_code)$Name to verify a code\n')Proj4-tekenreeksen
Voordat EPSG-codes de standaard werden, werden CRS'en gedefinieerd met Proj4-tekenreeksen — compacte parameterreeksen die aan de PROJ-bibliotheek werden doorgegeven. Je kunt ze nog steeds gebruiken met st_transform(), maar EPSG-codes hebben de voorkeur vanwege de duidelijkheid en toekomstige compatibiliteit.
library(sf)
nc <- read_sf(system.file('shape/nc.shp', package = 'sf'))
# WGS84 as Proj4 string
wgs84_proj4 <- '+proj=longlat +datum=WGS84 +no_defs'
nc_wgs84 <- st_transform(nc, crs = wgs84_proj4)
cat('Using Proj4 string:\n', wgs84_proj4, '\n')
cat('Result CRS EPSG:', st_crs(nc_wgs84)$epsg, '\n')
# Compare: equivalent to st_transform(nc, 4326)
cat('Same as EPSG 4326?',
identical(st_crs(nc_wgs84), st_crs(st_transform(nc, 4326))), '\n')Gelijkheid van CRS controleren
Controleer vóór elke ruimtelijke koppeling of overlaybewerking met st_crs(a) == st_crs(b) of beide objecten dezelfde CRS gebruiken. Als ze verschillen, transformeer je een van beide zodat deze overeenkomt met de andere voordat je verdergaat.
library(sf)
# Two objects in different CRS
nc_nad27 <- read_sf(system.file('shape/nc.shp', package = 'sf'))
nc_wgs84 <- st_transform(nc_nad27, 4326)
cat('Same CRS?', st_crs(nc_nad27) == st_crs(nc_wgs84), '\n')
# Always check before join/overlay
align_crs <- function(a, b) {
if (st_crs(a) != st_crs(b)) {
message('CRS mismatch! Transforming b to match a.')
b <- st_transform(b, st_crs(a))
}
list(a = a, b = b)
}
aligned <- align_crs(nc_nad27, nc_wgs84)
cat('After alignment - same CRS?',
st_crs(aligned$a) == st_crs(aligned$b), '\n')Afstanden berekenen met CRS
Afstanden die op een geografische CRS (graden) worden berekend, zijn betekenisloos. Herprojecteer eerst naar een geprojecteerde CRS die afstanden of oppervlakken correct weergeeft, of gebruik de ingebouwde geodetische afstandsberekening van sf, die WGS84 correct verwerkt via de PROJ-bibliotheek.
library(sf)
# City points in WGS84
cities <- data.frame(
city = c('Paris', 'Berlin', 'Madrid', 'Rome'),
lon = c(2.350, 13.404, -3.702, 12.496),
lat = c(48.865, 52.520, 40.417, 41.902)
)
cities_sf <- st_as_sf(cities, coords = c('lon', 'lat'), crs = 4326)
# sf computes geodesic distances on WGS84 automatically
dist_matrix <- st_distance(cities_sf)
rownames(dist_matrix) <- cities$city
colnames(dist_matrix) <- cities$city
# Convert to km
dist_km <- round(as.numeric(dist_matrix) / 1000)
mat_km <- matrix(dist_km, 4, 4, dimnames = list(cities$city, cities$city))
print(mat_km)Een volledige CRS-werkstroom
Dit is een volledige werkstroom: laad onbewerkte GPS-gegevens, wijs WGS84 toe, herprojecteer naar een lokale metrische CRS voor nauwkeurige berekeningen van oppervlakken en afstanden, voer de analyse uit en herprojecteer terug naar WGS84 voor uitvoer naar een webkaart.
library(sf)
# Load and assign CRS
nc <- read_sf(system.file('shape/nc.shp', package = 'sf'))
nc_wgs84 <- st_transform(nc, 4326)
# Re-project to NC State Plane (metres) for accurate areas
nc_proj <- st_transform(nc, 32119)
# Compute area per county in km2
nc_proj$area_km2 <- as.numeric(st_area(nc_proj)) / 1e6
# Top 5 largest counties
top5 <- nc_proj[order(-nc_proj$area_km2), c('NAME', 'area_km2')]
cat('5 Largest NC Counties (km2):\n')
print(head(as.data.frame(top5)[, c('NAME', 'area_km2')], 5))
# Back to WGS84 for output
nc_output <- st_transform(nc_proj, 4326)
cat('\nOutput CRS:', st_crs(nc_output)$epsg, '\n')Korte controle
Je moet nauwkeurige oppervlakken (in vierkante meters) berekenen voor polygonfeatures die momenteel in WGS84 (EPSG:4326) staan. Wat moet je doen?
Samenvatting: CRS en projecties
Belangrijkste punten:
st_crs(sf_obj)leest CRS-metagegevens; EPSG-codes hebben de voorkeur om een CRS op te geven- EPSG:4326 = WGS84 (graden, voor GPS); EPSG:3857 = Web Mercator (meters, voor webkaarten)
st_set_crs()wijst een CRS toe zonder te transformeren;st_transform()herprojecteert coördinaten- Controleer vóór ruimtelijke bewerkingen altijd de gelijkheid van CRS'en met
st_crs(a) == st_crs(b) - Herprojecteer voor nauwkeurige afstanden en oppervlakken eerst naar een geprojecteerde metrische CRS
- Proj4-tekenreeksen werken nog steeds, maar EPSG-codes zijn duidelijker en beter leesbaar
library(sf)
nc <- read_sf(system.file('shape/nc.shp', package = 'sf'))
# CRS pipeline
cat('Original:', st_crs(nc)$epsg, '\n')
nc_wgs84 <- st_transform(nc, 4326)
nc_proj <- st_transform(nc_wgs84, 32119)
cat('WGS84:', st_crs(nc_wgs84)$epsg, '\n')
cat('Projected:', st_crs(nc_proj)$epsg, '\n')Leer R met een AI-tutor — gratis
Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.
- Cursussen
- 43
- Lessen
- 159
Veelgestelde vragen
Is de les “Coördinatenreferentiesystemen en projecties” gratis?
Ja — je kunt hier op het web alle 3 lessen van het leerpad R Academy, waaronder “Coördinatenreferentiesystemen en projecties”, gratis volledig lezen. Daarna ontgrendelt CoddyKit PRO alle lessen, plus interactieve oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. De cursus R Academy bevat in totaal 4 lessen.
Wat leer ik in “Coördinatenreferentiesystemen en projecties”?
Transformeer CRS'en correct met st_crs() en st_transform(). Je oefent met R Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.
Heb ik ervaring nodig om met R Academy te beginnen?
Ervaring vooraf is niet nodig. R Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 2 van 4.
Hoe lang duurt de les “Coördinatenreferentiesystemen en projecties”?
De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.
Kan ik code schrijven en uitvoeren in deze les over R Academy?
Ja. Elke les over R Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.
Alle lessen in deze cursus
- Simple Features met het pakket sf
- Coördinatenreferentiesystemen en projecties
- Ruimtelijke joins en bewerkingen
- Interactieve kaarten met leaflet