Je souhaite couper un ensemble de polylignes (lignes noires dans l'image ci-dessous) à la limite extérieure d'un polygone. Tout vide dans le polygone doit être ignoré. Ma sortie idéale sont les lignes jaunes en pointillés. Les lignes initiales peuvent être droites ou non. L'image est un exemple simplifié, en réalité le polygone est beaucoup plus complexe et il y a des centaines de lignes. Je ne pense pas qu'une coque convexe fonctionnerait (mais je peux me tromper). Je suis ouvert aux solutions en arcgis, qgis, arcpy, shapely, etc. Le codage serait de préférence en python si je suis ouvert à d'autres options si nécessaire. Arcgis serait également préférable pour faciliter le partage de l'outil par mes collègues, mais ce n'est pas obligatoire.
Le mieux que je puisse penser en ce moment est d'intersecter une ligne individuelle avec le polygone en créant un ensemble de points à toutes les intersections de limites. Triez les points par distance jusqu'au début de la ligne. Les points les plus éloignés et les plus proches (FAC) seront la limite extérieure du polygone. Utilisez ensuite les points FAC pour sélectionner les sommets appropriés à partir de la ligne d'origine et créez la ligne pointillée jaune à partir des points appropriés. Cela devrait fonctionner mais semble plus compliqué que nécessaire.
Quelques réflexions supplémentaires:
- Les lignes sont "suffisamment" linéaires pour qu'un simple calcul de distance entre les points fonctionne, un référencement linéaire ne devrait pas être nécessaire.
- Ce serait facile dans arcpy s'il y avait un outil pour diviser une ligne en un point mais je n'en trouve pas.
Vous pensez à quelqu'un?
la source
Réponses:
Je veux ajouter ma solution pyQGIS, rien d'autre.
Mon cas de test - avant coupure:
Après la coupure:
Pour obtenir l'ensemble complet des attributs des lignes originales, je pense qu'il serait préférable de les joindre au résultat. Sinon, ils doivent être créés dans la section de préparation et définis dans la boucle la plus interne. Mais je n'ai pas testé s'ils réussissent le processus de dissolution ou s'ils se perdent, car en principe ils peuvent avoir des valeurs différentes.
la source
Si vous exécutez l'intégration avec les polygones et les lignes en tant qu'entrées, cela ajoutera un sommet à chacun où ils se coupent. (Attention, car Integrate modifie les entrées au lieu de produire de nouvelles sorties.)
Une fois que vous êtes sûr qu'il y a des sommets coïncidents, vous pouvez parcourir les sommets de la ligne et tester pour voir si chacun touche l'autre entité. Dans la liste ordonnée des sommets qui se touchent, prenez le minimum et le maximum de l'ensemble. Ensuite, faites deux lignes à partir de chaque entité, A: (début, ..., min) et B: (max, ..., fin).
Une autre option, bien que je ne sois pas sûr qu'ArcPy préserve l'ordre des pièces d'entité en fonction de l'ordre des sommets dans l'objet d'entrée, serait d'exécuter le clip tel quel. Pour la ligne médiane dans votre exemple, cela devrait se traduire par une fonctionnalité en plusieurs parties en trois parties. Selon l'ordre, vous pouvez parcourir chaque ligne en plusieurs parties produite par Clip et supprimer tout sauf la première et la dernière partie de la fonction en plusieurs parties.
la source
Il y a trois problèmes à résoudre dans ce cas:
des trous
Étant donné que toute ligne dans un trou sera conservée, supprimez les trous des polygones. Dans le script ci-dessous, je le fais en utilisant des curseurs et des géométries.
Lignes entre polygones
Les lignes qui touchent deux polygones doivent être supprimées. Dans le script ci-dessous, je le fais en effectuant une jointure spatiale de
one to many
, avec mes lignes comme classe d'entités en entrée et mes polygones comme classe d'entités de jointure. Toute ligne générée deux fois touche deux polygones et est supprimée.Lignes de fin
Pour supprimer des lignes qui ne touchent un polygone qu'à une extrémité, je convertis les lignes en points d'extrémité. J'utilise ensuite des couches d'entités et des sélections pour déterminer quels points d'extrémité sont des flottants. Je sélectionne les points d'extrémité qui coupent les polygones. Je change ensuite ma sélection. Cela sélectionne les points d'extrémité qui n'intersectent pas les polygones. Je sélectionne n'importe quelle ligne qui coupe ces points sélectionnés et les supprime.
Résultat
Hypothèses
erase
et afeature vertices to points
)Scénario
Le script ci-dessous génère une classe d'
_GreedyClip
entités avec le nom de votre classe d' entités linéaires plus , dans la même géodatabase que votre classe d'entités linéaires. Un emplacement d'espace de travail est également nécessaire.la source