cortar - Recorte para SpatialPolygonsDataFrame
cortar raster en r (4)
Tengo dos archivos 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
Quiero recortar el archivo dat1 utilizando la extensión de dat2. No se como hacerlo Yo solo manejo archivos raster usando la función "recortar" antes.
Cuando uso esta función para mis datos actuales, ocurre el siguiente error:
> r1 <- crop(BiomassCarbon.shp,alberta.shp)
Error in function (classes, fdef, mtable) :
unable to find an inherited method for function ‘crop’ for signature"SpatialPolygonsDataFrame"’
Aquí hay un ejemplo de cómo hacer esto con rgeos
usando el mapa del mundo como ejemplo
Esto viene de Roger Bivand en la lista de correo R-sig-Geo . Roger es uno de los autores del paquete sp
.
Usando el mapa del mundo como ejemplo
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")
No se puede usar el recorte en objetos de polígono sp. Necesitará crear un polígono que represente las coordenadas bbox de dat2 y luego puede usar gIntersects en la biblioteca rgeos.
Edición: este comentario fue en relación con la versión disponible en 2012 y ya no es así.
ver? cosechar
corp (x, y, filename = "", snap = ''near'', datatype = NULL, ...)
x Raster * objeto
y Objeto de extensión, o cualquier objeto del que se pueda extraer un objeto de Extensión (ver Detalles
Debe rasterizar el primer SpatialPolygon, usando la función rasterize
del paquete raster
Creo algunos datos para mostrar cómo usar rasterizar:
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 lo intento
crop(p1,p2)
unable to find an inherited method for function ‘crop’ for signature ‘"SpatialPointsDataFrame"’
Ahora usando rasterizar
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)
Método simplificado añadido 2014-10-9 :
raster::crop()
se puede usar para recortar objetos Spatial*
(así como Raster*
).
Por ejemplo, aquí es cómo podría usarlo para recortar un objeto 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")
Respuesta original (y aún funcional):
La función gIntersection()
hace que esto sea bastante sencillo.
Usando el ingenioso ejemplo de mnel como punto de partida:
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")