J'ai deux fichiers SpatialPolygonsDataFrame
: dat1, dat2
extent(dat1)
class : Extent
xmin : -180
xmax : 180
ymin : -90
ymax : 90
extent(dat2)
class : Extent
xmin : -120.0014
xmax : -109.9997
ymin : 48.99944
ymax : 60
Je veux recadrer le fichier dat1 en utilisant l'étendue de dat2. Je ne sais pas comment le faire. Je viens de gérer les fichiers raster en utilisant la fonction "Rogner" avant.
Lorsque j'utilise cette fonction pour mes données actuelles, l'erreur suivante se produit:
> r1 <- crop(BiomassCarbon.shp,alberta.shp)
Error in function (classes, fdef, mtable) :
unable to find an inherited method for function ‘crop’ for signature"SpatialPolygonsDataFrame"’
Méthode simplifiée ajoutée le 2014-10-9 :
raster::crop()
peut être utilisé pour rogner des objets Spatial*
(ainsi que Raster*
).
Par exemple, voici comment vous pouvez l’utiliser pour rogner un objet SpatialPolygons*
:
## Load raster package and an example SpatialPolygonsDataFrame
library(raster)
data("wrld_simpl", package="maptools")
## Crop to the desired extent, then plot
out <- crop(wrld_simpl, extent(130, 180, 40, 70))
plot(out, col="Khaki", bg="Azure2")
Réponse originale (et toujours fonctionnelle):
La fonction rgeos function gIntersection()
facilite la tâche.
En utilisant le bel exemple de Mnel comme point de départ:
library(maptools)
library(raster) ## To convert an "Extent" object to a "SpatialPolygons" object.
library(rgeos)
data(wrld_simpl)
## Create the clipping polygon
CP <- as(extent(130, 180, 40, 70), "SpatialPolygons")
proj4string(CP) <- CRS(proj4string(wrld_simpl))
## Clip the map
out <- gIntersection(wrld_simpl, CP, byid=TRUE)
## Plot the output
plot(out, col="Khaki", bg="Azure2")
Voici un exemple de la façon de procéder avec rgeos
en utilisant la carte du monde comme exemple.
Cela vient de Roger Bivand sur Liste de diffusion R-sig-Geo . Roger est l’un des auteurs du paquetage sp
.
Utiliser la carte du monde comme exemple
library(maptools)
data(wrld_simpl)
# interested in the arealy bounded by the following rectangle
# rect(130, 40, 180, 70)
library(rgeos)
# create a polygon that defines the boundary
bnds <- cbind(x=c(130, 130, 180, 180, 130), y=c(40, 70, 70, 40, 40))
# convert to a spatial polygons object with the same CRS
SP <- SpatialPolygons(list(Polygons(list(Polygon(bnds)), "1")),
proj4string=CRS(proj4string(wrld_simpl)))
# find the intersection with the original SPDF
gI <- gIntersects(wrld_simpl, SP, byid=TRUE)
# create the new spatial polygons object.
out <- vector(mode="list", length=length(which(gI)))
ii <- 1
for (i in seq(along=gI)) if (gI[i]) {
out[[ii]] <- gIntersection(wrld_simpl[i,], SP)
row.names(out[[ii]]) <- row.names(wrld_simpl)[i]; ii <- ii+1
}
# use rbind.SpatialPolygons method to combine into a new object.
out1 <- do.call("rbind", out)
# look here is Eastern Russia and a bit of Japan and China.
plot(out1, col = "Khaki", bg = "Azure2")
Vous ne pouvez pas utiliser le recadrage sur les objets polygones sp. Vous devrez créer un polygone représentant les coordonnées bbox de dat2, puis utiliser gIntersects dans la bibliothèque rgeos.
Edit: Ce commentaire était en relation avec la version disponible en 2012 et ce n'est plus le cas.
voir? recadrer
corp (x, y, nom_fichier = "", snap = 'près', type de données = NULL, ...)
x objet raster *
y Objet étendue, ou tout objet à partir duquel un objet étendue peut être extrait (voir Détails
Vous devez pixelliser le premier SpatialPolygon à l'aide de la fonction rasterize
du package raster.
Je crée des données pour montrer comment utiliser rasterize:
n <- 1000
x <- runif(n) * 360 - 180
y <- runif(n) * 180 - 90
xy <- cbind(x, y)
vals <- 1:n
p1 <- data.frame(xy, name=vals)
p2 <- data.frame(xy, name=vals)
coordinates(p1) <- ~x+y
coordinates(p2) <- ~x+y
si j'essaye:
crop(p1,p2)
unable to find an inherited method for function ‘crop’ for signature ‘"SpatialPointsDataFrame"’
Maintenant en utilisant rasterize
r <- rasterize(p1, r, 'name', fun=min)
crop(r,p2)
class : RasterLayer
dimensions : 18, 36, 648 (nrow, ncol, ncell)
resolution : 10, 10 (x, y)
extent : -180, 180, -90, 90 (xmin, xmax, ymin, ymax)
coord. ref. : +proj=longlat +datum=WGS84
data source : in memory
names : layer
values : 1, 997 (min, max)