Як зробити RASTER з даних неправильної точки без інтерполяції


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

Більше того, я намагався грати з функцією 'rasterize' (для нерегулярних сіток) 'растрового пакету', але не міг знайти шлях до нього :(. Я знаю, як інтерполювати та робити звичайну сітку, але заради Оригінальність, я хочу AVOID інтерполяції. Чи можна зробити растр неправильно розташованих точок даних без idw або методів крігінгу?


Проблема з неправильними розташованими сітками полягає в тому, що алгоритм виходить з ладу, якщо точки лежать занадто близько / далеко один від одного. Неоптимальне вирішення: чому б не пройти мінімальну відстань між клітинками та створити прямокутну векторну сітку. Потім приєднайте середні значення точок до цієї сітки та розтрішіть її.
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 --- цілком довільно ---, щоб можна було зробити растр із міри.
Роберт Хіджманс

Чи є для цього пітонічне рішення?
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 спасибі, виправлено!
Томаш
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.