写入几何
通过使用插入和更新游标,脚本可以在要素类中创建新要素或更新现有要素。脚本可以通过创建点对象、填充要素属性和将要素放入数组中来定义要素。该数组随后即可用于设置要素的几何。单个几何部分可以由点数组定义,因此可以从多个点数组创建多部分 (multipart) 要素。
下面就是一个文件示例,该示例将由随后的脚本进行处理。它包含一个点 ID 及 x 坐标和 y 坐标。
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
以下示例显示如何读取包含一系列线性坐标的文本文件(如上所示),并使用它们创建新要素类。
# 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 and other required modules
#
import arcpy
from arcpy import env
import fileinput
import string
import os
env.overwriteOutput = True
# Get the coordinate ASCII file
#
infile = arcpy.GetParameterAsText(0)
# Get the output feature class
#
fcname = arcpy.GetParameterAsText(1)
# Get the template feature class
#
template = arcpy.GetParameterAsText(2)
try:
# Create the output feature class
#
arcpy.CreateFeatureclass_management(os.path.dirname(fcname),
os.path.basename(fcname),
"Polyline", template)
# Open an insert cursor for the new feature class
#
cur = arcpy.InsertCursor(fcname)
# Create an array and point object needed to create features
#
lineArray = arcpy.Array()
pnt = arcpy.Point()
# Initialize a variable for keeping track of a feature's ID.
#
ID = -1
for line in fileinput.input(infile): # Open the input file
# set the point's ID, X and Y properties
#
pnt.ID, pnt.X, pnt.Y = string.split(line,";")
print pnt.ID, pnt.X, pnt.Y
if ID == -1:
ID = pnt.ID
# Add the point to the feature's array of points
# If the ID has changed, create a new feature
#
if ID != pnt.ID:
# Create a new row or feature, in the feature class
#
feat = cur.newRow()
# Set the geometry of the new feature to the array of points
#
feat.shape = lineArray
# Insert the feature
#
cur.insertRow(feat)
lineArray.removeAll()
lineArray.add(pnt)
ID = pnt.ID
# Add the last feature
#
feat = cur.newRow()
feat.shape = lineArray
cur.insertRow(feat)
lineArray.removeAll()
fileinput.close()
del cur
except Exception as e:
print e.message
写入点要素时不需要点数组。单个点对象用于设置点要素几何。
所有几何在写入要素类前都已经过验证。在插入几何前的几何简化过程中,将纠正各类问题(例如,不正确的环方向和自相交面以及其他问题)。
示例:使用 SearchCursor 和 InsertCursor 创建方形缓冲区
某些情况下,最好基于另一个要素类的要素创建新几何。这可以通过同时使用 SearchCursor 和 InsertCursor 来实现。
在以下示例中,InsertCursor 用于标识输入点要素类的 x,y 坐标。这些点坐标用于计算方形缓冲区多边形的拐角位置,这些拐角位置通过 InsertCursor 输入到输出中。
import arcpy
from arcpy import env
import os
env.overwriteOutput = True
# Get arguments:
# Input point feature class
# Output polygon feature class
# Buffer distance
# Boolean type: Maintain fields and field values of the input in the output
#
inPoints = arcpy.GetParameterAsText(0)
outPolys = arcpy.GetParameterAsText(1)
bufDist = arcpy.GetParameterAsText(2)
keepFields = arcpy.GetParameterAsText(3)
# Prepare the output based on whether field and field values are desired in the output
#
if keepFields:
# Create empty output polygon feature class that includes fields of the input
#
arcpy.CreateFeatureClass(os.path.dirname(outPolys), os.path.basename(outPolys), "POLYGON",
inPoints, "", "", inPoints)
# Create a short list of fields to ignore when moving fields values from
# input to output
#
ignoreFields = []
# Use Describe properties to identify the shapeFieldName and OIDFieldName
#
desc = arcpy.Describe(inPoints)
ignoreFields.append(desc.shapeFieldName)
ignoreFields.append(desc.OIDFieldName)
# Create a list of fields to use when moving field values from input to output
#
fields = arcpy.ListFields(inPoints)
fieldList = []
for field in fields:
if field.name not in ignoreFields:
fieldList.append(field.name)
else:
# Create empty output polygon feature class without fields of the input
#
arcpy.CreateFeatureclass(os.path.dirname(outPolys), os.path.basename(outPolys), "POLYGON",
"", "", "", inPoints)
# Open searchcursor
#
inRows = arcpy.SearchCursor(inPoints)
# Open insertcursor
#
outRows = arcpy.InsertCursor(outPolys)
# Create point and array objects
#
pntObj = arcpy.Point()
arrayObj = arcpy.Array()
for inRow in inRows: # One output feature for each input point feature
inShape = inRow.shape
pnt = inShape.getPart(0)
# Need 5 vertices for square buffer: upper right, upper left, lower left,
# lower right, upper right. Add and subtract distance from coordinates of
# input point as appropriate.
for vertex in [0,1,2,3,4]:
pntObj.ID = vertex
if vertex in [0,3,4]:
pntObj.X = pnt.X + bufDist
else:
pntObj.X = pnt.X - bufDist
if vertex in [0,1,5]:
pntObj.Y = pnt.Y + bufDist
else:
pntObj.Y = pnt.Y - bufDist
arrayObj.add(pntObj)
# Create new row for output feature
#
feat = outRows.newRow()
# Shift attributes from input to output
#
if keepFields == "true":
for fieldName in fieldList:
feat.setValue(fieldName, inRow.getValue(fieldName))
# Assign array of points to output feature
#
feat.shape = arrayObj
# Insert the feature
#
outRows.insertRow(feat)
# Clear array of points
#
arrayObj.removeAll()
# Delete inputcursor
#
del outRows
注:仅仅使用地理处理工具,也可以先后通过缓冲和 FeatureEnvelopeToPolygon 工具计算方形缓冲区。
相关主题
7/10/2012