2017-12-05 6 views
0

Ich habe ein Shapefile, das Thiessen Polygone darstellt. enter image description hewithWie konvertiert man automatisch viele Felder eines Polygon Shapefile in R

Jedes Polygon ist mit vielen Werten einer Tabelle verknüpft.

thiessen <- readOGR(dsn = getwd(), layer = poly) 
OGR data source with driver: ESRI Shapefile 
Source: ".../raingauges/shp", layer: "thiessen_pol" 
with 10 features 
It has 5 fields 
head(thiessen) 
    est est_name p001 p002 p003 
0 2 borges 1 8 2 
1 0  e018 2 4 3 
2 5 starosa 5 15 1 
3 6 delfim 4 2 2 
4 1  e087 1 1 3 
5 3  e010 0 1 0 

die Spalte 'est' und 'est_name' auf die ID und den Namen der regen Lehren in Zusammenhang stehen. Die folgenden Spalten sind für mich wichtig und stellen Niederschlagswerte an Tag 1, 2 usw. dar (im Beispiel habe ich nur drei Tage behalten, aber tatsächlich habe ich 8 Jahre täglich Niederschlagsdaten).

Ich muss die Polygone in Raster konvertieren, aber ein Raster für jedes Feld (Spalte p001, p002 usw.) der Tabelle.

Es gibt eine einfache Möglichkeit, um Polygone zu konvertieren mit der Funktion rasterize in R. rastern

r_p001 <- rasterize(thiessen, r, field = thiessen$p001) 
plot(r_p001) 
writeRaster(r_p001, filename=".../raingauges/shp/r_p001.tif") 

enter image description here

Das Problem ist, dass ich manuell das Feld (Spalte) der Tabelle festlegen muß mit den Polygonwerten, die in Raster konvertiert werden sollen. Da ich ungefähr 2900 Tage habe (2900 Spalten mit Niederschlagswerten für jeden Regenmesser), ist es unmöglich, dies manuell zu tun.

Die Dokumentation hilft nicht zu klären, wie man diesen Prozess automatisieren kann und ich habe nichts im Internet gefunden, um mir zu helfen.

Kann jemand jedes Feld automatisch in Raster konvertieren und als tif Format speichern? Hier

+0

Es ist sehr schwierig, Ihnen ohne ein reproduzierbares Beispiel zu antworten. Das heißt, Sie könnten eine Funktion schreiben und eine Schleife ausführen oder wiederholen, um eine Sequenz in eine Tabelle zu schreiben und die 2900 Zeilen in ein Skript einzufügen. –

Antwort

1

ist ein Ansatz:

Beispieldaten

library(raster) 
r <- raster(ncols=36, nrows=18) 
p1 <- rbind(c(-180,-20), c(-140,55), c(10, 0), c(-140,-60), c(-180,-20)) 
hole <- rbind(c(-150,-20), c(-100,-10), c(-110,20), c(-150,-20)) 
p1 <- list(p1, hole) 
p2 <- rbind(c(-10,0), c(140,60), c(160,0), c(140,-55), c(-10,0)) 
p3 <- rbind(c(-125,0), c(0,60), c(40,5), c(15,-45), c(-125,0)) 
att <- data.frame(id=1:3, var1=10:12, var2=c(6,9,6)) 
pols <- spPolygons(p1, p2, p3, attr=att) 

Das Wichtigste ist, mit einem einzigartigen, ein Feld zu haben, wenn Ihre Daten nicht haben, fügen Sie es wie folgt

pols$id <- 1:nrow(pols) 

Rastern

r <- rasterize(pols, r, field='id') 

Erstellen einer Ebene für alle anderen Variablen

x <- subs(r, data.frame(pols), by='id', which=2:ncol(pols), filename="rstr.grd") 
x 
#class  : RasterBrick 
#dimensions : 18, 36, 648, 2 (nrow, ncol, ncell, nlayers) 
#resolution : 10, 10 (x, y) 
#extent  : -180, 180, -90, 90 (xmin, xmax, ymin, ymax) 
#coord. ref. : +proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0 
#data source : rstr.grd 
#names  : var1, var2 
#min values : 10, 6 
#max values : 12, 9 

Eine Alternative eine Schicht mit Raster Tabelle Attribut zu halten ist, dass schneller ist, aber je nach Zweck, vielleicht eine weniger nützliche Methode:

r <- rasterize(pols, r, field='id') 
f <- as.factor(r) 
v <- levels(f)[[1]] 

v <- cbind(v, data.frame(pols)[,-1]) 
levels(f) <- v 
f 
#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 +ellps=WGS84 +towgs84=0,0,0 
#data source : in memory 
#names  : layer 
#values  : 1, 3 (min, max) 
#attributes : 
# ID var1 var2 
# 1 10 6 
# 2 11 9 
# 3 12 6 

anschließend können Sie tun:

z <- deratify(f) 

Um das gleiche Ergebnis wie im ersten Beispiel zu erhalten

z 
#class  : RasterBrick 
#dimensions : 18, 36, 648, 2 (nrow, ncol, ncell, nlayers) 
#resolution : 10, 10 (x, y) 
#extent  : -180, 180, -90, 90 (xmin, xmax, ymin, ymax) 
#coord. ref. : +proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0 
#data source : in memory 
#names  : var1, var2 
#min values : 10, 6 
#max values : 12, 9 
+0

Vielen Dank, @RobertH! Ich kannte die Funktion 'subs' noch nicht, aber es funktionierte perfekt für mich. –

Verwandte Themen