Cắt một raster trong R


33

Tôi đang xây dựng bản đồ cho vùng đông bắc Hoa Kỳ Nền bản đồ cần phải là bản đồ độ cao hoặc bản đồ nhiệt độ trung bình hàng năm. Tôi có hai raster từ Worldclim.org cung cấp cho tôi các biến này nhưng tôi cần đưa chúng vào phạm vi của các trạng thái mà tôi quan tâm. Mọi đề xuất về cách thực hiện điều này. Đây là những gì tôi có cho đến nay:

#load libraries
library (sp)
library (rgdal)
library (raster)
library (maps)
library (mapproj)


#load data
state<- data (stateMapEnv)
elevation<-raster("alt.bil")
meantemp<-raster ("bio_1.asc")

#build the raw map
nestates<- c("maine", "vermont", "massachusetts", "new hampshire" ,"connecticut",
  "rhode island","new york","pennsylvania", "new jersey",
  "maryland", "delaware", "virginia", "west virginia")

map(database="state", regions = nestates, interior=T,  lwd=2)
map.axes()

#add site localities
sites<-read.csv("sites.csv", header=T)
lat<-sites$Latitude
lon<-sites$Longitude

map(database="state", regions = nestates, interior=T, lwd=2)
points (x=lon, y=lat, pch=17, cex=1.5, col="black")
map.axes()
library(maps)                                                                  #Add axes to  main map
map.scale(x=-73,y=38, relwidth=0.15, metric=T,  ratio=F)

#create an inset map

 # Next, we create a new graphics space in the lower-right hand corner.  The numbers are proportional distances within the graphics window (xmin,xmax,ymin,ymax) on a scale of 0 to 1.
  # "plt" is the key parameter to adjust
    par(plt = c(0.1, 0.53, 0.57, 0.90), new = TRUE)

  # I think this is the key command from http://www.stat.auckland.ac.nz/~paul/RGraphics/examples-map.R
    plot.window(xlim=c(-127, -66),ylim=c(23,53))

  # fill the box with white
    polygon(c(0,360,360,0),c(0,0,90,90),col="white")

  # draw the map
    map(database="state", interior=T, add=TRUE, fill=FALSE)
    map(database="state", regions=nestates, interior=TRUE, add=TRUE, fill=TRUE, col="grey")

Các đối tượng độ cao và trung bình là những đối tượng cần được cắt theo phạm vi diện tích của đối tượng lồng. Bất kỳ đầu vào sẽ giúp


2
Bất kỳ cơ hội nào bạn có thể làm cho điều này có thể tái tạo bởi những người khác, bằng cách có thể tạo các trình quét từ dữ liệu ngẫu nhiên với cùng mức độ và độ phân giải?
Spainedman

Câu trả lời:


38

Tôi sẽ sử dụng mapsgói và tìm một shapefile trạng thái. Sau đó tải nó vào R bằng cách sử dụng rgdal, và sau đó thực hiện một số công việc lớp phủ đa giác.

library(raster)
# use state bounds from gadm website:
# us = shapefile("USA_adm1.shp")
us <- getData("GADM", country="USA", level=1)
# extract states (need to uppercase everything)
nestates <- c("Maine", "Vermont", "Massachusetts", "New Hampshire" ,"Connecticut",
         "Rhode Island","New York","Pennsylvania", "New Jersey",
         "Maryland", "Delaware", "Virginia", "West Virginia")

ne = us[match(toupper(nestates),toupper(us$NAME_1)),]


# create a random raster over the space:        
r = raster(xmn=-85,xmx=-65,ymn=36,ymx=48,nrow=100,ncol=100)
r[]=runif(100*100)

# plot it with the boundaries we want to clip against:
plot(r)
plot(ne,add=TRUE)

# now use the mask function
rr <- mask(r, ne)

# plot, and overlay:
plot(rr);plot(ne,add=TRUE)

Thế nào Shapefile gadm khá chi tiết, thay vào đó bạn có thể muốn tìm một cái tổng quát hơn.


Chúc mừng Robert, chỉnh sửa tốt đẹp. Tôi nghĩ rằng tôi đã quên về mặt nạ.
Spainedman

32

Đây là một cách tiếp cận sử dụng extract()từ rastergói. Tôi đã thử nghiệm nó với dữ liệu độ caonhiệt độ trung bình từ trang web WorldClim (tôi giới hạn ví dụ này ở độ cao, nhiệt độ hoạt động tương tự) và một hình dạng phù hợp của Hoa Kỳ có chứa biên giới tiểu bang sẽ được tìm thấy ở đây . Chỉ cần tải xuống dữ liệu .zip và giải nén nó vào thư mục làm việc của bạn.

Bạn cần tải rgdalrasterthư viện để tiến hành.

library(rgdal)
library(raster)

Hãy nhập khẩu shapefile của Mỹ bây giờ bằng cách sử dụng readOGR(). Sau khi thiết lập CRS của shapefile, tôi tạo một tập hợp con chứa các trạng thái mong muốn. Hãy chú ý đến việc sử dụng vốn và chữ cái đầu nhỏ!

state <- readOGR(dsn = path.data, layer = "usa_state_shapefile")
projection(state) <- CRS("+proj=longlat +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +no_defs")

# Subset US shapefile by desired states
nestates <- c("Maine", "Vermont", "Massachusetts", "New Hampshire" ,"Connecticut",
             "Rhode Island","New York","Pennsylvania", "New Jersey",
             "Maryland", "Delaware", "Virginia", "West Virginia")

state.sub <- state[as.character(state@data$STATE_NAME) %in% nestates, ]

Tiếp theo, nhập dữ liệu raster bằng cách sử dụng raster()và cắt nó với phạm vi của tập hợp con trạng thái được tạo trước đó.

elevation <- raster("/path/to/data/alt.bil")

# Crop elevation data by extent of state subset
elevation.sub <- crop(elevation, extent(state.sub))

Bước cuối cùng, bạn cần xác định các pixel của raster độ cao nằm trong đường viền của đa giác trạng thái đã cho. Sử dụng chức năng 'mặt nạ' cho điều đó.

elevation.sub <- mask(elevation.sub, state.sub)

Đây là một kết quả rất đơn giản về kết quả:

plot(elevation.sub)
plot(state.sub, add = TRUE)

DEM của các tiểu bang phía đông bắc Hoa Kỳ

Chúc mừng,
Florian


Trường hợp bạn đã nhận được shapefile nhà nước?
Tôi Del Toro

@IDelToro, tôi đã nhận nó từ Geocommons .
fdetsch

Tại sao việc này lại mất nhiều thời gian như vậy (>> 15 phút, có thể hàng giờ) khi làm việc với rasterlayer ~ 11mb và tệp hình đa giác đơn? Có một phương pháp hiệu quả hơn?
nhà sinh thái học

@ ecologist1234, bạn có thể cung cấp một ví dụ?
fdetsch
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.