Como criar o RASTER a partir de dados de pontos irregulares sem interpolação

13

Eu estava tentando criar uma imagem rasterizada de um banco de dados de pontos com espaçamento irregular. Os dados parecem-

> 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

Eu quero esses valores 'z' dentro de uma malha que eu criei 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))

Também quero que os valores z sejam atribuídos como 'NA' para os pontos de malha que estão fora dos pontos de dados. Os pontos sobre a malha são assim: https://drive.google.com/file/d/0B6GUNg-8d30vYzlwTkhvaHBFTnc/edit?usp=sharing quando plotar

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

O problema é que não tenho certeza de como desenvolver isso, as etapas a seguir não funcionam porque minha grade de malha e pontos de dados não têm a mesma escala !!

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

Se eu tentar fazer uma varredura apenas usando os pontos de dados (sem nenhuma malha), R gera um erro, pois meus dados estão espaçados 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

Além disso, eu estava tentando jogar com a função 'rasterize' (para grades irregulares) do 'pacote raster', mas não conseguia resolver isso :(. Eu sei como interpolar e criar uma grade regular, mas por uma questão de de originalidade, desejo EVITAR a interpolação.É possível fazer uma varredura de pontos de dados espaçados irregularmente sem métodos idw ou kriging?

ToNoY
fonte
O problema com grades espaçadas irregulares é que o algoritmo falha se os pontos estiverem muito próximos / distantes. Uma solução alternativa (não otimizada): por que não medir a distância mínima entre células e criar uma grade vetorial retangular. Em seguida, junte os valores médios dos pontos a essa grade e rasterize-a.
Curlew
Eu tive o mesmo problema - a solução era usar SpatialPixelsDataFramecom o toleranceargumento sugerido (0,916421 no seu caso).
Tomas

Respostas:

18

Suponho que você queira seus dados de pontos irregulares em uma varredura regular. Nesse caso, rasterize deve funcionar, e os exemplos em? Rasterize mostram como. Aqui está algo baseado em seus dados

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
fonte
excelente solução para o problema @ Robert
ToNoY
Desculpe, você pode esclarecer por que adiciona e <- e + 1000?
mmann1123 10/09/2015
@ mman1123 Isso é apenas para fazer as coisas funcionarem com esses dados de exemplo ímpares. Todas as coordenadas y são iguais e, portanto, a extensão é zero na direção y, então eu adiciono 1000 --- inteiramente arbitrárias --- para poder fazer uma varredura a partir da extensão.
Robert Hijmans
Existe uma solução pitônica para isso?
raaj
5

Isso funcionou para mim - a solução foi usar SpatialPixelsDataFrame com o argumento de tolerância sugerido (0,916421 no seu caso):

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

No entanto, devido ao alto valor de tolerância, a varredura não se encaixa muito bem nos pontos originais. Poderia estar em forma muito melhor.

Tomas
fonte
1
A primeira linha do código tem um colchete ausente?
Antti
@Antti obrigado, corrigido!
Tomas