2016-06-22 18 views
-1

I eine Rasterdatei haben Temperaturwerte enthält, und eine Liste von Punkten als Zentren meiner gewünschten Puffer zu koordinieren, in rot gefärbt, wie in der Figur:raster Pufferung mit Werten in einem gegebenen Zustand in R

temperatures field and centroids colored in red

Wie kann ich Puffer um die Zentroide extrahieren, die alle Nachbarzellen enthalten, die der Bedingung Tmax= Tcentroid+6ºC entsprechen? Auch ich würde gerne Puffer überlappen und für den Fall, dass sie sich überschneiden, sie zu einem einzigen zusammenführen.

+0

Haben Sie die Werte innerhalb eines bestimmten bu erhalten möchten fafer, die der Bedingung entsprechen (alle Werte im Puffer abrufen, diejenigen entfernen, die nicht übereinstimmen, und räumliche Duplikate entfernen); oder sollte die Bedingung die Puffergröße bestimmen (ist die Bedingung der Puffer, was etwas komplizierter erscheinen würde)? Richten Sie auch ein reproduzierbares Beispiel ein. – RobertH

+0

Ich möchte die Werte innerhalb des Puffers, die der Bedingung entsprechen. In dem angehängten Bild versuche ich einen Fall zu veranschaulichen, in dem die Zellen innerhalb des Puffers kleiner oder gleich 6 sind. [1]: http://i.stack.imgur.com/71PAs.png – ADM

Antwort

0

Hier ist ein Ansatz, um das zu bekommen. Es ist wahrscheinlich ein effizienter Weg, dies über Funktionen im gdistance Paket zu tun

Beispieldaten:

library(raster) 
r <- raster(ncol=36, nrow=18) 
r[] <- 1:ncell(r) 
xy <- cbind(-55, seq(-25, 20, by=20)) 

Algorithmus (beachten Sie, dass ich die default „Rook“ adjacency Regel bin mit):

start <- cellFromXY(r, xy) 
svalues <- extract(r, xy) 

result <- list() 
for (i in 1:nrow(xy)) { 
    value <- svalues[i] 
    cells <- start[i] 
    allcells <- cells 
    while(TRUE) { 
     adj <- adjacent(r, cells, pairs=FALSE) 
     asel <- which(abs(r[adj] - value) < 5) 
     if (length(asel) == 0) break 
     cells <- adj[asel] 
     cells <- cells[!cells %in% allcells] 
     allcells <- c(allcells, cells) 
    } 
    result[[i]] <- allcells 
} 

inspizieren Ergebnisse:

p <- xyFromCell(r, unlist(result)) 
plot(r) 
points(xy, pch=20) 
points(p, pch='+') 
+0

Vielen Dank für Ihre Antwort, aber ich habe erkannt, dass ich nicht richtig erklärt habe, was ich brauche. Soweit ich aus Ihrer Antwort verstehe, umfasst der Puffer alle Rasterwerte und sucht von den Mittelpunktspunkten aus nach Werten, die der Bedingung entsprechen. Was ich wirklich brauche, ist, von der Mitte aus jene Werte zu suchen, die benachbart sind und der Bedingung entsprechen. Sobald der erste Wert gefunden wird, der die Bedingung nicht erfüllt, möchte ich nicht mehr nach dieser Richtung suchen. Dies würde bedeuten, dass die Bedingung die Puffergröße bestimmt. – ADM

+0

Ich habe meine Antwort geändert, um das zu reflektieren – RobertH

+0

Vielen Dank. – ADM