QGISを使用して1つのラインレイヤーで特徴の交差点を見つける

Nov 25 2020

下の写真のように、同じレイヤーで交差点を見つけたいです。すべての線は、同じレイヤー内の個別のフィーチャです。

QGISでこれらの交差点を見つけるにはどうすればよいですか?

回答

8 KadirŞahbaz Nov 25 2020 at 10:26

次のスクリプトを使用すると、期待する結果を得ることができます。ただし、最初に、"Vector geometry > Multipart to singleparts"同じ色の線のペアが同じフィーチャである場合は、ツールを使用します。スクリプトはジオメトリ間の最も近いポイントを使用するためです。

レイヤー名を設定します。また、eps2本の線が交差または接触すると仮定するには、イプシロン()値を設定する必要があります。座標の小数の小さな変更が結果に影響するためです。したがって、ジオメトリに関連する一部のツールと関数にはしきい値が含まれています。

データは投影座標系にあると思います。地理的な場合は、を減らしepsます。

# specify minimum distance to assume that lines intersect/touch
eps = 0.01 # 0.01 meter = 1 cm

line_lyr = QgsProject.instance().mapLayersByName('LINE_LAYER_NAME')[0]
crs = line_lyr.crs().authid()

# make new point layer
point_lyr = QgsVectorLayer("Point?crs=" + crs, "points", "memory")
point_lyr.startEditing()

for line1 in line_lyr.getFeatures():
    geom1 = line1.geometry()
    
    for line2 in line_lyr.getFeatures():
        geom2 = line2.geometry()
        
        if (geom1.distance(geom2) < eps 
            and line1.id() < line2.id()): # to avoid duplicate points 
               
            point = geom1.nearestPoint(geom2)
            feature = QgsFeature()
            feature.setGeometry(point)
            point_lyr.addFeature(feature)    
    
point_lyr.commitChanges()
QgsProject.instance().addMapLayer(point_lyr)

注:スクリプトは、画像で強調表示されている交点も示します。

6 Taras Nov 25 2020 at 06:22

線が交差する点を作成する「線の交点」地理アルゴリズムを使用してみてください。

'Input layer''Intersect layer'同じラインレイヤーが選択されていることに注意してください

ラインが切断されている場合(下の画像を参照)、追加のジオメトリ調整、つまりスナップが必要です。

レイヤー内のジオメトリを同じレイヤー内のジオメトリにスナップするには、「ジオメトリをレイヤーにスナップ」を適用します。

そして、「線の交点」地理アルゴリズムを適用した後。

1 hexamon Nov 26 2020 at 08:05

各セグメントが1つの機能ではなく、各行が1つの機能であると想定しています。次に、バッファリングされた開始ノードと終了ノードをラインレイヤーでオーバーレイしてみることができます。

  1. 0と-1でExtractSpecific Verticesを実行します(すべての開始ノードと終了ノードのポイントを取得するため)
  2. 結果にバッファを使用します。たとえば、データによっては0.2メートル程度です。
  3. バッファリングされた開始ノードと終了ノードを入力として、ラインレイヤーを結合レイヤーとして、場所ごとの結合属性(概要)を実行します。計算するには、[概要]の[カウント]チェックボックスを必ずオンにしてください。これにより、このバッファリングされたノードがオーバーラップする行数がカウントされます。
  4. 結合からの出力レイヤーで、カウントが2未満のすべてのフィーチャをフィルターで除外します。残りのフィーチャは交差点である必要があります。
  5. 結果に対してCentroidsを実行してノードをポイントとして戻すか、[場所で選択]を使用して結果と重なる元の抽出されたノードを選択します

バッファリングされたすべてのノードは、別のラインと交差しない限り、元のラインから1オーバーラップする必要があるという考え方です。その場合、カウントは2(複数ラインの交差の場合はそれ以上)になります。