python脚本交换要素XY坐标

本文介绍了一种处理空间图形的技巧,即反转其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


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值