보간없이 불규칙한 점 데이터로 래스터를 만드는 방법


13

불규칙한 간격의 포인트 데이터베이스에서 래스터 이미지를 만들려고했습니다. 데이터는 다음과 같습니다.

> 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

내가 만든 메쉬 내 에서이 'z'값을 원합니다.

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

또한 데이터 포인트 외부에있는 메시 포인트에 대해 z- 값을 'NA'로 지정하고 싶습니다. 이 같은 메시의 모습을 통해 포인트 : https://drive.google.com/file/d/0B6GUNg-8d30vYzlwTkhvaHBFTnc/edit?usp=sharing 때를 플롯

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

문제는 이것을 구축하는 방법을 잘 모르겠다는 것입니다. 메시 그리드와 데이터 포인트의 배율이 같지 않기 때문에 다음 단계가 작동하지 않습니다!

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

데이터 포인트를 사용하여 (메시없이) 래스터를 만들려고하면 데이터 간격이 불규칙하므로 R에서 오류가 발생합니다!

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

또한, 나는 '래스터 패키지'의 '래스터 화'기능 (불규칙한 그리드의 경우)을 사용하려고했지만 그 방법으로 얻을 수 없었습니다. idw 또는 kriging 방법없이 불규칙한 간격의 데이터 포인트 래스터를 만들 수 있습니까?


불규칙한 간격의 그리드의 문제점은 점이 너무 가깝거나 멀리 있으면 알고리즘이 실패한다는 것입니다. (최적의) 해결책 : 셀 사이의 거리를 최소화하고 직사각형 벡터 그리드를 만드십시오. 그런 다음 점의 평균값을 해당 그리드에 결합하고 래스터 화하십시오.
Curlew

나는 같은 문제가 있었다-해결책은 SpatialPixelsDataFrame제안 된 tolerance인수 (당신의 경우 0.916421) 와 함께 사용 하는 것이었다 .
Tomas

답변:


18

규칙적인 래스터에서 불규칙한 점 데이터를 원한다고 가정합니다. 이 경우 래스터 화가 작동해야하고 "래스터 화"의 예가 방법을 보여줍니다. 다음은 데이터를 기반으로 한 것입니다.

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

e <-e + 1000을 추가 한 이유가 무엇입니까?
mmann1123

@ mman1123이 이상한 예제 데이터로 작업하게 만드는 것입니다. 모든 y 좌표는 동일하므로 y 방향에서 범위는 0이므로 범위를 래스터로 만들 수 있도록 완전히 임의의-1000을 추가합니다.
Robert Hijmans

이것에 대한 파이썬 솔루션이 있습니까?
raaj

5

이것은 나를 위해 일했습니다-해결책은 제안 된 공차 인수와 함께 SpatialPixelsDataFrame을 사용하는 것입니다 (귀하의 경우 0.916421).

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

그러나 공차 값이 높기 때문에 래스터는 원래 점에 잘 맞지 않습니다. 훨씬 더 잘 맞을 수 있습니다.


1
첫 번째 코드 줄에 닫는 괄호가 없습니까?
Antti

@Antti 감사합니다, 수정했습니다!
Tomas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.