Schreiben von Geometrien

Mit Einfüge- und Aktualisierungs-Cursorn können Skripte neue Features in einer Feature-Class erstellen oder vorhandene aktualisieren. Ein Skript kann ein Feature definieren, indem es ein Punkt-Objekt erstellt, dessen Eigenschaften festlegt und es in einem Array platziert. Dieses Array kann anschließend zum Festlegen der Geometrie eines Features mithilfe der Geometrieklassen Polygon, Polylinie, PointGeometry oder Multipoint verwendet werden.

import arcpy
fc = "c:/data/gdb.gdb/roads"
cursor = arcpy.da.InsertCursor(fc, ["SHAPE@"])
array = arcpy.Array([arcpy.Point(5997611.48964, 2069897.7022),
                     arcpy.Point(5997577.46097, 2069905.81145)])
polyline = arcpy.Polyline(array)

cursor.insertRow([polyline])

Wie oben gezeigt, wird ein einzelner Geometrieteil durch ein Punktarray definiert. Ebenso kann ein Multipart-Feature mit demselben Cursor aus einem Array mit Arrays von Punkten erstellt werden, wie weiter unten gezeigt wird.

firstPart = arcpy.Array([arcpy.Point(5997624.6225, 2069868.8208),
                         arcpy.Point(5997674.94199, 2069833.81741)])
secondPart = arcpy.Array([arcpy.Point(5997616.44497, 2069862.32774),
                          arcpy.Point(5997670.57373, 2069824.67456)])

array = arcpy.Array([firstPart, secondPart])
multipartFeature = arcpy.Polyline(array)

cursor.insertRow([newGeometry2])

Beim Schreiben von Punkt-Features wird nur ein einzelnes Punktobjekt zum Festlegen der Geometrie eines Punkt-Features verwendet. Mit dem Token SHAPE@XY (und den Token SHAPE@M sowie SHAPE@Z bei Bedarf) können Punkte auch einfacher (und effizienter) erstellt werden.

import arcpy

# fc is a point feature class
#
fc = "c:/data/gdb.gdb/stops"
cursor = arcpy.da.InsertCursor(fc, ["SHAPE@XY"])
xy = (5997594.4753, 2069901.75682)

cursor.insertRow([xy])

Sämtliche Geometrien werden validiert, bevor sie in eine Feature-Class geschrieben werden. Probleme wie eine fehlerhafte Ringausrichtung und sich selbst überschneidende Polygone werden beim Vereinfachen der Geometrie behoben, bevor diese eingefügt wird.

Im folgenden Beispiel wird veranschaulicht, wie ein Koordinatenpaar (definiert durch coordsList) mit mehreren linearen Koordinaten gelesen und anhand der Koordinaten eine neue Feature-Class erstellt wird.

# Create a new line feature class using a text file of coordinates.
#   Each coordinate entry is semicolon delimited in the format of ID;X;Y
import arcpy
import os

# List of coordinates (ID, X, Y)
#
coordsList = [[1, -61845879.0968, 45047635.4861], 
              [1, -3976119.96791, 46073695.0451],
              [1, 1154177.8272, -25134838.3511],
              [1, -62051091.0086, -26160897.9101],
              [2, 17365918.8598, 44431999.7507],
              [2, 39939229.1582, 45252847.3979],
              [2, 41170500.6291, 27194199.1591],
              [2, 17981554.5952, 27809834.8945],
              [3, 15519011.6535, 11598093.8619],
              [3, 52046731.9547, 13034577.2446],
              [3, 52867579.6019, -16105514.2317],
              [3, 17160706.948, -16515938.0553]]

# The output feature class to be created
#
outFC = arcpy.GetParameterAsText(0)

# Get the template feature class
#
template = arcpy.GetParameterAsText(1)

cur = None
try:
    # Create the output feature class
    #
    arcpy.CreateFeatureclass_management(os.path.dirname(outFC),
                                        os.path.basename(outFC), 
                                        "POLYLINE", template)

    # Open an insert cursor for the new feature class
    #
    cur = arcpy.da.InsertCursor(outFC, ["SHAPE@"])

    # Create an array object needed to create features
    #
    array = arcpy.Array()

    # Initialize a variable for keeping track of a feature's ID.
    #
    ID = -1
    for coords in coordsList: 
        if ID == -1:
            ID = coords[0]

        # Add the point to the feature's array of points
        #   If the ID has changed, create a new feature
        #
        if ID != coords[0]:
            cur.insertRow([arcpy.Polyline(array)])
            array.removeAll()
        array.add(arcpy.Point(coords[1], coords[2], ID=coords[0]))
        ID = coords[0]

    # Add the last feature
    #
    cur.insertRow([arcpy.Polyline(array)])


except Exception as e:
   print e.message
finally:
    # Cleanup the cursor if necessary
    #
    if cur:
        del cur

Multipart-Polygon- und Polylinien-Features mit Innenringen werden erstellt, indem Sie einen Array mit Arrays erstellen und diesen an die Classes Polygon und Polyline übergeben.

Verwandte Themen

9/11/2013