利用ArcGis进行属性逻辑一致性判断
背景:一个朋友从事农村不动产调查工作,工作当中发现有些宅基地的宗地代码前几位(地籍子区代码)与实际所属地籍子区不一样(错误输入)。这种属性错误会直接导致不动产数据无法入库。一个一个地籍子区检查即浪费时间又浪费精力,于是让我帮忙筛查属性错误的宅基地。我也就顺便做了这么个脚本工具。
如开篇图所示,想要从104个地籍子区中挑选出4万多宗地里面有属性错误的宗地,该如何做呢?
其实实现途径很简单,只需两步:
按位置选择图层----按属性选择图层(反选),所得到的就是我们所需要的宗地。
但是单纯这样做的话,工作量会随着地籍子区的增加而增加。特别是当我们需要挑选出建筑物不动产单元号和宗地代码不一致的时候,几万甚至几十万宗地是这种方法难以解决的。
这时候,就需要用到arcgis的自动地理处理了。自动地理处理可以选择使用模型构建器或者python,这两种方法都能够很轻松实现批量处理和自动迭代。
下面是python工具箱完整代码:
import arcpy,os #导入arcpy os
#工具箱类
class Toolbox(object):
def __init__(self):
"""Define the toolbox (the name of the toolbox is the name of the
.pyt file)."""
self.label = "Toolbox"
self.alias = ""
# List of tool classes associated with this toolbox
self.tools = [CheckLogicAttribute] #工具添加进工具箱,这是个列
#表,可以添加很多工具。
#新建一个叫checkLogicAttribute的工具
class CheckLogicAttribute(object):
def __init__(self):
"""Define the tool (tool name is the name of the class)."""
self.label = "CheckLogicAttribute"
self.description = ""
self.canRunInBackground = True
#定义输入输出参数
def getParameterInfo(self):
"""Define parameter definitions"""
#输入参数:被包含要素类(宗地)
param0=arcpy.Parameter(
displayName='inside_featureclass',
name='inside_f',
datatype='DEShapefile',
parameterType='Required',
direction='Input')
#输入参数:要检查属性的字段名(被包含要素)
param1=arcpy.Parameter(
displayName='selcet filed',
name='is_filed',
datatype='Field',
parameterType='Required',
direction='Input')
param1.parameterDependencies=[param0.name]
#输入参数:范围要素类(地籍子区)
param2=arcpy.Parameter(
displayName='outside_featureclass',
name='outside_f',
datatype='DEShapefile',
parameterType='Required',
direction='Input')
#输入参数:提供属性的字段名(范围要素)
param3=arcpy.Parameter(
displayName='select filed',
name='os_filed',
datatype='Field',
parameterType='Required',
direction='Input')
param3.parameterDependencies=[param2.name]
#输出要素类所在文件夹
param4=arcpy.Parameter(
displayName='out database',
name='db',
datatype='DEWorkspace',
parameterType='Required',
direction='Input')
params = [param0,param1,param2,param3,param4]
return params
def isLicensed(self):
"""Set whether tool is licensed to execute."""
return True
def updateParameters(self, parameters):
"""Modify the values and properties of parameters before internal
validation is performed. This method is called whenever a parameter
has been changed."""
return
def updateMessages(self, parameters):
"""Modify the messages created by internal validation for each tool
parameter. This method is called after internal validation."""
return
#下面是实现工具功能的代码
def execute(self, parameters, messages):
"""The source code of the tool."""
#get parameters value
inside_f=parameters[0].valueAsText
is_filed=parameters[1].valueAsText
outside_f=parameters[2].valueAsText
os_filed=parameters[3].valueAsText
db=parameters[4].valueAsText
#set default workspace in "in_memory"
arcpy.env.workspace='in_memory'
#make feature layer
try:
arcpy.MakeFeatureLayer_management(inside_f,'inside_lyr')
arcpy.MakeFeatureLayer_management(outside_f,'outside_lyr')
except:
arcpy.AddMessage('layer has already exist!')
#select features by location or attribute
with arcpy.da.SearchCursor('outside_lyr',os_filed) as ids:
for id in ids:
excute1=os_filed+"="+"'"+id[0]+"'" #sql表达式
arcpy.SelectLayerByAttribute_management('outside_lyr','NEW_SELECTION',excute1)
arcpy.SelectLayerByLocation_management('inside_lyr','HAVE_THEIR_CENTER_IN','outside_lyr',0,'NEW_SELECTION')
excute2=is_filed+" LIKE"+"'"+id[0]+"%"+"'" #sql表达式
arcpy.SelectLayerByAttribute_management('inside_lyr','REMOVE_FROM_SELECTION',excute2)
#判断是否选择了元素,选择到了元素就继续执行,未选择到就继续迭代下个子区
count=arcpy.GetCount_management('inside_lyr')
if count:
#用try语句来判断应该复制要素还是追加要素
try:
arcpy.CopyFeatures_management('inside_lyr','error_inside')
except:
arcpy.Append_management('inside_lyr','error_inside')
arcpy.AddMessage('DJZQDM:%s has been checked.\nThere are %s errors.'%(id,count))
#接下来都是文件处理和消息提示
arcpy.env.overwriteOutput='True'
filepath=os.path.join(db,'error_inside')
arcpy.CopyFeatures_management('in_memory/error_inside',filepath)
arcpy.Delete_management('in_memory')
arcpy.AddMessage('Result has saved as {0}'.format(filepath))
arcpy.env.overwriteOutput='False'
return
高亮的是工具检查出的逻辑属性错误的宗地,查看HTML窗口,DJZQDM为007,ZDDM为006,确实是错误的。工具运行结果是可靠的。
这个工具是被做为通用型工具设计的,所有具有包含关系的两个图层的相关联属性都可以用此工具检查。另外,此工具可以升级,不仅可以检查错误宗地,还可以同时把错误的属性改正。之所以没有贴出升级后的代码,是因为实际工作情况复杂,特别是有历史遗留问题的地块或者处在行政边界地带的地块,也许属性本就如此,盲目改正后可能会造成难以发觉的错误。对于国土类工作,严谨认真,逐宗判断才是正确的工作方式。