Alternatif spTransformasi?

8

Katakanlah kita memiliki shapefile dengan proyeksi tertentu.

s<-readOGR(dsn=".",layer="Spain")

Kami juga memiliki bandara Spanyol sebagai titik dalam proyeksi lain.

a<-readOGR(dsn=".",layer="airports")

Jika kita bertujuan untuk menempatkan poin ke shapefile Spanyol kita harus mengatur koordinat sehingga semuanya sama. Biasanya, dilakukan seperti ini:

 a<-spTransform(a,CRS(proj4string(s))

Tetapi apakah itu sama dengan itu?

proj4string(a)<-proj4string(s)

Jika ya, lalu mengapa bukan cara standar untuk melakukannya karena lebih sederhana dan harus menggunakan spTransformasi?

ya
sumber

Jawaban:

6

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)

masukkan deskripsi gambar di sini

Mereka tidak berbaris, jadi metode ini tidak berfungsi! Bagaimana dengan objek yang ditransformasikan ?

plot(tz.37, add = T, border = 'darkgreen', lwd = 2)

masukkan deskripsi gambar di sini

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:

masukkan deskripsi gambar di sini

Simbamangu
sumber
Coba alih-alih proj4string (tz.37.b) <- CRS ("+ init = epsg: 32737") untuk melakukan seperti yang saya lakukan di postingan pro4string (tz.37.b) <- proj4string (sebuah shapefile dengan proj setelah) dan melihat apakah itu berfungsi karena saya melakukannya seperti yang saya sebutkan dalam deskripsi dan muncul di posisi yang benar.
gsa
Jadi, jika satu shp tidak memiliki CRS apa langkah pertama sebelum kita menerapkan spTransform? Berikan setiap CR yang kita inginkan dan kemudian terapkan spTransform dan semuanya baik-baik saja?
gsa
Anda harus mengetahui CRS yang benar dan menerapkannya terlebih dahulu, atau spTransform tidak akan memiliki dasar untuk memproyeksikan ulang objek!
Simbamangu
4

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

proj4string(a)<-proj4string(s)

dan yang kedua (convert, transform) oleh

a<-spTransform(a,CRS(proj4string(s))

Karena Anda bukan orang pertama yang berpikir bahwa perintah pertama benar-benar melakukan apa yang dilakukan perintah kedua, spberikan peringatan berikut ketika Anda mencoba formulir pertama tetapi asudah memiliki CRS yang berbeda:

Warning message:
In ReplProj4string(obj, CRS(value)) :
  A new CRS was assigned to an object with an existing CRS:
+init=epsg:28992 +proj=sterea [etc]
without reprojecting.
For reprojection, use function spTransform in package rgdal

(yang tidak lagi sepenuhnya benar, karena spTransformmerupakan fungsi spyang memanggil metode dalam rgdal).

Edzer Pebesma
sumber