web-dev-qa-db-ja.com

SpatialPolygons-座標からRに一連のポリゴンを作成する

X、Y形式で保存された頂点の場所からポリゴンのセットを作成しようとしています。

これが私のデータの例です-各行は1つのポリゴンの頂点を表します。ポリゴンは正方形です

square <- rbind(c(255842.4, 4111578, 255862.4, 4111578, 255862.4, 4111558, 
                  255842.4, 4111558, 255842.4, 4111578, 255842.4, 4111578),
                c(257397.0, 4111309, 257417.0, 4111309, 257417.0, 4111289, 
                  257397.0, 4111289, 257397.0, 4111309, 257397.0, 4111309))

ID <- c("SJER1", "SJER2")'

私はSpatialPolygonsを使用しているため、データをリストに含める必要があります。そのため、マトリックスからリスト形式にデータを取得しようとするループを作成しました。

このサイトの他の質問で見つけたコードに従ってループを作成します。 2セットのポイントがあるにもかかわらず、出力としてポリゴンが1つしか取得されない理由を理解するために、各ステップを開始しました。

for (i in 1:2) {  
  pts <- rbind(c(square[i,1], square[i,2]), c(square[i,3], square[i,4]), 
               c(square[i,5],square[i,6]), c(square[i,7],square[i,8]), 
               c(square[i,9],square[i,10]))
  sp1 <- list(Polygon(pts))
  sp2 <- list(Polygons(sp1,i))
  sp = SpatialPolygons(sp2)  
}
plot(sp)

1つのポリゴンではなく2つのポリゴンを書き出すようにコードを調整する方法を教えてください。また、マトリックス(正方形)を開始データセットとして使用して、各ポリゴンにIDを割り当てる方法と、文字IDを割り当てると、すべてのデータが文字に変換されます。

私の最終的な目標は、SpatialPolygonsオブジェクト内の2つのポリゴンであり、最初のポリゴンはID SJER1と2番目のIDはSJER2SpatialPolygonsオブジェクトに格納されます。

次に、これをシェープファイルに書き出します。

14
Leah Wasser

?'SpatialPolygons-class'にはいくつかの情報がありますが、多かれ少なかれ、次のことを実行したいと考えています。

polys <- SpatialPolygons(list(
  Polygons(list(Polygon(matrix(square[1, ], ncol=2, byrow=TRUE))), ID[1]),
  Polygons(list(Polygon(matrix(square[2, ], ncol=2, byrow=TRUE))), ID[2])
))

plot(polys)

enter image description here

基本的な要点は、Polygonオブジェクトを作成する必要があることです(たとえば、最初の列にx座標、2番目の列にy座標を持つ2列の行列から)。これらはリストで結合され、Polygonsオブジェクトを作成します(それぞれに一意のIDが必要です)。これらのPolygonsオブジェクトをリストにまとめて、SpatialPolygonsオブジェクトを作成します。 CRSへのproj4string引数を使用して、必要に応じてSpatialPolygonsを追加できます(?SpatialPolygonsを参照)。

ESRIシェイプファイルに書き出すには、作成したSpatialPolygonsDataFrameオブジェクトといくつかのデータを組み合わせて、polysオブジェクトに変換する必要があります。さらに興味深いものがないため、IDをデータとして追加するだけです。

polys.df <- SpatialPolygonsDataFrame(polys, data.frame(id=ID, row.names=ID))

そしてそれを書きなさい...

writeOGR(polys.df, '.', 'fancysquares', 'ESRI Shapefile')

2番目の引数('.')は、現在の作業ディレクトリに書き出すことを示しています。


[〜#〜]編集[〜#〜]

ポリゴンを説明する行が多い場合にSpatialPolygonsDataFrameをすばやく作成するには、次を使用できます。

# Example data
square <- t(replicate(50, {
  o <- runif(2)
  c(o, o + c(0, 0.1), o + 0.1, o + c(0.1, 0), o)
}))
ID <- paste0('sq', seq_len(nrow(square)))

# Create SP
polys <- SpatialPolygons(mapply(function(poly, id) {
  xy <- matrix(poly, ncol=2, byrow=TRUE)
  Polygons(list(Polygon(xy)), ID=id)
}, split(square, row(square)), ID))

# Create SPDF
polys.df <- SpatialPolygonsDataFrame(polys, data.frame(id=ID, row.names=ID))

plot(polys.df, col=Rainbow(50, alpha=0.5))

enter image description here

27
jbaums