#----- Import arcpy module ----- import arcpy import os bTesting = False #***** TESTING ***** if bTesting == True: intTest = 1 #----- Folders ----- strWorkspace = r"C:\Users\Data\FarmstoRegionsFinal.gdb" strWorking_Folder = os.path.join(strWorkspace, "Outputs") arcpy.env.workspace = strWorking_Folder arcpy.env.overwriteOutput = True #----- Input shapefiles ----- strIDUs = os.path.join(strWorkspace, "IDU_Update") strSLCs = os.path.join(strWorkspace, "SLCs") strRandomPoints = os.path.join(strWorkspace, "RandomPoints_Template") strFT_LUT = os.path.join(strWorkspace,"Farm_Types") strCADs = os.path.join(strWorkspace, "CADs") #----- Layers ----- strIDU_Layer = "Input_IDUs" strSLC_Layer = "Input_SLCs" strRandomPoints_Layer = "RandomPoints_HQ" strCAD_Layer = "Input_CADs" #---- List ----- lstCLI = [3, 2, 1] #----- Fields ----- strSLC_ID_Field = "Cty_SLC_ID" #=============================== #===== Create input layers ===== #=============================== print("Creating input layers...\n") lyrCADs = arcpy.MakeFeatureLayer_management(strCADs, strCAD_Layer) lyrRandomPoints = arcpy.CopyFeatures_management(strRandomPoints, os.path.join(strWorkspace, strRandomPoints_Layer)) lyrIDUs = arcpy.MakeFeatureLayer_management(strIDUs, strIDU_Layer, "\"LC_CLASS\" = 'Corn' or \"LC_CLASS\" = 'Soybeans'") lyrSLCs = arcpy.MakeFeatureLayer_management(strSLCs, strSLC_Layer) arcpy.SelectLayerByLocation_management(lyrSLCs, "INTERSECT", lyrIDUs, "", "NEW_SELECTION") #========================================= #===== Get / extract SLCs from layer ===== #========================================= cursor_SLC = arcpy.SearchCursor(lyrSLCs) #----- Loop through SLC features ----- for rowSLC in cursor_SLC: strSLC_ID = str(rowSLC.getValue(strSLC_ID_Field)) print("\tSLC: " + strSLC_ID + "...") #----- Create a layer for each SLC ----- strCurrent_SLC = "SLC_" + strSLC_ID lyrCurrent_SLC = arcpy.MakeFeatureLayer_management(lyrSLCs, strCurrent_SLC, "\"" + strSLC_ID_Field + "\" = \'" + strSLC_ID + "\'") #=============================== #===== Get total HQ points ===== #=============================== #----- Get / extract FarmTypes from LUT ----- cursor_FT = arcpy.SearchCursor(strFT_LUT) intTotal_HQs = 0 lstFarmTypes = [] #----- Loop through FT Rows ----- for rowFT in cursor_FT: #----- Get "field name" from row ----- strFT_Field = rowFT.getValue("Census_FT") #----- Get total "random points" per field ----- intTotal_HQs = intTotal_HQs + int(rowSLC.getValue(strFT_Field)) lstFarmTypes.append([strFT_Field, int(rowSLC.getValue(strFT_Field))]) del rowFT del cursor_FT print("\t\tTotal Required HQs: " + str(intTotal_HQs) + "...") #================================================ #===== Extract IDU CLI value for each point ===== #================================================ print("\t\tExtracting IDU \'Field Crop\' CLI values...") #----- Selects IDUs with iterating SLC ----- strCurrent_IDUs = "IDU_Corn_" + strSLC_ID lyrCurrent_IDUs = arcpy.MakeFeatureLayer_management(lyrIDUs, strCurrent_IDUs, "\"LC_CLASS\" = 'Corn'") arcpy.SelectLayerByLocation_management(lyrCurrent_IDUs, "HAVE_THEIR_CENTER_IN", lyrCurrent_SLC, "", "NEW_SELECTION") intCLI_Count = 1 lstCLI_Values = [] bCLI_Values = False intAll_IDUs = 0 #----- Loop through CLIs ----- for intCLI in lstCLI: #print(intCLI) #----- Creates IDU layer with identical CLI values ----- strCLI = "IDU_Corn_" + strSLC_ID + "_" + str(intCLI) lyrIDU_CLI = arcpy.MakeFeatureLayer_management(lyrCurrent_IDUs, strCLI, "\"CLI\" = " + str(intCLI)) #----- Get IDU / CLI feature count ---- varIDU_CLI_Count = arcpy.GetCount_management(lyrIDU_CLI) intIDU_CLI_Count = int(varIDU_CLI_Count.getOutput(0)) intAll_IDUs = intAll_IDUs + intIDU_CLI_Count #print("\t" + str(intIDU_CLI_Count)) #----- Extract CLI by priority ----- if intIDU_CLI_Count > 0: for intGetCLI in range(1, intIDU_CLI_Count + 1): if intCLI_Count <= intTotal_HQs: #----- Assign value ----- lstCLI_Values.append(["Corn", str(intCLI)]) intCLI_Count = intCLI_Count + 1 else: #----- Completed, force exit ----- bCLI_Values = True break #----- Force exit ----- if bCLI_Values == True: break print("\t\t\t" + str(intCLI_Count - 1) + " of " + str(intTotal_HQs)) if (intCLI_Count - 1) == intTotal_HQs: print("\t\t\tAll IDUs acquired...") #----- Delete "IDU" layers ----- if arcpy.Exists(lyrCurrent_IDUs): arcpy.Delete_management(lyrCurrent_IDUs) if arcpy.Exists(lyrIDU_CLI): arcpy.Delete_management(lyrIDU_CLI) #----- Get remaining points from 'Soybeans' IDUs ----- if (intCLI_Count < intTotal_HQs) or intAll_IDUs == 0: print("\t\tExtracting IDU \'Soybeans\' CLI values...") #----- Selects IDUs with iterating SLC ----- strCurrent_IDUs = "IDU_Soybeans_" + strSLC_ID lyrCurrent_IDUs = arcpy.MakeFeatureLayer_management(lyrIDUs, strCurrent_IDUs, "\"LC_CLASS\" = 'Soybeans'") arcpy.SelectLayerByLocation_management(lyrCurrent_IDUs, "HAVE_THEIR_CENTER_IN", lyrCurrent_SLC, "", "NEW_SELECTION") #----- Loop through CLIs ----- intCLI_Count_2 = 1 for intCLI in lstCLI: #print(intCLI) #----- Creates IDU layer with identical CLI values ----- strCLI = "IDU_Soybeans_" + strSLC_ID + "_" + str(intCLI) lyrIDU_CLI = arcpy.MakeFeatureLayer_management(lyrCurrent_IDUs, strCLI, "\"CLI\" = " + str(intCLI)) #----- Get IDU / CLI feature count ---- varIDU_CLI_Count = arcpy.GetCount_management(lyrIDU_CLI) intIDU_CLI_Count = int(varIDU_CLI_Count.getOutput(0)) intAll_IDUs = intAll_IDUs + intIDU_CLI_Count #print("\t" + str(intIDU_CLI_Count)) #----- Extract CLI by priority ----- if intIDU_CLI_Count > 0: for intGetCLI in range(1, intIDU_CLI_Count + 1): if intCLI_Count <= intTotal_HQs: #----- Assign value ----- lstCLI_Values.append(["Soybeans", str(intCLI)]) intCLI_Count = intCLI_Count + 1 intCLI_Count_2 = intCLI_Count_2 + 1 else: #----- Completed, force exit ----- bCLI_Values = True break #----- Force exit ----- if bCLI_Values == True: break #----- Delete "IDU" layers ----- if arcpy.Exists(lyrCurrent_IDUs): arcpy.Delete_management(lyrCurrent_IDUs) if arcpy.Exists(lyrIDU_CLI): arcpy.Delete_management(lyrIDU_CLI) print("\t\t\t" + str(intCLI_Count_2 - 1) + " of " + str(intTotal_HQs)) if (intCLI_Count - 1) == intTotal_HQs: print("\t\t\tAll IDUs acquired...") elif (intCLI_Count - 1) < intTotal_HQs and (intCLI_Count - 1) != 0: print("\t\t\tMost IDUs acquired...") elif (intCLI_Count - 1) == 0: print("\t\t\tNo IDUs available...") #============================================= #===== Building random points collection ===== #============================================= print("\t\tCreating HQ point parameters...") #----- Loop through extract Farm Types ----- lstPoints_Info = [] for intHQ_Index in range(0, len(lstFarmTypes)): #----- Get # of points per farm types ----- intFT_Points = lstFarmTypes[intHQ_Index][1] #---- Iterate through # of points ----- for intGetPoints in range(1, intFT_Points + 1): #------ Build individual instances ----- lstPoints_Info.append([lstFarmTypes[intHQ_Index][0], intGetPoints]) #----- Adding CLI to 'point collection' ----- lstPoint_Parameters = [] for intAdd_CLI in range(0, len(lstCLI_Values)): #----- Merge point parameters into list ----- lstPoint_Parameters.append([lstPoints_Info[intAdd_CLI][0], lstPoints_Info[intAdd_CLI][1], lstCLI_Values[intAdd_CLI][0], lstCLI_Values[intAdd_CLI][1]]) #================================== #===== Build random HQ points ===== #================================== print("\t\tBuilding random HQ points...") #----- Loop through points to build ----- for intNewPoint in range(0, len(lstPoint_Parameters)): intNewPoint_Count = intNewPoint + 1 print("\t\t\t" + str(intNewPoint_Count) + " of " + str(len(lstPoint_Parameters)) + "...") #----- Extract parameters ------ strPoint_Field = lstPoint_Parameters[intNewPoint][0] strPoint_Number = lstPoint_Parameters[intNewPoint][1] strPoint_IDU = lstPoint_Parameters[intNewPoint][2] strPoint_CLI = lstPoint_Parameters[intNewPoint][3] #----- Selects IDUs with iterating SLC ----- strInput_IDUs = "IDU_" + strSLC_ID lyrInput_IDUs = arcpy.MakeFeatureLayer_management(lyrIDUs, strInput_IDUs, "\"LC_CLASS\" = \'" + strPoint_IDU + "\'") arcpy.SelectLayerByLocation_management(lyrInput_IDUs, "HAVE_THEIR_CENTER_IN", lyrCurrent_SLC, "", "NEW_SELECTION") #----- Creates IDU layer with identical CLI values ----- strInput_CLI = "IDU_" + strSLC_ID + "_" + strPoint_CLI lyrInput_IDU_CLI = arcpy.MakeFeatureLayer_management(lyrInput_IDUs, strInput_CLI, "\"CLI\" = " + strPoint_CLI) #----- Get all points to date ----- strTMP_Points = "TMP_Points_" + strSLC_ID + "_" + strPoint_Field + "_" + str(strPoint_Number) lyrTMP_Points = arcpy.MakeFeatureLayer_management(lyrRandomPoints, strTMP_Points, "\"SLC_ID\" = \'" + strSLC_ID + "\'") #----- Get CADs that contain random points ----- arcpy.SelectLayerByLocation_management(lyrCADs, "CONTAINS", lyrTMP_Points, "", "NEW_SELECTION") strCAD_w_Points = "TMP_CADs_" + strSLC_ID + "_" + strPoint_Field + "_" + str(strPoint_Number) lyrCAD_w_Points = arcpy.MakeFeatureLayer_management(lyrCADs, strCAD_w_Points) #----- Gets IDUs that do NOT intersect with CADs containing points ------ strTMP_IDUs = "TMP_IDUs_" + strSLC_ID + "_" + strPoint_Field + "_" + str(strPoint_Number) lyrTMP_IDUs = arcpy.MakeFeatureLayer_management(lyrInput_IDU_CLI, strTMP_IDUs) arcpy.SelectLayerByLocation_management(lyrTMP_IDUs, "INTERSECT", lyrCAD_w_Points, "", "NEW_SELECTION") arcpy.SelectLayerByLocation_management(lyrTMP_IDUs, "", "", "", "SWITCH_SELECTION") #----- Dissolve SLC IDU Selection into single polygon ----- strDissolved_IDUs = "Dissolved_" + strSLC_ID + "_" + str(strPoint_CLI) + "_" + strPoint_Field + "_" + str(strPoint_Number) lyrDissolved_IDUs = arcpy.Dissolve_management(lyrTMP_IDUs, strDissolved_IDUs, "", "", "MULTI_PART", "DISSOLVE_LINES") #----- Create random points within merged IDUs per SLC ----- strCurrent_Point = "Point_" + strSLC_ID + "_" + str(strPoint_CLI) + "_" + strPoint_Field + "_" + str(strPoint_Number) lyrCurrent_Point = arcpy.CreateRandomPoints_management(strWorking_Folder, strCurrent_Point, lyrDissolved_IDUs, "", 1) #----- Add fields to "Current Point" layer ----- arcpy.AddField_management(lyrCurrent_Point, "SLC_ID", "TEXT", 255, "", "", "", "NULLABLE", "REQUIRED") arcpy.AddField_management(lyrCurrent_Point, "CLI_ID", "TEXT", 255, "", "", "", "NULLABLE", "REQUIRED") arcpy.AddField_management(lyrCurrent_Point, "FIELD_ID", "TEXT", 255, "", "", "", "NULLABLE", "REQUIRED") arcpy.AddField_management(lyrCurrent_Point, "Iteration", "TEXT", 255, "", "", "", "NULLABLE", "REQUIRED") #----- Loads values into row ------ cursor_Current_Point = arcpy.UpdateCursor(lyrCurrent_Point) for rowPoint in cursor_Current_Point: rowPoint.SLC_ID = strSLC_ID rowPoint.CLI_ID = str(strPoint_CLI) rowPoint.FIELD_ID = strPoint_Field rowPoint.Iteration = str(strPoint_Number) cursor_Current_Point.updateRow(rowPoint) break #-----Apppend new point to "random points" ----- arcpy.Append_management(lyrCurrent_Point, lyrRandomPoints, "NO_TEST", "", "") #----- Delete "current point" and "CAD" layers ----- if arcpy.Exists(lyrTMP_Points): arcpy.Delete_management(lyrTMP_Points) if arcpy.Exists(lyrCAD_w_Points): arcpy.Delete_management(lyrCAD_w_Points) if arcpy.Exists(lyrTMP_IDUs): arcpy.Delete_management(lyrTMP_IDUs) if arcpy.Exists(lyrInput_IDUs): arcpy.Delete_management(lyrInput_IDUs) if arcpy.Exists(lyrInput_IDU_CLI): arcpy.Delete_management(lyrInput_IDU_CLI) if arcpy.Exists(lyrDissolved_IDUs): arcpy.Delete_management(lyrDissolved_IDUs) if arcpy.Exists(lyrCurrent_Point): arcpy.Delete_management(lyrCurrent_Point) #***** TESTING ***** if bTesting == True: intTest = intTest + 1 if intTest == 7: break #----- Delete "Iteration" layers ----- if arcpy.Exists(lyrCurrent_SLC): arcpy.Delete_management(lyrCurrent_SLC) #----- Delete "Input" layers ----- print("\nDeleting input layers...") if arcpy.Exists(lyrCADs): arcpy.Delete_management(lyrCADs) if arcpy.Exists(lyrIDUs): arcpy.Delete_management(lyrIDUs) if arcpy.Exists(lyrSLCs): arcpy.Delete_management(lyrSLCs) print("\nCompleted...")