Suite

Découper un polygone à l'aide de la ligne - cutter, cut () - à l'aide d'ArcPy?


Ce que j'aimerais faire, en utilisant ArcPy : utiliser une ligne pour diviser un tas de polygones en parties distinctes. Voici à quoi pourraient ressembler les entrées :

Dans ce cas, la ligne doit diviser chaque polygone en deux polygones distincts, créant finalement 6 polygones distincts.

Cette question a été posée plusieurs fois, et il y a eu beaucoup de réponses fournies, mais aucune d'entre elles ne semble mentionner le polygone couper méthode, peut-être parce qu'elle semble n'avoir été introduite qu'en 10.2.

Voici ce que montre l'aide d'ArcGIS (faites défiler jusqu'à couper (couper)):

Cela semble être exactement ce dont j'ai besoin, mais je ne sais pas exactement comment le mettre en œuvre.

D'après les quelques exemples que j'ai pu trouver, il semble que je ne puisse pas utiliser la méthode directement sur un fichier de formes que je référence, mais j'ai besoin d'accéder à la géométrie/aux sommets sous-jacents, alors voici ce que j'ai fait (veuillez me corriger s'il y a est une façon complètement différente de le faire):

  • lire les sommets du shapefile à l'aide d'un curseur
  • pousser chaque sommet dans un tableau
  • utilisez ce tableau pour créer un polygone/une ligne

La prochaine étape serait d'utiliser le couper() méthode, comme indiqué dans la capture d'écran ci-dessus, pour diviser réellement les polygones, mais je ne parviens pas à le faire fonctionner.

Ce qui suit est mon code (seule la partie polygone utilise des commentaires car la polyligne n'est qu'une répétition):

import arcpy polygon = r"D:Datapoly.shp" line = r"D:Dataline.shp" # ------------------- POLYGONE - ------------------ # lire d'abord la géométrie # c'est-à-dire : lire toutes les coordonnées des sommets et les placer dans un tableau dataset_vertices = [] # parcourir chaque entité pour la ligne in arcpy.da.SearchCursor(polygon, ["[email protected]", "[email protected]"]): print("Voici la fonctionnalité {0}:".format(row[0])) partnum = 0 # Parcourir chaque partie de l'entité pour la partie de la ligne[1] : # Imprimer le numéro de pièce print("Partie {0}:".format(partnum)) tempPart = [] # pousser chaque sommet dans un tableau # Parcourir chaque sommet de l'entité pour pnt en partie : if pnt : # Affiche les coordonnées x,y du point courant print("{0}, {1}".format(pnt.X, pnt.Y)) tempPart.append([pnt.X,pnt .Y]) else: # Si pnt est None, cela représente un anneau intérieur print("Interior Ring:") # push part-array dans tout le tableau dataset_vertices.append(tempPart) partnum += 1 # Une liste qui contiendra chacun les objets Polygon polygon_features = [] pour l'entité dans dataset_vertice s: # Créer un objet Polygon basé sur le tableau de points # Ajouter à la liste des objets Polygon polygon_features.append( arcpy.Polygon( arcpy.Array([arcpy.Point(*coords) for coords in feature]))) # ------------------- POLYLINE ------------------- line_vertices = [] pour la ligne dans arcpy.da. SearchCursor(line, ["[email protected]", "[email protected]"]): print("Voici la fonctionnalité {0}:".format(row[0])) partnum = 0 pour la partie de la ligne[1] : print( "Part {0} :".format(partnum)) tempPart = [] pour pnt en partie : si pnt : print("{0}, {1}".format(pnt.X, pnt.Y)) tempPart. append([pnt.X,pnt.Y]) else : print("Interior Ring :") line_vertices.append(tempPart) partnum += 1 line_features = [] pour la fonctionnalité dans dataset_vertices : line_features.append( arcpy.Polygon( arcpy .Array([arcpy.Point(*coords) pour les coordonnées de l'entité])))

Après avoir exécuté ce code, je peux utiliser des méthodes, telles que polygon_features[0].boundary(), mais je ne sais pas comment utiliser couper().


Entité vers polygone découpera les polygones par classes d'entités linéaires lorsque vous utilisez les deux classes d'entités comme entrée.

Contributions:

Résultats:

Selon la géométrie de la ligne, cette méthode peut créer des polygones en excès. Le cas échéant,agrafevotre classe d'entités en sortie par votre classe d'entités surfaciques en entrée d'origine pour éliminer les nouveaux polygones.

Si vous souhaitez uniquement que certains polygones soient découpés par certaines lignes, utilisez une expression SQL et des couches d'entités pour limiter vos entrées.


Voir la vidéo: Cut and or Split Polygons (Octobre 2021).