残りの道路ネットワークに接続されていないフィーチャを選択するためのPostGISクエリ?


8

PostGIS対応のデータベースに保存されている都市の道路のデータセットがあります。他の道路ネットワークに接続されていないフィーチャを特定して削除したいと思います。この動作は、データが切り取られたネットワークの端でよく見られます。

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

これを行う他の回答をGIS SEで見つけましたが、すべてArcGISを使用しているようで、PostGIS、QGIS、またはPythonスクリプトを使用して問題を解決したいと考えています。

データセットには10​​0万を超える機能を含めることができるため、パフォーマンスが問題になります。

回答:


3

私も同様の問題を抱えていたので、QGISプラグインを開発しました。これは、公式のQGISプラグインリポジトリで利用可能になり、QGISメニューで見つけることができます。

http://plugins.qgis.org/plugins/disconnected-islands/

このプラグインは、ポリラインレイヤーで実行され、接続されたリンクの道路(またはレールなど)ネットワークグラフを構築します。次に、相互に接続されているが、分離リンクまたはフローティングリンクには接続されていない接続サブグラフを分析します。サブグラフのグループIDを含む追加の属性を作成します。これを使用して、分類されたスタイルでレイヤーをスタイル設定したり、選択範囲にズームしたりできます。切断されたリンクは、修正または削除できます。

ソースコードは次の場所から分岐できます:https : //github.com/AfriGIS-South-Africa/disconnected-islands

私のデータセットには約200万のリンクがあり、55 GBのRAMを使用して15分未満で分析されました。


この音は完璧な私はそれをdlとするときだけ知っているので、私はエラー:(プラグイン壊れ取得
wmebane

フィードバック@wmebaneをありがとう。壊れたプラグインの問題を修正したいと思います。エラーメッセージをhub.qgis.org/projects/disconnected-islands/issues/newまたはメールで報告してください(プラグインマネージャー内の[作成者]をクリックします)。
Peter

8

PostGISを使用すると、他の道路と交差しない道路を簡単に選択できます。

SELECT id, geom FROM roads a
WHERE NOT EXISTS 
     (SELECT 1 FROM roads b 
      WHERE a.id != b.id
      AND   ST_Intersects(a.geom, b.geom))

4

このQGIS Pythonスクリプトを使用して、何にも接続されていないラインを検出できます。

from qgis.utils import iface

layer = iface.mapCanvas().currentLayer() # Selected layer

featureList = list( layer.getFeatures() ) # Gets all features
allFeatures = { feature.id(): feature for feature in featureList }

# Spatial indexing
spatialIdx = QgsSpatialIndex()
map( spatialIdx.insertFeature, featureList )

resList = [] # ids of features not connected to anything

for f in featureList:

    # List of potentially connected features from spatial indexing
    ids = spatialIdx.intersects( f.geometry().boundingBox() )

    hasNeighbor = False

    for id in ids:
        ifeature = allFeatures[id]

        if ifeature.id() == f.id():
            continue

        # Checks if f is really intersecting with ifeature
        if f.geometry().intersects(ifeature.geometry()):
            hasNeighbor = True
            break # Exit current for loop

    if (not hasNeighbor) and (not f.id() in resList):
        resList.append( f.id() )

print resList

これはマルチパートラインでは機能しないことに注意してください。もっと速くなるとは思いません...


このトピックの質問と同じ問題が発生しています。あなたの解決策をありがとう、私はそれを楽しんだ。「ループが適切に継続されない」エラーが発生しました。私はqgis3.4とpython3.7を使用しています。私はpythonの初心者なので、あなたが私を助けてくれることを願っています。
どうも

3

最初に@dbastonの方法で簡単な道路を取り除き、次にpgRoutingを使用して、他のネットワークに接続されていない道路のネットワークがある場合など、より複雑なケースを見つけることができます。

メインネットワーク内にある道路セグメントを選択してから、他の各セグメントからそのセグメントへのルートを見つけてください。ルートが存在しない場合は、セグメントを削除します。

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