Các lựa chọn thay thế của spTransform?


8

Hãy nói rằng chúng ta có một shapefile với một hình chiếu nhất định.

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

Chúng tôi cũng có các sân bay của Tây Ban Nha như các điểm trong một dự báo khác.

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

Nếu chúng ta đặt mục tiêu đặt các điểm vào shapefile của Tây Ban Nha, chúng ta phải sắp xếp các tọa độ sao cho chúng giống nhau. Thông thường, nó được thực hiện như thế này:

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

Nhưng nó có giống với điều đó không?

proj4string(a)<-proj4string(s)

Nếu có, thì tại sao không phải là cách làm tiêu chuẩn vì nó đơn giản hơn và phải dùng đến spTransform?

Câu trả lời:


6

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)

nhập mô tả hình ảnh ở đây

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)

nhập mô tả hình ảnh ở đây

Đố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:

nhập mô tả hình ảnh ở đây


Hãy thử thay vì proj4 chuỗi (tz.37.b) <- CRS ("+ init = epsg: 32737") để làm như tôi đã làm trong bài pro4 chuỗi (tz.37.b) <- proj4opes (một shapefile với proj u là sau) và xem nếu nó hoạt động vì tôi đã làm nó như tôi đã đề cập trong mô tả và nó xuất hiện ở vị trí chính xác.
gsa

Vì vậy, nếu một shp không có CRS thì bước đầu tiên trước khi chúng ta áp dụng spTransform là gì? Cung cấp cho nó bất kỳ crs nào chúng ta muốn và sau đó áp dụng spTransform và tất cả đều tốt?
gsa

Bạn chắc chắn nên tìm ra CRS chính xác và áp dụng nó trước, hoặc spTransform sẽ không có cơ sở để chiếu lại đối tượng!
Simbamangu

4

Không: hai hình thức này không giống nhau, và đây là do thiết kế. Lý do là trong một số trường hợp, bạn muốn gán CRS cho một đối tượng không có CRS hoặc thay đổi CRS mà không thay đổi tọa độ và trong các trường hợp khác bạn muốn chuyển đổi hoặc chuyển đổi tọa độ từ một CRS sang CRS khác. Cái đầu tiên (gán, thay thế) có được bởi

proj4string(a)<-proj4string(s)

và thứ hai (chuyển đổi, chuyển đổi) bởi

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

Vì bạn không phải là người đầu tiên nghĩ rằng lệnh đầu tiên thực sự làm những gì lệnh thứ hai làm, spđưa ra cảnh báo sau khi bạn thử biểu mẫu đầu tiên nhưng ađã có CRS khác:

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

(không còn hoàn toàn chính xác, vì spTransformlà một hàm trong spđó gọi các phương thức trong rgdal).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.