Rの孤立した穴の修正


18

2つの隣接するシェープファイルをマージした後、共通フィールドでユニオンを実行しようとしています。シェープファイルは、それらの間に少なくとも1つの薄いスライバーで終わります。ユニオンを試行すると、次の孤立したホールエラーが発生します。

createPolygonsComment(p)のエラー:rgeos_PolyCreateComment:孤立した穴、インデックス17の穴に含まれるポリゴンが見つかりません

このリンクで Dropboxに再現可能な例をアップロードしました。

問題を再現するコードは次のとおりです。

#loading required packages
require(sp)    
require(rgdal)
require(maptools)
require(rgeos)

#load example data, set "dsn=" to your working directory or specify the path
example <- readOGR(dsn=".",layer="ReproducibleExample")

#Attempting a UnionSpatialPolygons based on the COUNTY field
example.df <- as(example, "data.frame")
countycol <- example.df$COUNTY
example.diss <- unionSpatialPolygons(example, countycol)

戻り値:

createPolygonsComment(p)のエラー:rgeos_PolyCreateComment:孤立した穴、インデックス17の穴に含まれるポリゴンが見つかりません

ここここで提案されいる修正を試してください

slot(example, "polygons") <- lapply(slot(example, "polygons"), checkPolygonsHoles)

これは、ユニオンの試行と同じエラーを返しますが、インデックス番号が異なります。

rgeos_PolyCreateComment:孤立した穴、インデックス30の穴に含まれるポリゴンが見つかりません

Roger Bivandの役立つチュートリアルで提案されている修正を試してみる

fix <- slot(example, "polygons")
fixa <- lapply(fix, checkPolygonsHoles)

インデックス30で上記と同じエラーを返します。

他の人がこの問題をここここで提起しており、上記の解決策はいくつかのケースで機能するように見えますが、他のケースは解決されません。1人のユーザーはQGISを使用して問題に対処し、もう1人のユーザーは3つのアイテムのうち2つを修正しましたが、最終的なアイテムの解決策はありませんでした。

このコードが時々機能しているにもかかわらず、人々は引き続き問題を抱えているようです。誰かがR内で解決策を見つけましたか?

ArcGISで「ジオメトリの修復」ツールを実行し、問題を修正しましたが、Rに修正が必要なようです。


データがなければ、どこに問題があるのか​​を特定するのは困難です。

@Pascal、問題を再現するために、圧縮された10 MBの圧縮されたシェープファイルと16 MBの圧縮解除された16 MBの圧縮されていないDropboxリンクをアップロードしました。元のデータが1.5 GBであったためデータを提供する方法がわかりませんでしたが、ArcGISを使用して問題をより小さなファイルに絞り込むことができました。管理可能なサイズの再現可能な例を作成および共有するための適切なプロトコルはありますか?
ルークマコーレー14

Rでさまざまなアプローチを試してもうまくいきませんでした。また、ジオメトリをチェックするときにQgisがフリーズします。

回答:


25

私は、添付データに幾何学の問題を解析してきた、それだけではなく、持っていないようだorphaned holesが、またgeometry validity issuesorphaned holeが何らかの理由でジオメトリの有効性の問題であることは事実ですが、孤立したホールの場合、単純な警告の代わりにエラーが発生するため、rgeosは同じ方法でそれを処理しません。あなたが示すように、それらは多角形の穴をチェックするためのヒントですが、孤立した穴を修正するために適用されたときに常に成功するとは限りません。

だから、しましょう:

  1. データをクリーンアップします(ユニオンのようなジオプロセシングを行う場合に必要です)

  2. ユニオンプロセスでクリーンデータを使用する

1.ジオメトリのクリーニング Rでジオメトリを修正するのは難しい場合があるため、オブジェクトのクリーニングを容易にするための実験的なRパッケージ(https://github.com/eblondel/cleangeoを参照)を作成しようとしましたsp(現在は多角形)。パッケージは次の方法でインストールできます。

require(devtools)
install_github("eblondel/cleangeo")
require(cleangeo)

まず、ソースデータのジオメトリの問題を確認しておくとよいでしょう。このために、次を実行できます(データが大きいため、時間がかかることがあります):

#get a report of geometry validity & issues for a sp spatial object
report <- clgeo_CollectionReport(sp)
summary <- clgeo_SummaryReport(report)
issues <- report[report$valid == FALSE,]

これにより、データに2種類の問題があることがわかります:orphaned holesgeometry validity issues。両方の(孤立したホールだけでなく)unionプロセスが失敗する可能性が高いため、可能であれば自動化された方法でデータを事前にクリーニングする必要があります。高速再生のために、以下の最初のサンプルコードは、疑わしいとタグ付けされた機能のサブセットのみを取得します(元のデータのインデックス= 9002の最新の機能を除く-これに関する下のメモを参照)

#get suspicious features (indexes)
nv <- clgeo_SuspiciousFeatures(report)
mysp <- sp[nv[-14],]

#try to clean data
mysp.clean <- clgeo_Clean(mysp, print.log = TRUE)

#check if they are still errors
report.clean <- clgeo_CollectionReport(mysp.clean)
summary.clean <- clgeo_SummaryReport(report.clean)

場合はclgeo_Cleanうまく仕事をして、あなたは今、すべてのジオメトリが有効な取得する必要があります。これを完全なデータセットに適用できます(機能インデックス= 9002を除く)

#try to clean data
mysp <- sp[-9002,]
mysp.clean <- clgeo_Clean(mysp, print.log = TRUE)

#check if they are still errors
report.clean <- clgeo_CollectionReport(mysp.clean)
summary.clean <- clgeo_SummaryReport(report.clean)

2.ユニオンプロセス次にunionこのデータセットで機能するかどうかを見てみましょう。

#Attempting a UnionSpatialPolygons based on the COUNTY field
mysp.df <- as(mysp, "data.frame")
countycol <- mysp.df$COUNTY
mysp.diss <- unionSpatialPolygons(mysp.clean, countycol)

注:前述のように、1つの機能(インデックス= 9002)を削除しました。それをプロットplot(sp[9002,])すると、この機能は非常に(非常に)複雑であることがわかります。穴のチェックに時間がかかりすぎたため、サンプルから除外しました。データの読み取りにreadShapePoly(from maptools)を使用して同じ問題が発生するかどうかを見てみましょう...

3.データを読み取るためにreadShapePolyとreadOGRに切り替えます(更新)

readOGRシェープファイルを読み取るために使用できる唯一の関数ではありません。パッケージreadShapePolyから使用することもできmaptoolsます。通常は、最初のものよりもパフォーマンスが高くなります。

require(maptools)
mysp <- readShapePoly("ReproducibleExample.shp")

より速く実行することは別として:

  • に基づいて上記のコードを使用する場合clgeo_CollectionReport、孤立した穴の問題はありませんが、ジオメトリの問題はあります。

  • を使用したジオメトリのクリーニングclgeo_Cleanも正常に実行され、フィーチャインデックス9002で動けなくなりました

  • そして...組合のプロセスは機能します。

以下のプロット結果を参照してください。

#plot the result
plot(mysp, border= "lightgray")
plot(mysp.diss, border="red", add = TRUE)

ユニオン結果

結論:好むmaptoolsをあなたのシェープファイルのデータを読み、使用することを検討するcleangeoを任意のジオプロセシングする前にデータをきれいにします。


eblondelに感謝します!これを試してみます。パッケージ開発をありがとう!
ルークマコーレー14

こんにちはeblondel、これはうまく機能しましたが、ジオメトリを修正すると、複雑で複雑なフィーチャを処理するときに非常に大きなポリゴンが作成されることがよくあることをお知らせしたいと思いました。たとえば、道路ネットワークは、基本的にネットワークの範囲である大きなポリゴンに修正されました。修正がどれほど簡単かはわかりませんが、お知らせしたいと思います。
ルークマコーレー

ワオ。非常に印象的なパッケージ。それは大変な仕事だったに違いありません。
nograpes

3
フィードバックをありがとう@nograpes。また、ジオメトリのクリーニングは必ずしも簡単な作業ではないため、この問題が投稿されたときに、このパッケージをゼロから作成しました。Githubを使用している場合は、「スター」を歓迎します:-)、今後パッケージをさらに改善し、CRANでリリースする可能性があります。
エブロンデル

7
cleangeoがCRAN(cran.r-project.org/package=cleangeo)で公開されていることを知らせるために、それを使用するすべての人々に、Githubで機能拡張リクエストまたはバグを報告してください。
エブロンデル

1

Rで私のために働き続ける便利な解決策は、ゼロ幅のバッファ適用することです

#loading required packages
require(sp)    
require(rgdal)
require(maptools)
require(rgeos)

#load example data, set "dsn=" to your working directory or specify the path
example <- readOGR(dsn=".",layer="ReproducibleExample")

#project your data (I'm using California Albers here) and apply a zero-width buffer
example <- spTransform(example, CRS("+init=epsg:3310"))
example <- gBuffer(example, byid = T, width = 0)

#Attempting a UnionSpatialPolygons based on the COUNTY field
example.df <- as(example, "data.frame")
countycol <- example.df$COUNTY
example.diss <- unionSpatialPolygons(example, countycol)

unionSpatialPolygonsはこのデータセットではしばらく時間がかかりますが、うまく機能しているようです。

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