0Pricing
R Academy · Pelajaran

Sistem Referensi Koordinat dan Proyeksi

Lakukan transformasi antar-CRS dengan st_crs() dan st_transform() secara tepat.

Sistem Referensi Koordinat dan Proyeksi adalah pelajaran R Academy gratis di CoddyKit. Ini adalah pelajaran 2 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar R Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus R Academy mencakup 4 pelajaran total.

Mengapa CRS Penting

Coordinate Reference System (CRS) memberi tahu R arti angka dalam kolom geometri Anda — derajat lintang/bujur, meter dalam kisi terproyeksi, atau hal lainnya. Mencampur data dalam CRS yang berbeda tanpa memproyeksikannya ulang dapat menyebabkan penggabungan spasial gagal secara diam-diam dan perhitungan jarak menjadi keliru.

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: Membaca Info CRS

st_crs(sf_obj) mengembalikan objek crs dengan kode EPSG, string WKT, string Proj4, dan informasi satuan. Anda juga dapat langsung memberikan kode EPSG bilangan bulat untuk mengambil definisi 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 adalah World Geodetic System 1984 — standar untuk koordinat GPS. Koordinat dinyatakan dalam derajat desimal: bujur (X) berkisar dari −180 hingga 180, sedangkan lintang (Y) berkisar dari −90 hingga 90. Ini adalah CRS geografis, bukan CRS terproyeksi.

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 adalah proyeksi Web Mercator yang digunakan oleh Google Maps, OpenStreetMap, dan Leaflet. Koordinat dinyatakan dalam meter dan berpusat pada meridian utama / ekuator. Proyeksi ini mendistorsi luas di dekat kutub, tetapi baik untuk visualisasi web.

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: Menetapkan CRS

st_set_crs(sf_obj, crs) menetapkan CRS tanpa mentransformasi koordinat. Gunakan ini hanya ketika metadata CRS tidak ada atau keliru. Jika Anda ingin memproyeksikan ulang koordinat ke CRS baru, gunakan 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: Memproyeksikan Ulang

st_transform(sf_obj, crs) memproyeksikan ulang semua geometri dari CRS saat ini ke CRS target dengan menerapkan transformasi geodetik lengkap. Argumen crs menerima bilangan bulat EPSG, string Proj4, atau string 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')

Memilih Proyeksi yang Tepat

Proyeksi yang berbeda mengoptimalkan sifat yang berbeda: luas setara (misalnya Mollweide), konformal (Mercator), atau jarak setara. Untuk analisis lokal, gunakan CRS terproyeksi dalam satuan meter; untuk gambaran global, WGS84 dapat digunakan; untuk peta web, gunakan 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')

String Proj4

Sebelum kode EPSG menjadi standar, CRS ditentukan oleh string Proj4 — string parameter ringkas yang diberikan ke pustaka PROJ. Anda masih dapat menggunakannya dengan st_transform(), tetapi kode EPSG lebih disarankan karena lebih jelas dan kompatibel dengan perkembangan mendatang.

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

Memeriksa Kesamaan CRS

Sebelum melakukan operasi penggabungan atau pelapisan spasial, pastikan kedua objek memiliki CRS yang sama menggunakan st_crs(a) == st_crs(b). Jika berbeda, transformasikan salah satunya agar sesuai dengan yang lain sebelum melanjutkan.

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

Menghitung Jarak dengan CRS

Jarak yang dihitung pada CRS geografis (derajat) tidak bermakna. Proyeksikan ulang data ke CRS terproyeksi dengan jarak setara atau luas setara terlebih dahulu, atau gunakan perhitungan jarak geodesik bawaan sf yang menangani WGS84 dengan benar melalui pustaka 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)

Alur Kerja CRS Lengkap

Berikut alur kerja lengkapnya: muat data GPS mentah, tetapkan WGS84, proyeksikan ulang ke CRS metrik lokal untuk perhitungan luas/jarak yang akurat, lakukan analisis, lalu proyeksikan ulang ke WGS84 untuk keluaran pemetaan web.

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

Pemeriksaan Cepat

Anda perlu menghitung luas yang akurat (dalam meter persegi) untuk fitur poligon yang saat ini menggunakan WGS84 (EPSG:4326). Apa yang harus Anda lakukan?

Rangkuman: CRS dan Proyeksi

Hal-hal penting:

  • st_crs(sf_obj) membaca metadata CRS; kode EPSG adalah cara yang disarankan untuk menentukan CRS
  • EPSG:4326 = WGS84 (derajat, untuk GPS); EPSG:3857 = Web Mercator (meter, untuk peta web)
  • st_set_crs() menetapkan CRS tanpa mentransformasi; st_transform() memproyeksikan ulang koordinat
  • Selalu periksa kesamaan CRS dengan st_crs(a) == st_crs(b) sebelum operasi spasial
  • Untuk jarak dan luas yang akurat, proyeksikan ulang terlebih dahulu ke CRS terproyeksi metrik
  • String Proj4 masih berfungsi, tetapi kode EPSG lebih rapi dan mudah dibaca
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')

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Sistem Referensi Koordinat dan Proyeksi” gratis?

Ya — teks lengkap “Sistem Referensi Koordinat dan Proyeksi” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus R Academy, upgrade ke CoddyKit PRO. Kursus R Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Sistem Referensi Koordinat dan Proyeksi”?

Lakukan transformasi antar-CRS dengan st_crs() dan st_transform() secara tepat. Kamu berlatih R Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai R Academy?

Tidak diperlukan pengalaman sebelumnya. R Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 2 dari 4.

Berapa lama pelajaran “Sistem Referensi Koordinat dan Proyeksi” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran R Academy ini?

Ya. Setiap pelajaran R Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Fitur Sederhana dengan Paket sf
  2. Sistem Referensi Koordinat dan Proyeksi
  3. Penggabungan dan Operasi Spasial
  4. Peta Interaktif dengan leaflet
← Kembali ke R Academy