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

You may also like...