您好,欢迎访问三七文档
当前位置:首页 > 办公文档 > 其它办公文档 > 借助python构建自定义工具之判断并删除重复要素
FORUIONLY(仅供参考)借助python构建自定义工具之判断并删除重复要素tj051181@gmail.com/文问题:对输入的数据,按照图形或者指定字段进行判断重复,并由用户来决定是否删除粗略分析,工具界面大致需要输入项:1.InputFeatureClass:可能是shapefile,也可能是GDB要素集。为了不影响源数据,统一对源数据拷贝一份,对拷贝后数据操作,作为本工具的输出结果。2.DuplicateField(s):可能需要根据图形,也可能根据某个(些)字段。不管是那种,字段都是输入文件或者要素集含的字段,所以这里设想能够关联InputFeatureClass获取其字段,让用户勾选,类似DeleteField3.DeleteDuplicateFeatures:用户定义是否删除,所以这项定义为Boolean类型,界面上为勾选(check)界面预览:编写脚本:1.python编写环境ArcGISDesktopHelp里介绍的是pythonwin,但是目前自带的只有IDLE,可以根据当前python版本down一个适合的pythonwin,也可以就用IDLE(PythonGUI)2.参考ArcGISDesktopHelp\Geoprocessing\Automatingyourworkwithscripts\Gettingstartedwithwritinggeoprocessingscripts\CreatinganewPythonscriptmodule此部分介绍如何创建一个python模块FORUIONLY(仅供参考)3.具体函数在这个脚本里面,主要用到了这几个函数3.1文本处理函数us,作用是去掉s前后空格,并将其转为大写输出#trimanducaseastringdefus(s):returnstring.upper(strip(str(s)))3.2判断要素集fc中是否存在某字段field,返回True或者False#checkiffieldexistsinFeatureClassfcdefblnExistField(fc,field):flag=Falsefds=gp.ListFields(fc)fds.Reset()fd=fds.Next()whilefd:ifus(fd.name)==us(field):flag=Truefd=Noneelse:fd=fds.Next()delfds,fdreturnflag3.3对要素集遍历,计算每一个要素的四至值(Geometry.ExtentMinX,MinY,MaxX,MaxY)#calculateMinX;MinY;MaxX;MaxYFORUIONLY(仅供参考)defcal(fc):#addMinX;MinY;MaxX;MaxYfds=MinX;MinY;MaxX;MaxYforiinrange(0,len(fds.split(;))):fd=fds.split(;)[i]ifblnExistField(fc,fd)==False:gp.addfield_management(fc,fd,Double)#calculateMinX;MinY;MaxX;MaxYrows=gp.UpdateCursor(fc)rows.Reset()row=rows.Next()whilerow:Geo=row.GetValue(shapeFieldName)foriinrange(0,len(fds.split(;))):fd=fds.split(;)[i]row.SetValue(fd,Geo.extent.split()[i])rows.UpdateRow(row)row=rows.Next()delrows,row,fds,fdreturnMinX;MinY;MaxX;MaxY+havebeedcalculated...3.4根据某个(些)字段,判断要素集中的重复要素,并对iDup字段赋值为1,其余赋值为0#calculateidupfieldbyduplicatefieldsdefCaliDup(fc,fields):v1=[]sort=foriinrange(0,len(fields.split(;))):ifi==0:sort=fields.split(;)[i]+Delse:sort=sort+;+fields.split(;)[i]+Drows=gp.UpdateCursor(fc,,,,sort)row=rows.Next()whilerow:v2=[]foriinrange(0,len(fields.split(;))):v2.append(row.GetValue(fields.split(;)[i]))ifv1==v2:row.SetValue(idup,1)rows.UpdateRow(row)else:v1=v2row.SetValue(idup,0)FORUIONLY(仅供参考)rows.UpdateRow(row)row=rows.Next()delrows,row,sort,v1,v2returnidup+hasbeedcalculated...3.5根据标识flag判断是否删除重复要素#deletefeaturesdefdelfeatures(fc,whereclause,flag):delmsg=try:gp.makefeaturelayer_management(fc,tmp_lyr,whereclause)ifgp.getcount_management(tmp_lyr)0:ifflag==true:gp.deletefeatures_management(tmp_lyr)delmsg=Deletecompleted...delmsg=delmsg+\n+Afterdeletingduplicatethere're+str(gp.getcount_management(fc))+featuresleft...else:delmsg=There're+str(gp.getcount_management(tmp_lyr))+duplicateFeatures...else:delmsg=Thereisnoduplicatefeature...gp.delete(tmp_lyr)returndelmsgexcept:returnErrorwhiledeletingFeatures...4组合完整4.1import和createimportarcgisscriptingimportstringfromstringimport*importosimportsysgp=arcgisscripting.create()gp.overwriteoutput=14.2获取用户输入值,作为脚本运行参数#inputfeatureclassfc=sys.argv[1]#decideshapeorotherattribute(s)dup=sys.argv[2]FORUIONLY(仅供参考)#decidedeleteduplicatefeaturesornotblnDel=sys.argv[3]4.3拷贝源文件为_DelDup,此时要判断是shapefile还是要素集iffc.endswith(.shp):outfc=fc.replace(.shp,_DelDup.shp)wc=\+idup+\=1else:outfc=fc+_DelDupwc=[+idup+]=1#copyfeatureclasstofc+deldupforbakgp.copy_management(fc,outfc)msg=copy%sto%sdone...%(fc,outfc)gp.AddMessage(msg)fc=outfc4.4根据图形或属性判断重复#towwaystocheck#bygeographicorattributes#addiDuptodefinewhichwillbedeletedifus(dup)==us(shape):msg=BegintodeleteFeaturesbyGeographic...msg=cal(fc)gp.AddMessage(msg)msg=CaliDup(fc,MinX;MinY;MaxX;MaxY)gp.AddMessage(msg)else:msg=CaliDup(fc,dup)gp.AddMessage(msg)4.5处理结束注意删除用到的cursor(UpdateCursor等),因为如果代码执行异常,这些可能导致数据锁定delfc,gp,outfc,rows,row4.6异常处理Try:…except:msg=Error,pleasecheckoreMailyourproblemtotj051181@gmail.com...gp.AddError(msg)至此,代码部分基本完成,剩下的工作是把脚本放到ArcToolbox中,这里涉及界面设计和设置FORUIONLY(仅供参考)5.导入脚本,设置界面,如下图所示6运行界面:FORUIONLY(仅供参考)7输出处理消息8.批处理由衷感谢yishuiyaoyao和lwf902悉心测试与宝贵意见Tsonghua@Shanghai2010.07.04
本文标题:借助python构建自定义工具之判断并删除重复要素
链接地址:https://www.777doc.com/doc-4583136 .html