Wie rastere ich SpatialPolygons in R?

10

Ich versuche, die Bathymetriewerte meines Interessengebiets mithilfe der Funktion 'Rasterize' im Paket {sp} aus einer Welt-Bathymetrie-Rasterebene zu extrahieren.

* Änderungen: Ich habe die Funktion 'Extrahieren' gefunden, die eher das ist, wonach ich suche.

Folgendes habe ich bisher getan:

> class(subarea0) #This is my area of interest (Eastern Canadian Arctic Sea)
[1] "SpatialPolygons"
attr(,"package")
[1] "sp"

> extent(subarea0)
class       : Extent 
xmin        : -82.21997 
xmax        : -57.21667 
ymin        : 60.2 
ymax        : 78.16666

library(marelac)
data("Bathymetry")#World bathymetric data in library (marelac)
names(Bathymetry);class(Bathymetry);str(Bathymetry)
[1] "x" "y" "z"
[1] "list"
List of 3
 $ x: num [1:359] -180 -179 -178 -177 -176 ...
 $ y: num [1:180] -89.5 -88.5 -87.5 -86.5 -85.5 ...
 $ z: num [1:359, 1:180] 2853 2873 2873 2873 2873 ...

  raster_bath<-raster(Bathymetry)#Transformed into a raster layer
    extent(raster_bath) <- extent(subarea0)#Transform the extend of my raster to the extend of my SpatialPolygons

>ras_sub0<-rasterize(subarea0,raster_bath)#rasterize my SpatialPolygons (*Edits: not the function that I need here, but I am still interested to learn what results mean)
Found 2 region(s) and 10 polygon(s)
> plot(ras_sub0)
> plot(subarea0, add=TRUE)

Geben Sie hier die Bildbeschreibung ein

> ras_sub0
class       : RasterLayer 
dimensions  : 180, 359, 64620  (nrow, ncol, ncell)
resolution  : 0.06964709, 0.0998148  (x, y)
extent      : -82.21997, -57.21667, 60.2, 78.16666  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=longlat +ellps=WGS84 
values      : in memory
min value   : 1 
max value   : 2 
layer name  : layer 

Ich verstehe das Ergebnis nicht. Warum bekomme ich für jedes meiner Polygone 2 Farben? Was meinen sie?

Wie kann ich letztendlich eine Bathymetrie-Tiefenkontur erhalten? Hat das etwas mit meiner Auflösung oder der Änderung der Abmessungen zu tun?

* Änderungen: ok, ich habe jetzt folgendes gemacht:

v <- extract(raster_bath, subarea0)#Extract data from my Raster Layer for the locations of my SpatialPolygons

v ist eine Liste und ich bin mir nicht sicher, wie / in welcher Form ich diese Informationen mit meinem räumlichen Polygon neu binden soll ...

Vielen Dank!

GodinA
quelle
Wenn Sie "Bathymetrie-Tiefenkontur erhalten" sagen, meinen Sie damit, dass Sie auch Konturen erzeugen möchten?
Simbamangu

Antworten:

6

Ihre Zeile ras_sub0<-rasterize(subarea0,raster_bath)nimmt nur die Indexnummer der Polygone und weist diese den Werten des Rasters zu.

Wenn Sie nur den Schnittpunkt Ihres Polygons und des Rasters wünschen:

subarea0_bathy <- intersect(raster_bath, subarea0)

Update : Wie @GodinA bemerkt, gibt intersect () manchmal kein Raster zurück, das die vollständige Ausdehnung des Polygons hat! Um dies zu umgehen, können Sie ein etwas größeres Raster als Ihr Original verwenden:

r2 <- raster() # create a generic raster
extent(r2) <- extent(subarea0) + 1 # add 1 degree of extent (0.5 each side)
r3 <- intersect(raster_bath, r2) 
Simbamangu
quelle
Vielen Dank @Simbamangu, ich habe den Befehl "intersect" ausprobiert. Wenn ich jedoch das subarea0_bathy und mein räumliches Polygon (subarea0) zeichne, überlappen sie sich nicht vollständig. Warum? Um Ihre vorherige Frage zu beantworten, ja, ich möchte eventuell auch meine Bathymetriekontur haben. Irgendwelche Vorschläge?
GodinA
Ja, ich habe mir die Ausgabe der Bathymetriedaten und eines Tansania-Polygons angesehen und sehe den gleichen Effekt. Siehe mein Update oben. Für Konturen ist es so einfach wie cont <- contour(r3)damals. lines(cont)Ist R nicht großartig?
Simbamangu
Großartig, ja R kann fantastisch sein! Danke @Simbamangu, das funktioniert! Ich möchte jedoch meine Raumpolygone nur mit meiner Tiefenkontur zeichnen. Vielleicht einen SpatialPolygonsDataframe erstellen? Mit intersect erhalte ich die Informationen für das gesamte Quadrat, das meine Raumpolygone umfasst. Ich muss meine Raumpolygone irgendwie mit meiner Tiefenkontur kombinieren, bin mir aber nicht sicher, wie ich das machen soll. Aus diesem Grund dachte ich, dass die Funktion 'Extrahieren' ein guter Anfang ist, aber am Ende habe ich eine Liste mit Tiefen, bei denen ich nicht sicher bin, wie ich mich mit meinen räumlichen Polygonen wieder verbinden kann ... Irgendwelche Ideen? Danke noch einmal!
GodinA
Womit willst du enden? Konturen (SpatialLines), die sich mit Ihrem Unterbereich0 überschneiden? Möglicherweise möchten Sie eine neue Frage stellen, da diese jetzt über das Original hinausgeht.
Simbamangu
Ja, ich möchte mein Untergebiet0 nur mit der Tiefenkontur für diesen definierten Bereich erhalten: gis.stackexchange.com/questions/25112/…
GodinA
1

Hier ist eine andere Lösung, die eine grundlegende Teilmengenfunktion in verwendet raster.

# create a raster with the dimensions that you are interested in.
r <- raster(extent(subarea0)+1) # +1 to increase the area
res(r) <- 0.1 # you can change the resolution here. 0.1 can be about 10x10 km if you are close to the equator.
crs(r) <- projection(subarea0) # transfer the coordinate system to the raster

# Now you can add data to the cells in your raster to mark the ones that fall within your polygon.
r[subarea0,] <- 1 # this an easy way to subset a raster using a SpatialPolygons object

# check your raster
plot(r)
ssanch
quelle