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

52 篇文章 79 订阅
37 篇文章 17 订阅

首先小伙伴们可以参考arcpy开发学习视频。

https://edu.csdn.net/course/detail/25535

最近做三调项目中,有小伙伴有这样的需求,需要对图斑至上而下,从左到右进行编号。看了网络上相关的资料,有对图斑(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










                                                                         更多内容,请关注公众号

                                                                        

  • 5
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
以下是利用arcpy实现ArcGIS的split,erase,intersext和union的代码实现功能的示例: 1. Split ```python import arcpy # 输入要素类路径 in_features = "C:/data/input.gdb/input_fc" # 拆分要素类的字段 split_field = "Split_Field" # 拆分后的输出要素类路径 out_feature_class = "C:/data/output.gdb/split_fc" # 使用 Split 工具进行拆分 arcpy.Split_analysis(in_features, out_feature_class, split_field) ``` 2. Erase ```python import arcpy # 输入要素类路径 in_features = "C:/data/input.gdb/input_fc" # 要擦除的要素类路径 erase_features = "C:/data/input.gdb/erase_fc" # 擦除后的输出要素类路径 out_feature_class = "C:/data/output.gdb/erase_fc" # 使用 Erase 工具进行擦除 arcpy.Erase_analysis(in_features, erase_features, out_feature_class) ``` 3. Intersect ```python import arcpy # 输入要素类路径 in_features = "C:/data/input.gdb/input_fc" # 相交的要素类路径 intersect_features = "C:/data/input.gdb/intersect_fc" # 相交后的输出要素类路径 out_feature_class = "C:/data/output.gdb/intersect_fc" # 使用 Intersect 工具进行相交 arcpy.Intersect_analysis([in_features, intersect_features], out_feature_class) ``` 4. Union ```python import arcpy # 输入要素类路径 in_features = "C:/data/input.gdb/input_fc" # 要合并的要素类路径 union_features = "C:/data/input.gdb/union_fc" # 合并后的输出要素类路径 out_feature_class = "C:/data/output.gdb/union_fc" # 使用 Union 工具进行合并 arcpy.Union_analysis([in_features, union_features], out_feature_class) ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yGIS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值