2

I am trying to use the script from Randomly subsetting X% of selected points using ArcPy? to randomly select and export points in ArcGIS.

Specifically, I am using this:

def SelectRandomByCount (layer, count):
     import random
     layerCount = int (arcpy.GetCount_management (layer).getOutput (0))
     if layerCount < count:
         print "input count is greater than layer count"
         return
     oids = [oid for oid, in arcpy.da.SearchCursor (layer, "OID@")]
     oidFldName = arcpy.Describe (layer).OIDFieldName
     delimOidFld = arcpy.AddFieldDelimiters (layer, oidFldName)
     randOids = random.sample (oids, count)
     oidsStr = ", ".join (map (str, randOids))
     sql = "{0} IN ({1})".format (delimOidFld, oidsStr)
     arcpy.SelectLayerByAttribute_management (layer, "", sql)
     arcpy.CopyFeatures_management(layer, "random_start_20pop")
     arcpy.SelectLayerByAttribute_management(layer, "SWITCH_SELECTION")
     arcpy.CopyFeatures_management(layer, "endings_for_20pop")

What should I do to create Python tool in ArcToolbox instead of pasting it to the Python window? I've tried already to save it in toolbox as a script but I assume that I did it wrong. I tried to proceed as it is shown here Adding a script tool

BERA
  • 72,339
  • 13
  • 72
  • 161
KaBi
  • 55
  • 5
  • 1
    "Why does it work only in python window in ArcMAP, but not as a saved tool in toolbox so I can't use it in ModelBuilder? I saved it, I can insert parameters, but than nothing happens." - What have you tried? Add more info – BERA Jul 04 '17 at 08:44
  • You defined a python function, which on itself does nothing. So you'll need additional code to get the parameters from your script tool (i assume you are using a script tool not a python toolbox). Read this, to get a running tool http://pro.arcgis.com/de/pro-app/arcpy/geoprocessing_and_python/a-quick-tour-of-creating-tools-in-python.htm – Andreas Müller Jul 04 '17 at 08:44
  • @BERA - I used add script on arctoolbox and than set parameters. – KaBi Jul 04 '17 at 13:50

2 Answers2

1

The current workspace will be the output geodatabase. For example the Default geodatabase. If you want you can add the output database as an input to the function:

def SelectRandomByCount (layer, Count, outputdb):
     import random, os
     layerCount = int (arcpy.GetCount_management (layer).getOutput (0))
     if layerCount < count:
         print "input count is greater than layer count"
         return
     oids = [oid for oid, in arcpy.da.SearchCursor (layer, "OID@")]
     oidFldName = arcpy.Describe (layer).OIDFieldName
     delimOidFld = arcpy.AddFieldDelimiters (layer, oidFldName)
     randOids = random.sample (oids, count)
     oidsStr = ", ".join (map (str, randOids))
     sql = "{0} IN ({1})".format (delimOidFld, oidsStr)
     arcpy.SelectLayerByAttribute_management (layer, "", sql)
     arcpy.CopyFeatures_management(layer, os.path.join(outputdb, "random_start_20pop"))
     arcpy.SelectLayerByAttribute_management(layer, "SWITCH_SELECTION")
     arcpy.CopyFeatures_management(layer, os.path.join(outputdb, "endings_for_20pop"))

Then use the function:

SelectRandomByCount("fc", 10, r"C:\output.gdb")
BERA
  • 72,339
  • 13
  • 72
  • 161
1

To use this function inside a Python Toolbox in ArcMap:

  • In ArcCatalog, right click on a folder -> New -> Python Toolbox.
  • Right click on your newly created Python Toolbox -> Edit...
  • Put your funtion definition at the bottom of the file (watch the indentation so it is inside the class definition)
  • Define the toolbox parameters. (http://pro.arcgis.com/en/pro-app/arcpy/geoprocessing_and_python/defining-parameter-data-types-in-a-python-toolbox.htm. For example:

    def getParameterInfo(self):

    # Parameter: Input layer
    param0 = arcpy.Parameter(
        displayName="Input layer",
        name="input_folder",
        datatype="GPFeatureLayer",
        parameterType="Required",
        direction="Input")
    
    # Parameter: Output File Geodatabase
    param1 = arcpy.Parameter(
        displayName="Output File Geodatabase",
        name="output_location",
        datatype="DEWorkspace",
        parameterType="Required",
        direction="Input")
    
    param2 = arcpy.Parameter(
        displayName="blablabla",
        name="blablabla",
        datatype="GPLong",
        parameterType="Required",
        direction="Input")
    
    
    params = [param0, param1, param2]
    return params
    
  • Get the parameters and call the function. For example:

def execute(self, parameters, messages): inputlayer = parameters[0].valueAsText outputgdb = parameters[1].valueAsText number = parameters[2].valueAsText self.SelectRandomByCount(inputlayer, number, outputgdb)

Of course, you would have to modify it a bit to suite your needs. This code is mostly an example of how to proceed.

TurboGraphxBeige
  • 1,467
  • 10
  • 24