EdgeListToFeatureClass.py

# EdgeListToFeatureClass.py
#
# Description:
#  Creates a polyline feature class from an edge list and a patch centroid FC
#
# Inputs: <Patch centroids FC> <EdgeList CSV file>
#
# Output: Edge feature class
#
# June 2012
# John.Fay@duke.edu

import sys, os, arcpy
import arcpy.sa as sa
arcpy.env.overwriteOutput = 1

# Check out the ArcGIS Spatial Analyst extension license
arcpy.CheckOutExtension("Spatial")

# Inputs
patchRaster = sys.argv[1]   #r'C:WorkSpaceGBAT2012GHAT_V01CellBasedScratchSubnetPatches'
edgeList = sys.argv[2]      #r'C:WorkSpaceGBAT2012GHAT_V01CellBasedDataEdgeList.txt'

# Output
outFC = sys.argv[3]         #r'C:WorkSpaceGBAT2012GHAT_V01CellBasedScratchTestEdges.shp'

# Create zonal geometry table, including coordinates of each patch centroid
outTable = os.path.join(arcpy.env.scratchWorkspace,'DeleteMe')
zGeomTbl = sa.ZonalGeometryAsTable(patchRaster,"VALUE",outTable)

# Make a dictionary of patch coordinates
coordDict = {}
recs = arcpy.SearchCursor(outTable)
rec = recs.next()
while rec:
    coordDict[rec.VALUE] = (rec.XCENTROID, rec.YCENTROID)
    rec = recs.next()
del rec, recs

# Create the output feature class & add fields
sr = arcpy.Describe(patchRaster).SpatialReference
arcpy.CreateFeatureclass_management(os.path.dirname(outFC), os.path.basename(outFC),"POLYLINE",'','','', sr)
arcpy.AddField_management(outFC,"FromID","LONG",5)
arcpy.AddField_management(outFC,"ToID","LONG",5)
arcpy.AddField_management(outFC,"Cost","DOUBLE",10,2)

# Create and add features to the feature class
cur = arcpy.InsertCursor(outFC)
arr = arcpy.Array()
fileObj = open(edgeList,'r')
headerLine = fileObj.readline()
dataLine = fileObj.readline()
while dataLine:
    dataList = dataLine[:-1].split(",")
    #iterate through from/to points
    for i in [0,1]:
        coords = coordDict[int(dataList[i])]
        pt = arcpy.Point(coords[0],coords[1])
        arr.add(pt)
    polyline = arcpy.Polyline(arr)
    arr.removeAll()
    row = cur.newRow()
    row.FromID = int(dataList[0])
    row.ToID = int(dataList[1])
    row.Cost = float(dataList[2])
    row.shape = polyline
    cur.insertRow(row)
    dataLine = fileObj.readline()
del cur, row

arcpy.Delete_management(outTable)