2012-12-21 7 views
24

Ich habe zwei SpatialPolygonsDataFrame Dateien: dat1, dat2Crop für SpatialPolygonsDataFrame

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 Ausmaß der dat2 zuzuschneiden. 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 verwenden, der folgende Fehler auftritt:

> r1 <- crop(BiomassCarbon.shp,alberta.shp) 
Error in function (classes, fdef, mtable) : 

unable to find an inherited method for function ‘crop’ for signature"SpatialPolygonsDataFrame"’ 
+0

das ist hoffnungslos, die Arbeit an den Details für eine Frage DAT1 und dat2 oder jene andere Dinge – mdsumner

Antwort

48

Optimiertes Verfahren hinzugefügt 2014.10.09:

raster::crop() verwendet werden können Spatial* (sowie Raster* zuzuschneiden) Objekte.

Zum Beispiel, hier ist, wie Sie es verwenden, könnte ein SpatialPolygons* Objekt zu beschneiden:

## 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 funktionelle noch) Antwort:

Die rgeos Funktion gIntersection() Marken Das ist ziemlich einfach.

MNEL des geschickten Beispiel als Startpunkt verwenden:

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

+0

Viel einfacher. – mnel

+1

Vielen Dank für die Bereitstellung eines Codebeispiels. Ich hatte einfach keine Zeit, als ich meine Antwort postete. +1 für Ihre clevere Lösung beim Verwenden des Rasterpakets zum Erstellen des Begrenzungspolygons. –

+1

@ JeffreyEvans - Ja. Ich finde, dass ** Raster ** eine * viel * bessere Aufgabe hat, benutzerfreundliche Konvertierungsfunktionen/Methoden für Benutzer bereitzustellen als ** sp **. Ich schätze es, dass die ** sp ** -Autoren vielleicht ihr Paket sparsam und leicht behalten wollen (da es so viele andere Pakete untermauern soll), aber ich hoffe immer noch, dass sie schließlich ein paar zusätzliche Dienstprogrammfunktionen hinzufügen. –

0

siehe Ernte

corp (x, y, filename = "", Snap = 'in der Nähe? ‘Datentyp = NULL, ...)

x Raster * Objekt

y Extent Objekt oder irgendeine Objekt, von dem ein Ausmaß Objekt extrahierte sein kann (siehe Details

Sie müssen den ersten SpatialPolygon, mit rasterize Funktion aus dem Raster-Paket

ich einige Daten erstellen rastern zu zeigen, wie rasterize verwenden :

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

Sie können nicht Ernte auf sp Polygon-Objekte 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 war in Bezug auf die Version im Jahr 2012 verfügbar und das ist nicht mehr der Fall. Hier

5

ist ein Beispiel dafür, wie dies zu tun mit rgeos mit der Weltkarte als Beispiel

Der von Roger Bivand kommt auf R-sig-Geo mailing list. Roger ist einer der Autoren des sp Pakets.

Mit der 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

+0

kühle Antwort beteiligt sind. 'gIntersection()' macht dies noch einfacher als 'gIntersects()'. –