# CreateEdgeList.py
#
# Description:
# Loops through each patch in a raster dataset and creates a cost surface
# to determine the minimum distance to each other patch in the raster and
# writes these minimum distances out to an edge file, in CSV format
# Inputs: patch raster, cost surface raster, maxDist
#
# Outputs: edge list CSV file
# Import modules
import sys, os, arcpy
import arcpy.sa as sa
arcpy.env.overwriteOutput = 1
# Inputs
patchRaster = sys.argv[1] #r'C:WorkSpaceGBAT2012GHAT_V01CellBasedScratchSubnetPatches'
arcpy.env.extent = patchRaster
costRaster = sys.argv[2] #r'C:WorkSpaceGBAT2012GHAT_V01CellBasedScratchSubnetCost'
maxDist = sys.argv[3] #7500
# Outputs
edgeList = sys.argv[4] #r'C:WorkSpaceGBAT2012GHAT_V01CellBasedScratchCPEdgelist.csv'
# Check out the spatial analyst extension; send error if unavailable
if arcpy.CheckExtension("spatial") == 'Avalailable':
arcpy.CheckOutExtension("spatial")
# Get a list of patch IDs
patchIDs = []
rows = arcpy.SearchCursor(patchRaster)
row = rows.next()
while row:
patchIDs.append(row.Value)
row = rows.next()
del row, rows
# Initiate the output edge list
outFile = open(edgeList,'w')
outFile.write("FromID,ToID,Costn")
# Initiate status variables
total = float(len(patchIDs))
interval = total/20 #<-- 20.0 reports status at 5% completion intervals
interval2 = interval
iter = 0
arcpy.AddMessage("Initiating edge list creation...")
# Loop through each patchID in the PatchIDList
for patchID in patchIDs:
iter = iter + 1
if iter > interval:
arcpy.AddMessage(" %d%% complete." %(float(iter/total)*100.0))
interval = interval + interval2
# - Isolate the patch
selectedPatch = sa.SetNull(patchRaster, patchRaster, "Value <> %s" %patchID)
# - Calculate a cost distance and cost back link raster from the selected patch
costDist = sa.CostDistance(selectedPatch, costRaster, maxDist)
# - Tabulate zonal stats for the other patches on the cost distance
zStatTable = sa.ZonalStatisticsAsTable(patchRaster,"Value",costDist,"in_memoryzstattbl","DATA","MINIMUM")
# - Write out to an edge list
recs = arcpy.SearchCursor("in_memoryzstattbl","VALUE > %d" %patchID)
rec = recs.next()
while rec:
outFile.write("%d,%d,%sn" %(patchID, rec.VALUE, rec.MIN))
rec = recs.next()
del rec, recs
# Close the edge list file object
outFile.close()
# Clean up and exit
#arcpy.Delete_management("zstattbl")
arcpy.AddMessage("Edges successfully written to %s" %edgeList)