So erstellen Sie RASTER aus unregelmäßigen Punktdaten ohne Interpolation


13

Ich habe versucht, ein Rasterbild aus einer Datenbank mit unregelmäßigen Abständen zu erstellen. Die Daten sehen aus wie-

> 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

Ich möchte diese 'z'-Werte in einem von mir erstellten Netz haben

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

Ich möchte auch, dass die Z-Werte für die Netzpunkte, die sich außerhalb der Datenpunkte befinden, als "NA" zugewiesen werden. Die Punkte über dem Netz sehen folgendermaßen aus: https://drive.google.com/file/d/0B6GUNg-8d30vYzlwTkhvaHBFTnc/edit?usp=sharing, wenn ich plotte

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

Das Problem ist, dass ich nicht sicher bin, wie ich darauf aufbauen soll. Die folgenden Schritte funktionieren nicht, weil mein Gitter und meine Datenpunkte nicht den gleichen Maßstab haben.

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

Wenn ich versuche, ein Raster nur mithilfe der Datenpunkte (ohne Gitter) zu erstellen, gibt R einen Fehler aus, da meine Daten einen unregelmäßigen Abstand aufweisen!

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

Außerdem habe ich versucht, mit der 'Rasterize'-Funktion (für unregelmäßige Raster) des' Raster Package 'zu spielen, konnte mich aber nicht damit abfinden :(. Ich weiß, wie man interpoliert und ein reguläres Raster erstellt, aber aus Gründen Originalität möchte ich vermeiden, Interpolation. Ist es möglich, ein Raster von unregelmäßig beabstandeten Datenpunkten ohne IDW- oder Kriging-Methoden zu erstellen?


Das Problem bei Gittern mit unregelmäßigen Abständen besteht darin, dass der Algorithmus fehlschlägt, wenn die Punkte zu nah / fern beieinander liegen. Eine (nicht optimale) Problemumgehung: Nehmen Sie den minimalen Abstand zwischen den Zellen und erstellen Sie ein rechteckiges Vektorraster. Fügen Sie dann die Durchschnittswerte der Punkte zu diesem Raster hinzu und rastern Sie es.
Brachvogel

Ich hatte das gleiche Problem - die Lösung war SpatialPixelsDataFramemit dem vorgeschlagenen toleranceArgument (0,916421 in Ihrem Fall) zu verwenden.
Tomas

Antworten:


18

Ich gehe davon aus, dass Sie Ihre unregelmäßigen Punktdaten in einem regulären Raster haben möchten. In diesem Fall sollte das Rastern funktionieren, und die Beispiele in? Rasterize zeigen, wie. Hier ist etwas basierend auf Ihren Daten

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)

ausgezeichnete Lösung für das Problem @ Robert
ToNoY

Entschuldigung, können Sie klären, warum Sie e <- e + 1000 hinzufügen?
mmann1123

@ mman1123 Das soll nur dazu dienen, dass die Dinge mit diesen seltsamen Beispieldaten funktionieren. Alle y-Koordinaten sind gleich und daher ist die Ausdehnung in y-Richtung Null, also addiere ich 1000 - völlig willkürlich -, um aus der Ausdehnung ein Raster erstellen zu können.
Robert Hijmans

Gibt es dafür eine pythonische Lösung?
raaj

5

Das hat bei mir funktioniert - die Lösung war die Verwendung von SpatialPixelsDataFrame mit dem vorgeschlagenen Toleranzargument (in Ihrem Fall 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'])

Aufgrund des hohen Toleranzwerts passt das Raster jedoch nicht sehr gut zu den ursprünglichen Punkten. Könnte viel besser passen.


1
In der ersten Codezeile fehlt eine schließende Klammer?
Antti

@Antti danke, korrigiert!
Tomas
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.