ポリゴンをクリップしてデータを保持しますか?


13

次の2つのポリゴンがあります。

library(sp); library(rgeos); library(maptools)

coords1 <- matrix(c(-1.841960, -1.823464, -1.838623, -1.841960, 55.663696,
                    55.659178, 55.650841, 55.663696), ncol=2)
coords2 <- matrix(c(-1.822606, -1.816790, -1.832712, -1.822606, 55.657887,
                    55.646806, 55.650679, 55.657887), ncol=2)
p1 <- Polygon(coords1)
p2 <- Polygon(coords2)
p1 <- Polygons(list(p1), ID = "p1")
p2 <- Polygons(list(p2), ID = "p2")
myPolys <- SpatialPolygons(list(p1, p2))
spdf1 = SpatialPolygonsDataFrame(myPolys, data.frame(variable1 = c(232,
                                                                   242), variable2 = c(235, 464), row.names = c("p1", "p2")))
proj4string(spdf1) <- CRS("+proj=longlat +datum=WGS84 +ellps=WGS84
+towgs84=0,0,0")
plot(spdf1, col="red")

coords1a <- matrix(c(-1.830219, -1.833753, -1.821154, -1.830219, 55.647353,
                     55.656629, 55.652122, 55.647353), ncol=2)
p1a <- Polygon(coords1a)
p1a <- Polygons(list(p1a), ID = "p1a")
myPolys1 <- SpatialPolygons(list(p1a))
spdf2 = SpatialPolygonsDataFrame(myPolys1, data.frame(variable1 = c(2),
                                                      variable2 = c(3), row.names = c("p1a")))
proj4string(spdf2) <- CRS("+proj=longlat +datum=WGS84 +ellps=WGS84
+towgs84=0,0,0")
plot(spdf2, col="yellow", add=T)

ここに画像の説明を入力してください

spdf1交差する部分を切り取りたいspdf2。ただし、spdf1SpatialPolygonsDataFrameのままにして、に含まれる情報を保持したいですspdf1@data

次のようにgDifferenceを試しました。gDifferenceは、とspdf1交差する部分を切り取りますspdf2が、その後spdf1SpatialPolygonsに変換します(つまり、に含まれる情報を破棄しますspdf1@data)。

gDifference(spdf1, spdf2, byid=T)

どのように私はにカットできるspdf1とのspdf2データが含まれているに保持しているがspdf1@dataSpatialPointsDataFrameにポリゴンをオーバーレイしてSPDFデータを保存する方法なしにこの同様の質問を確認してみました

回答:


9

最も簡単なアプローチは

  library(raster)
  x <- spdf1 - spdf2

  # or, more formally
  y <- erase(spdf1,  spdf2)

ポリゴンオーバーレイを処理するその他の関数については、「 'raster-package'(セクションXIV)」を参照してください。これらの関数は、「ユーザーレベル」(「開発者レベル」とは対照的に)関数で、フードの下でrgeosの基本関数を使用します。


「(「開発者レベル」ではなく)「ユーザーレベル」機能」とはどういう意味ですか?
ルチアーノ

rgeos幾何学的操作を提供しますが、データの属性を処理しません。したがって、これらの関数を使用するには、すべてをまとめるために多くの作業が必要です。ラスタ関数は、これを単純化し、GISソフトウェアで同様の機能、のように振る舞う
ロバートHijmans

ええ、しかしこれはSpatialPolygonsDataFrame(part2、x @ data [match(row.names(part2)、:row.names of data and Polygons IDs not match
jebyrnes

それはバグでしょう。その例を提供できますか?
ロバートハイマンス

4

回避策は、クリップの実行後にからSpatialPolygonsに変換しながら属性を再追加することSpatialPolygonsDataFrameです。

sp3 <- gDifference(spdf1, spdf2, byid = TRUE)
row.names(sp3) <- row.names(spdf1)

spdf3 <- SpatialPolygonsDataFrame(sp3, data = spdf1@data)

spdf3@data

   variable1 variable2
p1       232       235
p2       242       464

plot(spdf3, col="red")

ここに画像の説明を入力してください


これは私が抱えている問題のように見えます。特定のインスタンスの出力クリップのみが存在しないspdf1から行名を生成します(row.namesの2桁目を取り除く単純なgsubとして、rownamesの一致を処理する必要がありますか? )
jebyrnes

SpatialPolygonsDataFrame(clip、data = as.data.frame(all_spdfs_together @ data))のエラー:オブジェクトの長さの不一致:クリップには1718個のPolygonsオブジェクトがありますが、as.data.frame(all_spdfs_together @ data)には86行あります
jebyrnes

確かに、海にはたくさんのポリゴンがあります。いくつかは、土地に誤って配置されているか、土地と重なっています。私はそれを切り取りたいので、海にいるエリアだけがあります。比較する海岸線シェープファイルがあります。コードは次のとおりです-gist.github.com/jebyrnes/c2e8d2b6c82849dad3a813d952ab8bb0
jebyrnes

1
nevermind-
raster
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.