vjvanexel

Trouble combining SelectLayerByLocation with an UpdateCursor. Please help!

Discussion created by vjvanexel on Nov 8, 2013
Hi,

First of all, I have been using ArcGIS 10 for a long time but I am a novice to using Python scripting. So please pardon my probably rather clunky code.
What I would like to do for each feature is to update a field with the mean value of a different field (in the same feature class) of all features that fall within a certain radius.
In my case, I have the point shapefile "FL20C.shp" which contains 20 features each with a series of attributes including "ZBUSH" and "MEAN01". I would like to update "MEAN01" with the value calculated by taking the mean/average of all the features in a 150 km radius of it (including the feature to be updated itself). The layer "counties_lyr" is the Feature Layer I created to be able to run the SelectLayerByLocation. (So that step has already been made and is left out of the script.)
I have tested the different blocks of code and they seem to work: the script iterates successfully through the SelectLayerByLocation and the steps of calculating the mean. I think the problem lies in establishing the connection between the UpdateCursor and the SearchCursor used in the SelectLayerByLocation.

I have structured the code in different ways, hitting road blocks in different locations. With this first attempt I get the following error: "Runtime error <class 'arcgisscripting.ExecuteError'>: ERROR 999999: Error executing function. Cannot acquire a lock. Cannot acquire a lock. [The table FL20C.shp is being written by another process.] Failed to execute (SelectLayerByLocation)."
This error results from the following code:
import arcpy
# Creating the UpdateCursor and its input 
counties = "C:/GISDATA2/FAUI/USAtests/FL20C.shp"
cursor01 = arcpy.UpdateCursor(counties)
# Setting up variables to be used in the Select Layer By Location 
selectionbase = arcpy.SearchCursor("counties_lyr")
desc = arcpy.Describe("counties_lyr")
selectionbaseShapeFieldName = desc.featureClass.shapeFieldName

# Starting the iteration through the input table that is to be updated 
for county in cursor01: 
    # Starting the Select Layer By Location 
    selected_c = arcpy.SelectLayerByLocation_management("counties_lyr", "WITHIN_A_DISTANCE", row.getValue(selectionbaseShapeFieldName), "150000 Meter", "NEW_SELECTION")
    # Counting the number of selected features to be used in the calculation of the Mean 
    selected_nr = arcpy.GetCount_management(selected_c)
    selected_count = selected_nr.getOutput(0)
    count_sel = float(selected_count)
    # Calculating the total of the ZBUSH value to be used in the Mean 
    curs_selected = arcpy.SearchCursor(selected_c)
    list4total = []
    for co in curs_selected:
        list4total.append(co.ZBUSH)
    total_v = sum(list4total)
    new_mean = total_v / count_sel
    # Update "MEAN01" with the new_mean value        
    county.MEAN01 = new_mean
    cursor01.updateRow(county)
    # emptying variables before restarting loop 
    del count_sel
    del list4total
    del total_v
    del new_mean
    del cursor02
    


Alternatively this code runs the Select Layer By Location and the Calculations successfully, but fails to update the Row. Instead I get: Runtime error <type 'exceptions.AttributeError'>: 'Cursor' object has no attribute '__exit__'
I think my mistake is in this code segment of the full code that follows below:
with arcpy.UpdateCursor(counties) as cursor02:
        for co in cursor02:
            co.MEAN01 = new_mean
            cursor02.updateRow(co)

Should I leave out the iteration?
How do I make sure that the shapefile-row being updated in this cursor corresponds to the row in the FeatureLayer used for the SelectLayerByLocation? If this is done through a SQL statement, then I don't know where to place it or how to state it.

import arcpy
selectionbase = arcpy.SearchCursor("counties_lyr")
desc = arcpy.Describe("counties_lyr")
selectionbaseShapeFieldName = desc.featureClass.shapeFieldName

for row in selectionbase:
    # Make the selection 
    selected_c = arcpy.SelectLayerByLocation_management("counties_lyr", "WITHIN_A_DISTANCE", row.getValue(selectionbaseShapeFieldName), "150000 Meter", "NEW_SELECTION")
    # Count the number of selected features  
    selected_nr = arcpy.GetCount_management(selected_c)
    selected_count = selected_nr.getOutput(0)
    count_sel = float(selected_count)
    # Get the total ZBUSH value for the selected features 
    curs_selected = arcpy.SearchCursor(selected_c)
    list4total = []
    for county in curs_selected:
        list4total.append(county.ZBUSH)
    total_v = sum(list4total)
    new_mean = total_v / count_sel
    # Write the mean-value to the feature  
    with arcpy.UpdateCursor(counties) as cursor02:
        for co in cursor02:
            co.MEAN01 = new_mean
            cursor02.updateRow(co)            
    # Reset values at end of iteration
    del count_sel 
    del list4total
    del total_v  
    del new_mean 


Thank you in advance for your help!

Vincent

Outcomes