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はSJER2
はSpatialPolygons
オブジェクトに格納されます。
次に、これをシェープファイルに書き出します。
?'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)
基本的な要点は、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))