Cortando uma varredura em R

33

Estou construindo um mapa para o nordeste dos EUA. O plano de fundo do mapa precisa ser um mapa de altitude ou um mapa de temperatura média anual. Eu tenho dois rasters do Worldclim.org que me fornecem essas variáveis, mas preciso recortá-las de acordo com os estados nos quais estou interessado. Quaisquer sugestões sobre como fazer isso. Isto é o que eu tenho até agora:

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

Os objetos de elevação e meantemp são aqueles que precisam ser cortados na extensão da área do objeto aninhado. Qualquer entrada ajudaria

I Del Toro
fonte
2
Alguma chance de você tornar isso reproduzível por outros, talvez criando criadores a partir de dados aleatórios com a mesma extensão e resolução?
Spacedman

Respostas:

38

Eu deixaria de usar o mapspacote e encontraria um shapefile de estado. Em seguida, carregue isso no R usando rgdale faça algum trabalho de sobreposição de polígono.

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 é isso? O gadp shapefile é bastante detalhado; talvez você queira encontrar um mais generalizado.

Spacedman
fonte
Saúde Robert, boa edição. Eu acho que tinha esquecido a máscara.
Spacedman 26/05
32

Aqui está uma abordagem usando a extract()partir do rasterpacote. Testei-o com dados de altitude e temperatura média no site do WorldClim (limito este exemplo à altitude, a temperatura funciona de maneira semelhante) e um arquivo de forma apropriado dos EUA que contém as fronteiras estaduais pode ser encontrado aqui . Basta baixar os dados .zip e descompactá-los no seu diretório de trabalho.

Você precisa carregar rgdale rasterbibliotecas para continuar.

library(rgdal)
library(raster)

Vamos importar o shapefile dos EUA agora usando readOGR(). Depois de definir o CRS do shapefile, crio um subconjunto que contém os estados desejados. Preste atenção ao uso de letras maiúsculas e 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, ]

Em seguida, importe os dados de varredura usando-os raster()e recorte-os com a extensão do subconjunto de estados gerado anteriormente.

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

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

Como etapa final, você precisa identificar os pixels da sua varredura de elevação que estão dentro das bordas dos polígonos de estado fornecidos. Use a função 'mascarar' para isso.

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

Aqui está um gráfico muito simples dos resultados:

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

DEM dos estados do nordeste dos EUA

Felicidades,
Florian

fdetsch
fonte
Onde você conseguiu o shapefile do estado?
I Del Toro
@IDelToro, recebi da Geocommons .
Fdetsch
Por que isso leva tanto tempo (>> 15 min, talvez horas) ao trabalhar com uma camada de varredura de ~ 11mb e um arquivo de forma de polígono único? Existe um método mais eficiente?
ecologist1234
@ ecologist1234, você pode fornecer um exemplo?
Fdetsch