工具下载连接:【免费】arcgis新融合工具箱资源-优快云文库
实例文件:
使用工具:
运行结果:
如果文本字段不去重:
原始代码:
import arcpy, os
import logging
logging.basicConfig(level=logging.DEBUG, format="%(asctime)s-%(levelname)s-%(message)s")
logging.debug("start of program")
argv = tuple(arcpy.GetParameterAsText(i) for i in range(arcpy.GetArgumentCount()))
fcpath = argv[0]
fieldname = argv[1]
duplicaterm = argv[2]
outputname = argv[3]
arcpy.env.overwriteOutput = True
arcpy.RepairGeometry_management(fcpath)
expblock = """def reclass(txt):
path1 = txt.split("/")
return "/".join(sorted(path1))"""
dupexpblock = """def reclass(txt):
path1 = txt.split("/")
return "/".join(sorted(list(set(path1))))"""
def NDissolve():
Dissolve1 = arcpy.Dissolve_management(fcpath,r"in_memory\Dissolve1",fieldname, "", "SINGLE_PART")
fieldmappings = arcpy.FieldMappings()
fieldmappings.addTable(fcpath)
Yfield_names = [(f.name, f.type) for f in arcpy.ListFields(fcpath)]
for eachfield in Yfield_names:
if eachfield[0] in fieldname:
continue
elif eachfield[1] == "String":
FieldIndex = fieldmappings.findFieldMapIndex(eachfield[0])
fieldmap = fieldmappings.getFieldMap(FieldIndex)
field = fieldmap.outputField
field.name = eachfield[0] + "_Join"
field.length = 1000
fieldmap.outputField = field
fieldmap.mergeRule = "Join"
fieldmap.joinDelimiter="/"
fieldmappings.replaceFieldMap(FieldIndex, fieldmap)
elif eachfield[1] in ["Double","Integer","Single","SmallInteger"]:
FieldIndex = fieldmappings.findFieldMapIndex(eachfield[0])
fieldmap = fieldmappings.getFieldMap(FieldIndex)
field = fieldmap.outputField
field.name = eachfield[0] + "_Sum"
fieldmap.outputField = field
fieldmap.mergeRule = "Sum"
fieldmappings.replaceFieldMap(FieldIndex, fieldmap)
elif eachfield[1] in ["Geometry", "GlobalID", "OID"]:
continue
else:
x = fieldmappings.findFieldMapIndex(eachfield[0])
fieldmappings.removeFieldMap(x)
arcpy.SpatialJoin_analysis(Dissolve1,fcpath,outputname, "#", "#", fieldmappings,match_option="CONTAINS")
def Ntxtfield(duprm):
Nfield_names = [(f.name, f.type) for f in arcpy.ListFields(outputname)]
for fl in Nfield_names:
if fl[1] == "String":
if duprm == u'true':
arcpy.CalculateField_management(outputname, fl[0], "reclass(!" + fl[0] + "!)", "PYTHON_9.3", dupexpblock)
else:
arcpy.CalculateField_management(outputname, fl[0], "reclass(!" + fl[0] + "!)", "PYTHON_9.3", expblock)
else:
continue
try:
logging.debug("start of program")
NDissolve()
Ntxtfield(duplicaterm)
except Exception as ex:
import traceback
import sys
tb = sys.exc_info()[2]
print("捕获到的异常信息是:{}".format(ex)) # 或者使用print("捕获到的异常信息是:",ex.args[0]或者str(ex)或者直接ex);3.9版本ex.message已不可用)
print("捕获到的异常代码行号是:Line {0}".format(tb.tb_lineno))
print(traceback.format_exc()) # 显示完整错误路径
except arcpy.ExecuteError:
print(arcpy.GetMessages())
else:
logging.debug("program success")
finally:
pass
欢迎使用,如发现问题欢迎指正,需求和交流,Q:775915005