web-dev-qa-db-fra.com

Recadrage pour SpatialPolygonsDataFrame

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"’
25
Jian Zhang

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

enter image description here

53
Josh O'Brien

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

enter image description here

5
mnel

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. 

1
Jeffrey Evans

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)
0
agstudy