Comment connecter des lignes dans un réseau?

15

J'ai un fichier de formes de lignes et un autre de polygones. Lorsque deux lignes ou plus coupent un polygone, elles doivent être connectées (cassées), mais parfois pendant la numérisation manuelle, cela ne se produit pas. J'ai besoin de trouver et de corriger toutes ces erreurs. J'ai utilisé v.cleanGRASS GIS et il a automatiquement cassé beaucoup de sommets, ce qui était bien, mais certaines de ces lignes déconnectées sont plus éloignées de la tolérance que j'ai donnée et si j'augmente trop la tolérance, cela commence à générer d'autres types d'erreurs.

entrez la description de l'image ici

Des idées?

vascobnunes
la source
1
Reliez spatialement les extrémités de la polyligne aux polygones et résumez les nombres par polygone. Pour chaque polygone contenant plus d'un point d'extrémité joint, créez une polyligne composée de segments rayonnant du centre de gravité de ces points d'extrémité vers les points d'extrémité eux-mêmes (une "étoile"). Fusionnez les étoiles avec les polylignes originales. Nettoyez le résultat pour supprimer les auto-intersections qui surviennent. Chacune de ces étapes est prise en charge (et peut être automatisée) par des SIG entièrement capables. Parce que je ne connais pas les détails de QGIS ou GRASS, je propose cette solution uniquement en tant que commentaire.
whuber
mais parfois toutes les lignes se terminent en dehors du polygone ...
vascobnunes
1
Que représentent ces lignes? S'il s'agit de rivières, sont-elles codées avec des informations supplémentaires telles que le nom ou l'ordre des cours d'eau? Le réseau est-il dirigé (comme un réseau fluvial), car deux flux de premier ordre, par exemple, doivent s'écouler dans un flux de second ordre. Je suppose que j'essaie de dire que vous voudrez peut-être mettre un peu d'intelligence derrière le processus de capture pour surmonter le problème de la capture douteuse avec une tolérance de recherche croissante.
Hornbydd
1
Votre commentaire semble contredire la question. La question semble dire que vous voulez capturer les sommets qui se trouvent dans un polygone commun. Si un sommet tombe en dehors d'un polygone, vous ne donnez aucun critère sur la façon dont il doit être traité! Alors, quelle est exactement la relation entre les polygones et les polylignes?
whuber
1
Je suis d'accord avec whuber; vous devriez peut-être clarifier la question. On dirait que vous voulez des lignes qui sont «dans» le polygone, ainsi que «proches» mais en excluant celles qui sont «dans» mais qui sont correctement jointes?
Darren Cope

Réponses:

7

Ma compréhension du problème est la suivante:

Si un point d'extrémité de polyligne coupe un polygone, la polyligne doit être connectée (en ajoutant ou en ajustant des sommets) à tous les points d'extrémité de polyligne supplémentaires qui coupent le même polygone.

Certains points d'extrémité de polyligne n'entrecoupent pas un polygone, étant des sous-dépassements, mais ceux-ci doivent être connectés comme ci-dessus.

Cette réponse s'appuie sur certaines déjà données, mais n'est pas complète car je ne connais pas toutes les commandes QGIS - peut-être que quelqu'un d'autre peut y ajouter?

  1. Pour chaque polyligne, extrayez les coordonnées d'extrémité ( Vector> Outils de géométrie> Extraire les nœuds puis ranger) et calculez si elles se trouvent ou non dans un polygone ( Vector> Outils de recherche> Sélectionner par emplacement ).

  2. Pour les extrémités de polyligne qui se trouvent dans un polygone, étendez cette extrémité de la polyligne au centre du polygone (Extraire le centre du polygone à l'aide de Vector> Outils de géométrie> Centre de gravité du polygone , vous n'êtes pas sûr de la modification de la ligne, bien que vous puissiez travailler avec les sommets de la polyligne en tant que points et ajoutez-en d'autres avec la numérotation appropriée avant de reconstruire la polyligne modifiée à l'aide du plugin Points to Paths)

    Vous mentionnez qu'il peut y avoir des situations où certaines ou toutes les lignes ont été correctement connectées, dans ces situations (identifiables par des points d'extrémité de polyligne coïncidents), vous pouvez choisir d'utiliser l'emplacement du point d'extrémité coïncident au lieu du centre de gravité du polygone comme point à étendre toute polyligne supplémentaire non connectée à ce polygone.

  3. Pour les extrémités de polyligne situées en dehors d'un polygone, étendez cette extrémité de la polyligne au centre du polygone le plus proche. Encore une fois, je ne suis pas sûr de calculer le polygone le plus proche, bien que le module GRASS v.distance semble faire l'affaire.

Andy Harfoot
la source
c'est une bonne justification de la solution du problème. Je suis également arrivé à quelque chose comme ça avec la réponse d'Alexgleith. Mais j'étais coincé dans l'opération pour "étendre cette extrémité de la polyligne au centre du polygone le plus proche". La question est maintenant de savoir comment faire cela? Si j'utilise v.clean.snap aux centroïdes des polygones, il déplacera toujours tous les sommets qui ne sont pas des extrémités ...
vascobnunes
Une approche consisterait à convertir les polylignes en points comme décrit et, si nécessaire, à ajouter un point supplémentaire au début ou à la fin d'une ligne donnée en fonction de l'emplacement du point de départ ou de fin existant. L'emplacement du point ajouté serait le centre de gravité du polygone, et le point serait attribué avec un numéro de séquence de sommet de -1 ou 1000000 pour le placer au début ou à la fin de la polyligne. Cela permettrait ensuite de reconstruire les polylignes à l'aide de l'outil Points to Path
Andy Harfoot
2

Je pense que je pourrais le faire avec un algorithme personnalisé ... Notez bien comment vous aimeriez l'implémenter, mais je pense que cela fonctionnerait.

Pour chaque ligne, pour chaque point final, faites un point en polygone pour le sommet au point final et liez-le au polygone.

Ensuite, pour chaque polygone, s'il y a plus d'un point d'extrémité de ligne lié, je les fusionnerais (déplacer) tous vers la coordonnée moyenne, ou vers le centre de gravité du polygone peut-être.

C'est assez simple. Mais non disponible dans les opérateurs standard. Je pense que cela pourrait être fait dans ArcGIS avec un temps de codage de jours.

Une autre note, dans l'image que vous avez publiée, l'une des lignes est en dehors du polygone ... Vous pouvez gérer cela de manière plus simple en trouvant simplement le sommet le plus proche de chaque sommet d'extrémité, en vous assurant que la proximité est mutuelle (je pense que c'est nécessaire, pour que les sommets ne s'alignent que dans un sens), vous pouvez alors les déplacer vers la position moyenne des sommets.

Alex Leith
la source
1

Problème intéressant! Je ne peux pas penser à un moyen d'effectuer automatiquement la capture, mais voici une étape dans l'identification des zones à rechercher au moins pour une correction manuelle:

  • Ajoutez une nouvelle colonne à votre calque de ligne et définissez-la sur «1» pour toutes les entités.
  • Sous Vector> Join Attributes by Location, définissez votre couche cible sur votre couche polygone et la couche ligne comme couche de jointure. Ensuite, sélectionnez "Prendre un résumé des fonctionnalités qui se croisent" et cliquez sur "Somme". Donnez un emplacement pour le fichier de sortie et "OK".
  • Le fichier de polygones résultant sera votre couche de polygones d'origine, mais avec quelques champs supplémentaires. Le champ SUM est ce que vous voulez; quand il est 2, cela signifie que vous pouvez alors zoomer dessus et enclencher manuellement les fonctionnalités.

Selon la situation (nombre de fonctionnalités, nombre qui se trouvent dans cette situation par rapport à celles qui ne le sont pas, etc.), cela peut vous faire gagner du temps.

EDIT: Vous pouvez également utiliser les polygones avec une somme de 2 pour créer un sous-ensemble de vos couches de lignes, puis exécuter le nettoyage sur ceux avec une tolérance plus grande afin de ne pas modifier les autres entités.

Darren Cope
la source
J'avais déjà fait quelque chose comme ça. J'ai même utilisé v.net pour récupérer les nœuds des lignes et effectué une sélection spatiale des polygones correspondant aux nœuds. Je trouve beaucoup d'erreurs à corriger en utilisant cela, mais j'ai encore 3 gros problèmes: 1) il y a des milliers d'erreurs à corriger manuellement, ce qui prend beaucoup de temps; 2) Je n'obtiens pas toutes les erreurs car dans certains cas les lignes ou les nœuds ne «touchent» même pas les polygones; 3) J'obtiens des erreurs qui ne sont pas des erreurs, car lorsque deux lignes se connectent correctement, elles sont également sélectionnées.
vascobnunes
0

une fois que vous avez les points d'extrémité, je ferais un diagramme d'araignée prenant les polygones centroïdes comme installations et les points d'extrémité des lignes voisines comme cibles. Vous effectuez l'analyse du diagramme d'araignée et par conséquent, vous auriez un segment pour chaque polyligne.

Cela fonctionnerait même pour ceux se terminant en dehors des polygones. Comment faire cela dans QGIS Je ne sais pas, désolé, mais je le ferais dans les produits ESRI que je connais bien. C'est ce que j'ai compris quand whuber, dans la première réponse, a suggéré de construire une "étoile".

Je suis sûr qu'il y a des gens ici qui savent comment effectuer une telle analyse dans QGIS

ankilosado
la source
4
Bienvenue sur GIS Stack Exchange! J'ai remarqué que votre réponse a attiré des votes négatifs et je pense que c'est parce que vous avez suggéré une alternative à la technologie utilisée par le demandeur (GRASS / QGIS). Ma recommandation serait de faire flotter des suggestions telles que des commentaires plutôt que des réponses et si le demandeur semble intéressé, transférez les informations à une réponse.
PolyGeo