TopologyExceptionの取得:入力geom 1は無効です。これはRの自己交差によるものですか?


24

無効なポリゴンジオメトリから発生する「TopologyException:Input geom 1 is invalid」自己交差エラーは広く議論されています。しかし、R機能だけに依存する便利な解決策をWeb上で見つけられませんでした。

たとえば、私はここでmap("state", ...) Josh O'Brienの素敵な答えを次の出力から「SpatialPolygons」オブジェクトを作成することができまし

library(maps)
library(maptools)

map_states = map("state", fill = TRUE, plot = FALSE)

IDs = sapply(strsplit(map_states$names, ":"), "[[", 1)
spydf_states = map2SpatialPolygons(map_states, IDs = IDs, proj4string = CRS("+init=epsg:4326"))

plot(spydf_states)

州

この広く適用されているデータセットの問題は、以下のポイントで自己交差が発生することです。

rgeos::gIsValid(spydf_states)
[1] FALSE
Warning message:
In RGEOSUnaryPredFunc(spgeom, byid, "rgeos_isvalid") :
  Self-intersection at or near point -122.22023214285259 38.060546477866055

残念ながら、この問題は、たとえばを呼び出すときに、 'spydf_states'の使用を妨げますrgeos::gIntersection。R内からこの問題を解決するにはどうすればよいですか?


1
その点を拡大すると、plot(spydf_states, xlim=c(-122.1,-122.3),ylim=c(38,38.1))「一見したところ」ではないことがわかります-自己交差があります。
Spacedman

回答:


39

ゼロ幅バッファを使用すると、Rの多くのトポロジの問題が解決されます。

spydf_states <- gBuffer(spydf_states, byid=TRUE, width=0)

ただし、投影されていない緯度経度座標を使用するとrgeos、警告がスローされる可能性があります。

以下は、最初にAlbersプロジェクションに再投影する拡張例です。

library(sp)
library(rgeos)

load("~/Dropbox/spydf_states.RData")

# many geos functions require projections and you're probably going to end
# up plotting this eventually so we convert it to albers before cleaning up
# the polygons since you should use that if you are plotting the US
spydf_states <- spTransform(spydf_states, 
                            CRS("+proj=aea +lat_1=29.5 +lat_2=45.5 +lat_0=37.5 +lon_0=-96"))

# simplify the polgons a tad (tweak 0.00001 to your liking)
spydf_states <- gSimplify(spydf_states, tol = 0.00001)

# this is a well known R / GEOS hack (usually combined with the above) to 
# deal with "bad" polygons
spydf_states <- gBuffer(spydf_states, byid=TRUE, width=0)

# any bad polys?
sum(gIsValid(spydf_states, byid=TRUE)==FALSE)

## [1] 0

plot(spydf_states)

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


4
gBuffer「ハック」が機能する理由についての追加のコメント/読書
MichaelChirico

gSimplifyを使用してdata.frameを分解し、SPDFを空間ポリゴンオブジェクトに変換しますか?
-wnursal

5
あなたが使用している場合sf、あなたはまた、使用することができますsf::st_buffer(x, dist = 0)
フィル・

使用しているときにも、いくつかのケースで動作しますPostGIS
natsuapo
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.