Suite

Supprimer des sommets de ligne à l'intérieur d'un polygone à l'aide d'ArcPy ?


Existe-t-il un moyen de supprimer automatiquement les sommets des entités linéaires à l'aide d'un fichier de polygone dans ArcGIS afin qu'il ne coupe pas la ligne mais redresse simplement la ligne à l'intérieur du polygone ?

Les lignes sont des lignes et la boîte représente un polygone qui les recouvre. Je souhaite supprimer les sommets de ligne qui se trouvent à l'intérieur du polygone afin que la ligne soit droite à l'intérieur de la limite du polygone comme sur l'illustration.

J'utilise ArcGIS 10.1 mais j'ai également accès à d'autres logiciels si quelque chose offre la solution.


Voici où une licence avancée sera utile.

  1. Utilisez l'outil Découper pour découper le "Ligne" classe d'entités (FC) par le "Polygone" FC. Nommer la sortie "Lignes_Intérieur".
  2. Utilisez l'outil Effacer pour faire le contraire et effacez les lignes qui tombent à l'intérieur des polygones. Nommez la sortie "Lignes_Extérieur".
  3. Pour le "Lignes_Intérieur" FC, utilisez l'outil Sommets d'entités aux points en spécifiant l'option "BOTH_ENDS" pour créer un point pour les nœuds de début et de fin de chaque ligne. Créez un champ appelé "Id de ligne" qui identifie de manière unique à quelle ligne appartenait chaque point de départ et de fin (vous pouvez le faire en utilisant une jointure ou une jointure spatiale ou une sélection ou autre). Malheureusement, je n'ai pas de licence avancée devant moi pour tester les étapes exactes.
  4. Utilisez l'outil Points à Ligne sur vos résultats de l'étape 3 pour créer ligne droite segments hors des points de début et de fin de l'original "Lignes_Intérieur" FC. Vous devrez préciser votre "Id de ligne" que vous avez créé à l'étape 3 pour le paramètre "Line_Field".
  5. Fusionner/Ajouter/Données Chargez les résultats de l'étape 4 dans votre "Lignes_Extérieur" FC pour réunir les deux FC.
  6. Utilisez l'outil Ligne non fractionnée ou l'outil Dissoudre pour fusionner les pièces ensemble en lignes simples. Vous devrez peut-être effectuer une jointure spatiale pour récupérer les attributs dans les segments intermédiaires (que vous avez générés) avant d'exécuter les outils.

J'espère que cela t'aides. Je peux ajouter des captures d'écran lorsque je peux accéder à une licence avancée si vous en avez besoin. La seule autre solution à laquelle je puisse penser si ces étapes ne fonctionnent pas serait de modifier la liste des sommets de l'objet arcpy.array pour chaque arcpy.polyline de votre FC, ce qui serait faisable sans la licence Advanced mais beaucoup plus difficile sans quelques compétences Python.


La clé est la différence méthode sur les objets géométriques. Le code suivant est loin d'être efficace, puisqu'un nouveau curseur de mise à jour est ouvert pour chaque polygone. Mais il a l'avantage supplémentaire de prendre en charge plusieurs polygones sur la même ligne :

importer itertools, arcpy arcpy.env.overwriteOutput = True line_FC = r'' poly_FC = r'' sortie = r'' #clone les lignes d'entrée en mémoire pour un traitement rapide temp = arcpy.CopyFeatures_management(line_FC, "in_memory/temp") polygons = arcpy.CopyFeatures_management(poly_FC, arcpy.Geometry()) pour poly dans les polygones : avec arcpy.da.UpdateCursor( temp, ["[email protected]"]) as uCursor: for line in uCursor: line = line[0] diff = line.difference(poly) #si les deux lignes ne sont pas égales, cela signifie qu'il a intersecté le polygone sinon la ligne. equals(diff): #le résultat de geometry.difference() est une ligne en plusieurs parties uniquement des #parties qui se trouvent à l'extérieur du polyon parties = diff.getPart() #si les parties sont vides, cela signifie que la ligne est complètement à l'intérieur du polygone # c'est-à-dire, aucune différence si parties : #Nous devrons "joindre" la fin de la partie1 au début de la partie2 #nous allons donc simplement aplatir la liste des listes jointes = list(itertools.chain.from_iterable(parts)) et créez un nouvel objet polyligne pour mettre à jour la forme poly_trimmed = arcpy.Polyline(arcpy.Array(joined)) uCursor.updateRow([poly_trimmed]) arcpy.CopyFeatures_management(temp, output)

Je ne l'ai pas testé avec des boîtiers de bord, mais cela devrait vous aider à démarrer.


Voir la vidéo: PYTHON IN ARC GIS #8 Save all polygons separately from a shape file with multiple polygon. ARCPY (Octobre 2021).