CreateHabitatPatches.py

#----------------------------------------------------------------------------
# CreateHabitatPatches.py
#
# Description: Converts a raster of habitat/NoData into a patch raster.
#  Patches of a minimum size can be excluded and patches boundaries can
#  be "cleaned" to remove jagged edges.  
#  
# Inputs: <Habitat raster> <Clean boundary boolean> {Minimum size}
# Outputs: <Patch raster>
#
# June 15 2012
# John.Fay@duke.edu
#----------------------------------------------------------------------------

import sys, os, arcpy
import arcpy.sa as sa

arcpy.CheckOutExtension("Spatial")
arcpy.env.overwriteOutput = True

# Input variables
HabRaster = sys.argv[1]     
CleanBoundary = sys.argv[2]
MinPatchSize = sys.argv[3]  

# Output variables
PatchRaster = sys.argv[4]  

# RegionGroup the HabSource into Patches
arcpy.AddMessage("Finding habitat clusters")
AllPatches = sa.RegionGroup(HabRaster,"EIGHT","WITHIN","NO_LINK")

# Boundary clean the patches, if asked
if CleanBoundary == 'true':
    arcpy.AddMessage("Cleaning patch boundaries")
    AllPatches2 = sa.BoundaryClean(AllPatches,"NO_SORT","TWO_WAY")
else:
    AllPatches2 = AllPatches

# Convert minimum patch size HA to cells (based on cell size of HabRaster)
arcpy.AddMessage("Converting minimum size to cells")
cellSizeResult = arcpy.GetRasterProperties_management(HabRaster,"CELLSIZEX")
cellSize = float(cellSizeResult.getOutput(0))
minCellSize = round(10000.0 * float(MinPatchSize) / (cellSize ** 2))

# Remove patches below the cell size
arcpy.AddMessage("Removing patches smaller than %s HA (%d cells)" %(MinPatchSize, minCellSize))
keepPatches = sa.SetNull(AllPatches2,AllPatches2,"COUNT < %2.2f" %minCellSize)

# RegionGroup the kept patches
finalPatches = sa.RegionGroup(keepPatches,"EIGHT","CROSS","NO_LINK","0")
finalPatches.save(PatchRaster)
arcpy.AddMessage("Saving result to %s" %PatchRaster)