Couper un raster en R


33

Je construis une carte pour le nord-est des États-Unis. L'arrière-plan de la carte doit être une carte d'altitude ou une carte de température annuelle moyenne. J'ai deux rasters de Worldclim.org qui me donnent ces variables mais je dois les découper dans la mesure des états qui m'intéressent. Toutes suggestions sur la façon de le faire. Voici ce que j'ai jusqu'à présent:

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

Les objets elevation et meanemp sont ceux qui doivent être clipsés sur l'étendue de la zone de l'objet niché. Toute entrée aiderait


2
Avez-vous une chance de rendre ceci reproductible par d'autres, en créant peut-être des rasters à partir de données aléatoires avec la même étendue et la même résolution?
Spacedman

Réponses:


38

Je laisserais tomber en utilisant le mapspaquet et trouverais un shapefile d'état. Puis chargez-le dans R avec rgdal, puis effectuez un travail de superposition de polygones.

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)

Comment ça Le fichier de formes gadm est assez détaillé, vous voudrez peut-être en trouver un plus généralisé.


A bientôt Robert, beau montage. Je pense que j'avais oublié de masque.
Spacedman

32

Voici une approche utilisant extract()le rasterpackage. Je l'ai testé avec les données d' altitude et de température moyenne du site Web WorldClim (je limite cet exemple à l'altitude, la température fonctionne de la même manière) et vous trouverez ici un fichier de formes approprié contenant les frontières des États américains . Il suffit de télécharger les données .zip et de les décompresser dans votre répertoire de travail.

Vous devez charger rgdalet les rasterbibliothèques afin de procéder.

library(rgdal)
library(raster)

Importons maintenant le fichier de formes américain utilisant readOGR(). Après avoir défini le fichier CRS du fichier de formes, je crée un sous-ensemble contenant les états souhaités. Faites attention à l'utilisation de majuscules et de petites lettres initiales!

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

Ensuite, importez les données raster à l'aide de raster()et recadrez-les avec l'étendue du sous-ensemble d'états précédemment généré.

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

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

Enfin, vous devez identifier les pixels de votre raster d'altitude situés dans les limites des polygones d'états donnés. Utilisez la fonction 'masque' pour cela.

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

Voici un graphique très simple des résultats:

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

DEM des états du nord-est des États-Unis

A bientôt,
Florian


Où avez-vous obtenu le fichier de formes d'état?
Je Del Toro

@ IDelToro, je l'ai eu de Geocommons .
fdetsch

Pourquoi est-ce que cela prend si longtemps (>> 15 min, voire quelques heures) lorsque vous travaillez avec un calque raster de ~ 11 Mo et un fichier de forme mono-polygone? Existe-t-il une méthode plus efficace?
ecologist1234

@ ecologist1234, pouvez-vous donner un exemple?
fdetsch
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.