【ArcPy】修改属性表

基于Python的shp文件要素经纬度编号教程,

问题描述

shp文件中有大量要素需要根据经纬度进行编号。编号规则为在一个区域内,纬度由北至南,在相同纬度下有西向东的属性编号。
在这里插入图片描述

代码实现

# -*- coding: utf-8 -*-
"""
Created on Tue Nov 11 19:47:56 2023
@author: VictorHans
思路:
先分区,一个区是一个列表,列表中第一个元素为该区的名字;
在每一个区中根据先纬度后经度排序,追加一个排序序号字段;
遍历属性表,根据FID对应到排序好的列表更新排序
"""
# 导入arcpy模块
import arcpy

#判断是否在列表中,不在就加入
def fundCopy(x,L):
    flag = x in L
    if flag == False:
        L.append(x)

#写编码
def funAddCode(L):#
    for i in range(len(L)):
        k=0
        for j in range(1,len(L[i])):
            k=k+1
            L[i][j][-1]=k
    return L

# 指定输入的shp文件路径
in_shp = r"D:\test\bui_hsl.shp"
L_name = []
L_elements = []
# 获取字段列表
fields = [field.name for field in arcpy.ListFields (in_shp)]
with arcpy.da.UpdateCursor(in_shp, fields[5]) as cursor:
    for row in cursor:
        fundCopy(row,L_name)
L_elements = L_name

#行政区划的结果存入对应列表
with arcpy.da.UpdateCursor(in_shp, fields) as cursor:
    for row in cursor:
        for i in range(len(L_elements)):
            if row[5] == L_elements[i][0]:
                L_elements[i].append(row)
del cursor
#对每一组元素排序
for i in range(len(L_elements)):
    temp = []
    #print(L_elements[i])
    for j in range(1,len(L_elements[i])):
        #print(L_elements[i][j])
        temp.append(L_elements[i].pop())
    #print(temp)
    sortlist = sorted(temp,key=lambda x: (-x[13],x[12]))
    for x in sortlist:
        L_elements[i].append(x)

#在最后一列写入编号
funAddCode(L_elements)

#根据行政区划写入序号
with arcpy.da.UpdateCursor(in_shp, fields) as cursor:
    for row in cursor:
        #print(row)
        for i in range(len(L_elements)):

            if row[5] == L_elements[i][0]:#Name相同
                for k in range(len(L_elements[i])):
                    if row[0] == L_elements[i][k][0]:#FID相同
                        print(L_elements[i][k][0])
                        row[-1]=L_elements[i][k][-1]#将序号添加到最后一行
        # 更新要素
        cursor.updateRow(row)
del cursor
print("finished!")

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

维吉斯蔡

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

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

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

打赏作者

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

抵扣说明:

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

余额充值