Cómo hacer RASTER a partir de datos de puntos irregulares sin interpolación

13

Estaba tratando de hacer una imagen de trama de una base de datos de puntos espaciados irregularmente. Los datos se ven como-

> 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

Quiero estos valores 'z' dentro de una malla que creé por

# 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))

También quiero que los valores z se asignen como 'NA' para esos puntos de malla que están fuera de los puntos de datos. Los puntos sobre la malla se ven así: https://drive.google.com/file/d/0B6GUNg-8d30vYzlwTkhvaHBFTnc/edit?usp=sharing cuando trazo

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

¡El problema es que no estoy seguro de cómo construir sobre esto, los siguientes pasos no funcionan porque mi malla de malla y los puntos de datos no son de la misma escala!

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

Si trato de hacer un ráster simplemente usando los puntos de datos (sin ninguna malla), R arroja un error ya que mis datos están espaciados irregularmente.

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

Además, estaba tratando de jugar con la función 'rasterizar' (para cuadrículas irregulares) del 'paquete ráster', pero no pude solucionarlo :(. Sé cómo interpolar y hacer una cuadrícula regular, pero por el bien de originalidad, quiero EVITAR la interpolación. ¿Es posible hacer una trama de puntos de datos espaciados irregularmente sin métodos idw o kriging?

ToNoY
fuente
El problema con las cuadrículas espaciadas irregulares es que el algoritmo falla si los puntos se encuentran demasiado cerca / muy juntos. Una solución (no óptima): por qué no tomar la distancia mínima entre celdas y crear una cuadrícula de vector rectangular. Luego, une los valores promedio de los puntos a esa cuadrícula y rastrízala.
Curlew
Tuve el mismo problema: la solución fue usar SpatialPixelsDataFrameel toleranceargumento sugerido (0.916421 en su caso).
Tomás

Respuestas:

18

Supongo que quiere sus datos de puntos irregulares en un ráster regular. En ese caso, rasterizar debería funcionar, y los ejemplos en? Rasterizar muestran cómo. Aquí hay algo basado en sus datos

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)
Robert Hijmans
fuente
excelente solución al problema @ Robert
ToNoY
Lo sentimos, ¿puedes aclarar por qué agregas e <- e + 1000?
mmann1123
@ mman1123 Eso es solo para hacer que las cosas funcionen con estos extraños datos de ejemplo. Todas las coordenadas y son iguales y, por lo tanto, la extensión es cero en la dirección y, por lo que agrego 1000 --- completamente arbitrario --- para poder hacer un ráster desde la extensión.
Robert Hijmans
¿Hay una solución pitónica para esto?
raaj
5

Esto funcionó para mí: la solución fue usar SpatialPixelsDataFrame con el argumento de tolerancia sugerido (0.916421 en su caso):

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

sin embargo, debido al alto valor de tolerancia, el ráster no se ajusta muy bien a los puntos originales. Podría estar en forma mucho mejor.

Tomás
fuente
1
¿A la primera línea de código le falta un corchete de cierre?
Antti
@Antti gracias, corregido!
Tomás