depressions = depressionsLocation + "depressions.shp" selectingBuffer = depressionsLocation + "dissolvedBuffers.shp" wasSelectedField = ('SELECTED', 'SELECTOR') isSelectorField = ('ASPECT_R', 'ID') try: arcpy.MakeFeatureLayer_management(depressions, "depressionsLayer") arcpy.MakeFeatureLayer_management(selectingBuffer, "selectingBufferLayer") except: print "Could not create feature layers" try: with arcpy.da.UpdateCursor("selectingBufferLayer", isSelectorField) as cursor: for row in cursor: if (row[0] >= 2): oid = row[1] arcpy.SelectLayerByLocation_management("depressionsLayer", "INTERSECT", "selectingBufferLayer") with arcpy.da.UpdateCursor("depressionsLayer", wasSelectedField) as cursor: for row in cursor: row[0] = "True" row[0] = "1" row[1] = oid cursor.updateRow(row) finally: arcpy.Delete_management("selectingBufferLayer") arcpy.Delete_management("depressionsLayer")
Solved! Go to Solution.
Ok, thanks for that, it helped a little. I also changed some other parts of code however the problem persists and FIDs are all 0 now.
Here is what I changed:try: with arcpy.da.UpdateCursor("selectingBufferLayer", isSelectorField) as cursor: for row in cursor: arcpy.SelectLayerByAttribute_management("selectingBufferLayer", "NEW_SELECTION", """ "ASPECT_R" >= 2 """) oid = int(row[1]) print oid arcpy.SelectLayerByLocation_management("depressionsLayer", "INTERSECT", "selectingBufferLayer") with arcpy.da.UpdateCursor("depressionsLayer", wasSelectedField) as selcursor: for selrow in selcursor: selrow[0] = "1" selrow[1] = oid print selrow[1] selcursor.updateRow(selrow) #del selcursor, selrow arcpy.DeleteRows_management("selectingBufferLayer") del cursor, row finally: if arcpy.Exists("depressionsLayer"): arcpy.Delete_management("depressionsLayer") if arcpy.Exists("selectingBufferLayer"): arcpy.Delete_management("selectingBufferLayer")
Hi,
I'm trying to write a script, that will select certain polygons according to their position in relation to some other polygons. The idea is to use a cursor in one table to select polygons with aspect ratio equal or more than two. When such polygon is selected an identifier is written to memory and select layer by location tool triggers with this polygon as selection feature. After that another cursor attempts to find which features were selected by polygon above in the select layer by location tool's input feature layer.The purpose of this cursor is that adds a value of 1 and FID of the selecting polygon to the selected polygon's attribure table.
The script works for 1 values but it only adds one FID (119).
Could some one take a look and tell me what is missing?depressions = depressionsLocation + "depressions.shp" selectingBuffer = depressionsLocation + "dissolvedBuffers.shp" wasSelectedField = ('SELECTED', 'SELECTOR') isSelectorField = ('ASPECT_R', 'ID') try: arcpy.MakeFeatureLayer_management(depressions, "depressionsLayer") arcpy.MakeFeatureLayer_management(selectingBuffer, "selectingBufferLayer") except: print "Could not create feature layers" try: with arcpy.da.UpdateCursor("selectingBufferLayer", isSelectorField) as cursor: for row in cursor: if (row[0] >= 2): oid = row[1] arcpy.SelectLayerByLocation_management("depressionsLayer", "INTERSECT", "selectingBufferLayer") with arcpy.da.UpdateCursor("depressionsLayer", wasSelectedField) as cursor: for row in cursor: row[0] = "True" row[0] = "1" row[1] = oid cursor.updateRow(row) finally: arcpy.Delete_management("selectingBufferLayer") arcpy.Delete_management("depressionsLayer")
with arcpy.da.UpdateCursor("depressionsLayer", wasSelectedField) as selCursor: for selRow in selCursor: selRow[0] = "True" selRow[0] = "1" selRow[1] = oid selCursor.updateRow(selRow)
try: with arcpy.da.UpdateCursor("selectingBufferLayer", isSelectorField) as cursor: for row in cursor: arcpy.SelectLayerByAttribute_management("selectingBufferLayer", "NEW_SELECTION", """ "ASPECT_R" >= 2 """) oid = int(row[1]) print oid arcpy.SelectLayerByLocation_management("depressionsLayer", "INTERSECT", "selectingBufferLayer") with arcpy.da.UpdateCursor("depressionsLayer", wasSelectedField) as selcursor: for selrow in selcursor: selrow[0] = "1" selrow[1] = oid print selrow[1] selcursor.updateRow(selrow) #del selcursor, selrow arcpy.DeleteRows_management("selectingBufferLayer") del cursor, row finally: if arcpy.Exists("depressionsLayer"): arcpy.Delete_management("depressionsLayer") if arcpy.Exists("selectingBufferLayer"): arcpy.Delete_management("selectingBufferLayer")
Ok, thanks for that, it helped a little. I also changed some other parts of code however the problem persists and FIDs are all 0 now.
Here is what I changed:try: with arcpy.da.UpdateCursor("selectingBufferLayer", isSelectorField) as cursor: for row in cursor: arcpy.SelectLayerByAttribute_management("selectingBufferLayer", "NEW_SELECTION", """ "ASPECT_R" >= 2 """) oid = int(row[1]) print oid arcpy.SelectLayerByLocation_management("depressionsLayer", "INTERSECT", "selectingBufferLayer") with arcpy.da.UpdateCursor("depressionsLayer", wasSelectedField) as selcursor: for selrow in selcursor: selrow[0] = "1" selrow[1] = oid print selrow[1] selcursor.updateRow(selrow) #del selcursor, selrow arcpy.DeleteRows_management("selectingBufferLayer") del cursor, row finally: if arcpy.Exists("depressionsLayer"): arcpy.Delete_management("depressionsLayer") if arcpy.Exists("selectingBufferLayer"): arcpy.Delete_management("selectingBufferLayer")
try: arcpy.MakeFeatureLayer_management(depressions, "depressionsLayer") arcpy.MakeFeatureLayer_management(selectingBuffer, "selectingBufferLayer") except: print "Could not create feature layers" try: with arcpy.da.UpdateCursor("selectingBufferLayer", isSelectorField) as cursor: for row in cursor: fid = int(row[0]) oid = int(row[2]) if (row[1] >= 2): arcpy.SelectLayerByAttribute_management("selectingBufferLayer", "NEW_SELECTION", '"ID" = {}'.format(oid)) arcpy.SelectLayerByLocation_management("depressionsLayer", "INTERSECT", "selectingBufferLayer") with arcpy.da.UpdateCursor("depressionsLayer", wasSelectedField) as selcursor: for selrow in selcursor: arcpy.SelectLayerByAttribute_management("depressionsLayer", "ADD_TO_SELECTION", '"ID" = {}'.format(oid)) selrow[0] = "1" selcursor.updateRow(selrow) selrow[1] = oid print "This is selrow[1] - " + str(selrow[1]) + " and " + str(oid) + " selected it." selcursor.updateRow(selrow) break del selcursor, selrow else: cursor.next() del cursor, row finally: if arcpy.Exists("depressionsLayer"): arcpy.Delete_management("depressionsLayer") if arcpy.Exists("selectingBufferLayer"): arcpy.Delete_management("selectingBufferLayer")
spatialReference = arcpy.Describe(depressionsLocation + depressionsName).spatialReference arcpy.CreateFeatureclass_management(depressionsLocation, unroofedCaves, "POLYGON", depressionsLocation + depressionsName, "SAME_AS_TEMPLATE", "DISABLED", spatialReference) depressions = depressionsLocation + "depressions.shp" selectingBuffer = depressionsLocation + "dissolvedBuffers.shp" wasSelectedField = ('ID') isSelectorField = ('ASPECT_R', 'ID') try: arcpy.MakeFeatureLayer_management(depressions, "depressionsLayer") arcpy.MakeFeatureLayer_management(selectingBuffer, "selectingBufferLayer") except: print "Could not create feature layers" try: with arcpy.da.SearchCursor("selectingBufferLayer", isSelectorField) as cursor: for row in cursor: oid = int(row[1]) if (row[0] >= 2): arcpy.SelectLayerByAttribute_management("selectingBufferLayer", "NEW_SELECTION", '"ID" = {}'.format(oid)) arcpy.SelectLayerByLocation_management("depressionsLayer", "INTERSECT", "selectingBufferLayer") with arcpy.da.SearchCursor("depressionsLayer", wasSelectedField) as selcursor: for selrow in selcursor: arcpy.SelectLayerByAttribute_management("depressionsLayer", "ADD_TO_SELECTION", '"ID" = {}'.format(oid)) arcpy.Append_management("depressionsLayer", depressionsLocation + unroofedCaves, "NO_TEST", "", "") print "Exporting " break #del selcursor, selrow else: cursor.next() del cursor, row finally: if arcpy.Exists("depressionsLayer"): arcpy.Delete_management("depressionsLayer") if arcpy.Exists("selectingBufferLayer"): arcpy.Delete_management("selectingBufferLayer")
Hmmmm, actually I was alredy thinking about this, before I decided to try with cursors but somehow I could not make such logical conclusion... Will definitley try this.
However in the meanwhile I came up with something. It works quite fine except for a few polygons. I do not know why but while checking the result I found some polygons that should have been selected (exported) but were not.
I tested it also on second area and it returned strange error message:
Traceback (most recent call last):
File "LINK TO THE SCRIPT", line 235, in <module>
cursor.next()
StopIteration
Any idea what it means?
Here is the last code:spatialReference = arcpy.Describe(depressionsLocation + depressionsName).spatialReference arcpy.CreateFeatureclass_management(depressionsLocation, unroofedCaves, "POLYGON", depressionsLocation + depressionsName, "SAME_AS_TEMPLATE", "DISABLED", spatialReference) depressions = depressionsLocation + "depressions.shp" selectingBuffer = depressionsLocation + "dissolvedBuffers.shp" wasSelectedField = ('ID') isSelectorField = ('ASPECT_R', 'ID') try: arcpy.MakeFeatureLayer_management(depressions, "depressionsLayer") arcpy.MakeFeatureLayer_management(selectingBuffer, "selectingBufferLayer") arcpy.MakeFeatureLayer_management(selectingBuffer, "selectingBufferLayer2") except: print "Could not create feature layers" try: with arcpy.da.SearchCursor("selectingBufferLayer", isSelectorField) as cursor: for row in cursor: oid = int(row[1]) if (row[0] >= 2): arcpy.SelectLayerByAttribute_management("selectingBufferLayer2", "NEW_SELECTION", '"ID" = {}'.format(oid)) arcpy.SelectLayerByLocation_management("depressionsLayer", "INTERSECT", "selectingBufferLayer2") with arcpy.da.SearchCursor("depressionsLayer", wasSelectedField) as selcursor: for selrow in selcursor: arcpy.SelectLayerByAttribute_management("depressionsLayer", "ADD_TO_SELECTION", '"ID" = {}'.format(oid)) arcpy.Append_management("depressionsLayer", depressionsLocation + unroofedCaves, "NO_TEST", "", "") print "Exporting " break #del selcursor, selrow # else: # cursor.next() del cursor, row finally: if arcpy.Exists("depressionsLayer"): arcpy.Delete_management("depressionsLayer") if arcpy.Exists("selectingBufferLayer"): arcpy.Delete_management("selectingBufferLayer") if arcpy.Exists("selectingBufferLayer2"): arcpy.Delete_management("selectingBufferLayer2")