Come rendere RASTER da dati di punti irregolari senza interpolazione


13

Stavo cercando di creare un'immagine raster da un database di punti con spaziatura irregolare. I dati sembrano-

> head(s100_ras)
         x       y         z
1 267573.9 2633781 213.29545
2 262224.4 2633781  69.78261
3 263742.7 2633781  51.21951
4 259328.4 2633781 301.98413
5 264109.8 2633781 141.72414
6 255094.8 2633781  88.90244

Voglio questi valori 'z' all'interno di una mesh da cui ho creato

# Create a fine mesh grid
my_mesh=expand.grid(seq(min(s100_ras$Y),max(s100_ras$Y),l=100),
                    seq(min(s100_ras$X),max(s100_ras$X),l=100))

Voglio anche assegnare i valori z come 'NA' per quei punti mesh che sono al di fuori dei punti dati. I punti sopra la mesh si presentano così: https://drive.google.com/file/d/0B6GUNg-8d30vYzlwTkhvaHBFTnc/edit?usp=sharing quando trama

plot(my_mesh)
points(s100_ras$Y, s100_ras$X, pch="*", col='blue')

Il problema è che non sono sicuro di come costruire su questo, i seguenti passaggi non funzionano perché la mia griglia mesh e i punti dati non sono della stessa scala !!

library(rgdal)
library(raster)
xyz<-cbind(my_mesh, s100_ras)
r <- rasterFromXYZ(xyz)
image(r)

Se provo a creare un raster semplicemente usando i punti dati (senza alcuna mesh), R genera un errore poiché i miei dati sono spaziati in modo irregolare!

library(sp)
s100_ras <- data.frame(expand.grid(x = s100_ras$Y, y = s100_ras$X), 
                       z = as.vector(s100_ras$mean))
coordinates(s100_ras) <- ~x+y
proj4string(s100_ras) <- CRS("+proj=utm +zone=46 +datum=WGS84")
gridded(s100_ras) = TRUE

suggested tolerance minimum: 0.916421 
Error in points2grid(points, tolerance, round) : 
  dimension 1 : coordinate intervals are not constant

Inoltre, stavo provando a giocare con la funzione "rasterizza" (per griglie irregolari) di "pacchetto raster", ma non riuscivo a trovare un modo per farlo :(. So come interpolare e creare una griglia regolare, ma per il bene di originalità, voglio EVITARE l'interpolazione. È possibile creare un raster di punti dati distribuiti in modo irregolare senza metodi idw o kriging?


Il problema con le griglie spaziate irregolari è che l'algoritmo fallisce se i punti si trovano troppo vicini / lontani insieme. Una soluzione alternativa (non ottimale): perché non prendere la distanza minima tra le celle e creare una griglia vettoriale rettangolare. Quindi unisci i valori medi dei punti a quella griglia e rasterizzala.
Chiurlo

Ho avuto lo stesso problema: la soluzione era quella di utilizzare SpatialPixelsDataFramel' toleranceargomento suggerito (0.916421 nel tuo caso).
Tomas,

Risposte:


18

Presumo che tu voglia i tuoi dati di punti irregolari su un normale raster. In tal caso, rasterize dovrebbe funzionare e gli esempi in? Rasterize mostrano come. Ecco qualcosa basato sui tuoi dati

s100 <- matrix(c(267573.9, 2633781, 213.29545, 262224.4, 2633781, 69.78261, 263742.7, 2633781, 51.21951, 259328.4, 2633781, 301.98413, 264109.8, 2633781, 141.72414, 255094.8, 2633781, 88.90244),  ncol=3,  byrow=TRUE)
colnames(s100) <- c('X', 'Y', 'Z')

library(raster)
# set up an 'empty' raster, here via an extent object derived from your data
e <- extent(s100[,1:2])
e <- e + 1000 # add this as all y's are the same

r <- raster(e, ncol=10, nrow=2)
# or r <- raster(xmn=, xmx=,  ...

# you need to provide a function 'fun' for when there are multiple points per cell
x <- rasterize(s100[, 1:2], r, s100[,3], fun=mean)
plot(x)

ottima soluzione al problema @ Robert
ToNoY

Spiacenti, puoi chiarire perché aggiungi e <- e + 1000?
mmann1123

@ mman1123 Questo è solo per far funzionare le cose con questi strani dati di esempio. Tutte le coordinate y sono uguali e quindi l'estensione è zero nella direzione y, quindi aggiungo 1000 --- completamente arbitrario --- per essere in grado di creare un raster dall'estensione.
Robert Hijmans,

Esiste una soluzione pitonica per questo?
raaj,

5

Questo ha funzionato per me - la soluzione era usare SpatialPixelsDataFrame con l'argomento di tolleranza suggerito (0.916421 nel tuo caso):

points <- SpatialPoints(s100_ras[,c('x','y')], s100_ras[,c('z')])
pixels <- SpatialPixelsDataFrame(points, tolerance = 0.916421, points@data)
raster <- raster(pixels[,'z'])

tuttavia, a causa dell'elevato valore di tolleranza, il raster non si adatta molto bene ai punti originali. Potrebbe andare molto meglio.


1
Nella prima riga di codice manca una parentesi quadra di chiusura?
Antti,

@Antti grazie, corretto!
Tomas,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.