Memotong raster di R

33

Saya sedang membangun peta untuk USA bagian timur laut. Latar belakang peta harus berupa peta ketinggian atau peta suhu tahunan rata-rata. Saya memiliki dua raster dari Worldclim.org yang memberikan saya variabel-variabel ini, tetapi saya perlu mengklipnya sampai sejauh mana saya tertarik. Ada saran tentang bagaimana melakukan ini. Inilah yang saya miliki sejauh ini:

#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")

Ketinggian dan benda-benda yang dimaksudkan adalah benda-benda yang perlu dijepitkan dengan luas area objek sarang. Masukan apa pun akan membantu

I Del Toro
sumber
2
Apakah Anda dapat membuat ini dapat direproduksi oleh orang lain, dengan mungkin membuat raster dari data acak dengan tingkat dan resolusi yang sama?
Spacedman

Jawaban:

38

Saya akan turun menggunakan mapspaket dan menemukan keadaan negara. Kemudian muat ke dalam R menggunakan rgdal, dan kemudian lakukan pekerjaan overlay poligon.

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)

Bagaimana dengan itu? Shapefile gadm cukup detail, Anda mungkin ingin mencari yang lebih umum.

Spacedman
sumber
Cheers Robert, hasil edit yang bagus. Saya pikir saya sudah lupa tentang topeng.
Spacedman
32

Berikut ini adalah pendekatan menggunakan extract()dari rasterpaket. Saya mengujinya dengan data ketinggian dan suhu rata - rata dari situs web WorldClim (saya membatasi contoh ini untuk ketinggian, suhu berfungsi serupa), dan bentuk yang sesuai dari AS yang berisi perbatasan negara dapat ditemukan di sini . Cukup unduh data .zip dan dekompres ke direktori kerja Anda.

Anda perlu memuat rgdaldan rasterperpustakaan untuk melanjutkan.

library(rgdal)
library(raster)

Mari mengimpor AS shapefile sekarang menggunakan readOGR(). Setelah mengatur CRS shapefile, saya membuat subset yang berisi status yang diinginkan. Perhatikan penggunaan huruf kapital dan huruf awal kecil!

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, ]

Selanjutnya, impor data raster menggunakan raster()dan potong dengan tingkat bagian negara yang dihasilkan sebelumnya.

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

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

Sebagai langkah terakhir, Anda perlu mengidentifikasi piksel-piksel dari raster elevasi Anda yang terletak di dalam batas-batas poligon keadaan yang diberikan. Gunakan fungsi 'topeng' untuk itu.

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

Berikut adalah plot hasil yang sangat sederhana:

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

DEM negara bagian AS timur laut

Tepuk tangan,
Florian

fdetsch
sumber
Di mana Anda mendapatkan formulir negara?
I Del Toro
@ IDToro, saya mendapatkannya dari Geocommons .
fdetsch
Mengapa ini memakan waktu begitu lama (>> 15 menit, mungkin berjam-jam) ketika bekerja dengan rasterlayer ~ 11mb dan file bentuk poligon tunggal? Apakah ada metode yang lebih efisien?
ecologist1234
@ ecologist1234, dapatkah Anda memberikan contoh?
fdetsch