I was trying to perform a geo analysis and the function CalculateGeometryAttributes produced None values when I wrapped the script in multiprocessing, but it worked correctly in a for loop.
def process(fc):
arcpy.env.workspace = "G:/usgrids2020/test1/"
arcpy.env.overwriteOutput=True
state = fc[34:-7]
print(f"Processing for {state.upper()}")
readTime = datetime.datetime.now()
# arcpy.env.workspace = os.path.join(gdb_path, f"usa{state}.gdb")
#Import the feature for boundary and water
# fc = f"usa{state[3:5]}_joined"
fcInMem = arcpy.management.CopyFeatures(fc, f"in_memory/usa{state}_fcInMem")
water_fc = f"{fc[:-7]}_water_layer"
waterInMem = arcpy.management.CopyFeatures(water_fc, f"in_memory/usa{state}_waterInMem")
#Create the temporary id for joining fields later
arcpy.AddField_management(fcInMem,'tempid','LONG')
arcpy.CalculateField_management(fcInMem,"tempid",'!OBJECTID!','PYTHON')
#Calculate the area(land+water) by GEODESIC method => Kytt recommended
arcpy.management.AddField(fcInMem, "GEODESIC_AREA", "FLOAT")
arcpy.management.CalculateGeometryAttributes(fcInMem, "GEODESIC_AREA AREA_GEODESIC", "", "SQUARE_METERS")
This is what it generated:
(None, 'USA_100030117003015')
(None, 'USA_100030127001011')
(None, 'USA_100030151002006')
(None, 'USA_100030121001003')
(None, 'USA_100030112051009')
(None, 'USA_100030148102015')
(None, 'USA_100030112062022')
(None, 'USA_100030168063009')
(None, 'USA_100030166141010')
(None, 'USA_100030164041013')
Solved! Go to Solution.
The tradeoff is that you have to use an arcpy cursor object, but I do most of my scripting with cursors. Even wrote some wrapper classes that allow you to use cursor objects safely using python syntax (see my post in Python Ideas).
Cursors are great because they gave you really granular access to the feature data. They are still Python objects though and don't have all the horsepower of the base Arc functions that are implemented in C.
For use cases like this though, and basic CRUD ops on a dataset they're great. Especially if you use the where_clause and spatial_filter parameters properly.