利用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