Ritagliare un raster in R


33

Sto costruendo una mappa per gli Stati Uniti nord-orientali. Lo sfondo della mappa deve essere una mappa di altitudine o una temperatura media annuale. Ho due raster di Worldclim.org che mi danno queste variabili ma devo tagliarle nella misura degli stati a cui sono interessato. Qualche suggerimento su come farlo. Questo è quello che ho finora:

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

Gli oggetti elevazione e meantemp sono quelli che devono essere tagliati all'estensione dell'area dell'oggetto nestates. Qualsiasi input sarebbe d'aiuto


2
Qualche possibilità che tu possa renderlo riproducibile da altri, forse creando raster da dati casuali con la stessa estensione e risoluzione?
Spacedman,

Risposte:


38

Vorrei rilasciare usando il mapspacchetto e trovare un file di stato. Quindi caricalo in R usando rgdal, quindi esegui un lavoro di sovrapposizione di poligoni.

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)

Com'è quello? Il gadget shapefile è abbastanza dettagliato, potresti invece preferirne uno più generalizzato.


Saluti Robert, bella modifica. Penso di essermi dimenticato della maschera.
Spacedman,

32

Ecco un approccio che utilizza extract()dal rasterpacchetto. L'ho testato con i dati di altitudine e temperatura media dal sito Web WorldClim (limito questo esempio a altitudine, la temperatura funziona in modo simile) e qui è possibile trovare un file di forma appropriato degli Stati Uniti contenente i confini di stato . Scarica i dati .zip e decomprimili nella directory di lavoro.

È necessario caricare rgdale le rasterlibrerie per procedere.

library(rgdal)
library(raster)

Importiamo ora il file di forma USA usando readOGR(). Dopo aver impostato il CRS dello shapefile, creo un sottoinsieme contenente gli stati desiderati. Presta attenzione all'uso di lettere maiuscole e iniziali!

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

Quindi, importare i dati raster usando raster()e ritagliarli con l'estensione del sottoinsieme di stati precedentemente generato.

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

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

Come passaggio finale, devi identificare i pixel del tuo raster di elevazione che si trovano all'interno dei bordi dei poligoni di stato indicati. Usa la funzione 'maschera' per questo.

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

Ecco una trama molto semplice dei risultati:

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

DEM degli stati nord-orientali degli Stati Uniti

Saluti,
Florian


Dove hai preso lo shapefile dello stato?
I Del Toro,

@IDelToro, l'ho preso da Geocommons .
fdetsch,

Perché questo impiega così tanto tempo (>> 15 min, forse ore) quando si lavora con un rasterlayer ~ 11mb e un file di forma a singolo poligono? Esiste un metodo più efficiente?
ecologo1234

@ ecologist1234, puoi fornire un esempio?
fdetsch,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.