Menetapkan CRS yang berbeda tidak mengubah proyeksi data spasial yang mendasarinya - CRS adalah bagian internal dari objek spasial yang memberitahu R cara menafsirkan koordinat spasial.
library(rgdal)
# Load Tanzania in UTM 36
tz.36 <- readOGR(dsn = ".", layer = "tz_36")
summary(tz.36) # Show the bounding coordinates:
Coordinates:
min max
x 94000.58 1315978
y 8699697.87 9889701
Is projected: TRUE
proj4string :
[+proj=utm +zone=36 +south +datum=WGS84 +units=m +no_defs +ellps=WGS84 +towgs84=0,0,0]
....
Sekarang ubah bentuk menjadi zona UTM yang berdekatan:
tz.37 <- spTransform(tz.36, CRS("+init=epsg:32737"))
summary(tz.37)
Coordinates:
min max
x -576091.7 657248.1
y 8700995.0 9888925.5
Is projected: TRUE
proj4string :
[+init=epsg:32737 +proj=utm +zone=37 +south +datum=WGS84 +units=m +no_defs +ellps=WGS84 +towgs84=0,0,0]
Koordinat geometri telah berubah - dengan benar - agar sesuai dengan zona UTM yang berdekatan. Bagaimana jika kita dengan mudah menugaskan CRS tanpa transformasi?
# Make a copy of the original object.
tz.37.b <- tz.36
# Assign the CRS
proj4string(tz.37.b) <- CRS("+init=epsg:32737")
Warning message:
In `proj4string<-`(`*tmp*`, value = <S4 object of class "CRS">) :
A new CRS was assigned to an object with an existing CRS:
+proj=utm +zone=36 +south +datum=WGS84 +units=m +no_defs +ellps=WGS84 +towgs84=0,0,0
without reprojecting.
For reprojection, use function spTransform in package rgdal
Kami sudah diperingatkan ... jadi seperti apa koordinatnya?
summary(tz.37.b)
Coordinates:
min max
x 94000.58 1315978
y 8699697.87 9889701
Is projected: TRUE
proj4string :
[+init=epsg:32737 +proj=utm +zone=37 +south +datum=WGS84 +units=m +no_defs +ellps=WGS84 +towgs84=0,0,0]
Angka-angka (koordinat) adalah yang asli dari zona UTM 36, tetapi bentuknya akan dipetakan ke zona UTM yang salah sekarang, dan muncul di tempat yang salah.
Edit
Menggunakan metode persis yang disarankan oleh OP:
# Make a new copy of the original UTM 36 shape:
tz.37.c <- tz.36
# Now assign the proj4string using OP's suggestion:
proj4string(tz.37.c) <- proj4string(tz.37)
summary(tz.37.c)
Coordinates:
min max
x 94000.58 1315978
y 8699697.87 9889701
Is projected: TRUE
proj4string :
[+init=epsg:32737 +proj=utm +zone=37 +south +datum=WGS84 +units=m +no_defs +ellps=WGS84 +towgs84=0,0,0]
Extent sama dengan objek utm36 asli, tetapi proj4string sekarang utm37. (Menariknya, tidak ada peringatan saat ini.) Catatan: hasilnya PERSIS sama dengan menugaskan CRS dengan kode EPSG. Untuk mengetes:
identical(tz.37.b, tz.37.c)
TRUE
Mari kita periksa seperti apa bentuk sebenarnya, menggunakan lapisan UTM37 sebenarnya dari wilayah Tanzania.
# Load the region shape
tz.regions.37 <- readOGR(".", "tz_regions_37_simp")
# Plot it
plot(tz.regions.37, lwd = 1, border = 'red')
# Now add the CRS-assigned (not transformed!) object:
plot(tz.37.c, add = T, border = 'blue', lwd = 2)
Mereka tidak berbaris, jadi metode ini tidak berfungsi! Bagaimana dengan objek yang ditransformasikan ?
plot(tz.37, add = T, border = 'darkgreen', lwd = 2)
Objek yang ditransformasikan muncul di tempat yang tepat (latar belakang hijau gelap).
NB Jika Anda mentransformasikan antara zona UTM tetapi datum yang sama (WGS84 di sini) perbedaannya akan sangat dramatis, seperti dalam contoh saya - tetapi jika Anda mentransformasikan antara datum yang berbeda, perbedaannya mungkin jauh lebih halus. Sebagai contoh, di bawah ini adalah dua bentuk dari Zanzibar, keduanya UTM 37, tetapi satu adalah WGS84 dan yang lainnya adalah ARC1960:
Tidak: kedua bentuk ini tidak sama, dan ini adalah desain. Alasannya adalah bahwa dalam beberapa kasus Anda ingin menetapkan CRS ke objek yang tidak memiliki CRS atau mengubah CRS tanpa mengubah koordinat, dan dalam kasus lain Anda ingin mengubah atau mengubah koordinat dari satu CRS ke CRS lain. Yang pertama (menugaskan, mengganti) diperoleh oleh
dan yang kedua (convert, transform) oleh
Karena Anda bukan orang pertama yang berpikir bahwa perintah pertama benar-benar melakukan apa yang dilakukan perintah kedua,
sp
berikan peringatan berikut ketika Anda mencoba formulir pertama tetapia
sudah memiliki CRS yang berbeda:(yang tidak lagi sepenuhnya benar, karena
spTransform
merupakan fungsisp
yang memanggil metode dalamrgdal
).sumber