irkgreen

SpatialReference in Loop

Discussion created by irkgreen on Jul 18, 2013
Latest reply on Jul 19, 2013 by irkgreen
Hey all,

I am trying to set the projection of a temp shapefile so I can add a length field.  I am using the factory code to set it.  I have a huge list of shapefiles in (GCS) and their corresponding ideal factory codes for State Plane CS.  I am trying to loop through each and set the projection, but it only works the first time.  The second time I get this error:

Traceback (most recent call last):
  File "C:\Users\egreen\Desktop\BigFiles KEEP\CreatePROX_FINAL.py", line 67, in <module>
    sr = arcpy.SpatialReference(ProjCode)
  File "C:\Program Files (x86)\ArcGIS\Desktop10.1\arcpy\arcpy\arcobjects\mixins.py", line 927, in __init__
    self._arc_object.createFromFile(item)
RuntimeError: ERROR 999999: Error executing function.
the input is not a geographic or projected coordinate system

The error is misleading since it is not a bad factory code (or WKID).  The second shapefile has the same factory code.  I think the error is due to the variable sr already existing.  I'm curious if I need to destroy sr somehow (I don't see a method for that though).  Or am I misunderstanding this.

Here's my code:

import arcpy
import xml.etree.cElementTree as ET
import os
import xlrd
from arcpy import env
import os.path
import shutil
import zipfile
import glob

#set paths to documents
myPath = os.getcwd() + "\\ScriptFiles"
excel_path = myPath + "\\Inputs.xls"
wb = xlrd.open_workbook(excel_path)

# Load XLRD Excel Reader
sheetname = wb.sheet_names() #Read for XCL Sheet names
sh1 = wb.sheet_by_index(0) #Login

#flag for first row
Skip = True

### Set Geoprocessing environments
arcpy.env.scratchWorkspace = myPath + "\\Scratch.gdb"
arcpy.env.workspace = myPath + "\\PROXCreate.gdb"

Coordinate_System = "GEOGCS['GCS_North_American_1983',DATUM['D_North_American_1983',SPHEROID['GRS_1980',6378137.0,298.257222101]],PRIMEM['Greenwich',0.0],UNIT['Degree',0.0174532925199433]]" # provide a default value if unspecified
# Set overwrite option
arcpy.env.overwriteOutput = True

tmpRoads = "tmpRoads"
tmpBoundaries = "tmpBoundaries"

#Loop through Excel
for rownum in range(sh1.nrows):

    rows = sh1.row_values(rownum)
    
    #skip first row
    if Skip == True:
        Skip=False
    else:
        CountyName = rows[0]
        StateName = rows[2]
        InputRoadShpfl = rows[10]
        InputBoundaryShpfl = rows[11]
        ProjName = rows[9]
        ProjCode = rows[12]

        if arcpy.Exists(tmpRoads):
            arcpy.Delete_management(tmpRoads)
            
        if arcpy.Exists(tmpBoundaries):
            arcpy.Delete_management(tmpBoundaries)

        if (arcpy.Exists(myPath + "\\TigerFiles\\" + InputRoadShpfl)) and (myPath + "\\TigerFiles\\" + InputBoundaryShpfl):

            print "Executing shapefiles:" + InputBoundaryShpfl + " & " + InputRoadShpfl + "(" + StateName + "\\" + CountyName + ")"
           
            # Make a layer from the feature class
            #arcpy.MakeFeatureLayer_management(myPath + "\\TigerFiles\\" + InputRoadShpfl, tmpRoads)
            arcpy.CopyFeatures_management(myPath + "\\TigerFiles\\" + InputRoadShpfl, tmpRoads)
            arcpy.MakeFeatureLayer_management(myPath + "\\TigerFiles\\" + InputBoundaryShpfl, tmpBoundaries)

            # Process: Define Projection (3)
            #sr = arcpy.SpatialReference(102629)
            sr = arcpy.SpatialReference(ProjCode)
            #sr = arcpy.SpatialReference(ProjName)
            #sr.factoryCode = ProjCode
            sr.create()
            arcpy.DefineProjection_management(tmpRoads, sr)

Outcomes