Rの空間ポリゴンオブジェクトのリストをマージします


16

関数で構築した空間バッファー(30000バッファー)のリストがありますlapply

buff.pts <- lapply(1:nrow(pts.prj), FUN=function(l){
  buff <- gBuffer(pts.prj[l,], width=1000) ## 1km
  return(buff)
}))

> head(buff.pts)
[[1]]
class       : SpatialPolygons 
features    : 1 
extent      : 307941.8, 311941.8, 4994518, 4998518  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=tmerc +lat_0=0 +lon_0=-73.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs +towgs84=0,0,0 

[[2]]
class       : SpatialPolygons 
features    : 1 
extent      : 307226, 311226, 4991153, 4995153  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=tmerc +lat_0=0 +lon_0=-73.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs +towgs84=0,0,0 

このリストから、すべての空間バッファーをマージして30000バッファー(または機能)を持つシェープファイルを取得するにはどうすればよいですか?(このシェープファイルは、aggregate属性で空間ポリゴンを集約する関数で使用されます。)

このコードをテストしましたが、次のエラーメッセージが表示されます。

test <- as.data.frame(do.call("rbind", buff.pts))
Error in as.data.frame(do.call("rbind", buff.pts)) : 
  error in evaluating the argument 'x' in selecting a method for function 'as.data.frame': Error in validObject(res) : 
  invalid class SpatialPolygons object: non-unique Polygons ID slot values

3
lapply使用gBufferする代わりにでバッファを構築する必要がある理由はbyid = TRUE何ですか?
cengel

回答:


12

SpatialPolygonsオブジェクトのリストを指定して、元のSpatialPolygonsフィーチャごとに1つのフィーチャを持つ空間ポリゴンデータフレームを作成する方法を次に示します。

サンプルデータ:spl12 SpatialPolygons個のオブジェクトのリストです-オブジェクトがこれと同じ結果を与えることを確認し、30,000で実行する前に小さなサンプルでテストします。

> length(spl)
[1] 12
> class(spl)
[1] "list"
> class(spl[[1]])
[1] "SpatialPolygons"
attr(,"package")
[1] "sp"

Spatial Polygons次に、空間ポリゴンデータフレームを作成するために、すべての機能を備えた単一のオブジェクトを作成します。

> joined = SpatialPolygons(lapply(spl, function(x){x@polygons[[1]]}))
> plot(joined)

これは、polygonsオブジェクトから最初のスロットSpatialPolygonsを取得し(各リスト要素は現在単一の機能であるため、1つのみ存在する必要があります)、次に、複数の機能を作成するためにフィードするPolygonsオブジェクトのリストを作成しますSpatialPolygons。これをプロットすると、すべての機能が表示されます。次に、として保存する場合はshapefile、データを追加する必要があります。他に何もない場合、単純な1〜​​12のID列を作成します。

> jdata = SpatialPolygonsDataFrame(Sr=joined, data=data.frame(i=1:12),FALSE)

FALSEフラグはちょうどRが一致した空間と非空間データを再配置しようと停止します。データフレームなどにバッファサイズを入れたい場合があります。

仕事完了。



2

ポリゴンに一意のIDがない場合、rbindでmakeUniqueIDs引数を使用できます。

 library(purrr)

list(buff.pts, makeUniqueIDs = T) %>% 
  flatten() %>% 
  do.call(rbind, .)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.