Verarbeitungsvektor zum schnelleren Raster mit R.

9

Ich konvertiere Vektor in Raster in R. Der Prozess war jedoch zu lang. Gibt es die Möglichkeit, das Skript in Multithread- oder GPU-Verarbeitung zu versetzen, um es schneller zu machen?

Mein Skript zum gerasterten Vektor.

r.raster = raster()
extent(r.raster) = extent(setor) #definindo o extent do raster
res(r.raster) = 10 #definindo o tamanho do pixel
setor.r = rasterize(setor, r.raster, 'dens_imov')

r.raster

Klasse: RasterLayer Abmessungen: 9636, 11476, 110582736 (nrow, ncol, ncell) Auflösung: 10, 10 (x, y) Ausdehnung: 505755, 620515, 8555432, 8651792 (xmin, xmax, ymin, ymax) Koordinate. ref. : + proj = longlat + datum = WGS84 + ellps = WGS84 + towgs84 = 0,0,0

Setter

Klasse: SpatialPolygonsDataFrame-Funktionen: 5419 Umfang: 505755, 620515.4, 8555429, 8651792 (xmin, xmax, ymin, ymax) Koordinate. ref. : + proj = utm + zone = 24 + süd + ellps = GRS80 + Einheiten = m + no_defs Variablen: 6 Namen: ID, CD_GEOCODI, TIPO, dens_imov, area_m, domicilios1 min Werte: 35464, 290110605000001, RURAL, 0.00000003,100004, Maximalwerte 1,0000: 58468, 293320820000042, URBANO, 0,54581673,99996, 99,0000

Druck des Setors Geben Sie hier die Bildbeschreibung ein

Diogo Caribé
quelle
Können Sie Zusammenfassungen von setor und r.raster veröffentlichen? Ich möchte eine Vorstellung von der Anzahl der Objekte in setor und den Abmessungen von r.raster haben. einfach ausdrucken ist in Ordnung
mdsumner
Ich habe eine Zusammenfassung in die Frage gestellt.
Diogo Caribé
Keine Zusammenfassung, nur drucken - die Info, die ich für uns gefragt habe, nicht tgere
mdsumner
Entschuldigung, ich habe den Druck gemacht.
Diogo Caribé
Ah, enttäuscht, dass ich nicht daran gedacht habe, bis ich den Ausdruck gesehen habe - stellen Sie sicher, dass die Projektion des Rasters mit den Polygonen übereinstimmt, im Moment nicht - versuchen Sie es mit r <- raster (setor); res (r) <- 10; setor.r = rasterize (setor, r, 'dens_imov') - aber versuchen Sie auch, zuerst res (r) <- 250 einzustellen, damit Sie eine Vorstellung davon bekommen, wie lange die
hochauflösende

Antworten:

17

Ich habe versucht, die Funktion mit dem Paket folgendermaßen zu "parallelisieren" :rasterizeRparallel

  1. Teilen Sie das SpatialPolygonsDataFrame- Objekt in nTeile
  2. rasterize jedes Teil separat
  3. Füge alle Teile zu einem Raster zusammen

In meinem Computer rasterizedauerte die parallelisierte Funktion 2,75- mal weniger als die nicht parallelisierte rasterizeFunktion.

Hinweis: Mit dem folgenden Code können Sie ein Polygon-Shapefile (~ 26,2 MB) aus dem Internet herunterladen. Sie können jedes SpatialPolygonDataFrame-Objekt verwenden. Dies ist nur ein Beispiel.

Laden Sie Bibliotheken und Beispieldaten:

# Load libraries
library('raster')
library('rgdal')

# Load a SpatialPolygonsDataFrame example
# Load Brazil administrative level 2 shapefile
BRA_adm2 <- raster::getData(country = "BRA", level = 2)

# Convert NAMES level 2 to factor 
BRA_adm2$NAME_2 <- as.factor(BRA_adm2$NAME_2)

# Plot BRA_adm2
plot(BRA_adm2)
box()

# Define RasterLayer object
r.raster <- raster()

# Define raster extent
extent(r.raster) <- extent(BRA_adm2)

# Define pixel size
res(r.raster) <- 0.1

BrazilSPDF

Abbildung 1: Brazil SpatialPolygonsDataFrame-Diagramm

Einfaches Thread-Beispiel

# Simple thread -----------------------------------------------------------

# Rasterize
system.time(BRA_adm2.r <- rasterize(BRA_adm2, r.raster, 'NAME_2'))

Zeit in meinem Laptop:

# Output:
# user  system elapsed 
# 23.883    0.010   23.891

Beispiel für einen Multithread-Thread

# Multithread -------------------------------------------------------------

# Load 'parallel' package for support Parallel computation in R
library('parallel')

# Calculate the number of cores
no_cores <- detectCores() - 1

# Number of polygons features in SPDF
features <- 1:nrow(BRA_adm2[,])

# Split features in n parts
n <- 50
parts <- split(features, cut(features, n))

# Initiate cluster (after loading all the necessary object to R environment: BRA_adm2, parts, r.raster, n)
cl <- makeCluster(no_cores, type = "FORK")
print(cl)

# Parallelize rasterize function
system.time(rParts <- parLapply(cl = cl, X = 1:n, fun = function(x) rasterize(BRA_adm2[parts[[x]],], r.raster, 'NAME_2')))

# Finish
stopCluster(cl)

# Merge all raster parts
rMerge <- do.call(merge, rParts)

# Plot raster
plot(rMerge)

BrazilRaster

Abbildung 2: Brasilien-Rasterplot

Zeit in meinem Laptop:

# Output:
# user  system elapsed 
# 0.203   0.033   8.688 

Weitere Informationen zur Parallelisierung in R :

Guzmán
quelle
Sehr gute Antwort!
Diogo Caribé
Stellen Sie nicht einfach n als Anzahl der Kerne auf der Maschine ein?
Sam
@ Sam Ich denke, es sollte ohne Probleme funktionieren, aber ich weiß nicht, ob es besser ist oder nicht! Ich nahm an, dass, wenn ich die Features in n Teile aufteilen würde, die der Anzahl der Kerne entsprechen, eines dieser Teile möglicherweise einfacher zu verarbeiten wäre und der Kern, der es verarbeitet, unbrauchbar wäre! Wenn Sie jedoch mehr Teile als Kerne haben, wenn ein Kern ein Teil fertig verarbeitet, wird ein anderes Teil benötigt. Aber ich bin mir nicht sicher! Jede Hilfe zu diesem Thema wäre dankbar.
Guzmán
Ich werde heute Abend einige Tests durchführen. Auf einem kleinen Shapefile (ungefähr 25 km x 25 km), das auf 50 m gerastert ist, gibt es eine winzige Verbesserung bei der Verwendung von n = 2,4 oder 8 gegenüber n = 20, 30 oder bis zu 50. Ich werde heute Abend ein sehr großes Shapefile einreichen und auf 25m rastern. Die Single-Core-Verarbeitung dauert 10 Stunden, wir werden also sehen, welche unterschiedlichen Werte von n bewirken !! (n = 50 ist knapp 1 Stunde)
Sam
@ Guzmán Ich führe den Code wieder aus. Es hat jedoch einige Fehler behoben und ich weiß nicht warum. Können Sie mir helfen? Fehler in checkForRemoteErrors (val): 7 Knoten haben Fehler erzeugt; erster Fehler: Objekt 'BRA_adm2' nicht gefunden
Diogo Caribé