hotnet 发表于 2017-5-2 11:34:25

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()
tbinfo = traceback.format_tb(tb)


# 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

  
页: [1]
查看完整版本: python脚本交换要素XY坐标