Ecriture des géométries

A l'aide des curseur d'insertion et de mise à jour, les scripts peuvent créer de nouvelles entités dans une classe d'entités ou mettre à jour des entités existantes. Un script permet de définir une entité en créant un objet Point, en définissant ses propriétés et en la plaçant dans un tableau. Ce tableau peut ensuite permettre de définir la géométrie d'une entité à l'aide des classes de géométrie Polygon, Polyline, PointGeometryou MultiPoint.

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])

Comme illustré ci-dessus, une seule partie de géométrie est définie par un tableau de points. De même, une entité multi-parties peut être créée à partir d'un tableau de tableaux de points, comme indiqué ci-dessous à l'aide du même curseur.

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])

Lors de l'écriture des entités ponctuelles, un objet point unique sert à définir la géométrie d'une entité ponctuelle. Les points peuvent également être créés plus facilement (et efficacement) à l'aide du jeton SHAPE@XY (et des jetons SHAPE@M et SHAPE@Z si nécessaire).

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])

Toutes les géométries sont validées avant leur enregistrement dans une classe d'entités. Les problèmes de boucles mal orientées et de polygones qui s'entrecoupent, entre autres, sont corrigés lorsque la géométrie est simplifiée avant son insertion.

L'exemple ci-dessous montre comment lire un ensemble de coordonnées (définies par coordsList) contenant une série de coordonnées linéaires, puis les utiliser pour créer une nouvelle classe d'entités.

# 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

Il est possible de créer des entités surfaciques et polylignes à plusieurs parties avec des anneaux intérieurs en créant un tableau de tableaux et en le transmettant aux classes Polygone et Polyligne.

Thèmes connexes

5/10/2014