重複するジオメトリを見つけるためのGIS分析


9

私が働いている町のすべての建物と家を含む大きなシェープファイルがあります(約90,000個のフィーチャ)。建物/家屋のデータは町の測量技師によって保存され、悪い習慣とそのデータへのさまざまな測量士のアクセスにより、多くの建物/家屋が2回保存され、重複してマップに表示されています。

それらの一部は正確に複製され(一方が他方の上に表示されます)、もう一方は2つのオブジェクト間にスペースを空けて複製されます(一方のオブジェクトが他方の中にあるように-添付のスクリーンショットを参照)。

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

そのデータを整理して、町に正しい建物や家だけができるようにしたいので、私の質問は次のとおりです。

すべての複製されたフィーチャ(正確なものと他の内部にあるものの両方)を見つけるために実行できるGIS分析またはSQL式はありますか?私はArcGISとQGISの両方を持っているので、あなたの提案をすべて受け入れます。


同一削除ツールを試してみることができます。ただし、エンタープライズライセンスレベルが必要です。あなたはで利用可能ないくつかの他のオプション見直すことができる技術記事36031んのArcGISが重複ジオメトリを識別するための方法または削除機能を提供し 、あなたの最善の策であるデータレビューExtenstion。ただし、これらのツールはいずれも分割ジオメトリに対応しません
MDHald

また、表形式のコンポーネントは同一削除ツールでは比較されないことを考慮する必要があります。答えはわかりませんが、問題解決に役立つことを願っています。
MDHald 2014

データはデータベースにありますか?どのタイプ?
ラッセル、ISCの

1つのオプションとして、ArcMap で(この回答で説明されているように)交差ツールを使用し、オーバーラップの場所を出力することができます。削除するポリゴンを手動でチェックして決定する必要がありますが、完全に重複していない場合は、とにかくそうする必要があると思います。
エリカ

4
「重複」という用語の使用は、この質問では少し誤解を招きます。完全に同一のスタックされたコピーの場合、はい、それらは重複している(または属性である可能性があります-重複している)ほか、他の人がそのライセンスレベルを持っている場合は、削除ツールまたは同一検索ツールが役立つ可能性があることを示唆しています。しかし、それらがまったくオフセットされている場合、または別の形状である場合、それら自体は実際には複製ではありません。Advancedライセンスをお持ちの場合は、ジオデータベーストポロジを調べ、重複しないようにするチェックを実行します。Advancedがなければ、Luigiの回答が示唆するように、おそらく同じことがQGISとプラグインで実行できます。
クリスW

回答:


4

QGISでは、トポロジーチェッカープラグインが問題を適切に解決できます


3
トポロジーはおそらくデータのクリーンアップの問題に対する単一の最良のソリューションであることに同意します。ただし、プラグインへのリンクを提供し、トポロジが何であるか、または何であるか、およびどのチェックを実行するかについての簡単な説明を提供することで、答えを少し広げることができます。入力した回答が低品質として報告される可能性があります。
クリスW

わかりました:プラグインの説明はここにあります:docs.qgis.org/2.2/en/docs/user_manual/plugins/…そして「重複してはいけません」は問題に近づくことができます。プラグインのビデオガイドはこちらです:youtube.com/watch?v=huhkTZkoKC8
ルイージピレリ

6

私は、PythonのitertoolsSearchCursorを使用して、目的の空間関係を見つける非常に効率的な方法を見つけます。あなたは組み込むことができ、ジオメトリメソッドを overlapscontainsequal幾何学的な特性で取得します。

  1. ワークフローをよりよく整理し、再現性を高めるための関数を作成することから始めます

    def findOverlaps(x):

  2. 検索カーソルを開いて、個々のフィーチャジオメトリをループします

    with arcpy.da.SearchCursor(x, ['OID@', 'SHAPE@']) as cur:

  3. itertools.combinations()入力イテラブルから要素のサブシーケンスを返すために使用しますcur

    for feature1,feature2 in itertools.combinations(cur, 2):

  4. 次の方法でジオメトリプロパティにアクセスし equals()overlaps()、とcontains()。これらは論理的な順序で設定されます。必要に応じて、これを微調整して特定の目的を満たすことができます。

        if feature1[1].equals(feature2[1]):
            print "{} equals {}".format(feature1[0],feature2[0])
        if feature1[1].overlaps(feature2[1]):
            print "{} overlaps {}".format(feature1[0],feature2[0])
        if feature1[1].contains(feature2[1]):
            print "{} contains {}".format(feature1[0],feature2[0])
    
  5. それを実行します...

enter code herefindOverlaps(fc)


import itertools, arcpy

fc = r'C:\path\to\your\fc'

def findOverlaps(x):
    with arcpy.da.SearchCursor(x, ['OID@', 'SHAPE@']) as cur:
        for feature1,feature2 in itertools.combinations(cur, 2):
            if feature1[1].equals(feature2[1]):
                print "{} equals {}".format(feature1[0],feature2[0])
            if feature1[1].overlaps(feature2[1]):
                print "{} overlaps {}".format(feature1[0],feature2[0])
            if feature1[1].contains(feature2[1]):
                print "{} contains {}".format(feature1[0],feature2[0])

findOverlaps(fc)

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

スクリーンショットは、重複、重複&同一、独自のさまざまな機能を示しています。

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


2

私はあなたのために何がうまくいくかもしれないという考えを持っています。これはいくつかの仮定に基づいていますが、同じ機能の可能性のあるリストを絞り込むのに役立ちます。これは自動化されたプロセスではありませんが、重複を手動で確認する必要があります。コメントに基づいて、自動化ツールは属性を比較しないようですので、これは誤って機能を削除しないようにするのに役立ちます。

ArcMapの使用

(1)問題が発生した場合に備えて、シェープファイルのコピーを作成します。

(2)列をシェープファイルにdoubleとして追加します。

(3)可能な限り最も記述的(最も正確)なフォーマットを使用して、各フィーチャの面積を計算します。丸めが問題にならない場合があります。

(4)その列で要約(要約)を実行します。サマリーで一意の識別子を選択し、最初と最後の両方にマークを付けてください。

(5)出力テーブルで、countフィールドが1より大きいレコードを探します。

(6a)機能を手動で確認し、重複がなくなるまでプロセスを繰り返します。

(6b)これらの一意のIDのリストを作成し、arcpyを使用して機能を削除することはできますが、同じ領域で2つの同一でない機能が存在する可能性があります。

ArcPyを使用する別のテクニック

上記の回答を作成しているときに、このデータの複数の作成者が重複した機能に同じ一意の識別子を実際に使用した可能性があると考えました。 IFそのような場合は、あなたがarcpyにループによる重複を見つけることができるかもしれません。

ArcPyを使用してこれを行うことについて私が考える方法は、システムに負担をかけ、少しかかる可能性があります。

(1)シェープファイルのコピーを作成します(もう一度)

(2)重複を示すために新しい列を追加します。「y」、「n」、0、1など、機能するものを使用します。

(3)Pythonでリストを作成して、一意の識別子を保存します。

(4)更新カーソル()を実行しますarcpy.UpdateCursor('LAYERNAME')。各レコードについて、リストにその識別子が含まれているかどうかを確認し、重複がある場合は列に重複のマークを付けます。

myList = []
rows = arcpy.UpdateCursor("layername")
for row in rows:
  if str(row.UniqueIdentifier) in myList:
    #value duplicated
    row.DuplicateColumnName = "y"
  else:
    #not there, add it
    myList.append(row.UniqueIdentifier)
  rows.updateRow(row)

(5)次に、これらのマークされた列を使用して、好きなように比較または実行できます。

おそらくこれらの比較を行うためのより良い方法があるでしょうが、それらは私がうまくいくか、少なくともあなたが始めるべきだと私が信じる二つです。

編集する

elrobisによるコメントに基づいて、最小外接長方形を利用して、誤ったフィーチャーを削除する可能性をさらに減らすことができます。

ArcMapを使用すると、データ管理で最小境界ジオメトリツールを実行できます。オプションをチェックした後、CONVEX_HULLオプションを使用するのがおそらく最善だと思います。

MBG_APodX / Y1MBG_APod_X / Y2フィールドをMBG_Orientation比較して重複を比較すると、重複した機能の良いアイデアが得られるはずです。上で説明したSummarizeメソッドを使用して比較することをお勧めします。境界長方形から頂点(座標)の1つを選択して、重複を見つけます。偶発的な「一致」がいくつか発生する可能性がありますが、他の頂点と方向を追加すると、結果の機能が重複することはかなり安全です。

まだ使用しておらず、このツールの結果もよくわかりませんが、ArcMapの[要約統計量]ツールを使用すると、結果のシェープファイルを簡単に調べることができます。私の単一列オプションの代わりに、複数の列をそのように要約できるようです。

重複しない機能を削除する可能性を心配せずに、これを完全に自動化する方法はないと思います。これらの方法は、手動で確認する必要がある機能の数を制限するのに役立ちます。


これらはポリゴンであると想定しています。それらが線の場合は、長さを使用できます。ポイントはX / Y座標で最も簡単です。
ブランコ

2
「等しいエリアフィーチャ」についても考えましたが、ビルのフットプリントには、意図しない一致を作成するために同じタイプのシェイプが十分にある可能性が高いと思います。機能のMBRの共通部分を使ってさらに改良することで、確率が向上すると思います。つまり、それらが同じエリアを持ち(同じ機能である可能性があり)、MBRが交差している場合、おそらくそれらは同じ機能の2つの世代である可能性があります。それは理にかなっていますか?
elrobis 2014

2

これは、SQLで空間自己結合を使用して行うことができます。使用しているSQL方言を指定しないため、この例ではPostgres / Postgisを使用していますが、OracleまたはSQL Serverに簡単に適合させることができます。ジオメトリがgeomという列に格納されている、buildingsというテーブルがあるとします。

SELECT a.id, b.id from buildings a, buildings b WHERE 
  ST_INTERSECTS(a.geom, b.geom) AND a.id < b.id;

これは交差を見つけます。完全な等価性が必要な場合は、ST_IntersectsをST_Equalsに置き換えます。または、2つを組み合わせるだけです。

SELECT a.id, b.id from buildings a, buildings b WHERE 
   (ST_INTERSECTS(a.geom, b.geom) OR ST_EQUALS(a.geom, b.geom)) 
   AND a.id < b.id;

a.id <b.idは、自己結合のケースの半分のみを考慮することを意味します。これにより、a)高速になり、b)重複するポリゴンの半分をすべて削除せずに削除するために使用できるリストが提供されます。 。明らかに、これはまだO(n²)アルゴリズムですが、実際には空間インデックスを使用している場合ははるかに高速になります。これは、重要なデータセットの合計要件です。

オーバーラップの定義に合わせるために、これを少しマッサージする必要があるかもしれません-調査が不十分な近隣の家を削除したくない場合。


シェープファイルに一意の属性がない場合は、のa.rowid代わりに使用できますa.idrowidデータセットの内部IDを提供するSQLiteのキーワードです。
LuWi

1

トポロジチェッカープラグインは、正しく使用すれば優れたツールです。それでも、データの基本的な理解が必要であり、手動で「修正」する必要があります。プラグインは、エラーと思われるものを強調表示します。その後、それぞれを調べて、あなたとあなたのデータに適切な決定をするのはあなた次第です。レイヤーに90 000個のアイテムがあるので、クリスマスまでに家に帰ることができます。

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