Как сделать РАСТР из нерегулярных точечных данных без интерполяции

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 или методов кригинга?

ToNoY
источник
Проблема с нерегулярными разнесенными сетками состоит в том, что алгоритм не работает, если точки лежат слишком близко / далеко друг от друга. Обход (неоптимальный): почему бы не взять минимальное расстояние между ячейками и создать прямоугольную векторную сетку. Затем присоедините средние значения точек к этой сетке и растеризуйте ее.
Curlew
У меня была та же проблема - решение было использовать SpatialPixelsDataFrameс предложенным toleranceаргументом (0,916421 в вашем случае).
Томас

Ответы:

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)
Роберт Хейманс
источник
отличное решение проблемы @ Роберт
ToNoY
Извините, вы можете уточнить, почему вы добавляете e <- e + 1000?
mmann1123
@ mman1123 Это просто для того, чтобы все работало с этими странными примерами. Все координаты y одинаковы и, следовательно, экстент равен нулю в направлении y, поэтому я добавляю 1000 - совершенно произвольно - чтобы иметь возможность создать растр из экстента.
Роберт Хейманс,
Есть ли питоническое решение для этого?
радж
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'])

однако из-за высокого значения допуска растр не очень хорошо подходит к исходным точкам. Может подойти гораздо лучше.

Tomas
источник
1
В первой строке кода отсутствует закрывающая скобка?
Антти
@ Антти спасибо, исправлено!
Томас