I have the following information:
A table with a list of cities
A cities layer
A grid layer
I am trying to write a code that goes through the list of cities and searches for each grid that intersects each city in the list. So if I have a city of 'somewhereville' python will find all the grids that intersect the 'somewhereville' feature and then updates a field in the grid's attribute with the city name ('somewhereville'). I have tried a few ways but I can't quite figure it out. Any direction would be great.
import arcpy
from arcpy import env
#arcpy.AddMessage ("1")
arcpy.env.workspace = "C:\E1B8\Grid_Create_Update_11-2013"
#arcpy.AddMessage ("2")
# Create the search cursor
#
tablecur = arcpy.SearchCursor("SampleCityTable")
for row in tablecur:
cityname = row.City
sql = "\"'NAME10' = " + cityname + '"'
# arcpy.AddMessage (sql)
# arcpy.AddMessage (cityname)
# Make new feature for current city
arcpy.MakeFeatureLayer_management("state_places.shp","thecity",sql)
# arcpy.AddMessage ("3")
# Select grid that intersect with new feature
arcpy.SelectLayerByLocation_management("CityGrids.shp", "INTERSECT", "thecity", "", "NEW_SELECTION")
# arcpy.AddMessage ("4")
# Update field in grid layer with city name
arcpy.CalculateField_management("CityGrids.shp", "CITY_GRID", cityname, "PYTHON", "")
# Remove selection from grid
arcpy.SelectLayerByAttribute_management("CityGrids.shp", "CLEAR_SELECTION", "")
# Delete newly made city layer
arcpy.Delete_management("thecity", "")
# arcpy.AddMessage ("5")
arcpy.MakeFeatureLayer_management("CityGrids.shp", "cityGridsLyr")
arcpy.SelectLayerByLocation_management("cityGridsLyr", "INTERSECT", "thecity", "", "NEW_SELECTION")
What if one of your grid cells has multiple cities within it?
import arcpy
cityFC = r"C:\temp\city_polygons.shp"
indexFC = r"C:\temp\index_polygons.shp"
arcpy.MakeFeatureLayer_management(indexFC, "index_fl")
searchRows = arcpy.da.SearchCursor(cityFC, ["SHAPE@","CITY_NAME"])
for searchRow in searchRows:
geomObj, cityName = searchRow
arcpy.SelectLayerByLocation_management("index_fl", "INTERSECT", geomObj, "", "NEW_SELECTION")
arcpy.CalculateField_management("index_fl", "CITY_GRID", "'" + cityName + "'", "PYTHON", "")How about something like this:
Note that if you want the "first" city to trump subsequent ones (in the case of overlap), you would want to sort the cityFC search cursor by OID in decending order (by default the sort order is by OID in ascending order).
import arcpy
from arcpy import env
arcpy.env.workspace = "C:\E1B8\Grid_Create_Update_11-2013"
# Create the search cursor
#
tablecur = arcpy.SearchCursor("SampleCityTable.dbf")
for row in tablecur:
cityname = row.City
clause = "\"'NAME10' = " + cityname + '"'
arcpy.AddMessage (clause)
arcpy.AddMessage (cityname)
# Make new feature for current city
arcpy.MakeFeatureLayer_management("state_places.shp","thecity",clause)
# Create layer for selection
arcpy.MakeFeatureLayer_management("CityGrids.shp", "cityGridsLyr")
# Select grid that intersect with new feature
arcpy.SelectLayerByLocation_management("cityGridsLyr", "INTERSECT", "thecity", "", "NEW_SELECTION")
# Update field in grid layer with city name
arcpy.CalculateField_management("cityGridsLyr", "CITY_GRID", cityname, "PYTHON", "")
# Remove selection from grid
arcpy.SelectLayerByAttribute_management("cityGridsLyr", "CLEAR_SELECTION", "")
# Delete newly made city layer
arcpy.Delete_management("thecity", "")
arcpy.Delete_management("cityGridsLyr", "")
An invalid SQL statement was used.
clause = "\"'NAME10' = " + cityname + '"'
clause = "NAME10 = " + "'" + cityname + "'"
Note that if you want the "first" city to trump subsequent ones (in the case of overlap), you would want to sort the cityFC search cursor by OID in decending order (by default the sort order is by OID in ascending order).