HOW TO

Teilen eines Polygons nach Prozentsatz mithilfe von ArcPy in ArcGIS Pro

Last Published: August 26, 2024

Beschreibung

In ArcGIS Pro kann ein Polygon-Feature mit Werkzeugen wie dem Werkzeug Teilen (Analysis) und dem Werkzeug "Teilen" im Bereich Features ändern in mehrere Segmente geteilt werden. Mit den bereitgestellten Werkzeugen kann das Polygon jedoch nicht nach Prozentsatz geteilt werden. Befolgen Sie die Anweisungen in diesem Artikel, um ein Polygon im Python-Fenster nach Prozentsatz zu teilen.

Lösung oder Problemumgehung

Note: 
Ensure the data added to the map and the map share the same projected coordinate system to avoid errors.
  1. Importieren Sie das ArcPy-Modul, und konfigurieren Sie die Umgebung des Skripts.
Import arcpy
p = arcpy.mp.ArcGISProject("CURRENT")
m = p.listMaps("<Map_Name>")[0]
lyr = m.listLayers(0)
  1. Geben Sie den Prozentsatz für die Polygon-Teilung mithilfe eines Array-Parameters an. In diesem Beispiel wird das Polygon nach 20 %, 30 % und 50 % geteilt.
splits = [20, 30, 50]
  1. Rufen Sie die Polygoneigenschaften und die Ausdehnungseigenschaften des Polygons mit der Funktion SearchCursor ab.
with arcpy.da.SearchCursor("<Layer_Name>", ["SHAPE@"]) as pcursor:
   for prow in pcursor:
      polygon = prow[0]    # polygon to cut
      e = polygon.extent   # bounding extent of polygon
      print(e.XMin,e.YMin,e.XMax,e.YMax)
del pcursor
  1. Erstellen Sie eine Variable zum Speichern des Wertes für die Genauigkeit der geometrischen Iteration.
stepsize = 0.001
  1. Geben Sie die Parameter zum Festlegen der Polygon-Teilungsrichtung an.
leftXstart = e.XMin
leftX = e.XMin + stepsize
ymax = e.YMax
ymin = e.YMin
  1. Die Iteration durch den Polygon-Ausschneidevorgangs erfolgt mithilfe der Funktion "cut()" gemäß der in Schritt 2 festgelegten Prozentsätze.
cutpoly = polygon
icursor = arcpy.da.InsertCursor("<Layer_Name>", ["SHAPE@"])
for i in splits[:2]:
   print(i)
   tol = 0
   while tol < i:
      # construct NS line
      pntarray = arcpy.Array()
      pntarray.add(arcpy.Point(leftX, ymax))
      pntarray.add(arcpy.Point(leftX, ymin))
      pline = arcpy.Polyline(pntarray,arcpy.SpatialReference(<WKID>))
      # cut polygon and get split-parts
      cutlist = cutpoly.cut(pline)
      tol = 100 * cutlist[1].area / polygon.area
      leftX += stepsize
      #print str(leftX) + ":" + str(tol)
   cutpoly = cutlist[0]
   icursor.insertRow([cutlist[1]])
# part 0 is on the right and part 1 is on the left of the split
  1. Fügen Sie den letzten Teilungsrest ein.
icursor.insertRow([cutlist[0]])
del icursor

Im nachfolgenden Code finden Sie das vollständige Skript.

Import arcpy
p = arcpy.mp.ArcGISProject("CURRENT")
m = p.listMaps("Map")[0]
lyr = m.listLayers(0)
splits = [20, 30, 50]
with arcpy.da.SearchCursor("testpolygon", ["SHAPE@"]) as pcursor:
   for prow in pcursor:
      polygon = prow[0]
      e = polygon.extent
      print(e.XMin,e.YMin,e.XMax,e.YMax)
del pcursor
stepsize = 0.001
leftXstart = e.XMin
leftX = e.XMin + stepsize
ymax = e.YMax
ymin = e.YMin
cutpoly = polygon
icursor = arcpy.da.InsertCursor("testpolygon", ["SHAPE@"])
for i in splits[:2]:
   print(i)
   tol = 0
   while tol < i:
      pntarray = arcpy.Array()
      pntarray.add(arcpy.Point(leftX, ymax))
      pntarray.add(arcpy.Point(leftX, ymin))
      pline = arcpy.Polyline(pntarray,arcpy.SpatialReference(3857))
      cutlist = cutpoly.cut(pline)
      tol = 100 * cutlist[1].area / polygon.area
      leftX += stepsize
   cutpoly = cutlist[0]
   icursor.insertRow([cutlist[1]])
icursor.insertRow([cutlist[0]])
del icursor

In der folgenden Abbildung ist das Polygon dargestellt, das nach dem Ausführen des Python-Skripts in ArcGIS Pro nach 20 %, 30 % und 50 % geteilt ist.

Ein Polygon, das mithilfe von ArcPy nach Prozentsätzen geteilt wurde

Artikel-ID: 000027999

Holen Sie sich Unterstützung mit KI

Lösen Sie Ihr Problem schnell mit dem Esri Support AI Chatbot.

Beginnen Sie jetzt mit dem Chatten

Unterstützung durch ArcGIS-Experten anfordern

An den technischen Support wenden

Beginnen Sie jetzt mit dem Chatten

Zu Download-Optionen wechseln