# Name: list_selected_values_v93.py # # Description # ----------- # This script will list the unique values of selected features/records in a FC or table # in a specified sort order. I meant this tool to be used to format long text strings # as value1, value2, value3, etc. so that I could use it as part of an SQL expression. # # Written By: Chris Snyder, WA DNR, chris.snyder(at)wadnr.gov # # Written For: Python 2.5.1 and ArcGIS v9.3.1 SP1 # # UPDATES: # # Notes on input parameters (for the toolbox): # VARIABLE PAREMETER_INDEX PARAMETER_DATA_TYPE # ------------------------------------------------------------------- # inputLayer 0 TableView (the input FeatureClass, Table, FeatureLayer or TableView) # inputFieldName 1 Field Name # inputSortOrder 2 String ("ASCENDING","DESCENDING", "UNSORTED") # try: #Process: Import some modules import os, string, sys, time, traceback, arcgisscripting #Process: Create the gp object gp = arcgisscripting.create(9.3) #Process: Defines some functions used for getting messages from the gp and python def showGpMessage(): gp.AddMessage(gp.GetMessages()) print >> open(logFile, 'a'), gp.GetMessages() print gp.GetMessages() def showGpWarning(): gp.AddWarning(gp.GetMessages()) print >> open(logFile, 'a'), gp.GetMessages() print gp.GetMessages() def showGpError(): gp.AddError(gp.GetMessages()) print >> open(logFile, 'a'), gp.GetMessages() print gp.GetMessages() def showPyLog(): #just print to the log file! print >> open(logFile, 'a'), str(time.ctime()) + " - " + message def showPyMessage(): gp.AddMessage(str(time.ctime()) + " - " + message) print >> open(logFile, 'a'), str(time.ctime()) + " - " + message print str(time.ctime()) + " - " + message def showPyWarning(): gp.AddWarning(str(time.ctime()) + " - " + message) print >> open(logFile, 'a'), str(time.ctime()) + " - " + message print str(time.ctime()) + " - " + message def showPyError(): gp.AddError(str(time.ctime()) + " - " + message) print >> open(logFile, 'a'), str(time.ctime()) + " - " + message print str(time.ctime()) + " - " + message #Specifies the root directory variable, defines the logFile variable, and does some minor error checking... dateTimeString = str(time.strftime('%Y%m%d%H%M%S')) scriptName = os.path.split(sys.argv[0])[-1].split(".")[0] userName = string.lower(os.environ.get("USERNAME")).replace(" ","_").replace(".","_") tempPathDir = os.environ["TEMP"] logFileDirectory = r"\\snarf\am\div_lm\ds\gis\tools\log_files" if os.path.exists(logFileDirectory) == True: logFile = os.path.join(logFileDirectory, scriptName + "_" + userName + "_" + dateTimeString + ".txt") try: print >> open(logFile, 'a'), "Write test successfull!" except: logFile = os.path.join(tempPathDir, scriptName + "_" + userName + "_" + dateTimeString + ".txt") else: logFile = os.path.join(tempPathDir, scriptName + "_" + userName + "_" + dateTimeString + ".txt") if os.path.exists(logFile)== True: os.remove(logFile) message = "Created log file " + logFile; showPyMessage() message = "Running " + sys.argv[0]; showPyMessage() #Process: Check out the highest license available try: if gp.CheckProduct("ArcView") == "Available": gp.SetProduct("ArcView") elif gp.CheckProduct("ArcEditor") == "Available": gp.SetProduct("ArcEditor") elif gp.CheckProduct("ArcInfo") == "Available": gp.SetProduct("ArcInfo") except: message = "ERROR: Could not select an ArcGIS license level! Exiting script..."; showPyError(); sys.exit() message = "Selected an " + gp.ProductInfo() + " license"; showPyMessage() #Process: Sets some gp environment variables gp.overwriteoutput = True #Process: Collect the input parameters inputLayer = gp.GetParameterAsText(0) #tableview inputFieldName = gp.GetParameterAsText(1) #fieldname inputSortOrder = gp.GetParameterAsText(2) #string #Process: Print out the input parameters message = "INPUT PARAMETERS"; showPyMessage() message = "----------------"; showPyMessage() message = "Input Layer = " + inputLayer; showPyMessage() message = "Input Field Name = " + inputFieldName; showPyMessage() message = "Sort Order = " + inputSortOrder + "\n"; showPyMessage() #Some error checking: try: dsc = gp.describe(inputLayer) except: message = "ERROR: Could not describe input layer! Exiting script..."; showPyError(); sys.exit() #make sure the inputLayer is a FeatureClass or Table inputLayerDataType = dsc.datasettype if inputLayerDataType not in ("FeatureClass","Table"): message = "ERROR: Input layer type (" + str(inputLayerDataType) + ") is not a FeatureClass or Table! Exiting script.."; showPyError(); sys.exit() #make sure inputFieldName is in inputLayer if len(gp.listfields(inputLayer, inputFieldName)) == []: message = "ERROR: Input layer does not contain a " + str(inputFieldName) + " field! Exiting script..."; showPyError(); sys.exit() #Make sure a valid sort method is being provided if inputSortOrder not in ("ASCENDING","DESCENDING","UNSORTED"): message = "ERROR: Input sort order must be either ASCENDING, DESCENDING, or UNSORTED! Exiting script..."; showPyError(); sys.exit() elif inputSortOrder == "ASCENDING": fieldSortString = inputFieldName + " A" elif inputSortOrder == "DESCENDING": fieldSortString = inputFieldName + " D" else: fieldSortString = "" #Determine the field type of inputFieldName try: inputFieldNameType = gp.listfields(inputLayer, inputFieldName)[0].type except: message = "ERROR: Could not determine the field type of the specified Input Field Name! Exiting script..."; showPyError(); sys.exit() #Process: Create a string to return uniqueValueList = [] uniqueValueCount = 0 searchRows = gp.searchcursor(inputLayer, "", "", "", fieldSortString) searchRow = searchRows.next() while searchRow: fieldValue = searchRow.getvalue(inputFieldName) if fieldValue not in uniqueValueList: uniqueValueCount = uniqueValueCount + 1 uniqueValueList.append(fieldValue) searchRow = searchRows.next() del searchRow del searchRows uniqueValueString = "" for uniqueValue in uniqueValueList: if inputFieldNameType in ("String","Text"): uniqueValueString = uniqueValueString + "'" + str(uniqueValue) + "'," else: uniqueValueString = uniqueValueString + str(uniqueValue) + "," message = "UNIQUE VALUES: " + str(uniqueValueString[:-1]); showPyMessage() message = ""; showPyMessage() message = "BTW: There are " + str(uniqueValueCount) + " unique values!"; showPyMessage() except: message = "\n*** PYTHON ERRORS *** "; showPyMessage() message = "Python Traceback Info: " + traceback.format_tb(sys.exc_info()[2])[0]; showPyMessage() message = "Python Error Info: " + str(sys.exc_type)+ ": " + str(sys.exc_value) + "\n"; showPyMessage()
Angemeldete Mitglieder können Beiträge verfassen, Updates folgen und mehr. Neu hier? Registriere ein kostenloses Konto.
Find useful guides, FAQs, and documents to help you navigate and make the most of Esri Community.