利用arcpy实现在arcgis中对图斑至上而下、从左到右编号

最近做三调项目中,有小伙伴有这样的需求,需要对图斑至上而下,从左到右进行编号。看了网络上相关的资料,有对图斑(polygon)面求出extend,xmin、ymax值,然后导出数据,按照对xmin进行升序排列、对ymax进行降序排列,然后按照自己项目的需要对图斑进行编号。我们在这里基于这种算法,利用arcpy来实现一下。算法开始,主要对图斑进行依次遍历、然后求出图斑的extend最小外包矩形。然后按照之前的算法对xmin、ymax进行排列,然后按照我们的需要填入相应的排序编号。在arcpy中对shapefile数据进创建一个编号的字段,最后利用FID来匹配shapefile中FID将数据填入属性数据中。整个工程就结束了。好了,我们来看一下具体的实现算法。当然这里实现的算法免去利用excel对数据重新排序以及重新挂接。具体的实现代码如下。

# coding:utf-8
import arcpy


#简单排序算法
class SQList:
    def __init__(self, lis=None):
        self.r = lis

    def swap(self, i, j):
        """定义一个交换元素的方法,方便后面调用。"""
        temp = self.r[i]
        self.r[i] = self.r[j]
        self.r[j] = temp
    #对X升序排列
    def select_sortAX(self):
        """
        简单选择排序,时间复杂度O(n^2)
        """
        lis = self.r
        length = len(self.r)
        for i in range(length):
            minimum = i
            for j in range(i+1, length):
                if lis[minimum].XMin > lis[j].XMin:
                    minimum = j
            if i != minimum:
                self.swap(i, minimum)
    # 对Y降序排列
    def select_sortDY(self):
        """
        简单选择排序,时间复杂度O(n^2)
        """
        lis = self.r
        length = len(self.r)
        for i in range(length):
            minimum = i
            for j in range(i+1, length):
                if lis[minimum].YMax < lis[j].YMax:
                    minimum = j
            if i != minimum:
                self.swap(i, minimum)



#图斑信息类
class TBInfo:
    FID=""
    XMin=0;
    YMax=0
    #排序ID
    OrderID=""


def isExsitXH(testData,fileName):
    # 遍历所有的字段
    isContain=False
    fieldObjList = arcpy.ListFields(testData)
    for field in fieldObjList:
        if field.name == fileName:
            isContain=True
            break
    return isContain

#testData="C:\Users\qrb_PC\Desktop\sb\FW.shp"
def do(testData):
    TBInfoList = []

    with  arcpy.da.SearchCursor(testData, ['FID', 'SHAPE@']) as cursor:
        for row in cursor:
            e = row[1].extent

            tmpTBInfo = TBInfo()
            tmpTBInfo.FID = str(row[0])
            tmpTBInfo.XMin = e.XMin
            tmpTBInfo.YMax = e.YMax

            # tmpTBInfo2={"FID":str(row[0]),"XMin":e.XMin,"YMax":e.YMax}
            TBInfoList.append(tmpTBInfo)
        del cursor

    sqlist = SQList(TBInfoList)
    # 对Y降序排列
    sqlist.select_sortDY()
    # 对X升序排列
    sqlist.select_sortAX()


    #对图斑进行编号
    for i in range(0, len(TBInfoList)):
        tmpStr = str(i + 1)
        TBInfoList[i].OrderID = "xxx" + tmpStr

    # 如果是否存在"TBXH"这个字段
    if isExsitXH(testData, "TBXH") == False:
        arcpy.AddField_management(testData, "TBXH", "TEXT", 50)

    with  arcpy.da.UpdateCursor(testData, ["FID", "TBXH"])  as cursor:
        for row in cursor:
            tmpSelectID = str(row[0])
            for item in TBInfoList:
                if item.FID == tmpSelectID:
                    # 更新编号ID
                    row[1] = item.OrderID
                    cursor.updateRow(row)
                    break
        del cursor










                                                                         更多内容,请关注公众号

                                                                        

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

You may also like...