##------------------------------------------------------------------------- ## Tool Name: Compute Watershed Landcover ## Source Name: Compute_Watershed_MELCD_Landcover.py ## Version: ArcGIS 9.2 ## Author: Michael Smith ## This script extracts landcover data for a layer ## or selected set of polygons and computes summary ## information based on the landcover into a new table. ## Optionally, the tool can also compute the raw landcover ## class totals for each polygon. If the input polygons ## do not have unique IDs, then data for polygons with ## identical IDs will be pooled. ## ## Added functionality for clipping the analysis area to a hydro buffer ## in version 2.0 ## ## Added functionality for clipping by point buffer in version 3.0 ## ## Script version: 3.0 ## Last revision: July 3, 2007 MRS ##------------------------------------------------------------------------- ## ## SECTION 1 - declare variables, import modules, etc. ## #Import required modules import sys, os, arcgisscripting, string, random # Create the geoprocessor object gp = arcgisscripting.create() # get input parameters as variables outtable = sys.argv[1] summarytableboolean = sys.argv[2] classtableboolean = sys.argv[3] impervtableboolean = sys.argv[4] watershedboolean = sys.argv[5] watershedlayer = sys.argv[6] watershedfield = sys.argv[7] hydroboolean = sys.argv[8] hydrobufdistance = sys.argv[9] circlebufboolean = sys.argv[10] circlebuflayer = sys.argv[11] circlebuffield = sys.argv[12] circlebufdistance = sys.argv[13] # Tell user to be patient gp.AddMessage('') gp.AddMessage('This could take up to 15 minutes per polygon, depending on area being analyzed...') gp.AddMessage('') # Operate with ArcInfo license gp.SetProduct("ArcInfo") # overwrite output gp.overwriteoutput = 1 # set local variables for input data and workspace gp.AddMessage('Creating temporary files...') gp.AddMessage('') tempworkspace = r'g:\dep\temp' landcovergrid = r'\\dep-eia1fsd2550\data$\images\landcover\melcd2004' impervgrid = r'\\dep-eia1fsd2550\data$\images\landcover\melcd_2004_imperviousness.tif' streamlayer = r'g:\data_layers\hydrography\streams.lyr' riverlayer = r'g:\data_layers\hydrography\rivers.lyr' pondlayer = r'g:\data_layers\hydrography\ponds_and_lakes.lyr' ## ## SECTION 2 - check for existing data and make sure everything is OK, create the workspace ## # check to make sure that at least one clipping layer is specified if watershedboolean == 'false' and circlebufboolean == 'false': gp.AddMessage('ERROR') gp.AddMessage(' At least one of the clipping choices must be selected -') gp.AddMessage(' either \'Clip by polygon\' or \'Clip by circular buffer\'') gp.AddMessage(' or both') gp.AddMessage('') gp.AddMessage('Exiting the tool') gp.AddMessage('') sys.exit() # check to make sure that everything's cool with clipping polygon layer if that box is checked if watershedboolean == 'true': try: watershedlayerdsc = gp.describe(watershedlayer) except: gp.AddMessage('ERROR') gp.AddMessage(' The \'Clip by polygon\' box was checked but no valid polygon') gp.AddMessage(' layer was specified for clipping.') gp.AddMessage('') gp.AddMessage('Exiting the tool') gp.AddMessage('') sys.exit() if watershedlayerdsc.shapetype != 'Polygon': gp.AddMessage('ERROR') gp.AddMessage(' The \'Clip by polygon\' box was checked but the layer specified') gp.AddMessage(' for clipping was not a polygon layer.') gp.AddMessage('') gp.AddMessage('Exiting the tool') gp.AddMessage('') sys.exit() if gp.validatefieldname(watershedfield, watershedlayer) == 'F1': gp.AddMessage('ERROR') gp.AddMessage(' The \'Clip by polygon\' box was checked but the field specified') gp.AddMessage(' for the clipping layer was not valid.') gp.AddMessage('') gp.AddMessage('Exiting the tool') gp.AddMessage('') sys.exit() # test to make sure that a hydro layer is specified if the hydro box is checked if hydroboolean == 'true' and int(hydrobufdistance) == 0: gp.AddMessage('ERROR') gp.AddMessage(' The \'Clip by a hydro buffer\' box was checked but no buffer') gp.AddMessage(' distance was specified.') gp.AddMessage('') gp.AddMessage('Exiting the tool') gp.AddMessage('') sys.exit() # test to make sure the point buffer parameters are specified correctly if that box is checked if circlebufboolean == 'true': try: circlebuflayerdsc = gp.describe(circlebuflayer) except: gp.AddMessage('ERROR') gp.AddMessage(' The \'Clip by circular buffer\' box was checked but no valid point') gp.AddMessage(' layer was specified for buffering.') gp.AddMessage('') gp.AddMessage('Exiting the tool') gp.AddMessage('') sys.exit() if circlebuflayerdsc.shapetype != 'Point': gp.AddMessage('ERROR') gp.AddMessage(' The \'Clip by circular buffer\' box was checked but the layer specified') gp.AddMessage(' for buffering was not a point layer.') gp.AddMessage('') gp.AddMessage('Exiting the tool') gp.AddMessage('') sys.exit() if gp.validatefieldname(circlebuffield, circlebuflayer) == 'F1': gp.AddMessage('ERROR') gp.AddMessage(' The \'Clip by circular buffer\' box was checked but the field specified') gp.AddMessage(' for the point layer was not valid.') gp.AddMessage('') gp.AddMessage('Exiting the tool') gp.AddMessage('') sys.exit() if int(circlebufdistance) == 0: gp.AddMessage('ERROR') gp.AddMessage(' The \'Clip by circular buffer\' box was checked but no buffer') gp.AddMessage(' distance was specified.') gp.AddMessage('') gp.AddMessage('Exiting the tool') gp.AddMessage('') sys.exit() # test to make sure polygon clip box is checked if something is specified inside: if watershedboolean == 'false': if watershedlayer != '': gp.AddMessage('ERROR') gp.AddMessage(' The \'Clip by polygon\' box was not checked but a layer') gp.AddMessage(' was still specified.') gp.AddMessage('') gp.AddMessage('Exiting the tool') gp.AddMessage('') sys.exit() if watershedfield != '': gp.AddMessage('ERROR') gp.AddMessage(' The \'Clip by polygon\' box was not checked but a field') gp.AddMessage(' was still specified.') gp.AddMessage('') gp.AddMessage('Exiting the tool') gp.AddMessage('') sys.exit() # test to make sure hydro clip box is checked if something is specified inside: if hydroboolean == 'false': if hydrobufdistance != '0' or hydrobufdistance == '#': gp.AddMessage('hydrobufdistance =' + hydrobufdistance) gp.AddMessage('ERROR') gp.AddMessage(' The \'Clip by a hydro buffer\' box was not checked but a') gp.AddMessage(' hydro buffer distance was still specified.') gp.AddMessage('') gp.AddMessage('Exiting the tool') gp.AddMessage('') sys.exit() # test to make sure point buffer clip box is checked if something is specified inside: if circlebufboolean == 'false': if circlebuflayer != '' and circlebuflayer != '#': gp.AddMessage('ERROR') gp.AddMessage(' The \'Clip by circular buffer\' box was not checked but a layer') gp.AddMessage(' was still specified.') gp.AddMessage('') gp.AddMessage('Exiting the tool') gp.AddMessage('') sys.exit() if circlebufdistance != '0' or circlebufdistance == '#': gp.AddMessage('ERROR') gp.AddMessage(' The \'Clip by circular buffer\' box was not checked but a') gp.AddMessage(' buffer distance was still specified.') gp.AddMessage('') gp.AddMessage('Exiting the tool') gp.AddMessage('') sys.exit() # creates the workspace using random number in name randcounter = 0 while randcounter < 1: try: workspace = tempworkspace + '\\landcov' + str(random.randint(1000, 10000)) os.mkdir(workspace) gp.AddMessage('') gp.AddMessage('Creating workspace...') randcounter = 1 except: workspace = tempworkspace + '\\landcov' + str(random.randint(1000, 10000)) # create the temporary GDB for this script outgdb = 'landcovtemp.mdb' gdbfilename = workspace + '\\' + outgdb gp.CreatePersonalGDB_management(workspace, outgdb) # Copy the input layer(s) into the GDB if watershedboolean == 'true': gp.copyfeatures_management(watershedlayer, gdbfilename + '\\watershedtemp', '', '100000', '0', '0') if circlebufboolean == 'true': gp.copyfeatures_management(circlebuflayer, gdbfilename + '\\circlebuftemp', '', '100000', '0', '0') # add an integer field and calculate values - this # is to work around issue with zonalstats only allowing # integer or text fields if watershedboolean == 'true': gp.AddField_management(gdbfilename + '\\watershedtemp', 'lctempzone', 'long') try: gp.CalculateField_management(gdbfilename + '\\watershedtemp', 'lctempzone', "[" + watershedfield + "]") except: gp.AddMessage('ERROR') gp.AddMessage(' The \'Clip by polygon\' box was checked but the input field') gp.AddMessage(' contained non-numeric characters. The field must only') gp.AddMessage(' contain numbers.') gp.AddMessage('') gp.AddMessage('Exiting the tool') sys.exit() if circlebufboolean == 'true': gp.AddField_management(gdbfilename + '\\circlebuftemp', 'lctempzone', 'long') try: gp.CalculateField_management(gdbfilename + '\\circlebuftemp', 'lctempzone', "[" + circlebuffield + "]") except: gp.AddMessage('ERROR') gp.AddMessage(' The \'Clip by circular buffer\' box was checked but the') gp.AddMessage(' input field contained non-numeric characters. The field') gp.AddMessage(' must only contain numbers.') gp.AddMessage('') gp.AddMessage('Exiting the tool') sys.exit() # check to make sure that polys have matching points if both are selected if circlebufboolean == 'true' and watershedboolean == 'true': gp.AddMessage('Comparing the polygon and point layers for matching IDs') gp.AddMessage('') counter = 0 rows = gp.SearchCursor(gdbfilename + '\\watershedtemp') row = rows.Next() while row: zonevalue = row.GetValue('lctempzone') gp.Select_analysis(gdbfilename + '\\circlebuftemp', gdbfilename + '\\pointtest' + str(counter), '[lctempzone] = ' + str(zonevalue)) pointcounter = 0 pointrows = gp.SearchCursor(gdbfilename + '\\pointtest' + str(counter)) pointrow = pointrows.Next() while pointrow: pointcounter = pointcounter + 1 pointrow = pointrows.Next() if pointcounter == 0: gp.AddMessage('ERROR') gp.AddMessage(' The \'Clip by polygon\' and \'Clip by circular buffer\'') gp.AddMessage(' were checked, but the layers specified for both have a') gp.AddMessage(' mismatching ID.') gp.AddMessage('') gp.AddMessage('The polygon layer has an ID of ' + str(zonevalue) + ' which is not found in the point layer') gp.AddMessage('') gp.AddMessage('Exiting the tool') sys.exit() counter = counter + 1 row = rows.Next() del rows ## ## SECTION 3 - geoprocessing and initial creation of output table ## # Check out SA license gp.CheckOutExtension('spatial') # Loop through all features, select each one out to # temp fc, tab areas, and append the tables gp.AddMessage('Tabulating areas for landcover...') gp.AddMessage('') # do it when watershedboolean is true if watershedboolean == 'true': counter = 0 rows = gp.SearchCursor(gdbfilename + '\\watershedtemp') row = rows.Next() while row: zonevalue = row.GetValue('lctempzone') gp.AddMessage('processing polygon ' + str(zonevalue)) gp.Select_analysis(gdbfilename + '\\watershedtemp', gdbfilename + '\\drdvd' + str(counter), '[lctempzone] = ' + str(zonevalue)) # do the hydro buffering if requested if hydroboolean == 'false': gp.copyfeatures_management(gdbfilename + '\\drdvd' + str(counter), gdbfilename + '\\allbuffclip' + str(counter)) else: gp.AddMessage('computing hydro buffers') gp.clip_analysis(streamlayer, gdbfilename + '\\drdvd' + str(counter), gdbfilename + '\\streams' + str(counter)) gp.clip_analysis(riverlayer, gdbfilename + '\\drdvd' + str(counter), gdbfilename + '\\rivers' + str(counter)) gp.clip_analysis(pondlayer, gdbfilename + '\\drdvd' + str(counter), gdbfilename + '\\ponds' + str(counter)) gp.buffer_analysis(gdbfilename + '\\streams' + str(counter), gdbfilename + '\\streamsbuf' + str(counter), hydrobufdistance, 'FULL', 'ROUND', 'ALL') gp.buffer_analysis(gdbfilename + '\\rivers' + str(counter), gdbfilename + '\\riversbuf' + str(counter), hydrobufdistance, 'FULL', 'ROUND', 'ALL') gp.buffer_analysis(gdbfilename + '\\ponds' + str(counter), gdbfilename + '\\pondsbuf' + str(counter), hydrobufdistance, 'FULL', 'ROUND', 'ALL') gp.append_management('\"' + gdbfilename + '\\riversbuf' + str(counter) + ';' + gdbfilename + '\\pondsbuf' + str(counter) + '\"', gdbfilename + '\\streamsbuf' + str(counter), "NO_TEST") gp.clip_analysis(gdbfilename + '\\streamsbuf' + str(counter), gdbfilename + '\\drdvd' + str(counter), gdbfilename + '\\allbuffclip' + str(counter)) #do the point buffering if requested if circlebufboolean == 'false': gp.copyfeatures_management(gdbfilename + '\\allbuffclip' + str(counter), gdbfilename + '\\finalclip' + str(counter)) else: gp.AddMessage('computing point buffers') gp.Select_analysis(gdbfilename + '\\circlebuftemp', gdbfilename + '\\samplept' + str(counter), '[lctempzone] = ' + str(zonevalue)) gp.buffer_analysis(gdbfilename + '\\samplept' + str(counter), gdbfilename + '\\sampleptbuf' + str(counter), circlebufdistance, 'FULL', 'ROUND', 'ALL') gp.clip_analysis(gdbfilename + '\\allbuffclip' + str(counter), gdbfilename + '\\sampleptbuf' + str(counter), gdbfilename + '\\finalclip' + str(counter)) #ready to extract the landcover now and make the table if summarytableboolean == 'true' or classtableboolean == 'true': gp.ExtractByMask_sa(landcovergrid, gdbfilename + '\\finalclip' + str(counter), workspace + '\\lc' + str(counter)) gp.ZonalStatisticsAsTable_sa(workspace + '\\lc' + str(counter), 'VALUE', workspace + '\\lc' + str(counter), gdbfilename + '\\lctab' + str(counter), 'DATA') gp.CalculateField_management(gdbfilename + '\\lctab' + str(counter), 'MAX_', zonevalue) if impervtableboolean == 'true': gp.ExtractByMask_sa(impervgrid, gdbfilename + '\\finalclip' + str(counter), workspace + '\\impraw' + str(counter)) gp.singleoutputmapalgebra(workspace + '\\impraw' + str(counter) + "+ 99", workspace + '\\imp' + str(counter)) gp.ZonalStatisticsAsTable_sa(workspace + '\\imp' + str(counter), 'VALUE', workspace + '\\imp' + str(counter), gdbfilename + '\\imptab' + str(counter), 'DATA') gp.CalculateField_management(gdbfilename + '\\imptab' + str(counter), 'MAX_', zonevalue) counter = counter + 1 gp.AddMessage('') row = rows.Next() del rows #do it when watershedboolean is false if watershedboolean == 'false': counter = 0 rows = gp.SearchCursor(gdbfilename + '\\circlebuftemp') row = rows.Next() while row: zonevalue = row.GetValue('lctempzone') gp.AddMessage('processing polygon ' + str(zonevalue)) gp.Select_analysis(gdbfilename + '\\circlebuftemp', gdbfilename + '\\samplept' + str(counter), '[lctempzone] = ' + str(zonevalue)) gp.buffer_analysis(gdbfilename + '\\samplept' + str(counter), gdbfilename + '\\sampleptbuf' + str(counter), circlebufdistance, 'FULL', 'ROUND', 'ALL') # do the hydro buffering if requested if hydroboolean == 'false': gp.copyfeatures_management(gdbfilename + '\\sampleptbuf' + str(counter), gdbfilename + '\\allbuffclip' + str(counter)) else: gp.AddMessage('computing hydro buffers') gp.clip_analysis(streamlayer, gdbfilename + '\\sampleptbuf' + str(counter), gdbfilename + '\\streams' + str(counter)) gp.clip_analysis(riverlayer, gdbfilename + '\\sampleptbuf' + str(counter), gdbfilename + '\\rivers' + str(counter)) gp.clip_analysis(pondlayer, gdbfilename + '\\sampleptbuf' + str(counter), gdbfilename + '\\ponds' + str(counter)) gp.buffer_analysis(gdbfilename + '\\streams' + str(counter), gdbfilename + '\\streamsbuf' + str(counter), hydrobufdistance, 'FULL', 'ROUND', 'ALL') gp.buffer_analysis(gdbfilename + '\\rivers' + str(counter), gdbfilename + '\\riversbuf' + str(counter), hydrobufdistance, 'FULL', 'ROUND', 'ALL') gp.buffer_analysis(gdbfilename + '\\ponds' + str(counter), gdbfilename + '\\pondsbuf' + str(counter), hydrobufdistance, 'FULL', 'ROUND', 'ALL') gp.append_management('\"' + gdbfilename + '\\riversbuf' + str(counter) + ';' + gdbfilename + '\\pondsbuf' + str(counter) + '\"', gdbfilename + '\\streamsbuf' + str(counter), "NO_TEST") gp.clip_analysis(gdbfilename + '\\streamsbuf' + str(counter), gdbfilename + '\\sampleptbuf' + str(counter), gdbfilename + '\\allbuffclip' + str(counter)) if summarytableboolean == 'true' or classtableboolean == 'true': gp.ExtractByMask_sa(landcovergrid, gdbfilename + '\\allbuffclip' + str(counter), workspace + '\\lc' + str(counter)) gp.ZonalStatisticsAsTable_sa(workspace + '\\lc' + str(counter), 'VALUE', workspace + '\\lc' + str(counter), gdbfilename + '\\lctab' + str(counter), 'DATA') gp.CalculateField_management(gdbfilename + '\\lctab' + str(counter), 'MAX_', zonevalue) if impervtableboolean == 'true': gp.ExtractByMask_sa(impervgrid, gdbfilename + '\\finalclip' + str(counter), workspace + '\\impraw' + str(counter)) gp.singleoutputmapalgebra(workspace + '\\impraw' + str(counter) + "+ 99", workspace + '\\imp' + str(counter)) gp.ZonalStatisticsAsTable_sa(workspace + '\\imp' + str(counter), 'VALUE', workspace + '\\imp' + str(counter), gdbfilename + '\\imptab' + str(counter), 'DATA') gp.CalculateField_management(gdbfilename + '\\imptab' + str(counter), 'MAX_', zonevalue) counter = counter + 1 gp.AddMessage('') row = rows.Next() del rows #process the output table # if no polygon layer specified, use the fieldname from the point buffer layer if watershedboolean == 'false': watershedfield = circlebuffield counter2 = 0 while counter2 < counter: if summarytableboolean == 'true' or classtableboolean == 'true': gp.AddField_management(gdbfilename + '\\lctab' + str(counter2), watershedfield, 'long') gp.CalculateField_management(gdbfilename + '\\lctab' + str(counter2), watershedfield, '[MAX_]') if counter2 > 0: gp.Append_management(gdbfilename + '\\lctab' + str(counter2), gdbfilename + '\\lctab0', 'TEST') gp.delete_management(workspace + '\\lc' + str(counter2)) if impervtableboolean == 'true': gp.AddField_management(gdbfilename + '\\imptab' + str(counter2), watershedfield, 'long') gp.CalculateField_management(gdbfilename + '\\imptab' + str(counter2), watershedfield, '[MAX_]') if counter2 > 0: gp.Append_management(gdbfilename + '\\imptab' + str(counter2), gdbfilename + '\\imptab0', 'TEST') gp.delete_management(workspace + '\\imp' + str(counter2)) gp.delete_management(workspace + '\\impraw' + str(counter2)) counter2 = counter2 + 1 if summarytableboolean == 'true' or classtableboolean == 'true': gp.DeleteField_management(gdbfilename + '\\lctab0', 'COUNT_; MIN_; MAX_; RANGE; MEAN; MEDIAN; STD; SUM_; VARIETY; MAJORITY; MINORITY') if impervtableboolean == 'true': gp.DeleteField_management(gdbfilename + '\\imptab0', 'COUNT_; MIN_; MAX_; RANGE; MEAN; MEDIAN; STD; SUM_; VARIETY; MAJORITY; MINORITY') #test the scenarios and create output table based on them if summarytableboolean == 'true' or classtableboolean == 'true': if impervtableboolean == 'true': gp.Append_management(gdbfilename + '\\imptab0', gdbfilename + '\\lctab0', 'TEST') else: gp.copy_management(gdbfilename + '\\imptab0', gdbfilename + '\\lctab0') # pivot the table if watershedboolean == 'true': gp.AddMessage('') gp.AddMessage('Pivoting output table...') gp.AddMessage('') gp.pivottable_management(gdbfilename + '\\lctab0', watershedfield, 'VALUE_', 'AREA', outtable) if summarytableboolean == 'true' or classtableboolean == 'true': vallist = [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 16, 19, 20, 21, 22, 23, 24, 25, 26, 27] for j in vallist: try: gp.AddField_management(outtable, 'VALUE_' + str(j), 'long') gp.CalculateField_management(outtable, 'VALUE_' + str(j), 0) except: gp.AddMessage('field VALUE_' + str(j) + ' already exists, skipping') if impervtableboolean == 'true': vallist = [99, 100] for j in vallist: try: gp.AddField_management(outtable, 'VALUE_' + str(j), 'long') gp.CalculateField_management(outtable, 'VALUE_' + str(j), 0) except: gp.AddMessage('field VALUE_' + str(j) + ' already exists, skipping') # Check in SA license gp.CheckInExtension('spatial') # tests output table - must be GDB descoutputtable = gp.Describe(outtable) if descoutputtable.DataType != 'Table': gp.AddMessage('') gp.AddMessage('ERROR') gp.AddMessage('Operation failed - output table must be geodatabase.') gp.AddMessage('(MS Access table or Oracle table)') gp.AddMessage('') sys.exit() ## ## SECTION 4 - compute summaries ## # Add summary fields to output table # # total area gp.AddMessage('') if summarytableboolean == 'true': gp.AddMessage('Computing summaries...') gp.AddMessage('') fld = 'total_area' gp.AddMessage(' ' + fld) gp.AddField_management(outtable, fld + '_ac', 'double') gp.AddField_management(outtable, fld + '_ha', 'double') gp.CalculateField_management(outtable, fld + '_ac', '[VALUE_2] + [VALUE_3] + \ [VALUE_4] + [VALUE_5] + [VALUE_6] + [VALUE_7] + [VALUE_8] + [VALUE_9] + \ [VALUE_10] + [VALUE_11] + [VALUE_12] + [VALUE_13] + [VALUE_15] + [VALUE_16] + \ [VALUE_19] + [VALUE_20] + [VALUE_21] + [VALUE_22] + [VALUE_23] + [VALUE_24] + \ [VALUE_25] + [VALUE_26] + [VALUE_27]') gp.CalculateField_management(outtable, fld + '_ha', '[' + fld + '_ac] * .0001') gp.CalculateField_management(outtable, fld + '_ac', '[' + fld + '_ha] * 2.471054073') # total land area fld = 'total_land_area' gp.AddMessage(' ' + fld) gp.AddField_management(outtable, fld + '_ac', 'double') gp.AddField_management(outtable, fld + '_ha', 'double') gp.CalculateField_management(outtable, fld + '_ac', '[VALUE_2] + [VALUE_3] + \ [VALUE_4] + [VALUE_5] + [VALUE_6] + [VALUE_7] + [VALUE_8] + [VALUE_9] + \ [VALUE_10] + [VALUE_11] + [VALUE_12] + [VALUE_13] + [VALUE_15] + [VALUE_16] + \ [VALUE_20] + [VALUE_22] + [VALUE_23] + [VALUE_24] + \ [VALUE_25] + [VALUE_26] + [VALUE_27]') gp.CalculateField_management(outtable, fld + '_ha', '[' + fld + '_ac] * .0001') gp.CalculateField_management(outtable, fld + '_ac', '[' + fld + '_ha] * 2.471054073') # high intensity urban development fld = 'high_intensity_dev' gp.AddMessage(' ' + fld) gp.AddField_management(outtable, fld + '_ac', 'double') gp.AddField_management(outtable, fld + '_ha', 'double') gp.AddField_management(outtable, fld + '_pct', 'double') gp.CalculateField_management(outtable, fld + '_ac', '[VALUE_2]') gp.CalculateField_management(outtable, fld + '_ha', '[' + fld + '_ac] * .0001') gp.CalculateField_management(outtable, fld + '_ac', '[' + fld + '_ha] * 2.471054073') gp.CalculateField_management(outtable, fld + '_pct', '[' + fld + '_ac] / [total_land_area_ac] * 100') # medium intensity urban development fld = 'med_intensity_dev' gp.AddMessage(' ' + fld) gp.AddField_management(outtable, fld + '_ac', 'double') gp.AddField_management(outtable, fld + '_ha', 'double') gp.AddField_management(outtable, fld + '_pct', 'double') gp.CalculateField_management(outtable, fld + '_ac', '[VALUE_3]') gp.CalculateField_management(outtable, fld + '_ha', '[' + fld + '_ac] * .0001') gp.CalculateField_management(outtable, fld + '_ac', '[' + fld + '_ha] * 2.471054073') gp.CalculateField_management(outtable, fld + '_pct', '[' + fld + '_ac] / [total_land_area_ac] * 100') # low intensity urban development fld = 'low_intensity_dev' gp.AddMessage(' ' + fld) gp.AddField_management(outtable, fld + '_ac', 'double') gp.AddField_management(outtable, fld + '_ha', 'double') gp.AddField_management(outtable, fld + '_pct', 'double') gp.CalculateField_management(outtable, fld + '_ac', '[VALUE_4] + [VALUE_16]') gp.CalculateField_management(outtable, fld + '_ha', '[' + fld + '_ac] * .0001') gp.CalculateField_management(outtable, fld + '_ac', '[' + fld + '_ha] * 2.471054073') gp.CalculateField_management(outtable, fld + '_pct', '[' + fld + '_ac] / [total_land_area_ac] * 100') # low intensity urban development fld = 'all_dev' gp.AddMessage(' ' + fld) gp.AddField_management(outtable, fld + '_ac', 'double') gp.AddField_management(outtable, fld + '_ha', 'double') gp.AddField_management(outtable, fld + '_pct', 'double') gp.CalculateField_management(outtable, fld + '_ac', '[VALUE_2] + [VALUE_3] + [VALUE_4] + [VALUE_16]') gp.CalculateField_management(outtable, fld + '_ha', '[' + fld + '_ac] * .0001') gp.CalculateField_management(outtable, fld + '_ac', '[' + fld + '_ha] * 2.471054073') gp.CalculateField_management(outtable, fld + '_pct', '[' + fld + '_ac] / [total_land_area_ac] * 100') # tilled agriculture fld = 'tilled_agriculture' gp.AddMessage(' ' + fld) gp.AddField_management(outtable, fld + '_ac', 'double') gp.AddField_management(outtable, fld + '_ha', 'double') gp.AddField_management(outtable, fld + '_pct', 'double') gp.CalculateField_management(outtable, fld + '_ac', '[VALUE_6]') gp.CalculateField_management(outtable, fld + '_ha', '[' + fld + '_ac] * .0001') gp.CalculateField_management(outtable, fld + '_ac', '[' + fld + '_ha] * 2.471054073') gp.CalculateField_management(outtable, fld + '_pct', '[' + fld + '_ac] / [total_land_area_ac] * 100') # grasslands fld = 'grasslands' gp.AddMessage(' ' + fld) gp.AddField_management(outtable, fld + '_ac', 'double') gp.AddField_management(outtable, fld + '_ha', 'double') gp.AddField_management(outtable, fld + '_pct', 'double') gp.CalculateField_management(outtable, fld + '_ac', '[VALUE_7] + [VALUE_8]') gp.CalculateField_management(outtable, fld + '_ha', '[' + fld + '_ac] * .0001') gp.CalculateField_management(outtable, fld + '_ac', '[' + fld + '_ha] * 2.471054073') gp.CalculateField_management(outtable, fld + '_pct', '[' + fld + '_ac] / [total_land_area_ac] * 100') # upland_woody fld = 'upland_woody' gp.AddMessage(' ' + fld) gp.AddField_management(outtable, fld + '_ac', 'double') gp.AddField_management(outtable, fld + '_ha', 'double') gp.AddField_management(outtable, fld + '_pct', 'double') gp.CalculateField_management(outtable, fld + '_ac', '[VALUE_9] + [VALUE_10] + [VALUE_11] + [VALUE_12] + \ [VALUE_22] + [VALUE_23] + [VALUE_24] + [VALUE_25] + [VALUE_26]') gp.CalculateField_management(outtable, fld + '_ha', '[' + fld + '_ac] * .0001') gp.CalculateField_management(outtable, fld + '_ac', '[' + fld + '_ha] * 2.471054073') gp.CalculateField_management(outtable, fld + '_pct', '[' + fld + '_ac] / [total_land_area_ac] * 100') # wetland fld = 'wetlands' gp.AddMessage(' ' + fld) gp.AddField_management(outtable, fld + '_ac', 'double') gp.AddField_management(outtable, fld + '_ha', 'double') gp.AddField_management(outtable, fld + '_pct', 'double') gp.CalculateField_management(outtable, fld + '_ac', '[VALUE_13] + [VALUE_15]') gp.CalculateField_management(outtable, fld + '_ha', '[' + fld + '_ac] * .0001') gp.CalculateField_management(outtable, fld + '_ac', '[' + fld + '_ha] * 2.471054073') gp.CalculateField_management(outtable, fld + '_pct', '[' + fld + '_ac] / [total_land_area_ac] * 100') # nonvegetated fld = 'nonvegetated' gp.AddMessage(' ' + fld) gp.AddField_management(outtable, fld + '_ac', 'double') gp.AddField_management(outtable, fld + '_ha', 'double') gp.AddField_management(outtable, fld + '_pct', 'double') gp.CalculateField_management(outtable, fld + '_ac', '[VALUE_19] + [VALUE_20]') gp.CalculateField_management(outtable, fld + '_ha', '[' + fld + '_ac] * .0001') gp.CalculateField_management(outtable, fld + '_ac', '[' + fld + '_ha] * 2.471054073') gp.CalculateField_management(outtable, fld + '_pct', '[' + fld + '_ac] / [total_land_area_ac] * 100') # water fld = 'water' gp.AddMessage(' ' + fld) gp.AddField_management(outtable, fld + '_ac', 'double') gp.AddField_management(outtable, fld + '_ha', 'double') gp.AddField_management(outtable, fld + '_pct', 'double') gp.CalculateField_management(outtable, fld + '_ac', '[VALUE_19] + [VALUE_21]') gp.CalculateField_management(outtable, fld + '_ha', '[' + fld + '_ac] * .0001') gp.CalculateField_management(outtable, fld + '_ac', '[' + fld + '_ha] * 2.471054073') gp.CalculateField_management(outtable, fld + '_pct', '[' + fld + '_ac] / [total_land_area_ac] * 100') # human altered fld = 'human_altered' gp.AddMessage(' ' + fld) gp.AddField_management(outtable, fld + '_ac', 'double') gp.AddField_management(outtable, fld + '_ha', 'double') gp.AddField_management(outtable, fld + '_pct', 'double') gp.CalculateField_management(outtable, fld + '_ac', '[VALUE_2] + [VALUE_3] + [VALUE_4] \ + [VALUE_5] + [VALUE_6] + [VALUE_7] + [VALUE_16] + [VALUE_20] + [VALUE_22]') gp.CalculateField_management(outtable, fld + '_ha', '[' + fld + '_ac] * .0001') gp.CalculateField_management(outtable, fld + '_ac', '[' + fld + '_ha] * 2.471054073') gp.CalculateField_management(outtable, fld + '_pct', '[' + fld + '_ac] / [total_land_area_ac] * 100') # natural fld = 'natural' gp.AddMessage(' ' + fld) gp.AddField_management(outtable, fld + '_ac', 'double') gp.AddField_management(outtable, fld + '_ha', 'double') gp.AddField_management(outtable, fld + '_pct', 'double') gp.CalculateField_management(outtable, fld + '_ha', '[total_land_area_ha] - [human_altered_ha]') gp.CalculateField_management(outtable, fld + '_ac', '[' + fld + '_ha] * 2.471054073') gp.CalculateField_management(outtable, fld + '_pct', '[' + fld + '_ac] / [total_land_area_ac] * 100') gp.AddMessage('') # list to store all possible MELCD class names vallist = ['2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '15', '16', '19', '20', '21', '22', '23', '24', '25', '26', '27'] ## ## Section 5 Add the actual landcover classes if desired ## # Add fields to classes table if classtableboolean == 'true': fldlist = ['hi_dens_dev', 'med_dens_dev', 'lo_dens_dev', 'open_space_dev', 'cultivated_crops', 'pasture_hay', 'herbaceous', 'decid_forest', 'everg_forest', 'mixed_forest', 'scrub_shrub', 'wetland_forest', 'wetland', 'road_runway', 'shore', 'bare_land', 'open_water', 'blueberry_field', 'recent_clearcut', 'light_partial_cut', 'heavy_partial_cut', 'forest_regen', 'alpine'] gp.AddMessage('Computing MELCD 2004 classes...') gp.AddMessage('') count = 0 for j in fldlist: gp.AddMessage(' ' + j) calcfield = '[VALUE_' + vallist[count] + ']' gp.AddField_management(outtable, j + '_ha', 'double') gp.CalculateField_management(outtable, j + '_ha', calcfield + ' * .0001') gp.AddField_management(outtable, j + '_ac', 'double') gp.CalculateField_management(outtable, j + '_ac', '[' + j + '_ha] * 2.471054073') count = count + 1 gp.AddMessage('') ## ## Section 6 - compute imperviousness ## # Compute the imperviousness if impervtableboolean == 'true': if summarytableboolean == 'false' and classtableboolean == 'false': gp.AddField_management(outtable, 'total_area_ha', 'double') gp.AddField_management(outtable, 'total_area_ac', 'double') gp.CalculateField_management(outtable, 'total_area_ac', '[VALUE_99] + [VALUE_100]') gp.CalculateField_management(outtable, 'total_area_ha', '[total_area_ac] * .0001') gp.CalculateField_management(outtable, 'total_area_ac', '[total_area_ha] * 2.471054073') gp.AddMessage('Computing MELCD 2004 imperviousness') gp.AddMessage('') gp.AddField_management(outtable, 'imperv_ha', 'double') gp.AddField_management(outtable, 'imperv_ac', 'double') gp.AddField_management(outtable, 'imperv_pct', 'double') gp.CalculateField_management(outtable, 'imperv_ha', '[VALUE_99] * .0001') gp.CalculateField_management(outtable, 'imperv_ac', '[imperv_ha] * 2.471054073') gp.CalculateField_management(outtable, 'imperv_pct', '[imperv_ac] / [total_area_ac] * 100') ## ## Section 7 - clean up the mess ## # Delete value fields gp.AddMessage('Deleting temporary files...') gp.AddMessage('') if summarytableboolean == 'true' or classtableboolean == 'true': for k in vallist: gp.DeleteField_management(outtable, 'VALUE_' + k) if impervtableboolean == 'true': gp.DeleteField_management(outtable, 'VALUE_99') gp.DeleteField_management(outtable, 'VALUE_100') del gp os.remove(workspace + '\\info\\arc.dir') os.rmdir(workspace + '\\info') os.remove(gdbfilename) os.rmdir(workspace) #ALL DONE sys.exit()