2017-05-31 2 views
3

Ich stoße auf ein ungewöhnliches Problem mit der Cover-Funktion in R. Wir versuchen, trübe Pixel mit Werten aus einer anderen Ebene zu füllen. Ich kann es nur gut mit Stapeln funktioniert wie folgt -r Raster-Cover-Funktion - Fehler mit Landsat-Stapeln

library(raster) 
r1 <- raster(ncols=36, nrows=18) 
r1[] <- 1:ncell(r1) 
r1b <- r1a <- r1 
r1_stack <- stack(r1, r1a, r1b) 

r2 <- setValues(r1, runif(ncell(r1))) 
r2b <- r2a <- r2 
r_stack <- stack(r2, r2a, r2b) 

r_stack[r_stack < 0.5] <- NA 

r3 <- cover(r_stack, r1_stack) 

Aber ich versuche dann mit einem Raster-Stack, das Gleiche zu tun, und ich bekomme die Fehlermeldung:

Error in as.character(x) : 
cannot coerce type 'closure' to vector of type 'character' 

Der Code:

# get all tifs 
LS5_032_032_2008_09_21 <- list.files("LT050340302008090301T1-SC20170526100900/", 
            pattern = glob2rx("*band*.tif$"), full.names = T) 


# stack bands 
cloudy_scene <- stack(LS5_032_032_2008_09_21) 
# import cloud mask 
cloud_mask <- raster('LT050340302008090301T1-SC20170526100900/LT05_L1TP_034030_20080903_20160905_01_T1_sr_cloud_qa.tif') 

# mask data 
masked_data <- mask(cloudy_scene, mask = cloud_mask, maskvalue=0, inverse=TRUE) 

####### get cloud free data 
# get files 
LS5_2008_09_19 <- list.files("LT050340302008091901T1-SC20170526101124/", 
          pattern = glob2rx("*band*.tif$"), full.names = T) 

# subset and stack cloud free bands 
cloud_free_data <- stack(LS5_2008_09_19) 

# use cover function to assign NA pixels to corresponding pixels in other scene 
cover <- cover(masked_data, cloud_free_data) 

TRACEBACK() Ausgang:

9: toupper(format) 
8: .defaultExtension(format) 
7: .getExtension(filename, filetype) 
6: .local(x, filename, ...) 
5: writeStart(outRaster, filename = filename, format = format, datatype = datatype, 
     overwrite = overwrite) 
4: writeStart(outRaster, filename = filename, format = format, datatype = datatype, 
     overwrite = overwrite) 
3: .local(x, y, ...) 
2: cover(masked_data, cloud_free_data) 
1: cover(masked_data, cloud_free_data) 

UPDATE: Ich habe versucht, die Daten sampeln - noch nicht

cloud_free_resam <- resample(cloud_free_data, masked_data) 
cover <- cover(masked_data, cloud_free_resam) 

ERROR funktioniert:

Error in as.character(x) : 
    cannot coerce type 'closure' to vector of type 'character' 

Ich habe auch versucht, beide Schichten zu beschneiden - gleiche Fehler

# find intersection boundary 
crop_extent <- intersect(extent(cloud_free_data), extent(masked_data)) 
cloud_free_data <- crop(cloud_free_data, crop_extent) 
masked_data <- crop(masked_data, crop_extent) 

# use cover function to assign NA pixels to corresponding pixels in other scene 
cover <- cover(masked_data, cloud_free_data) 

ERHALTEN SIE DIE DATEN: (WARNUNG: 317mb download - packt zu ~ 1GB) https://ndownloader.figshare.com/files/8561230

Irgendwelche Ideen, was diesen Fehler mit diesem bestimmten Datensatz verursachen könnte? Ich bin sicher, wir vermissen etwas ganz einfaches, aber ... was? Vielen Dank im Voraus.

Leah

+0

Works für mich, wenn ich alles zu einem geringen Teil durch 'e = Umfang definiert beschneiden (450000,470000,4750000,4780000) ', also zB:' cloud_free_data <- crop (stack (LS5_2008_09_19 [5:10]), e) ', Mein PC schleift schlecht auf die ganzen Daten, ich habe es nicht laufen lassen Abschluss/Fehler – Spacedman

+0

Was sagt 'traceback()' nach Ihrem Fehler? Kannst du das in die Frage einarbeiten? – Spacedman

+0

@Spacedman Ich habe das Gefühl, dass es etwas mit überlappenden Pixeln in Bereichen zu tun hat, in denen keine Daten vorhanden sind, aber ich bin mir nicht sicher. Ich werde versuchen, die Ernte und die Traceback –

Antwort

1

Dies ist ein Fehler. Cover mit zwei mehrschichtigen Raster * -Objekten können nicht auf die Festplatte schreiben. Dies kann in dem einfachen Beispiel zu sehen, indem

rasterOptions(todisk=TRUE) 

Ich reparierte haben dies in Version 2-6.1 (erscheint in Kürze)

+0

Danke @RobertH Ich werde nach dem Update suchen! –

1

Ich denke, es ist zu tun, wenn das Objekt in eine rasterBrick umgewandelt wird und das Raster in eine temporäre Datei geschrieben. d. h. masked_data <- mask(cloudy_scene, mask = cloud_mask)

Die Verwendung von Spacedman's Crop erzeugt ein 'im Speicher' rasterBrick Objekte, die nicht auf den Zugriff auf die Dateien angewiesen sind; In diesem Fall funktioniert das Beispiel ohne Fehler.

Aber unter Verwendung der vollen Ausdehnung (oder Beschneiden am Ende des Prozesses), Raster schreibt und greift auf (temporäre) Dateien und der Fehler tritt auf.

Vielleicht als eine temporäre Lösung ist es, die Bilder explizit in speichergroße Stücke aufzuteilen, Maske/Abdeckung und dann mit mosaic restitch.

Die Ausdehnungen der beiden Objekte sind auch leicht unterschiedlich, so dass sollte behoben werden. Im Allgemeinen ist es auch eine gute Idee, Probleme zu vermeiden, indem Bandnamen, Min-Max-Werte und Werte < 0 explizit auf NA gesetzt werden.

+0

Danke! Das Ausmaß Problem ist ein Problem. Ich habe versucht, beide in gleichem Maße zu beschneiden, aber das hat den Fehler nicht behoben. Ich werde versuchen, die Raster-Brick-Ansatz und sehen, ob es hilft, aber ich denke immer noch, es könnte etwas mit Pixel-Überlappung zu tun haben - Landsat Szenen sind nicht quadratisch, aber die Ausdehnungen sind "rechteckig", so dass es viele keine Daten Pixel in einer Szene gibt könnte Probleme verursachen. Ich werde ein paar mehr Dinge versuchen ... –

+0

Nö! weil ich vermutete, dass es nicht damit zusammenhängt, ein Ziegelstein gegen Stapel zu sein. Ich denke immer noch, dass es etwas mit Pixelüberlappung/fehlenden Daten zu tun hat. –