Recherche d'intersections d'entités dans une couche linéaire à l'aide de QGIS

Nov 25 2020

Je veux trouver des intersections dans le même calque comme l'image ci-dessous. Toutes les lignes sont des entités distinctes dans la même couche.

Comment puis-je trouver ces intersections dans QGIS?

Réponses

8 KadirŞahbaz Nov 25 2020 at 10:26

En utilisant le script suivant, vous pouvez obtenir le résultat attendu. Mais tout d'abord, utilisez l' "Vector geometry > Multipart to singleparts"outil si les paires de lignes de la même couleur sont les mêmes caractéristiques. Parce que le script utilise le point le plus proche entre les géométries.

Définissez le nom du calque. Vous devez également définir la epsvaleur epsilon ( ) pour supposer que deux lignes se croisent ou se touchent. Parce que de petits changements de décimales dans les coordonnées affectent le résultat. Par conséquent, certains outils et fonctions liés à une géométrie contiennent un seuil.

Je suppose que les données sont dans le système de coordonnées projetées. Si c'est géographique, diminuez 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)

Remarque: Le script donne également le point d'intersection mis en évidence dans l'image.

6 Taras Nov 25 2020 at 06:22

Essayez d'utiliser le géoalgorithme " Intersections de lignes " qui crée des points d'intersection des lignes.

Notez que pour 'Input layer'et 'Intersect layer'le même calque de ligne a été choisi.

Si les lignes sont déconnectées (voir l'image ci-dessous), un ajustement de la géométrie supplémentaire est nécessaire, c'est-à-dire un accrochage.

Pour accrocher des géométries dans une couche aux géométries dans la même couche, appliquez "Aligner les géométries sur la couche" .

Et après appliquer le géoalgorithme "Intersections de lignes".

1 hexamon Nov 26 2020 at 08:05

Je suppose que chaque ligne est une caractéristique plutôt que chaque segment étant une caractéristique. Vous pouvez ensuite essayer de superposer les nœuds de début et de fin tamponnés avec la couche de lignes.

  1. Exécutez Extract Specific Vertices avec 0 et -1 (pour obtenir des points pour tous les nœuds de début et de fin)
  2. Utilisez Buffer sur le résultat avec, par exemple, 0,2 mètre ou quelque chose, peut-être moins en fonction de vos données.
  3. Exécutez les attributs de jointure par emplacement (résumé) avec les nœuds de début et de fin tamponnés en entrée et la couche de lignes en tant que couche de jointure. Assurez-vous de cocher la case Compter dans les résumés pour calculer . Cela vous donnera un compte sur le nombre de lignes que ce nœud tamponné chevauche.
  4. Dans la couche de sortie de la jointure, filtrez toutes les entités dont le nombre est inférieur à 2. Les autres doivent être vos intersections.
  5. Exécutez les centres de gravité sur le résultat pour récupérer les nœuds sous forme de points, ou sélectionnez les nœuds extraits d'origine qui chevauchent les résultats via Sélectionner par emplacement .

L'idée est que tous les nœuds tamponnés doivent avoir 1 chevauchement à partir de sa propre ligne d'origine, à moins qu'ils ne se croisent avec une autre ligne, alors le nombre sera de 2 (ou plus pour les intersections multilignes.)