maptools

2014年1月25日 (土)

SpatialLinesDataFrameオブジェクトから座標データを簡単に抜き出す。

ggplot2パッケージに含まれる関数fortifyを使うと、SpatialLinesDataFrameオブジェクトから座標データを簡単なデータフレーム形式に変換してくれる。以下に、線が20含まれるシェープファイルmap.shpを使用した例を示す。「・・・」は表示を省略している箇所。

> library(maptools)
> library(ggplot2)
> shp <- readShapeLines("map.shp")
> shp
(大量にデータが表示される)
> length(shp)  # 線の数
[1] 20
> df <- fortify(shp)  # データフレーム形式に変換
> is.data.frame(df)
[1] TRUE
> head(df, 3)
         long         lat order piece group id
1 ・・・
2 ・・・
3 ・・・
> tail(df, 3)
             long         lat order piece  group   id
○○ ・・・
○○ ・・・
○○ ・・・

含まれる線の識別は列idを見ればよい。上記の例でいうと、列idは1から始まり線が変わることにidが1ずつ増えて最終行のidは20になる。

2014年1月24日 (金)

SpatialLinesDataFrameオブジェクトから座標データを抜き出す。

S4クラスである。下記は線の数が20含まれるmap.shpというシェープファイルを読み込んだときの例。「・・・」は表示を省略していることを示す。

> library(maptools)
> shp <- readShapeLines("map.shp")
> mode(shp)  # クラスを確認
[1] "S4"
> length(shp)  # シェープファイルに含まれる線の数
[1] 20
> shp@lines[[1]]@Lines[[1]]@coords  # 1番目の線の座標
            [,1]        [,2]
[1,] ・・・
[2,] ・・・
[3,] ・・・
> shp@lines[[2]]@Lines[[1]]@coords  # 2番目の線の座標
             [,1]        [,2]
[1,] ・・・
[2,] ・・・
[3,] ・・・
[4,] ・・・
> shp@lines[[20]]@Lines[[1]]@coords  # 最後(20番目)の線の座標
            [,1]        [,2]
[1,] ・・・
[2,] ・・・
> shp@lines[[21]]@Lines[[1]]@coords  # 最後の次は当然無い
以下にエラー shp@lines[[21]] :  添え字が許される範囲外です
> is.matrix(shp@lines[[20]]@Lines[[1]]@coords)  # 座標データの形式を確認
[1] TRUE

座標データは、1桁目(上の[,1])にx座標(横軸方向)が、2桁目(上の[,2])にy座標(縦軸方向)が格納されている。

なお、spsurveyパッケージの関数read.shapeを使用して作成したオブジェクトでも扱いは全く同じ。

エラーメッセージ「Not polygon shapes」

maptoolsパッケージの関数readShapePolyを使用してシェープファイルを読み込むとき、うまくいかないことがある。以下はmap.shpというファイルを読み込むときの例。

> library(maptools)
要求されたパッケージ sp をロード中です
Checking rgeos availability: TRUE
> shp <- readShapePoly("map.shp")
以下にエラー .asSpatialPolygonsShapes(Map$Shapes, IDs, proj4string = proj4string,  :
  Not polygon shapes

シェープファイルにポリゴンのデータが含まれていないからと思われる。よって、この関数では扱えない。関数readShapeLinesを使えばよい。

> shp <- readShapeLines("map.shp")