Rの逆クリッピング(消去)?


14

他のオブジェクトの内側にある 部分を保存する通常のクリップとは対照的に、リバースクリップは、別のオブジェクトの境界の外側にある空間オブジェクトの部分のみを保存します。

ArcMapで逆クリップを実行していますか?ArcMapでそれを行う方法を示します。

Rでこれを行うにはどうすればよいですか?

再現可能な例(Linuxマシンの場合):

system("wget 'https://github.com/Robinlovelace/Creating-maps-in-R/archive/master.zip' -P /tmp/")
unzip("/tmp/master.zip", exdir = "/tmp/master")
uk <- readOGR("/tmp/master/Creating-maps-in-R-master/data/", "ukbord")
lnd <- readOGR("/tmp/master/Creating-maps-in-R-master/data/", "LondonBoroughs")
plot(uk)
plot(lnd, add = T, col = "black")

ここでやりたいことは、ロンドンを除くすべての英国救うことです。視覚的には、結果の画像の黒い形状が穴になるようにします。

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

回答:


4

シンプルな機能に対する回答:

sfパッケージはGeometry Engine Open Sourceを利用するため、st_withinなどのコマンドのリストにアクセスできます。

そのようなコマンドの1つであるst_differenceは、仕事をします:

require(sf)

# make a square simple feature
s <- rbind(c(1,1), c(1,5), c(5,5), c(5,1), c(1,1))
s.sf <-st_sfc(st_polygon(list(s)))
s.pol = st_sf(ID = "sq", s.sf)

# make a smaller triangle simple feature
s2 <- rbind(c(2,2), c(3,4), c(4,2), c(2,2))
s2.sf <-st_sfc(st_polygon(list(s2)))
s2.pol = st_sf(ID = "tr", s2.sf)

# find the 'difference', i.e. reverse of st_intersection
t <- st_difference(s.pol,s2.pol)

plot(t)

# have a look at the new geometry, a well known text format with exterior followed by hole
st_geometry(t)[[1]]
POLYGON((1 1, 1 5, 5 5, 5 1, 1 1), (2 2, 4 2, 3 4, 2 2))

また、この記事の下部に向かって参照してください

また、st_as_sfを使用してSpをsfに強制することでも実行できます。属性は管理が難しい場合があるため、警告に注意してください!


12

パッケージgDifferenceからの単純なアプリケーションのようですrgeos

> require(rgeos)
> ukhole = gDifference(uk, lnd)
Warning message:
In RGEOSBinTopoFunc(spgeom1, spgeom2, byid, id, "rgeos_difference") :
  spgeom1 and spgeom2 have different proj4 strings
> plot(ukhole)

投影警告は、LondonBoroughsシェープファイルにファイルがないため.prjです。

アウトラインや別のソリッドポリゴンではなく、穴であることを確認するためだけに:

> gArea(lnd) + gArea(ukhole) - gArea(uk)
[1] 0

すっごく簡単です、速い応答に感謝します。これらの関数のソースコードを見て、内部で何が起こっているのかを調べることに興味があるでしょう。
ロビンラブレス14

深いところでは、ジオメトリ関数のCコードライブラリであるGEOSを呼び出すだけですtrac.osgeo.org/geos
Spacedman

興味深い-そして、それが合理的に速い理由を説明するのに役立ちます。このページに基づいて、積極的に開発されていないようですが、これを確認/反論することはできますか?svn.osgeo.org/geos/branches/3.4/ChangeLog
RobinLovelace

1
確かに開発されています。タイムラインtrac.osgeo.org/geos/timelineまたはメーリングリストのアーカイブを参照してくださいlists.osgeo.org/pipermail/geos-devel
user30184

5

パーティーに少し遅れましたが、「逆」引数を使用してマスクでこれを行う簡単な方法があります。

ukhole <- mask(uk, lnd, inverse = TRUE)

ラスターパッケージから。そして、sfから何かアイデアはありますか?
-RobinLovelace
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.