Konvertieren von Punktdaten in einen gerasterten Datenrahmen für die Histogrammanalyse mit R?

14

Ich bin sehr neu im Umgang mit GIS-Daten und habe nur bescheidene Erfahrungen mit R. Ich habe gelesen, wie man Geodaten mit dem PDF-Buch "spatial-analyst.net" analysiert, daher bin ich nicht völlig verloren, aber ich dachte, ich könnte beschreiben Mein Problem und die Leute könnten Ideen vorschlagen.

Ich habe einen Datensatz mit ungefähr 2000 Messungen bei verschiedenen Längen- / Breitengraden, obwohl ich diesen Datensatz wahrscheinlich unterteilen werde, da die Daten über 3 Jahre gesammelt wurden und sich die Bedingungen im Laufe der Zeit geändert haben. Nennen wir die zu messende Variable "IP".

Ich möchte mit Kriging oder einer anderen Interpolationsmethode für die Beispieldaten eine IP-Karte im gesamten fraglichen Bereich erstellen. Dann möchte ich ein Histogramm erstellen, das die Landmenge in verschiedenen IP-Buckets misst. Ich muss auch ein Histogramm erstellen, das die Anzahl der Proben in jedem Bucket anzeigt (beachten Sie, dass eine Probe eine höhere oder niedrigere tatsächliche IP-Adresse haben kann als das, was Kriging für ihr Land vorhersagt).

Ich verfolge das Laden der Daten in einen SpatialPointsDataFrame und führe eine Kriging-Analyse durch. Dabei habe ich Probleme damit, diese Daten in einen gerasterten Datenframe zu konvertieren, damit ich die Histogrammanalyse durchführen kann.

Irgendwelche Vorschläge zur Umwandlung von Punkten in Gitter?

user1080253
quelle

Antworten:

12

Du hast recht ... es ist ziemlich einfach! Das "Raster" -Paket bietet einige recht einfache Möglichkeiten zum Erstellen und Bearbeiten von Rastern.

library(maptools)
library(raster)

# Load your point shapefile (with IP values in an IP field):
pts <- readShapePoints("pts.shp")

# Create a raster, give it the same extent as the points
# and define rows and columns:

rast <- raster()
extent(rast) <- extent(pts) # this might be unnecessary
ncol(rast) <- 20 # this is one way of assigning cell size / resolution
nrow(rast) <- 20

# And then ... rasterize it! This creates a grid version 
# of your points using the cells of rast, values from the IP field:
rast2 <- rasterize(pts, rast, pts$IP, fun=mean) 

Sie können die Rastergröße und -auflösung auf verschiedene Arten zuweisen. Lesen Sie die Dokumentation zum Rasterpaket.

Die Werte der Rasterzellen aus Rasterize können mit einer Funktion berechnet werden - im obigen Beispiel 'mean'. Stellen Sie sicher, dass Sie dies eingeben: Andernfalls wird nur der Wert von IP vom letzten Punkt verwendet, auf den es stößt!


Aus einer CSV:

pts <- read.csv("IP.csv")
coordinates(pts) <- ~lon+lat
rast <- raster(ncol = 10, nrow = 10)
extent(rast) <- extent(pts)
rasterize(pts, rast, pts$IP, fun = mean)
Simbamangu
quelle
Hey, das ist sehr nützlich, aber wie würde der Code aussehen, wenn ich mit den Punkten in einer einfachen CSV mit Lat / Longs anstatt eines Shapefiles beginnen würde? Die Spalten in der CSV wären IP, Lat, Long usw. usw.
user1080253
Sie haben angegeben, dass Sie die Daten bereits in einen SpatialPointsDataFrame geladen haben ... genau wie ptsin meinem obigen Beispiel. Führen Sie einfach den Code für Ihr SpatialPointsDataFrame-Objekt aus!
Simbamangu
4
Diese Antwort ist zwar hervorragend, scheint aber nicht das zu beantworten, was benötigt wird. (Es scheint stattdessen eine Lösung für gis.stackexchange.com/questions/20018 zu bieten .) Die Herausforderung besteht darin, etwa 2000 Punkte zu interpolieren und ihre Werte nicht nur Rasterzellen zuzuweisen. Da das OP behauptet, bereits eine "Kriging-Analyse" durchgeführt zu haben, handelt es sich bei dieser Frage darum, die Werte eines Rasters (etwa ) für die Verwendung in einer ähnlichen Prozedur zu extrahieren . rhisthist(getValues(r))
whuber
@whuber - Sieht so aus, als ob OP fragt, "wo ich Probleme habe, ist, wie ich diese Daten in einen gerasterten Datenrahmen konvertiere, damit ich die Histogrammanalyse durchführen kann ... irgendwelche Vorschläge zum Konvertieren von Punkten in Raster" als eigentliche Frage und weiß, wie um einen SpatialPointsDataFrame zu erstellen und das Kriging auszuführen. Aber Sie haben recht, es scheint ein Duplikat von 20018 zu sein (mit Ausnahme der gerasterten Eingabe).
Simbamangu
Entschuldigung, @ user1080253 ... Ich habe 'grid' als 'raster' gelesen, was nicht korrekt und für das Kriging nicht hilfreich ist. siehe hier für eine bessere Idee auf ein regelmäßiges Gitter zu schaffen und Interpolations - Daten zu diesem Netz.
Simbamangu
3

Das plotKML-Paket hat eine Funktion namens vect2rast. Diese Funktion erweitert im Wesentlichen die im rasterizeRasterpaket verfügbare Funktion. Der Vorteil von vect2rast; Dies bedeutet jedoch, dass keine Eingaben seitens des Benutzers erforderlich sind, dh, die Größe der Rasterzellen und der Begrenzungsrahmen werden automatisch anhand der Eigenschaften des Eingabedatensatzes bestimmt. Die Größe der Rasterzellen wird basierend auf der Dichte / Größe der Features in der Karte geschätzt ( nndistFunktion im spatstat-Paket).

library(plotKML)
Rast2 <- vect2rast(pts)

# for large data sets use SAGA GIS:
Rast2 <- vect2rast(pts, method = "SAGA")
HassanSh__3571619
quelle