#-------------------------------------------------------------------------- # Tool Name: SmartConservation GreenPlan AddFields # Source Name: AddingFields.py # Version: ArcGIS 9.0 # Author: Robert Cheetham cheetham@avencia.com # # This script will add or overwrite a field to the input # feature class and populate that field with feature areas. #-------------------------------------------------------------------------- #-------------------------------------------------------------------------- #Imports #-------------------------------------------------------------------------- from win32com.client import constants, Dispatch from types import * import pythoncom, sys, os, math, string # HelperFunctions.py contains functions and custom classed used by all # the Stat tools and utilities. # from SCMHelperFunctions import * #-------------------------------------------------------------------------- #MAIN sAreaMetersField = "AREA_MTR" sAreaAcresField = "AREA_ACRE" sAreaRankField = "AREA_RANK" sRoundednessField = "SHP_RANK" sResultsField = "SC_SCORE" SQ_METERS_IN_ACRES = 4047 CONS_VALUE_WEIGHT = 0.70 AREA_WEIGHT = 0.20 ROUNDEDNESS_WEIGHT = 0.10 # print "Area Field: ", sAreaMetersField # print "Perimeter Field: ", sRoundednessField # print "Results/Score Field: ", sResultsField try: pGP = Dispatch("esriGeoprocessing.GPDispatch.1") except: raise "Error creating the geoprocessing dispatch object." pGP.SetProduct("ArcView") #Get input feature class try: sInputFC = sys.argv[1] # Input Feature Class sOutputFC = sys.argv[2] # Output Feature Class sValueField = sys.argv[3] # The value field except: raise "Invalid Arguments" #Copy the input feature class into the output feature class. # print "sInputFC: ", sInputFC # print "sOutputFC: ", sOutputFC # print "sValueField: ", sValueField try: pGP.copyfeatures(sInputFC, sOutputFC) except: sMessage = "Cannot overwrite output feature class: %s" % (sOutputFC) sErrors = pGP.GetMessages(2) sOutMessage = sMessage + "... " + sErrors raise sOutMessage #Get feature class information: fields, shapefile, etc. pFCInfo = pGP.Describe(sInputFC) pFields = pGP.ListFields(sInputFC) if string.lower(pFCInfo.ShapeType) <> "polygon": raise "Only Polygons are valid input feature classes" # Add AREA_MTR field. try: pGP.AddField(sOutputFC, sAreaMetersField, "DOUBLE") except: pGP.AddWarning("Area field exists") # Add AREA_ACRE field. try: pGP.AddField(sOutputFC, sAreaAcresField, "DOUBLE") except: pGP.AddWarning("Area Acres field exists") # Add AREA_RANK field. try: pGP.AddField(sOutputFC, sAreaRankField, "DOUBLE") except: pGP.AddWarning("Area Rank field exists") # Add ROUNDEDNESS (SHP_RANK) field. try: pGP.AddField(sOutputFC, sRoundednessField, "DOUBLE") except: pGP.AddWarning("Perimeter field exists") # Add results SCORE field. try: pGP.AddField(sOutputFC, sResultsField, "DOUBLE") except: pGP.AddWarning("Score field exists") pRows = pGP.UpdateCursor(sOutputFC) pRow = pRows.Next() while pRow <> None: pGeometry = pRow.GetValue (pFCInfo.ShapeFieldName) dArea = pGeometry.Area # Set Acres by dividing Sq Meters by 4042 dAreaAcres = dArea / SQ_METERS_IN_ACRES dPerim = pGeometry.Length dRoundedness = (35.4 * (math.sqrt(dArea) / dPerim)) dConservationValue = pRow.GetValue(sValueField) if (dAreaAcres < 9): dAreaRank = 1 elif (dAreaAcres>=9) and (dAreaAcres<14): dAreaRank = 2 elif (dAreaAcres>=14) and (dAreaAcres<19): dAreaRank = 3 elif (dAreaAcres>=19) and (dAreaAcres<26): dAreaRank = 4 elif (dAreaAcres>=26) and (dAreaAcres<36): dAreaRank = 5 elif (dAreaAcres>=36) and (dAreaAcres<50): dAreaRank = 6 elif (dAreaAcres>=50) and (dAreaAcres<73): dAreaRank = 7 elif (dAreaAcres>=73) and (dAreaAcres<122): dAreaRank = 8 elif (dAreaAcres>=122) and (dAreaAcres<260): dAreaRank = 9 elif (dAreaAcres>=260): dAreaRank = 10 pRow.SetValue(sAreaMetersField,dArea) pRow.SetValue(sAreaAcresField,dAreaAcres) pRow.SetValue(sRoundednessField,dRoundedness) pRow.SetValue(sAreaRankField,dAreaRank) pRow.SetValue(sResultsField,((dConservationValue * CONS_VALUE_WEIGHT) + (dAreaRank * AREA_WEIGHT) + (dRoundedness * ROUNDEDNESS_WEIGHT))) pRows.UpdateRow(pRow) pRow = pRows.Next() pGeometry = None pRow = None pRows = None pGP = None sInputFC = None sOutputFC = None #==========================================================================