Hey guys,I was thinking about this very problem today.I tried to create a simpler, cleaner interface for straightforward field mapping situations. Using Mathew's code and example as a reference, I came up with the following:def GetFieldMappings(fc_in, fc_out, dico): field_mappings = arcpy.FieldMappings() field_mappings.addTable(fc_in) for input, output in dico.iteritems(): field_map = arcpy.FieldMap() field_map.addInputField(fc_in, input) field = fieldmap.outputField field.name = output field_map.outputField = field field_mappings.addFieldMap(field_map) del field, field_map return field_mappings
def GetFieldMappings(fc_in, fc_out, dico): field_mappings = arcpy.FieldMappings() field_mappings.addTable(fc_in) for input, output in dico.iteritems(): field_map = arcpy.FieldMap() field_map.addInputField(fc_in, input) field = fieldmap.outputField field.name = output field_map.outputField = field field_mappings.addFieldMap(field_map) del field, field_map return field_mappings
def FieldNameMap(tbl, maps): """Create a field mappings object to rename, drop, or re-order fields. Arguments tbl - input feature class, table, or table view maps - field names map list (';'-delimited string) If a field is left out, it will not be included in the field map Example import arcpy Maps = "Shape_Area AREA;BID BID2;AREASQMI AREAMI2" Mapper = FieldNameMap("temp.dbf", Maps) # to debug: print out the field mapping print Mapper.exportToString().replace(";","\n") # copy table, keeping only renamed fields: AREA, BID2, AREAMI2 arcpy.Merge_management("temp.dbf","temp2.dbf",Mapper) Author Curtis Price, U.S. Geological Survey, cprice@usgs.gov Not reviewed/approved use at your own risk """ field_mappings = arcpy.FieldMappings() mapList = Maps.split(';') for rec in mapList: fromName,toName = rec.split() # create a new field map field_map = arcpy.FieldMap() # populate it and add to field_mappings try: field_map.addInputField(fc_in, fromName) field = field_map.outputField field.name = toName field_map.outputField = field field_mappings.addFieldMap(field_map) except: raise Exception, "Cannot not map fields (%s) in %s" % (rec,tbl) return field_mappings
def GetFieldMappings(fc_in, fc_out, dico): field_mappings = arcpy.FieldMappings() field_mappings.addTable(fc_in) for input, output in dico.iteritems(): field_map = arcpy.FieldMap() field_map.addInputField(fc_in, input) field = field_map.outputField # Missing underscore field.name = output field_map.outputField = field field_mappings.addFieldMap(field_map) del field, field_map return field_mappings
fc_in = r'C:/input.shp' fc_out = r'C:/output_blocks.shp' dico = {'OBJECTID': 'O_OID', 'BLOCKSTAGE': 'BLOCKSTAGE', 'AREAGIS': 'AREAGIS', 'OPERATIONSTYPE': 'OPTYPE', 'BLOCKTYPE': 'BLOCKTYPE', 'HARVESTSEASON': 'HARVSEASON', 'ROADPERCENTAGE': 'ROADPERCNT'} Mapper = GetFieldMappings(fc_in, fc_out, dico)
block_out = str(sel)+"_blocks" field_mappings = arcpy.FieldMappings() field_mappings.addTable(block_lyr) fldmap_OBJID = arcpy.FieldMap() fldmap_BLOCKSTAGE = arcpy.FieldMap() fldmap_AREAGIS = arcpy.FieldMap() fldmap_OPTYPE = arcpy.FieldMap() fldmap_BLOCKTYPE = arcpy.FieldMap() fldmap_HARVSEASON = arcpy.FieldMap() fldmap_ROADPERCNT = arcpy.FieldMap() #fldmap_SOURCEID = arcpy.FieldMap(8,"","Join") fldmap_OBJID.addInputField(block_lyr, "OBJECTID") fld_OBJID = fldmap_OBJID.outputField fld_OBJID.name = "O_OID" fldmap_OBJID.outputField = fld_OBJID field_mappings.addFieldMap(fldmap_OBJID) fldmap_BLOCKSTAGE.addInputField(block_lyr, "BLOCKSTAGE") fld_BLOCKSTAGE = fldmap_BLOCKSTAGE.outputField fld_BLOCKSTAGE.name = "BLOCKSTAGE" fldmap_BLOCKSTAGE.outputField = fld_BLOCKSTAGE field_mappings.addFieldMap(fldmap_BLOCKSTAGE) fldmap_AREAGIS.addInputField(block_lyr, "AREAGIS") fld_AREAGIS = fldmap_AREAGIS.outputField fld_AREAGIS.name = "AREAGIS" fldmap_AREAGIS.outputField = fld_AREAGIS field_mappings.addFieldMap(fldmap_AREAGIS) fldmap_OPTYPE.addInputField(block_lyr, "OPERATIONSTYPE") fld_OPTYPE = fldmap_OPTYPE.outputField fld_OPTYPE.name = "OPTYPE" fldmap_OPTYPE.outputField = fld_OPTYPE field_mappings.addFieldMap(fldmap_OPTYPE) fldmap_BLOCKTYPE.addInputField(block_lyr, "BLOCKTYPE") fld_BLOCKTYPE = fldmap_BLOCKTYPE.outputField fld_BLOCKTYPE.name = "BLOCKTYPE" fldmap_BLOCKTYPE.outputField = fld_BLOCKTYPE field_mappings.addFieldMap(fldmap_BLOCKTYPE) fldmap_HARVSEASON.addInputField(block_lyr, "HARVESTSEASON") fld_HARVSEASON = fldmap_HARVSEASON.outputField fld_HARVSEASON.name = "HARVSEASON" fldmap_HARVSEASON.outputField = fld_HARVSEASON field_mappings.addFieldMap(fldmap_HARVSEASON) fldmap_ROADPERCNT.addInputField(block_lyr, "ROADPERCENTAGE") fld_ROADPERCNT = fldmap_ROADPERCNT.outputField fld_ROADPERCNT.name = "ROADPERCNT" fldmap_ROADPERCNT.outputField = fld_ROADPERCNT field_mappings.addFieldMap(fldmap_ROADPERCNT) for selection in blocklist: if blockPrev <> selection and not arcpy.Exists(block_out+".shp"): block_query = ("\""+str(block_id)+"\" = \'"+str(selection)+"\' AND (BLOCKSTAGE = 'APPR')") arcpy.FeatureClassToFeatureClass_conversion(block_lyr, exportdir, block_out, block_query, field_mappings)
dropFields = list() fieldList = arcpy.ListFields(block_out+".shp") keep_list = ["O_OID","SOURCEID","BLOCKTYPE","ROADPERCNT","BLOCKSTAGE","AREAGIS","OPERATIONS","HARVSEASON","OBJECTID","PLANNEDVOL","OID","Geometry"] for f in fieldList: #print f.name if f.name not in keep_list and f.type not in keep_list: dropFields.append(f.name) #print dropFields arcpy.DeleteField_management(block_out+".shp", dropFields)
Přihlášení členové mohou přispívat, sledovat aktualizace a další. Jste tu noví? Zaregistrujte si bezplatný účet.
Find useful guides, FAQs, and documents to help you navigate and make the most of Esri Community.