Chiếu các đối tượng sp trong R


35

Tôi có một số shapefile trong các CRS khác nhau (chủ yếu là WGS84 lat / lon) mà tôi muốn chuyển đổi thành một phép chiếu chung (có thể là Albers Equal Area Conic, nhưng tôi có thể yêu cầu trợ giúp về việc chọn câu hỏi khác một khi vấn đề của tôi trở nên tốt hơn -được xác định).

Tôi đã dành vài tháng để làm công cụ thống kê không gian trong R, nhưng đó là 5 năm trước. Đối với cuộc sống của tôi, tôi không thể nhớ làm thế nào để biến đổi một spvật thể (ví dụ SpatialPolygonsDataFrame) từ hình chiếu này sang hình chiếu khác.

Mã ví dụ:

P4S.latlon <- CRS("+proj=longlat +datum=WGS84")
hrr.shp <- readShapePoly("HRR_Bdry"), verbose=TRUE, proj4string=P4S.latlon) 
# Shapefile available at 
#   http://www.dartmouthatlas.org/downloads/geography/hrr_bdry.zip 
#   but you must rename all the filenames to have the same 
#   capitalization for it to work in R

Bây giờ tôi có một SpatialPolygonsDataFramethông tin chiếu thích hợp, nhưng tôi muốn chuyển đổi nó thành hình chiếu mong muốn. Tôi nhớ rằng có một chức năng được đặt tên hơi vô tình cho việc này, nhưng tôi không thể nhớ nó là gì.

Lưu ý rằng tôi không muốn chỉ thay đổi CRS mà thay đổi tọa độ cho phù hợp ("reproject", "Transform", v.v.).

Chỉnh sửa

Không bao gồm AK / HI được đặt một cách khó chịu ở Mexico cho shapefile này:

library(taRifx.geo)
hrr.shp <- 
  subset(hrr.shp, !(grepl( "AK-" , hrr.shp@data$HRRCITY ) |
                                     grepl( "HI-" , hrr.shp@data$HRRCITY )) )
proj4string(hrr.shp) <- P4S.latlon

Câu trả lời trước về chiếu bằng gói proj4 tại đây . Mặc dù vậy, chúng tôi chưa thử điều này với SpatialPolygonsDataFrame.
Simbamangu

Trên thực tế có vẻ như proj4 không hoạt động với các đối tượng Không gian - nhưng xem câu trả lời bên dưới.
Simbamangu

2
Luôn có Chế độ xem nhiệm vụ không gian: cran.r-project.org/web/view/Spatial.html và ghi chú của tôi về Dữ liệu không gian [phích cắm không biết xấu hổ]: maths.lancs.ac.uk/~rowlings/Teaching/UseR2012
Spainedman

Câu trả lời:


44

Bạn có thể sử dụng các spTransform()phương thức trong rgdal - sử dụng ví dụ của bạn, bạn có thể chuyển đổi đối tượng thành NAD83 cho Kansas (26978):

library(rgdal)
library(maptools)

P4S.latlon <- CRS("+proj=longlat +datum=WGS84")
hrr.shp <- readShapePoly("HRR_Bdry", verbose=TRUE, proj4string=P4S.latlon)
plot(hrr.shp)

chưa được tiêm

hrr.shp.2 <- spTransform(hrr.shp, CRS("+init=epsg:26978"))
plot(hrr.shp.2)

dự kiến

Để lưu nó trong phép chiếu mới:

writePolyShape(hrr.shp.2, "HRR_Bdry_NAD83")

EDIT : Hoặc, theo đề xuất của @ Spacesman (ghi tệp .prj với thông tin CRS):

writeOGR(hrr.shp.2, dsn = getwd(), layer = "HRR_Bdry_NAD83", driver="ESRI Shapefile")

Nếu không chắc chắn CRS sẽ chiếu từ đâu, hãy tham khảo bài viết sau:

Và nếu ai đó muốn xác định / gán CRS khi dữ liệu không có, hãy tham khảo:


10
lưu ý rằng writePolyShape KHÔNG viết tệp .prj! Bạn nên sử dụng writeOGR từ rgdal (và sử dụng readOGR để đọc shapefiles) nếu bạn muốn viết và đọc tệp .prj để đặt CRS của các đối tượng không gian của bạn trong R!
Spainedman

Tốt hơn nhiều (chỉnh sửa cho phù hợp) - cảm ơn; đã không nhận ra nó tạo tập tin .prj! Nhân tiện, chiếc áo choàng tuyệt vời trên trang của bạn.
Simbamangu

1
Thật kỳ lạ khi hình chiếu ở Mexico ảnh hưởng đến sự xuất hiện của các miếng lót Alaska và Hawaii :-).
whuber

@whuber - hmm, vâng ... có ai đó đã chỉnh sửa bài đăng của tôi không có bản đồ thực tế trong đó hiển thị những nội dung khá không phù hợp ... bản thân tôi không bao giờ nghĩ rằng họ đang ở đó.
Simbamangu

@Simbamangu Xin lỗi, quên rằng tệp .shp này không phù hợp bao gồm các phần tử khi tôi cố gắng hữu ích trong việc thêm biểu đồ!
Ari B. Friedman

7

Kể từ sự ra đời của sf-gói (có một cái nhìn tại các họa tiết SF1 , SF2 , sf3 , sf4 và hướng dẫn di chuyển ở đây ), bạn có thể sử dụng st_transform()để tái chiếu lại dữ liệu vector của bạn:

require(sf)

hrr_sf = st_read('HRR_Bdry.shp', stringsAsFactors = FALSE,
    crs = 4326) # has +proj=longlat +datum=WGS84
plot(hrr_sf)

hrr_sf2 = st_transform(hrr_sf, "+init=epsg:26978") # 1st option sp::CRS() not working/ needed
hrr_sf2 = st_transform(hrr_sf, 26978) # 2nd option - EPSG code as an integer
plot(hrr_sf2)

# don't think about doing this:
hrr_sf3 = st_read('HRR_Bdry.shp', stringsAsFactors = FALSE,
    crs = 26978)

# Output layer
st_write(hrr_sf2, dsn = getwd(), layer = "HRR_Bdry_NAD83", driver = "ESRI Shapefile")

sf sẽ thay thế sp trong tương lai và do tính đơn giản và tốc độ của nó, một số lợi thế so với sp.

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.