Hi,
I have a FGDB for a project at work.
We have plotted points for road signs and collected various attributes for each point.
We also have a picture attachment for each point.
The information was collected on the Collector app and has now been downloaded.
I now need to do a few things to the data.
I need to populate a field named 'USSR' with an automatic incremental number followed by the letter 'A', starting at a set number i.e. 7000A, 7001A, 7002A etc.
I then need the attachments to be saved and named as '7000A.jpg', '7001A.jpg', '7002A.jpg' etc.
Then I need the 'Photo' field to be filled with the photo name i.e. '7000A.jpg'
I've been looking for some Python script I can run from ArcMap to batch rename and update for me, but I'm struggling to find anything I can use.
If anyone could help me I'd be very grateful.
I have a very limited knowledge of coding and have no idea where to start.
Thanks
Sam Plant
Solved! Go to Solution.
Try the code below.
Note: In this example, Global IDs exist, so the relationship between the feature class and attachments table is based off of the GLOBALID and REL_GLOBALID fields. If your data does not contain GlobalIDs, the relationship will exist between the OBJECTID and REL_OBJECTID field. So, you will need to update line 10 to "REL_OBJECTID" and line 20 to row.OBJECTID.
import arcpy, os from arcpy import env env.workspace = r"C:\temp\python\test.gdb" #Update USSR and Photo field fc = "Airports" tbl = "Airports__ATTACH" field1 = "USSR" field2 = "Photo" relateField = "REL_GLOBALID" fldBLOB = 'DATA' fldAttName = 'ATT_NAME' outFolder = r"C:\Temp\Python\Attachments" x = 7000 y = 0 rows = arcpy.UpdateCursor(fc) for row in rows: globalID = row.GlobalID with arcpy.da.SearchCursor(tbl,[fldBLOB,fldAttName,relateField]) as cursor: for row2 in cursor: if row2[2] == globalID: row.setValue(field1, str(x + y) + "A") row.setValue(field2, str(x + y) + "A.JPG") binaryRep = row2[0] open(outFolder + os.sep + str(x + y) + "A.JPG", 'wb').write(binaryRep.tobytes()) y += 1 rows.updateRow(row) del row, rows, row2, cursor print 'Finished'
Hi Sam,
Here is an example on how to do this:
import arcpy, os from arcpy import env env.workspace = r"C:\temp\python\test.gdb" #Update USSR and Photo field fc = "Airports" field1 = "USSR" field2 = "Photo" x = 7000 y = 0 rows = arcpy.UpdateCursor(fc) for row in rows: row.setValue(field1, str(x + y) + "A") row.setValue(field2, str(x + y) + "A.JPG") y += 1 rows.updateRow(row) del row, rows #Save attachments tbl = r"C:\Temp\Python\Test.gdb\Airports__ATTACH" fldBLOB = 'DATA' fldAttName = 'ATT_NAME' outFolder = r"C:\Temp\Python\Attachments" x = 7000 y = 0 with arcpy.da.SearchCursor(tbl,[fldBLOB,fldAttName]) as cursor: for row in cursor: binaryRep = row[0] open(outFolder + os.sep + str(x + y) + "A.JPG", 'wb').write(binaryRep.tobytes()) y += 1 del cursor print 'Finished'
Thanks that's brilliant.
I'll have a go and see if I can get it working.
I have manually had to rename 4000 signs from a different program, and it takes a long time...
I've tried the code and it works well, but I have a slight problem. A few of the points don't have attachments, but I'm not sure where. So the pictures coming out don't match up with the points with the same name.
Is there a way to identify these points?
Or skip these for the renaming?
Try the code below.
Note: In this example, Global IDs exist, so the relationship between the feature class and attachments table is based off of the GLOBALID and REL_GLOBALID fields. If your data does not contain GlobalIDs, the relationship will exist between the OBJECTID and REL_OBJECTID field. So, you will need to update line 10 to "REL_OBJECTID" and line 20 to row.OBJECTID.
import arcpy, os from arcpy import env env.workspace = r"C:\temp\python\test.gdb" #Update USSR and Photo field fc = "Airports" tbl = "Airports__ATTACH" field1 = "USSR" field2 = "Photo" relateField = "REL_GLOBALID" fldBLOB = 'DATA' fldAttName = 'ATT_NAME' outFolder = r"C:\Temp\Python\Attachments" x = 7000 y = 0 rows = arcpy.UpdateCursor(fc) for row in rows: globalID = row.GlobalID with arcpy.da.SearchCursor(tbl,[fldBLOB,fldAttName,relateField]) as cursor: for row2 in cursor: if row2[2] == globalID: row.setValue(field1, str(x + y) + "A") row.setValue(field2, str(x + y) + "A.JPG") binaryRep = row2[0] open(outFolder + os.sep + str(x + y) + "A.JPG", 'wb').write(binaryRep.tobytes()) y += 1 rows.updateRow(row) del row, rows, row2, cursor print 'Finished'
Brilliant. I managed to figure out a way around it, by splitting the table in two and saving separately, but this will help me the next few times I need to do it, and save me time.
Thankyou
Can this code be adapted to bulk rename picture attachments collected with Collector for ArcGIS/ArcGIS Online? The picture attachments have been downloaded locally but need to be renamed based on feature class ID attribute (e.g. Stop_ID in a point feature class).