Frage Zuschneiden für SpatialPolygonsDataFrame


ich habe zwei SpatialPolygonsDataFrame Dateien: 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 

Ich möchte die Datei dat1 mit dem Umfang von dat2 zuschneiden. Ich weiß nicht, wie ich es machen soll. Ich handle nur mit Rasterdateien, die zuvor die Funktion "Zuschneiden" verwendet haben.

Wenn ich diese Funktion für meine aktuellen Daten verwende, tritt der folgende Fehler auf:

> 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
2017-12-21 00:43


Ursprung


Antworten:


Rationalisierte Methode hinzugefügt 2014-10-9:

raster::crop() kann zum Zuschneiden verwendet werden Spatial* (ebenso gut wie Raster*) Objekte.

Zum Beispiel, wie Sie es verwenden könnten, um einen zuzuschneiden SpatialPolygons* Objekt:

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

Original (und immer noch funktional) antwort:

Das RGEOS Funktion gIntersection() macht das ziemlich einfach.

Verwenden Sie das nette Beispiel von mnel als Sprungpunkt:

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


51
2017-12-21 07:31



Hier ist ein Beispiel, wie man das macht rgeos am Beispiel der Weltkarte

Das kommt von Roger Bivand an R-Sig-Geo Mailingliste. Roger ist einer der Autoren des sp Paket.

Verwenden Sie die Weltkarte als Beispiel

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
2017-12-21 01:27



Sie können keine Crop-on-SP-Polygonobjekte verwenden. Sie müssen ein Polygon erstellen, das die bbox-Koordinaten von dat2 darstellt, und dann gIntersects in der rgeos-Bibliothek verwenden.

Edit: Dieser Kommentar bezieht sich auf die 2012 verfügbare Version und dies ist nicht mehr der Fall.


1
2017-12-21 01:25



sehen? zuschneiden

corp (x, y, Dateiname = "", snap = 'nahe', Datentyp = NULL, ...)

x Raster * Objekt

y Extent-Objekt oder ein beliebiges Objekt, aus dem ein Extent-Objekt bestehen kann     extrahiert (siehe Details

Sie müssen das erste SpatialPolygon mithilfe von rasterisieren rasterize Funktion aus dem Raster-Paket

Ich erstelle einige Daten, um zu zeigen, wie man Rasterize verwendet:

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

wenn ich versuche:

 crop(p1,p2)
 unable to find an inherited method for function ‘crop’ for signature ‘"SpatialPointsDataFrame"’

Jetzt mit 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
2017-12-21 01:13