写入几何
通过使用 插入和 更新游标,脚本可以在要素类中创建新要素或更新现有要素。脚本可以通过创建 点对象、填充要素属性和将要素放入 数组中来定义要素。然后,即可通过 面 (Polygon)、 折线 (Polyline)、 点几何 (PointGeometry) 或 多部件 (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])
如上所示,单个几何部分可以由点数组定义。同样,可以使用同一游标从点数组的数组创建多部件要素,如下所示。
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])
在写入点要素时,只有单个点对象用于设置点要素几何。使用 SHAPE@XY 令牌(以及 SHAPE@M 和 SHAPE@Z 令牌(如果需要的话)),也可更加轻松地创建点。
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])
所有几何在写入要素类前都已经过验证。在插入几何前的几何简化过程中,将纠正各类问题(例如,不正确的环方向和自相交面以及其他问题)。
以下示例显示如何读取包含一系列线性坐标的坐标组(由 coordsList 定义),并使用它们创建新的要素类。
# 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
通过创建由数组构成的数组并将其传递到 Polygon 类和 Polyline 类,可以创建多部分面要素和折线要素以及带有内部环的面要素。