貯水池に接続されている運河のみを選択しますか?


8

貯水池のポリゴンレイヤーと運河のポリラインレイヤーがあります。

私のデータでは、いくつかの運河は貯水池に由来し、他の運河に通じています。一方、孤立している、または何にも接続されていない運河もあります。(これがどのようにして起こったのかは別の日の話です)

分離された運河と、貯水池に接続されていない運河ネットワーク(接続された運河のセット)を削除する必要があります。

何らかのネットワークトレースを使用する必要があると思いますが、どこから始めればよいかわかりません。

このタスクを解決するために、ArcGISデスクトップとNetwork Analystがあります。

あなたはこの仕事にどのように取り組みますか?

回答:


6

運河のシェープファイルがどのように見えるかは正確にはわかりませんが、Network Analystを使用せずにこれを行う方法を次に示します。

Canals.shpポリラインが分離しているが接続されているセグメントに分割されている可能性が高い場合は、[ ディゾルブ]を使用して分割を解除します。次に、Select by Locationを実行し、Reservoirs.shpでINTERSECTまたはBOUNDARY_TOUCHESするCanals.shpの機能を見つけます。


残念ながら、Dissolveツールを実行するのに十分なフィールドはありません
Devdatta Tengshe

2
次に、新しいフィールド(short int)を作成し、そのデフォルト(0)でディゾルブします
Brad Nesom

5

私はこれを2つの別個の問題として扱います。まず、個々のラインセグメントを接続されたコンポーネントに分解する必要があります。それらすべてをデフォルト値でディゾルブするだけでは機能しません。これはグラフ理論の問題であり、必要なのは「連結成分サブグラフ」です。

これをネットワークアナリストでハッキングする方法は確かにありますが、私の好みは、グラフの問題と同じように扱うことです。ホイールを再発明せず、優れたNetworkx Pythonモジュールをインストールして、以下を試してください。

from networkx import Graph, connected_components
G = Graph()
# iterate through your feature class and build a graph
for row in featureclass:
    # we need a unique representation for each edges start and end points
    start = row.shape.getpart()[0]
    end = row.shape.getpart()[-1]
    G.add_edge(start,end,oid=row.oid)

# get the connected components
Components = connected_components(G)

# we now have a "list of lists" containing edges grouped by their component
# there's several ways to apply this to the feature class...eg
for i, connected in enumerate(Components):
    # assign id = i to the group by writing it to a field for all members 
    # of that component (the row oid is an attribute of the edge)

2番目のステップは、dmahrが提案するディゾルブとロケーションによる選択です。

私は何度も同じようなテクニックを使いました。グラフ理論は素晴らしく、多くのGIS問題を解決します。Networkxは、これをPythonに実装するための優れたツールです。


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