2015-08-26 2 views
13

Arbeiten mit dem sp-Paket in R. Ich frage mich, wann ich SpatialPoints und SpatialPointsDataframe verwenden würde. Es scheint mir so, dass es keinen großen Unterschied gibt ?!SpatialPoints und SpatialPointsDataframe

Ist der einzige Unterschied, dass ich in einem SpatialPointsDataframe mehr Attribute speichern kann ?! Wenn ja, kann ich einen SpatialPointDataframe aus einem vorhandenen Datenframe erstellen (wenn Koordinaten in diesem Datenrahmen vorhanden sind), ohne den Umweg zum Erstellen von spatialPoints zu nehmen?

+3

Sie können 'coordinates (Dataframe) <- c (easting, northing)' verwenden, um die Koordinaten eines vorhandenen Datenrahmens festzulegen. Dies wird den Datenrahmen zu einem räumlichen Objekt machen. "Easting" und "Northth" sind hier die Spaltennamen in 'Dataframe'. Sie können die Projektion auch mit 'proj4string' einstellen. –

Antwort

15

Sowohl SpatialPoints als auch SpatialPointsDataFrame-Objekte sind S4-Objekte. Es stimmt, dass der wichtigste strukturelle Unterschied darin besteht, dass in dem letzteren ein zusätzlicher Slot vorhanden ist, der die Attributdaten enthält. Die praktischen Unterschiede sind jedoch signifikanter. Um nur ein paar Beispiele zu nennen (unter Verwendung der integrierten meuse Datenbank aus dem Paket sp, die geokodierte Schadstoffdaten aus der Aue der Maas enthält).

library(sp) 
data(meuse) 
class(meuse)  # a data.frame 
# [1] "data.frame" 
head(meuse[,1:5]) # first 5 columns 
#  x  y cadmium copper lead 
# 1 181072 333611 11.7  85 299 
# 2 181025 333558  8.6  81 277 
# 3 181165 333537  6.5  68 199 
# 4 181298 333484  2.6  81 116 
# 5 181307 333330  2.8  48 117 
# 6 181390 333260  3.0  61 137 

coordinates(meuse) <- 1:2  # convert to spDF object; use first 2 columns for lon/lat 
class(meuse)     # now a SpatialPointsDataFrame 
# [1] "SpatialPointsDataFrame" 
# attr(,"package") 
# [1] "sp" 

Obwohl meuse ist ein SpatialPointsDataFrame, können wir immer noch Index es, als ob es sich um eine einfache data.frame war. Beachten Sie, wie wir auf die Spalte lead der Attributtabelle verweisen, als ob meuse ein DF wäre, und beachten Sie, wie die Indexierung funktioniert, wie es in einem DF geschieht.

meuse[meuse$lead>500,1:5]  # high lead 
#   coordinates cadmium copper lead zinc elev 
# 55 (179973, 332255) 12.0 117 654 1839 7.90 
# 60 (180100, 332213) 10.9  90 541 1571 6.68 
meuse[meuse$lead<40,1:5]   # low lead 
#    coordinates cadmium copper lead zinc elev 
# 112 (180328, 331158)  0.4  20 39 113 9.717 
# 161 (180201, 331160)  0.8  18 37 126 9.036 

Wir können auch die Plot-Methode verwenden, um SpatialPointsDataFrames die Daten plotten.

par(mfrow=c(1,2), mar=c(2,2,2,2)) # 1 X 2 grid of plots; remove margins 
plot(meuse, pch=20, main="Full Dataset", axes=TRUE) 
plot(meuse, 
    bg=rev(heat.colors(5))[cut(meuse$lead,breaks=c(0,100,200,300,400,Inf),labels=FALSE)], 
    col="grey",main="Lead Distribution", pch=21, axes=TRUE) 

Und wir können die Koordinaten in etwas nützlich (lon/lat) zu transformieren.

library(rgdal) 
proj4string(meuse) <- CRS("+init=epsg:28992")     # set original projection 
meuse <- spTransform(meuse, CRS("+proj=longlat +datum=WGS84")) # transform to lon/lat 
plot(meuse, pch=20, main="Full Dataset", axes=TRUE) 
plot(meuse, 
    bg=rev(heat.colors(5))[cut(meuse$lead,breaks=c(0,100,200,300,400,Inf),labels=FALSE)], 
    col="grey",main="Lead Distribution", pch=21, axes=TRUE) 

Und schließlich ein Gegenbeispiel, die Punkte auf einer Google-Karte überlagert:

library(ggmap) # loads ggplot2 as well 
map <- get_map(location=rowMeans(bbox(meuse)), zoom=13) # get Google map 
ggmap(map) + 
    geom_point(data=as.data.frame(meuse), aes(x,y,fill=lead), 
      color="grey70", size=3.5, shape=21)+ 
    scale_fill_gradientn(colours=rev(heat.colors(5))) 

Was wir hier im Wesentlichen getan haben, ist Konvertiere meuse von einem data.frame in einen spatialPointsDataFrame, so dass wir spTransform(...) auf der Koordinate verwenden könnten Dann konvertieren Sie das Ergebnis zurück in einen data.frame, so dass wir ggplot verwenden können, um sie auf einer Google-Karte zu überlagern.

+1

Danke für diese tolle Erklärung. Ich bin ein wenig in der Dokumentation des SP-Pakets verloren und finde es schwierig, durch gute Erklärungen/Tutorials online zu kommen! Ich hoffe, dass das von anderen gefunden wird! – Stophface

Verwandte Themen