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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值