Gán một CRS khác nhau không không thay đổi dự báo của các dữ liệu không gian cơ bản - CRS là một phần nội bộ của đối tượng không gian mà nói với R như thế nào để giải thích các tọa độ không gian.
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]
....
Bây giờ chuyển đổi hình dạng thành một vùng UTM lân cận:
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]
Các tọa độ của hình học đã thay đổi - chính xác - để phù hợp với vùng UTM lân cận. Điều gì xảy ra nếu chúng ta chỉ đơn giản gán lại CRS mà không cần chuyển đổi?
# 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
Chúng ta đã được cảnh báo ... vậy tọa độ trông như thế nào?
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]
Các số (tọa độ) là các số gốc từ UTM vùng 36, nhưng hình dạng sẽ được ánh xạ tới vùng UTM sai ngay bây giờ và xuất hiện ở vị trí sai.
Biên tập
Sử dụng phương pháp chính xác được đề xuất bởi 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 giống như đối tượng utm36 ban đầu, nhưng proj4 chuỗi bây giờ là utm37. (Thật thú vị, lần này không có cảnh báo nào.) Lưu ý: kết quả là CHÍNH XÁC giống như đã gán CRS với mã EPSG. Để kiểm tra:
identical(tz.37.b, tz.37.c)
TRUE
Chúng ta hãy kiểm tra hình dạng thực tế trông như thế nào, bằng cách sử dụng lớp UTM37 thực tế của các khu vực 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)
Họ không xếp hàng, vì vậy phương pháp này không hiệu quả! Còn đối tượng biến hình thì sao?
plot(tz.37, add = T, border = 'darkgreen', lwd = 2)
Đối tượng biến đổi xuất hiện ở đúng nơi (nền màu xanh đậm).
NB Nếu bạn đang chuyển đổi giữa các vùng UTM nhưng cùng một mốc (WGS84 ở đây), sự khác biệt sẽ rất lớn, như trong ví dụ của tôi - nhưng nếu bạn chuyển đổi giữa các mốc khác nhau, sự khác biệt có thể tinh tế hơn nhiều. Ví dụ, bên dưới là hai hình dạng từ Zanzibar, cả UTM 37, nhưng một hình là WGS84 và hình kia là ARC1960: