python脚本交换要素XY坐标
在实际工作中你可能会遇到这样的问题,将空间图形的XY坐标进行反转,如下图所示:
三种类型的要素都可以完成XY坐标点的互换操作。
整个处理的思路为:
1.获取输入要素,然后逐个进行遍历
2.同时新建空间类型相同的要素类,然后创建要素
3.将遍历要素中所有节点的XY反转后赋予新要素(注意点、线、面的操作略有不同)
4.保存新建要素,并输出结果。
参考代码如下(在arcgis9.3环境下测试通过,如果需要在10.0以及以上版本使用可能需要修改部分代码):
import arcgisscripting, sys, traceback, string, os
gp = arcgisscripting.create(9.3)
gp.overwriteoutput = 1
inFC = gp.GetParameterAsText(0)
outFC = gp.GetParameterAsText(1)
gp.workspace = os.path.dirname(inFC)
desc = gp.Describe(inFC)
shapeField = desc.ShapeFieldName #SHAPE field name
shapeType = desc.ShapeType
# Create output FC for inserting swaped geometries (if not exist)
if not gp.Exists(outFC):
gp.CreateFeatureClass_management(os.path.dirname(outFC),os.path.basename(outFC),shapeType,inFC,””,””,inFC)
#define function to insert new row with swaped geometry and field values from oryginal FC
def insertFields(inFields, geometry, outUpdateCursor, inSearchCursorRow):
newFeature = outUpdateCursor.newRow() #create new row in InsCur
newFeature.shape = geometry #assign vertex or ARRAY of vertices
#append attributes from oryginal feature class
for fieldName in inFields:
inValue = inSearchCursorRow.getValue(fieldName)
if inValue: #ensures that NULLs will not be copied
newFeature.setValue(fieldName, inValue)
outUpdateCursor.insertRow(newFeature) #insert new row
try:
# Define progressor to update progress info in dialog box
gp.SetProgressor(“default”)
count = int(gp.GetCount_management(inFC).getOutput(0))
fcount = 0
#determine fields from input FC which will be copied to output FC
inFieldList = gp.ListFields(inFC)
inFieldNameList = []
for field in inFieldList:
#exclude field wich should not be copied
if (field.editable == True) and (field.name.upper() not in (“SHAPE”)):
inFieldNameList.append(field.name)
#open SearchCursor on input FC
rows = gp.SearchCursor(inFC)
row = rows.next()
#open InsertCursor on output FC
outRows = gp.InsertCursor(outFC)
while row:
#create Point and Array object which will contain features vertices
vertex = gp.CreateObject(“Point”)
featureVertexArray = gp.CreateObject(“Array”)
partVertexArray = gp.CreateObject(“Array”)
feature = row.getValue(shapeField) #get the SHAPE field into variable
#update progressor
fcount += 1
progressMessage = “Processing source feature: ” + str(fcount) + ” of ” + str(count)
gp.SetProgressorLabel(progressMessage)
##For point and multipoint geometry there is another way of reading coordinates than for polyline/polygon
if shapeType.upper() == “POINT”:
pnt = feature.GetPart() #when POINT, GetPart returns point, not array of points
#for each geometry create new POINT obj and assign swapped Y, X (no need to add vertices to ARRAY)
vertex = gp.CreateObject(“Point”)
vertex.X, vertex.Y = pnt.Y, pnt.X
insertFields(inFieldNameList, vertex, outRows, row)
elif shapeType.upper() == “MULTIPOINT”:
partNum = 0
partCount = feature.PartCount
while partNum < partCount:
pnt = feature.GetPart(partNum) #when POINT, GetPart returns point, not array of points
#for each geometry create new POINT obj and assign swapped Y, X (no need to add vertices to ARRAY)
vertex = gp.CreateObject(“Point”)
vertex.X, vertex.Y = pnt.Y, pnt.X
featureVertexArray.add(vertex)
partNum += 1 #take next point in next loop run
insertFields(inFieldNameList, featureVertexArray, outRows, row)
else: #polylines and polygons
#feature can have multiple parts – first goes iteration through parts
partNum = 0
partCount = feature.PartCount
while partNum < partCount:
part = feature.GetPart(partNum) #the output is Array of points
pnt = part.next() #take first point from Array of points
#iterate through all points in array
while pnt:
#for each geometry create new POINT obj and assign swapped Y, X. Then add vertices to ARRAY
vertex.X, vertex.Y = pnt.Y, pnt.X
partVertexArray.add(vertex)
pnt = part.next()
#If pnt is null, either the part is finished or there is an interior ring
if not pnt:
pnt = part.next()
featureVertexArray.add(partVertexArray)
partVertexArray.removeAll()
featureVertexArray.add(partVertexArray)
partNum += 1 #increment part number to run loop
insertFields(inFieldNameList, featureVertexArray, outRows, row)
featureVertexArray.removeAll() #clear ARRAY before processing new geometry
row = rows.next() #go to next row in input FC
gp.AddMessage(‘Swapping XY coordinates finished sucessfully.’)
except:
# Get the geoprocessing error messages
msgs = gp.GetMessage(0)
msgs += gp.GetMessages(2)
# Return gp error messages for use with a script tool
gp.AddError(msgs)
# Print gp error messages for use in Python/PythonWin
print msgs
# Get the traceback object
tb = sys.exc_info()[2]
tbinfo = traceback.format_tb(tb)[0]
# Concatenate information together concerning the error into a
# message string
pymsg = tbinfo + “\n” + str(sys.exc_type)+ “: ” + str(sys.exc_value)
# Return python error messages for use with a script tool
gp.AddError(pymsg)
# Print Python error messages for use in Python/PythonWin
print pymsg
del gp, inFC, desc, rows, row, feature, pnt, outRows, outFC, vertex, featureVertexArray, partVertexArray, shapeType
转载自:https://blog.csdn.net/esrichinacd/article/details/19159819