Escribir geometrías
Al utilizar los cursores insertar y actualizar, las secuencias de comandos pueden crear nuevas entidades en una clase de entidad o actualizar las existentes. Una secuencia de comandos puede definir una entidad al crear un objeto de punto, completar sus propiedades y colocarlo en un conjunto. Ese conjunto se pueden usar entonces para establecer la geometría de una entidad utilizando clases de geometría Polígono, Polilínea, PointGeometry, o 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])
Según se mostró anteriormente, una sola parte de la geometría se define mediante un conjunto de puntos. De igual manera, se puede crear una entidad multiparte a partir de un conjunto de conjuntos de puntos según se muestra más adelante utilizando el mismo cursor.
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])
Al escribir entidades de punto, se utiliza solamente un solo objeto de punto para establecer la geometría de una entidad de puntos. También se pueden crear puntos más fácilmente (y eficientemente) utilizando el token SHAPE@XY (y los tokens SHAPE@M y SHAPE@Z, según sea necesario).
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])
Todas las geometrías se validan antes de que se escriban en una clase de entidad. Problemas como una incorrecta orientación del anillo y polígonos que se intersecan a sí mismos, entre otros, se corrigen cuando se simplifica la geometría antes de su inserción.
El siguiente ejemplo muestra cómo leer un conjunto de coordenadas (definido por coordsList) que contiene una serie de coordenadas lineales y utilizarlo para crear una nueva clase de entidad.
# 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
Polígono multiparte y entidades de polilínea y entidades poligonales con anillos interiores se pueden crear mediante un conjunto de conjuntos y pasar esto a clases de Polígono y Polilínea.