背景:
用某建库软件做年度变更,仍需手工处理以下问题:
1、地类图斑图层线状地物宽度处理;
2、城镇村等用地错误数据处理;
3、村级调查区图层、行政区图层错误数据处理;
代码:
# -*- coding: cp936 -*-
import arcpy
path_gdb = 'D:/年度变更/工程文件/年度变更.gdb'#年末数据库。(导成果前维护此数据库)
path_gdb_gx = 'D:/年度变更/工程文件/补充更新数据.gdb'#补充更新数据库。(因为删除了年末库中部分CJDCQJXGX与XZQJXGX数据,需要补充进来)
cjdcq_delete = ['CJDCQ1','CJDCQ2']#待删除的CJDCQ坐落单位代码(因为某些原因,年末库会生成CJDCQ多余的相关更新数据)
xzq_delete = ['XZQ1','XZQ2']#待删除的XZQ坐落单位代码(因为某些原因,年末库会生成XZQ多余的相关更新数据)
len_min = 5#最小长度(小于阈值的数据会被删除)
area_min = 0.01#最小面积(小于阈值的数据会被删除)
#-------------------------------------------------------------------------
print('开始维护:DLTBGX 线状地物宽度')#更新地类图斑更新图层:线状地物宽度为0
fc = path_gdb+'/Data/DLTBGX'
fields = ['XZDWKD']
with arcpy.da.UpdateCursor(fc, fields) as cursor:
for row in cursor:
row[0]='0'
cursor.updateRow(row)
#-------------------------------------------------------------------------
print('开始维护:DLTBGXGC 变更后线状地物宽度')#更新地类图斑更新过程图层:线状地物宽度为0
fc = path_gdb+'/Data/DLTBGXGC'
fields = ['BGHXZDWKD']
with arcpy.da.UpdateCursor(fc, fields) as cursor:
for row in cursor:
row[0]='0'
cursor.updateRow(row)
#-------------------------------------------------------------------------
print('开始维护:CZCDYDGX 删除错误数据')#删除城镇村等用地更新图层:删除面积小于阈值的数据
fc = path_gdb+'/Data/CZCDYDGX'
fields = ['SHAPE_Area']
with arcpy.da.UpdateCursor(fc, fields) as cursor:
for row in cursor:
if row[0] < area_min:
cursor.deleteRow()
#-------------------------------------------------------------------------
print('开始维护:CZCDYDGXGC 更新错误数据')#更新城镇村等用地更新过程图层:维护上一步删除的对应更新过程层属性
fc = path_gdb+'/Data/CZCDYDGXGC'
fields = ['SHAPE_Area','XZQTZLX','BGHBSM','BGHCZCLX','BGHCZCDM','BGHCZCMC','BGXW']
with arcpy.da.UpdateCursor(fc, fields) as cursor:
for row in cursor:
if row[0] < area_min and row[1] == '0':
row[1]='4'
row[2]=''
row[3]=''
row[4]=''
row[5]=''
row[6]='0'
cursor.updateRow(row)
#-------------------------------------------------------------------------
print('开始维护:CJDCQJX 删除错误数据')#删除村级调查区界线图层:删除长度小于阈值的数据
fc = path_gdb+'/Data/CJDCQJX'
fields = ['SHAPE_Length']
with arcpy.da.UpdateCursor(fc, fields) as cursor:
for row in cursor:
if row[0] < len_min:
cursor.deleteRow()
#-------------------------------------------------------------------------
print('开始维护:CJDCQJXGX 删除错误数据')#删除村级调查区界线更新图层:删除长度小于阈值的数据与变更行为为4的数据(因为某些原因,年末库会生成很多多余的CJDCQJXGX。有行政区划调整,删除数据后需要补充进来相关的CJDCQJXGX。其实做到后期,也可以直接导入无需修改、正确的CJDCQJXGX。)
fc = path_gdb+'/Data/CJDCQJXGX'
fc_gx = path_gdb_gx+'/Data/CJDCQJXGX'
fields = ['SHAPE_Length','BGXW']
with arcpy.da.UpdateCursor(fc, fields) as cursor:
for row in cursor:
if row[0] < len_min or row[1] == '4':
cursor.deleteRow()
arcpy.MakeFeatureLayer_management(fc_gx, "CJDCQJXGX")
arcpy.SelectLayerByAttribute_management("CJDCQJXGX", "NEW_SELECTION")
arcpy.Append_management("CJDCQJXGX",fc,"NO_TEST")
#-------------------------------------------------------------------------
print('开始维护:CJDCQGX 删除错误数据')#删除村级调查区更新图层:删除指定坐落单位代码的数据(因为某些原因,年末库会生成很多多余的CJDCQGX。)
fc = path_gdb+'/Data/CJDCQGX'
fields = ['ZLDWDM']
with arcpy.da.UpdateCursor(fc, fields) as cursor:
for row in cursor:
if row[0] in cjdcq_delete:
cursor.deleteRow()
#-------------------------------------------------------------------------
print('开始维护:CJDCQGXGC 删除错误数据')#删除村级调查区更新过程图层:删除指定变更前坐落单位代码的数据(因为某些原因,年末库会生成很多多余的CJDCQGXGC。)
fc = path_gdb+'/Data/CJDCQGXGC'
fields = ['BGQZLDWDM']
with arcpy.da.UpdateCursor(fc, fields) as cursor:
for row in cursor:
if row[0] in cjdcq_delete:
cursor.deleteRow()
#-------------------------------------------------------------------------
print('开始维护:XZQJX 删除错误数据')#删除行政区界线图层:删除长度小于阈值的数据
fc = path_gdb+'/Data/XZQJX'
fields = ['SHAPE_Length']
with arcpy.da.UpdateCursor(fc, fields) as cursor:
for row in cursor:
if row[0] < len_min:
cursor.deleteRow()
#-------------------------------------------------------------------------
print('开始维护:XZQJXGX 删除错误数据')#删除行政区界线更新图层:删除长度小于阈值的数据与变更行为为4的数据(因为某些原因,年末库会生成很多多余的XZQJXGX。有行政区划调整,删除数据后需要补充进来相关的XZQJXGX。其实做到后期,也可以直接导入无需修改、正确的XZQJXGX。)
fc = path_gdb+'/Data/XZQJXGX'
fc_gx = path_gdb_gx+'/Data/XZQJXGX'
fields = ['SHAPE_Length','BGXW']
with arcpy.da.UpdateCursor(fc, fields) as cursor:
for row in cursor:
if row[0] < len_min or row[1] == '4':
cursor.deleteRow()
arcpy.MakeFeatureLayer_management(fc_gx, "XZQJXGX")
arcpy.SelectLayerByAttribute_management("XZQJXGX", "NEW_SELECTION")
arcpy.Append_management("XZQJXGX",fc,"NO_TEST")
#-------------------------------------------------------------------------
print('开始维护:XZQGX 追加数据')#追加行政区更新图层:下发的基础库有个洞🤬🤬🤬(我也是服了,什么奇葩都能遇到)
fc = path_gdb+'/Data/XZQGXGC'
out_path = path_gdb+'/Data/XZQGX'
arcpy.MakeFeatureLayer_management(fc, "XZQGX_Add")
arcpy.SelectLayerByAttribute_management("XZQGX_Add", "NEW_SELECTION", "SHAPE_Area<1")
arcpy.Append_management("XZQGX_Add",out_path,"NO_TEST")
#-------------------------------------------------------------------------
print('开始维护:XZQGX 删除错误数据')#删除行政区更新图层:删除指定坐落单位代码的数据(因为某些原因,年末库会生成很多多余的XZQGX。处理上一步追加的空洞。)
arcpy.env.workspace = path_gdb
fields = ['XZQDM']
with arcpy.da.UpdateCursor('Data/XZQGX', fields) as cursor:
for row in cursor:
if row[0] in xzq_delete:
cursor.deleteRow()
#arcpy.Rename_management('Data/XZQGX', 'Data/XZQGX1')#图层重命名需要独占模式,弃用
arcpy.FeatureClassToFeatureClass_conversion('Data/XZQGX',path_gdb,'Data/XZQGX1')
arcpy.Delete_management('Data/XZQGX')
arcpy.MakeFeatureLayer_management('Data/XZQGX1', "XZQGX")
arcpy.SelectLayerByAttribute_management("XZQGX", "NEW_SELECTION", "SHAPE_Area<1")
arcpy.Eliminate_management("XZQGX",'Data/XZQGX','LENGTH')
arcpy.Delete_management('Data/XZQGX1')
#-------------------------------------------------------------------------
print('开始维护:XZQGXGC 删除错误数据')#删除行政区更新过程图层:删除指定变更前坐落单位代码的数据(因为某些原因,年末库会生成很多多余的XZQGXGC。处理基础库空洞造成的多余XZQGXGC。)
arcpy.env.workspace = path_gdb
fields = ['BGQXZQDM']
with arcpy.da.UpdateCursor('/Data/XZQGXGC', fields) as cursor:
for row in cursor:
if row[0] in xzq_delete:
cursor.deleteRow()
#arcpy.Rename_management('Data/XZQGXGC', 'Data/XZQGXGC1')#图层重命名需要独占模式,弃用
arcpy.FeatureClassToFeatureClass_conversion('Data/XZQGXGC',path_gdb,'Data/XZQGXGC1')
arcpy.Delete_management('Data/XZQGXGC')
arcpy.MakeFeatureLayer_management('Data/XZQGXGC1', "XZQGXGC")
arcpy.SelectLayerByAttribute_management("XZQGXGC", "NEW_SELECTION", "SHAPE_Area<1")
arcpy.Eliminate_management("XZQGXGC",'Data/XZQGXGC','LENGTH')
arcpy.Delete_management('Data/XZQGXGC1')
#-------------------------------------------------------------------------
print('over')