Układy odniesienia współrzędnych i odwzorowania
Poprawnie przekształcaj układy CRS za pomocą st_crs() i st_transform().
Układy odniesienia współrzędnych i odwzorowania to bezpłatna lekcja R Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej R Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs R Academy zawiera 4 lekcji w sumie.
Dlaczego CRS ma znaczenie
Układ współrzędnych (CRS) informuje R, co oznaczają liczby w kolumnie geometrii — stopnie szerokości i długości geograficznej, metry w odwzorowanej siatce lub coś innego. Łączenie danych w różnych CRS bez ponownego odwzorowania może powodować ciche niepowodzenia złączeń przestrzennych i błędne obliczenia odległości.
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: odczytywanie informacji o CRS
st_crs(sf_obj) zwraca obiekt crs zawierający kod EPSG, ciąg WKT, ciąg Proj4 oraz informacje o jednostkach. Można także bezpośrednio przekazać całkowitą wartość kodu EPSG, aby pobrać definicję CRS.
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 to World Geodetic System 1984 — standard stosowany dla współrzędnych GPS. Współrzędne są podawane w stopniach dziesiętnych: długość geograficzna (X) mieści się w zakresie od −180 do 180, a szerokość geograficzna (Y) od −90 do 90. Jest to geograficzny CRS, a nie CRS odwzorowany.
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 to odwzorowanie Web Mercator używane przez Google Maps, OpenStreetMap i Leaflet. Współrzędne są podawane w metrach, względem południka zerowego i równika. Odwzorowanie zniekształca powierzchnie w pobliżu biegunów, ale dobrze sprawdza się w wizualizacji internetowej.
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: przypisywanie CRS
st_set_crs(sf_obj, crs) przypisuje CRS bez przekształcania współrzędnych. Używaj tej funkcji tylko wtedy, gdy brakuje metadanych CRS lub są one nieprawidłowe. Jeśli chcesz ponownie odwzorować współrzędne do nowego CRS, użyj zamiast niej funkcji 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: ponowne odwzorowanie
st_transform(sf_obj, crs) ponownie odwzorowuje wszystkie geometrie z bieżącego CRS do docelowego CRS, stosując pełną transformację geodezyjną. Argument crs może przyjmować całkowity kod EPSG, ciąg Proj4 lub ciąg WKT.
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')Wybór właściwego odwzorowania
Różne odwzorowania optymalizują różne właściwości: równopowierzchniowe (np. Mollweide), wiernokątne (Mercatora) lub równoodległościowe. Do analiz lokalnych używaj odwzorowanego CRS w metrach; do przeglądów globalnych sprawdzi się WGS84, a do map internetowych — 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')Ciągi Proj4
Zanim kody EPSG stały się standardem, CRS definiowano za pomocą ciągów Proj4 — krótkich ciągów parametrów przekazywanych do biblioteki PROJ. Nadal można ich używać z st_transform(), ale ze względu na przejrzystość i zgodność w przyszłości preferowane są kody EPSG.
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')Sprawdzanie zgodności CRS
Przed wykonaniem złączenia przestrzennego lub operacji nakładania sprawdź, czy oba obiekty mają ten sam CRS, używając st_crs(a) == st_crs(b). Jeśli się różnią, przed dalszą pracą przekształć jeden z nich tak, aby pasował do drugiego.
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')Obliczanie odległości z użyciem CRS
Odległości obliczane w geograficznym CRS (w stopniach) nie mają praktycznego znaczenia. Najpierw ponownie odwzoruj dane do równoodległościowego lub równopowierzchniowego CRS odwzorowanego albo użyj wbudowanego w sf obliczania odległości geodezyjnych, które prawidłowo obsługuje WGS84 za pośrednictwem biblioteki PROJ.
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)Kompletny przebieg pracy z CRS
Oto kompletny przebieg pracy: wczytaj surowe dane GPS, przypisz WGS84, ponownie odwzoruj dane do lokalnego metrycznego CRS, aby dokładnie obliczać powierzchnie i odległości, wykonaj analizę, a następnie ponownie odwzoruj dane do WGS84 na potrzeby wyników przeznaczonych do map internetowych.
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')Szybkie sprawdzenie
Musisz dokładnie obliczyć powierzchnie (w metrach kwadratowych) obiektów poligonowych znajdujących się obecnie w WGS84 (EPSG:4326). Co należy zrobić?
Podsumowanie: CRS i odwzorowania
Najważniejsze informacje:
st_crs(sf_obj)odczytuje metadane CRS; kody EPSG są preferowanym sposobem określania CRS- EPSG:4326 = WGS84 (stopnie, dla GPS); EPSG:3857 = Web Mercator (metry, dla map internetowych)
st_set_crs()przypisuje CRS bez przekształcania;st_transform()ponownie odwzorowuje współrzędne- Przed operacjami przestrzennymi zawsze sprawdzaj zgodność CRS za pomocą
st_crs(a) == st_crs(b) - Aby dokładnie obliczać odległości i powierzchnie, najpierw ponownie odwzoruj dane do metrycznego CRS odwzorowanego
- Ciągi Proj4 nadal działają, ale kody EPSG są przejrzystsze i łatwiejsze do odczytania
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')Ucz się R dzięki korepetycjom AI — za darmo
Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.
- Kursy
- 43
- Lekcje
- 159
Często zadawane pytania
Czy lekcja „Układy odniesienia współrzędnych i odwzorowania” jest bezpłatna?
Tak — pełny tekst „Układy odniesienia współrzędnych i odwzorowania” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu R Academy, przejdź na CoddyKit PRO. Kurs R Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Układy odniesienia współrzędnych i odwzorowania”?
Poprawnie przekształcaj układy CRS za pomocą st_crs() i st_transform(). Ćwiczysz R Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć R Academy?
Nie wymagamy żadnego doświadczenia. R Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.
Ile czasu zajmuje lekcja „Układy odniesienia współrzędnych i odwzorowania”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji R Academy?
Tak. Każda lekcja R Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Proste obiekty przestrzenne za pomocą pakietu sf
- Układy odniesienia współrzędnych i odwzorowania
- Złączenia i operacje przestrzenne
- Interaktywne mapy za pomocą leaflet