I need to numerate a thousands of polygons in groups, so each group will get unique number. Every intersecting polygons is unique group (see picture).
So polygons have field "groups" with values:
polygons 1,2,3 is group 1;
polygons 4,5 is group 2;
polygons 6,7,8,9 is group 3 and so on...
My current approach is very slow it takes about 5 minutes to enumerate layer with about 10 000 polygons (it is 4 100 groups).
Is there any faster way to do this?
Here is what I do:
- Dissolve all polygons - that is my way to find groups (arcpy.Dissolve_management)
- Give unique numbers to every polygon in dissolved layer (arcpy.CalculateField_management)
- Iterate every feature in dissolved layer (arcpy.SelectLayerByAttribute_management)
- Select polygons that intersect with original (not dissolved) layer.
- Give them group number (arcpy.CalculateField_management)
Here is a part of the code:
#1
arcpy.Dissolve_management(fc, dissolve_shp, "", "", "SINGLE_PART")
#2
arcpy.CalculateField_management(dissolve_shp, "ID", '!FID!+1', "PYTHON")
#3
number_of_rows = arcpy.GetCount_management(dissolve_shp)
number_of_rows = int(number_of_rows.getOutput(0))
lyr_dissolve = r"in_memory\Temporary_layer_DISSOLVE_DEL"
lyr_merge = r"in_memory\Temporary_layer_MERGE_DEL"
arcpy.MakeFeatureLayer_management(dissolve_shp, lyr_dissolve)
arcpy.MakeFeatureLayer_management(fc, lyr_merge)
for i in range(number_of_rows):
i2=i+1
if float(i2)//100 == float(i2)/100:
print i2, "of", number_of_rows
arcpy.SelectLayerByAttribute_management (lyr_dissolve, "NEW_SELECTION", '"ID" = '+str(i2))
#4
arcpy.SelectLayerByLocation_management (lyr_merge, "INTERSECT", lyr_dissolve)
#5
arcpy.CalculateField_management(lyr_merge, "TERM_P_NUM", i2, "PYTHON")
No comments:
Post a Comment