(三)arcpy开发&利用arcpy实现接边处理(arcgis要素创建、更新、图层选择)

之前一个项目中有关于接边方面内容,即在两个相邻的行政区域内出现面数据有相邻的部分,现在需要将相邻部分两个面的ID互换。具体的数据如下图所示:

那么如何来解决这个问题呢,首先在arcpy中可以使用

SelectLayerByLocation_management对图层进行选择,该函数需要传入选择图层,被选择图层,以及选择的方式,是否相邻之类的。关于该函数的使用,大家可以查阅相关的资料,这里就不一一说明。首先在编写这个程序时,需要对一个区域所有的面进行遍历,然后再与另外区域的所有面进行选择。因此,这中间涉及到面遍历后创建新元素,然后将新元素放到选择函数中,之后还需要删除该图层。这中间比较浪费时间,特别是在创建元素和删除元素的时候,以及进行选择操作时。经过比较后找到相应的id然后更新原来的传入的数据。具体的实现看一下源代码。

# coding:utf-8
import arcpy
import os
import sys
reload(sys)
sys.setdefaultencoding('utf-8')




#交换id
def switchID(selectLayer,selectID,selectedLayer,selectedID):
    #处理选择图层
    with  arcpy.da.UpdateCursor(selectLayer,["ID","JBX"])  as cursor:
        for row in cursor:
            tmpSelectID=row[0].encode("utf-8")
            if tmpSelectID==selectID:
                row[1]=selectedID
                cursor.updateRow(row)
                break

        del  cursor
    #处理被选择图层
    with  arcpy.da.UpdateCursor(selectedLayer,["ID","JBX"])  as cursor:
        for row in cursor:
            tmpSelectID=row[0].encode("utf-8")
            if tmpSelectID==selectedID:
                row[1]=selectID
                cursor.updateRow(row)
                break

        del  cursor

def delShpFile(root):
     extends=[".cpg",".dbf",".prj",".sbn",".sbx",".shp",".shp.xml",".shx"]
     files=[]
     for extend in extends:
        tmpFile=root+extend
        if os.path.isfile(tmpFile):
            files.append(tmpFile)
     for file in files:
         os.remove(file)

selectLayer="C:\Users\Desktop\STProject\statistics\测试数据\xx1遥感统计数据库.gdb\STM"
selectedLayer="C:\Users\Desktop\STProject\statistics\测试数据\xx2遥感统计数据库.gdb\STM"

arcpy.MakeFeatureLayer_management(selectLayer,"STM")

arcpy.MakeFeatureLayer_management(selectedLayer,"STM2")

selection=arcpy.SelectLayerByLocation_management("STM",
                                                 "BOUNDARY_TOUCHES",
                                                 selectedLayer,"","NEW_SELECTION")

selection2=arcpy.SelectLayerByLocation_management("STM2",
                                                 "BOUNDARY_TOUCHES",
                                                 selectLayer,"","NEW_SELECTION")

cnt=arcpy.GetCount_management(selection);

rootPath="C:\Users\qrb_PC\Desktop\mestShp"




# with arcpy.da.SearchCursor(selectLayer, ["SHAPE@",'ID']) as cursor:
#      for row in cursor:
#         geometry = row[0]
#         arcpy.MakeFeatureLayer_management(geometry,"TmpSTM")
#         itemSelect=arcpy.SelectLayerByLocation_management("TmpSTM",selectedLayer,"","NEW_SELECTION")
#         tmpCNT = arcpy.GetCount_management(itemSelect);
#      del cursor


selectResultPath=rootPath+"\Metd.shp"
arcpy.CopyFeatures_management(selection, selectResultPath)

selectedResultPath=rootPath+"\Metd2.shp"

finalResPath=rootPath+"\Final.shp"

cnt2=arcpy.GetCount_management(selection2)
arcpy.CopyFeatures_management(selection2, selectedResultPath)

# 遍历选择面
with arcpy.da.SearchCursor(selectResultPath, ["SHAPE@",'ID']) as selectCursor:
    for selectRow in selectCursor:
        out_name = "Select"+selectRow[1] + '.shp'
        tmpSelectOutName="Select"+selectRow[1];
        selectID=selectRow[1].encode("utf-8")
        arcpy.FeatureClassToFeatureClass_conversion(selectRow[0], rootPath, out_name)
        # 遍历被选择面
        with arcpy.da.SearchCursor(selectedResultPath, ["SHAPE@",'ID']) as selectedCursor:
            for selectedRow in selectedCursor:
                out_name2 = "SelectED" + selectedRow[1] + '.shp'
                tmpSelectedOutName = "SelectED" + selectedRow[1]
                creatName="RSelectED" + selectedRow[1]

                creatName.encode("utf-8")
                arcpy.FeatureClassToFeatureClass_conversion(selectedRow[0], rootPath, out_name2)

                tmpResultPath=rootPath +"\\"+ out_name
                tmpResultPath2 = rootPath + "\\" + out_name2
                #创建临时图层
                arcpy.MakeFeatureLayer_management(tmpResultPath, creatName)
                resSelection = arcpy.SelectLayerByLocation_management(creatName,"BOUNDARY_TOUCHES",tmpResultPath2)
                fCNT = int(arcpy.GetCount_management(resSelection).getOutput(0))

                selectedID=selectedRow[1].encode("utf-8")
                mypath=rootPath+"\\"+tmpSelectedOutName
                if fCNT==1:
                    print "已经找到"
                    switchID(selectLayer,selectID,selectedLayer,selectedID)
                    delShpFile(rootPath+"\\"+tmpSelectedOutName)
                else:
                    delShpFile(rootPath+"\\"+tmpSelectedOutName)
                #删除临时图层
                arcpy.Delete_management(creatName)
            del selectedCursor
        delShpFile(rootPath + "\\" + tmpSelectOutName)
    del selectCursor

当然在中间遇到了不少的问题,首先来看一下这个,显然是使用游标选择的时候,字段值没有造成的错误。

RuntimeError: A column was specified that does not exist.


                                                                              更多内容,请关注公众号

                                                                    

转载自:https://blog.csdn.net/u010608964/article/details/83242228

You may also like...