Recorte de una trama en R

33

Estoy construyendo un mapa para el noreste de EE. UU. El fondo del mapa debe ser un mapa de altitud o un mapa de temperatura media anual. Tengo dos rásteres de Worldclim.org que me dan estas variables, pero necesito recortarlas en la medida de los estados en los que estoy interesado. Cualquier sugerencia sobre cómo hacer esto. Esto es lo que tengo hasta ahora:

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

Los objetos de elevación y meantemp son los que deben recortarse en la extensión del área del objeto nestates. Cualquier entrada ayudaría

Yo del toro
fuente
2
¿Hay alguna posibilidad de que otros puedan hacer esto reproducible, tal vez creando rásteres a partir de datos aleatorios con la misma extensión y resolución?
Spacedman

Respuestas:

38

Me gustaría usar el mapspaquete y encontrar un archivo de forma de estado. Luego cargue eso en R usando rgdal, y luego haga un trabajo de superposición de polígonos.

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)

¿Como es que? El archivo de forma de gadm es bastante detallado, es posible que desee encontrar uno más generalizado.

Hombre espacial
fuente
Saludos Robert, buena edición. Creo que me había olvidado de la máscara.
Spacedman
32

Aquí hay un acercamiento usando extract()del rasterpaquete. Probé con la altitud y de la temperatura media de datos de la WorldClim sitio web (I limitar este ejemplo a la altitud, la temperatura funciona de forma similar), y un archivo de forma apropiada de las que contienen las fronteras estatales de Estados Unidos se encuentra aquí . Simplemente descargue los datos .zip y descomprímalos en su directorio de trabajo.

Necesita cargar rgdaly rasterbibliotecas para continuar.

library(rgdal)
library(raster)

Importemos el archivo de forma estadounidense ahora usando readOGR(). Después de configurar el CRS del shapefile, creo un subconjunto que contiene los estados deseados. ¡Presta atención al uso de mayúsculas y minúsculas!

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

A continuación, importe los datos ráster con raster()y recórtelos con la extensión del subconjunto de estados generados previamente.

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

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

Como paso final, debe identificar los píxeles de su ráster de elevación que se encuentran dentro de los bordes de los polígonos de estado dados. Use la función 'máscara' para eso.

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

Aquí hay una gráfica muy simple de los resultados:

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

DEM de los estados del noreste de EE. UU.

Saludos,
Florian

fdetsch
fuente
¿De dónde sacaste el archivo de forma del estado?
I Del Toro
@IDelToro, lo obtuve de Geocommons .
fdetsch
¿Por qué tarda tanto (>> 15 min, tal vez horas) cuando se trabaja con una capa ráster de ~ 11mb y un archivo de forma de un solo polígono? ¿Existe un método más eficiente?
ecologista1234
@ ecologist1234, ¿puedes dar un ejemplo?
fdetsch