Rでspパッケージを使用しています。あまり違いがないように思えますか?
SpatialPointsDataframe でより多くの属性を格納できるという唯一の違いはありますか?! もしそうなら、spatialPointsを作成する迂回路を使わずに、既存のデータフレームからSpatialPointDataframeを作成できますか(このデータフレームに座標が存在する場合)?
SpatialPoints オブジェクトと SpatialPointsDataFrame オブジェクトはどちらも S4 オブジェクトです。主な構造上の違いは、後者には属性データを含む追加のスロットがあることです。ただし、実際の違いはより重要です。いくつかの例を挙げます ( Meuse 川の氾濫原からの地理コード化された汚染物質データを含むmeuse、パッケージの組み込みデータベースを使用します)。sp
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"
はSpatialPointsDataFramemeuseですが、単純な data.frame であるかのようにインデックスを作成できます。lead属性テーブルの列を df であるかのように参照する方法meuseと、df でのインデックス作成の動作に注意してください。
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
SpatialPointsDataFrames の plot メソッドを使用してデータをプロットすることもできます。
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)
そして、座標をより便利なもの (経度/緯度) に変換できます。
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)
最後に反例として、ポイントを Google マップに重ねます。
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)))
ここで行ったことは、本質的に、座標でmeuse使用できるように data.frame から spatialPointsDataFrame に変換し、次に結果を data.frame に変換して、それらを Google にオーバーレイするために使用できるようにすることです。地図。spTransform(...)ggplot