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.
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. –