问题描述
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!")