web-dev-qa-db-ja.com

SpatialPointsおよびSpatialPointsDataframe

Rで sp パッケージを使用しています。SpatialPointsをいつ使用し、いつSpatialPointsDataframeを使用するのでしょうか。あまり差がないように思えるのですが!?

SpatialPointsDataframeでより多くの属性を格納できる唯一の違いはありますか?!その場合、spatialPointsの作成の迂回を行わずに、既存のDataframeからSpatialPointDataframeを作成できますか(座標がこのデータフレームに存在する場合)?

17
Stophface

SpatialPointsオブジェクトとSpatialPointsDataFrameオブジェクトはどちらもS4オブジェクトです。主な構造上の違いは、後者の場合、属性データを含む追加のスロットがあることは事実です。ただし、実際的な違いはより重要です。ほんの数例を示します(パッケージ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"
_

meuseはSpatialPointsDataFrameですが、単純なdata.frameであるかのようにインデックスを付けることができます。属性テーブルのlead列をmeuseがdfであるかのように参照する方法に注意してください。また、索引付けが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)
_

そして、座標をより有用なものに変換できます(lon/lat)。

_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に変換し、座標でspTransform(...)を使用して、結果をデータに戻すことです。 .frameを使用して、ggplotを使用してGoogleマップにオーバーレイすることができます。

17
jlhoward