We have written a Python script using arcpy
modules. It is was written by Python beginners and many parts of the code are written in 'unpythonic way'. The goal is to re-write or address 'unpythonic' code. The software used for this script are ArcMap 10.4 and written in Python 2.7. The complete script is available on GitHub.
The main directory is "C:/A__P6_GIS4/" and contains twelve sub-dirs the sub directories are actually names of counties, and each county sub-dir contains all relevant inputs inside the geodatabase
or gdb
file. First, the script loops and creates a .txt file with names of all the sub-dirs then uses this to loop through each sub-dir and execute set of functions for each county using set of if-else statements. The functions can be broadly broken by turf grass (TG) model
, fractional (Frac) model
, forest model
and final model
. The final model utilizes outputs from the aforementioned models and then creates the final model.
Only contains main()
due to character limitation:
def main():
ALL_start_time = time.time()
#ALL_start_time = timeit.default_timer()
if arcpy.CheckExtension("Spatial") == "Available":
arcpy.AddMessage("Checking out Spatial")
arcpy.CheckOutExtension("Spatial")
else:
arcpy.AddError("Unable to get spatial analyst extension")
arcpy.AddMessage(arcpy.GetMessages(0))
sys.exit(0)
# Create List of Counties for Loop
arcpy.Delete_management("C:/GIS_temp/county_list.txt")
co_list = "C:/GIS_temp/county_list.txt"
county_list = open(co_list,"a") #Open the list
MainDIR = "C:/A__P6_GIS4/" #Directory where LAND USE geodatabases are located
for i in os.listdir(MainDIR):
i_base = os.path.basename(i)
county_list.write(i_base + "\n")
county_list.close()
# Start Looping Through County List
county_list = open(co_list,"r")
for i in county_list: #A text file is needed to ensure looping works!
CoName = i.strip("\n")
print CoName + " started"
# Setup Directories
MainDIR = "C:/A__P6_GIS4/" #Directory where LAND USE geodatabases are located
CntyDIR = os.path.join(MainDIR, CoName + "/")
OutputDIR = os.path.join(CntyDIR, "Outputs/")
TiffDIR = os.path.join(OutputDIR, CoName + "_FINAL/") # Former FinalDirectory
if not arcpy.Exists(OutputDIR):
arcpy.CreateFolder_management(CntyDIR, "Outputs")
if not arcpy.Exists(TiffDIR):
arcpy.CreateFolder_management(OutputDIR, CoName + "_FINAL")
Inputs = os.path.join(CntyDIR, CoName + "_Inputs.gdb/") # Former CoGDB
Temp_1m = os.path.join(OutputDIR, "Temp_1m.gdb/") # Former TempGDB
Temp_10m = os.path.join(OutputDIR, "Temp_10m.gdb/") # Former Temp10GDB
Final_10m = os.path.join(OutputDIR, "Final_10m.gdb/") # Former Final_10m
Final_1m = os.path.join(OutputDIR, "Final_1m.gdb/") # Former LuGDB
if not arcpy.Exists(Temp_1m):
arcpy.CreateFileGDB_management(OutputDIR, "Temp_1m.gdb")
if not arcpy.Exists(Temp_10m):
arcpy.CreateFileGDB_management(OutputDIR, "Temp_10m.gdb")
if not arcpy.Exists(Final_10m):
arcpy.CreateFileGDB_management(OutputDIR, "Final_10m.gdb")
if not arcpy.Exists(Final_1m):
arcpy.CreateFileGDB_management(OutputDIR, "Final_1m.gdb")
arcpy.Copy_management(Inputs + CoName + "_IR_1m", Final_1m + CoName + "_IR_1m")
arcpy.Copy_management(Inputs + CoName + "_INR_1m", Final_1m + CoName + "_INR_1m")
arcpy.Copy_management(Inputs + CoName + "_TCoI_1m", Final_1m + CoName + "_TCoI_1m")
arcpy.Copy_management(Inputs + CoName + "_WAT_1m", Final_1m + CoName + "_WAT_1m")
arcpy.Copy_management(Inputs + CoName + "_LC", Final_1m + CoName + "_LandCover")
arcpy.env.overwriteOutput = True
coord_data = Inputs + CoName + "_Snap"
arcpy.env.outputCoordinateSystem = arcpy.Describe(coord_data).spatialReference
arcpy.env.workspace = Temp_1m
arcpy.env.scratchWorkspace = Temp_1m
arcpy.env.extent = os.path.join(str(Final_1m) + str(CoName) + "_IR_1m")
arcpy.env.parallelProcessingFactor = "100%"
arcpy.env.snapRaster = str(Final_1m) + str(CoName) + "_IR_1m" #location of the default snap raster
# Local variables:
BAR = os.path.join(str(Inputs) + str(CoName) + "_Barren")
BEACH = os.path.join(str(Inputs) + str(Inputs),str(CoName) + "_MOBeach")
cc_wetlands = os.path.join(str(Inputs), str(CoName) +"_WL")
crpCDL = os.path.join(str(Inputs) + str(CoName) + "_crpCDL")
DEMstrm = os.path.join(str(Inputs) + str(CoName) + "_Stream")
DEV_UAC = os.path.join(str(Inputs) + str(CoName) + "_DEV_UAC")
DEV113 = os.path.join(str(Inputs) + str(CoName) + "_DEV113")
DEV37 = os.path.join(str(Inputs) + str(CoName) + "_DEV37")
DEV27 = os.path.join(str(Inputs) + str(CoName) + "_DEV27")
DEV18 = os.path.join(str(Inputs) + str(CoName) + "_DEV18")
fc_Tidal = os.path.join(str(Inputs), str(CoName) +"_mask_tidal")
fc_FPlain = os.path.join(str(Inputs), str(CoName) +"_mask_fplain")
fc_OTHWL = os.path.join(str(Inputs), str(CoName) +"_mask_oth_wl")
FEDS_sm = os.path.join(str(Inputs) + str(CoName) + "_FedPark_small")
FEDS_med = os.path.join(str(Inputs) + str(CoName) + "_FedPark_medium")
FEDS_lrg = os.path.join(str(Inputs) + str(CoName) + "_FedPark_large")
FINR_LU = os.path.join(str(Inputs) + str(CoName) + "_FracINR")
FTG_LU = os.path.join(str(Inputs) + str(CoName) + "_FracTG")
INST = os.path.join(str(Inputs) + str(CoName) + "_TurfNT")
T_LANDUSE = os.path.join(str(Inputs) + str(CoName) + "_TgLU")
M_LANDUSE = os.path.join(str(Inputs) + str(CoName) + "_MoLU")
LV = os.path.join(str(Inputs) + str(CoName) + "_LV")
MINE = os.path.join(str(Inputs) + str(CoName) + "_ExtLFill")
nwi_Tidal = os.path.join(str(Inputs), str(CoName) +"_Tidal")
nwi_FPlain = os.path.join(str(Inputs), str(CoName) +"_NTFPW")
nwi_OTHWL = os.path.join(str(Inputs), str(CoName) +"_OtherWL")
PARCELS = os.path.join(str(Inputs) + str(CoName) + "_Parcels")
pa_wetlands = os.path.join(str(Inputs), str(CoName) +"_PA_wet")
pasCDL = os.path.join(str(Inputs) + str(CoName) + "_pasCDL")
ROW = os.path.join(str(Inputs) + str(CoName) + "_RoW")
SS = os.path.join(str(Inputs),str(CoName) + "_SS")
TC = os.path.join(str(Inputs) + str(CoName) + "_TC")
Snap = os.path.join(str(Inputs) + str(CoName) + "_Snap")
# 1 meter LU Rasters - Listed in Hierarchical Order:
IR = os.path.join(str(Final_1m) + str(CoName) + "_IR_1m")
INR = os.path.join(str(Final_1m) + str(CoName) + "_INR_1m")
TCI = os.path.join(str(Final_1m) + str(CoName) + "_TCoI_1m")
WAT = os.path.join(str(Final_1m) + str(CoName) + "_WAT_1m")
WLT = os.path.join(str(Final_1m) + str(CoName) + "_WLT_1m")
WLF = os.path.join(str(Final_1m) + str(CoName) + "_WLF_1m")
WLO = os.path.join(str(Final_1m) + str(CoName) + "_WLO_1m")
FOR = os.path.join(str(Final_1m) + str(CoName) + "_FOR_1m")
TCT = os.path.join(str(Final_1m) + str(CoName) + "_TCT_1m")
MO = os.path.join(str(Final_1m) + str(CoName) + "_MO_1m")
FTG1 = os.path.join(str(Final_1m) + str(CoName) + "_FTG1_1m")
FTG2 = os.path.join(str(Final_1m) + str(CoName) + "_FTG2_1m")
FTG3 = os.path.join(str(Final_1m) + str(CoName) + "_FTG3_1m")
FINR = os.path.join(str(Final_1m) + str(CoName) + "_FINR_1m")
TG = os.path.join(str(Final_1m) + str(CoName) + "_TG_1m")
# Temporary Datasets
CDEdge = os.path.join(str(Temp_1m) + str(CoName) + "_EDGE")
EDGE = os.path.join(str(Temp_1m) + str(CoName) + "_EDGE")
FINRtemp = os.path.join(str(Temp_1m) + str(CoName) + "_FINRtemp")
FTGMask = os.path.join(str(Temp_1m) + str(CoName) + "_FTGmask")
FTGparcels = os.path.join(str(Temp_1m),str(CoName) + "_FTG_parcels")
FTGtemp = os.path.join(str(Temp_1m) + str(CoName) + "_FTGtemp")
FTGtemp2 = os.path.join(str(Temp_1m) + str(CoName) + "_FTGtemp2")
FTGtemp3 = os.path.join(str(Temp_1m) + str(CoName) + "_FTGtemp3")
HERB = os.path.join(str(Temp_1m) + str(CoName) + "_Herb")
INRmask = os.path.join(str(Temp_1m),str(CoName) + "_INRmask")
MOherb = os.path.join(str(Temp_1m) + str(CoName) + "_MOherb")
POT_FOR = os.path.join(str(Temp_1m),str(CoName) + "_potFOR")
RLTCP = os.path.join(str(Temp_1m) + str(CoName) + "_RLTCP")
RTmask = os.path.join(str(Temp_1m) + str(CoName) + "_RTmask")
RURmask = os.path.join(str(Temp_1m) + str(CoName) + "_RURmask")
TGMask = os.path.join(str(Temp_1m) + str(CoName) + "_TGmask")
TURFparcels = os.path.join(str(Temp_1m),str(CoName) + "_TURF_parcels")
TURFtemp = os.path.join(str(Temp_1m) + str(CoName) + "_TURFtemp")
TREES = os.path.join(str(Temp_1m) + str(CoName) + "_MOTrees")
URBmask = os.path.join(str(Temp_1m) + str(CoName) + "_URBmask")
WAT_FOR = os.path.join(str(Temp_1m),str(CoName) + "_watFOR")
print ("IR", arcpy.Exists(IR))
print ("INR", arcpy.Exists(INR))
print ("TCI", arcpy.Exists(TCI))
print("WAT", arcpy.Exists(WAT))
print("BAR", arcpy.Exists(BAR))
print("LV", arcpy.Exists(LV))
print("SS", arcpy.Exists(SS))
print("TC", arcpy.Exists(TC))
print("BAR", arcpy.Exists(BAR))
print("DEV_UAC", arcpy.Exists(DEV_UAC))
print("DEV113", arcpy.Exists(DEV113))
print("DEV37", arcpy.Exists(DEV37))
print("DEV27", arcpy.Exists(DEV27))
print("DEV18", arcpy.Exists(DEV18))
print("FEDS_sm", arcpy.Exists(FEDS_sm))
print("FEDS_med", arcpy.Exists(FEDS_med))
print("FEDS_lrg", arcpy.Exists(FEDS_lrg))
print("BEACH", arcpy.Exists(BEACH))
print("MINE", arcpy.Exists(MINE))
print("T_LANDUSE", arcpy.Exists(T_LANDUSE))
print("M_LANDUSE", arcpy.Exists(M_LANDUSE))
print("FINR_LU", arcpy.Exists(FINR_LU))
print("FTG_LU", arcpy.Exists(FTG_LU))
print("INST", arcpy.Exists(INST))
print("PARCELS", arcpy.Exists(PARCELS))
print("ROW", arcpy.Exists(ROW))
########################## START ALL MODELS ####################################
#ALL_start_time = time.time()
#------------------------- TURF & FRACTIONAL MODELS -----------------------------
start_time = time.time()
arcpy.Delete_management(str(Temp_1m) + "Parcel_IMP")
arcpy.Delete_management(str(Temp_1m) + "Parcel_IMP2")
arcpy.Delete_management(str(Temp_1m) + str(CoName) + "_INRmask")
arcpy.Delete_management(str(Temp_1m) + str(CoName) + "_RTmask")
arcpy.Delete_management(str(Temp_1m) + str(CoName) + "_Parcels_TURFtemp")
arcpy.Delete_management(str(Temp_1m) + str(CoName) + "_Parcels_TURF")
arcpy.Delete_management(str(Temp_1m) + str(CoName) + "_TURF_parcels")
arcpy.Delete_management(str(Temp_1m) + str(CoName) + "_Parcels_FTGtemp")
arcpy.Delete_management(str(Temp_1m) + str(CoName) + "_Parcels_FTG")
arcpy.Delete_management(str(Temp_1m) + str(CoName) + "_FTG_parcels")
arcpy.Delete_management(str(Temp_1m) + str(CoName) + "_TGmask")
arcpy.Delete_management(str(Temp_1m) + str(CoName) + "_FTGmask")
arcpy.Delete_management(str(Temp_1m) + str(CoName) + "_TURFtemp")
arcpy.Delete_management(str(Temp_1m) + str(CoName) + "_FTGtemp")
arcpy.Delete_management(str(Temp_1m) + str(CoName) + "_FTGtemp2")
arcpy.Delete_management(str(Temp_1m) + str(CoName) + "_FTGtemp3")
arcpy.Delete_management(str(Temp_1m) + str(CoName) + "_FINRtemp")
arcpy.Delete_management(str(Final_1m) + str(CoName) + "_TG_1m")
arcpy.Delete_management(str(Final_1m) + str(CoName) + "_TCI_1m")
arcpy.Delete_management(str(Final_1m) + str(CoName) + "_FTG1_1m")
arcpy.Delete_management(str(Final_1m) + str(CoName) + "_FTG2_1m")
arcpy.Delete_management(str(Final_1m) + str(CoName) + "_FTG3_1m")
arcpy.Delete_management(str(Final_1m) + str(CoName) + "_FINR_1m")
print("--- Removal of TURF & FRAC Duplicate Files Complete %s seconds ---" % (time.time() - start_time))
# Call each function, passing the necessary variables...
turf_1(CoName, Temp_1m, INR, IR, INRmask, TCI)
turf_2(CoName, Temp_1m, HERB, BAR, LV)
turf_3(CoName, Temp_1m, DEV18, DEV27)
# # TURF 4: Create Parcel-based Turf and Fractional Turf Masks
if arcpy.Exists(PARCELS):
turf_4a(CoName, Temp_1m, PARCELS, IR)
turf_4b(CoName, Temp_1m, PARCELS)
turf_4c(CoName, Temp_1m, PARCELS)
turf_4d(CoName, Temp_1m, DEV_UAC, RTmask, ROW, INST, T_LANDUSE, TURFparcels)
turf_4e(CoName, Temp_1m, FTG_LU, FEDS_sm, FTGparcels)
else:
turf_5a(CoName, Temp_1m, DEV_UAC, RTmask, ROW, INST, T_LANDUSE)
turf_5b(CoName, Temp_1m, FTG_LU, FEDS_sm)
turf_6(CoName, Temp_1m, Final_1m, HERB, TGMask, TURFtemp)
frac_1(CoName, Final_1m, HERB, FTGMask, FTGtemp)
frac_2(CoName, Final_1m, HERB, FEDS_med, FTGtemp2)
frac_3(CoName, Final_1m, HERB, FEDS_lrg, FTGtemp3)
frac_4(CoName, Final_1m, FINR_LU, HERB, FINRtemp)
# TURF & FRACTIONAL Clean up
start_time = time.time()
arcpy.Delete_management(str(Temp_1m) + "Parcel_IMP")
arcpy.Delete_management(str(Temp_1m) + "Parcel_IMP2")
arcpy.Delete_management(str(Temp_1m) + str(CoName) + "_RTmask")
arcpy.Delete_management(str(Temp_1m) + str(CoName) + "_Parcels_TURFtemp")
arcpy.Delete_management(str(Temp_1m) + str(CoName) + "_Parcels_TURF")
arcpy.Delete_management(str(Temp_1m) + str(CoName) + "_TURF_parcels")
arcpy.Delete_management(str(Temp_1m) + str(CoName) + "_Parcels_FTGtemp")
arcpy.Delete_management(str(Temp_1m) + str(CoName) + "_Parcels_FTG")
arcpy.Delete_management(str(Temp_1m) + str(CoName) + "_FTG_parcels")
#arcpy.Delete_management(str(Temp_1m) + str(CoName) + "_TGmask")
#arcpy.Delete_management(str(Temp_1m) + str(CoName) + "_FTGmask")
arcpy.Delete_management(str(Temp_1m) + str(CoName) + "_TURFtemp")
arcpy.Delete_management(str(Temp_1m) + str(CoName) + "_FTGtemp")
arcpy.Delete_management(str(Temp_1m) + str(CoName) + "_FTGtemp2")
arcpy.Delete_management(str(Temp_1m) + str(CoName) + "_FTGtemp3")
arcpy.Delete_management(str(Temp_1m) + str(CoName) + "_FINRtemp")
print("--- TURF & FRAC Clean Up Complete %s seconds ---" % (time.time() - start_time))
#--------------------------------FOREST MODEL----------------------------------------
start_time = time.time()
arcpy.Delete_management(str(Temp_1m) + str(CoName) + "_RLTCP")
arcpy.Delete_management(str(Temp_1m) + str(CoName) + "_EDGE")
arcpy.Delete_management(str(Temp_1m) + str(CoName) + "_CDEdge")
arcpy.Delete_management(str(Temp_1m) + str(CoName) + "_URBmask")
arcpy.Delete_management(str(Temp_1m) + str(CoName) + "_RURmask")
arcpy.Delete_management(str(Temp_1m) + str(CoName) + "_CDEdge")
arcpy.Delete_management(str(Temp_1m) + str(CoName) + "_URB_TCT")
arcpy.Delete_management(str(Temp_1m) + str(CoName) + "_RUR_TCT")
arcpy.Delete_management(str(Temp_1m) + str(CoName) + "_TCT1")
arcpy.Delete_management(str(Temp_1m) + str(CoName) + "_nonTCT")
arcpy.Delete_management(str(Temp_1m) + str(CoName) + "_potFOR")
arcpy.Delete_management(str(Temp_1m) + str(CoName) + "_NATnhbrs")
arcpy.Delete_management(str(Temp_1m) + str(CoName) + "_ForRG")
arcpy.Delete_management(str(Temp_1m) + str(CoName) + "_MOtemp")
arcpy.Delete_management(str(Temp_1m) + str(CoName) + "_MOspace")
arcpy.Delete_management(str(Temp_1m) + str(CoName) + "_MOherb")
arcpy.Delete_management(str(Temp_1m) + str(CoName) + "_MOTrees")
arcpy.Delete_management(str(Final_1m) + str(CoName) + "_FOR_1m")
arcpy.Delete_management(str(Final_1m) + str(CoName) + "_MO_1m")
for_1(CoName, DEV113, TC)
for_2(CoName, TC, DEV27)
for_3(CoName, Temp_1m, RLTCP, EDGE)
for_4(CoName, DEV37, CDEdge)
for_5(CoName, DEV18, TC)
for_6(CoName, Temp_1m, Final_1m)
for_7(CoName, TCT, TC)
for_8(CoName, Temp_1m, Final_1m, TC, WAT, WLF, WLO, WLT, WAT_FOR, POT_FOR)
#---------------------------MIXED OPEN MODEL-----------------------------------------------------
# MO 1: Create Mixed Open with just MOtrees and Scrub-shrub (no ancillary data)
inrasListMO = [ ]
if arcpy.Exists(BEACH):
inrasListMO.append(BEACH)
if arcpy.Exists(M_LANDUSE):
inrasListMO.append(M_LANDUSE)
if arcpy.Exists(MINE):
inrasListMO.append(MINE)
if not inrasListMO:
mo_1(CoName, Temp_1m, Final_1m, TREES, SS)
else:
mo_2a(CoName, Temp_1m, inrasListMO)
mo_2b(CoName, Temp_1m, BAR, HERB, LV)
mo_2c(CoName, Temp_1m, HERB, MOherb)
mo_2d(CoName, Temp_1m, Final_1m, MOherb, TREES, SS)
# FOREST & MIXED OPEN Clean up
start_time = time.time()
arcpy.Delete_management(str(Temp_1m) + str(CoName) + "_RLTCP")
arcpy.Delete_management(str(Temp_1m) + str(CoName) + "_EDGE")
arcpy.Delete_management(str(Temp_1m) + str(CoName) + "_CDEdge")
arcpy.Delete_management(str(Temp_1m) + str(CoName) + "_URBmask")
arcpy.Delete_management(str(Temp_1m) + str(CoName) + "_RURmask")
arcpy.Delete_management(str(Temp_1m) + str(CoName) + "_CDEdge")
arcpy.Delete_management(str(Temp_1m) + str(CoName) + "_URB_TCT")
arcpy.Delete_management(str(Temp_1m) + str(CoName) + "_RUR_TCT")
arcpy.Delete_management(str(Temp_1m) + str(CoName) + "_TCT1")
arcpy.Delete_management(str(Temp_1m) + str(CoName) + "_nonTCT")
arcpy.Delete_management(str(Temp_1m) + str(CoName) + "_potFOR")
arcpy.Delete_management(str(Temp_1m) + str(CoName) + "_NATnhbrs")
arcpy.Delete_management(str(Temp_1m) + str(CoName) + "_ForRG")
arcpy.Delete_management(str(Temp_1m) + str(CoName) + "_MOtemp")
#arcpy.Delete_management(str(Temp_1m) + str(CoName) + "_MOspace")
arcpy.Delete_management(str(Temp_1m) + str(CoName) + "_MOherb")
print("--- FOREST & MIXED OPEN Clean Up Complete %s seconds ---" % (time.time() - start_time))
#----------------------FINAL AGGREGATION MODEL-----------------------------------------
print ("IR", arcpy.Exists(IR))
print ("INR", arcpy.Exists(INR))
print ("TCI", arcpy.Exists(TCI))
print ("WAT", arcpy.Exists(WAT))
print ("WLT", arcpy.Exists(WLT))
print ("WLF", arcpy.Exists(WLF))
print ("WLO", arcpy.Exists(WLO))
print ("FOR", arcpy.Exists(FOR))
print ("TCT", arcpy.Exists(TCT))
print ("MO", arcpy.Exists(MO))
print ("FTG1", arcpy.Exists(FTG1))
print ("FTG2", arcpy.Exists(FTG2))
print ("FTG3", arcpy.Exists(FTG3))
print ("FINR", arcpy.Exists(FINR))
print ("TG", arcpy.Exists(TG))
final_1(CoName, Temp_1m, IR, INR, TCI, WAT, WLT, WLF, WLO, FOR, TCT, MO, FTG1, FTG2, FTG3, FINR, TG)
final_2(CoName, Temp_1m, Temp_10m, Final_1m, Snap, CntyDIR)
final_3(CoName, Temp_10m, DEMstrm, crpCDL, pasCDL, Snap)
final_4(CoName, Temp_10m, FTG1, FTG2, FTG3, FINR, WLT, WLF, WLO, Snap)
final_5(CoName, Temp_10m, Final_10m, TiffDIR, WLT, WLF, Snap)
print("--- All Models Complete %s seconds ---" % (time.time() - ALL_start_time))
## #############################################################################
## <<< END MAIN >>>
## #############################################################################
# Need this to execute main()
if __name__ == "__main__":
main()