Count Points in Polygon and symbolize on number of occurrences

3086
14
Jump to solution
05-20-2021 04:07 AM
jaykapalczynski
Frequent Contributor

I have an app that searches for a particular species from a point file

Once found it creates graphics for the point locations and grid polygons that encompass those points.

What I want to do now is symbolize those polygons based on how many points are found within them.  I am not sure how to approach this.  I think I would have to read through each polygon and determine how many points are in there and set the symbology?

So the result would be a graphics layer of polygons of varying color based on how many points are within them  

Anyone have any ideas?

 

jaykapalczynski_0-1621508788062.png

 

0 Kudos
14 Replies
jaykapalczynski
Frequent Contributor

OK I think I have it working now...Now onto the next piece

 

# COUNT NUMBER OF RECORDS FOR EACH SPECIES
def unique_values(table, field):
expressionValue = table
species = field
expressionValue2 = "common_name = '{}'".format(species)
with arcpy.da.SearchCursor(bba_Points, "common_name", where_clause=expressionValue2) as cursor:
for row in cursor:
print row[0]

 

0 Kudos
jaykapalczynski
Frequent Contributor

OK I am trying to get a tally of each species and their counts...

But I just get a big list of each one as it passes through the loop....not totals....where am I going wrong

 

jaykapalczynski_0-1621620635827.png

 

 

 

# COUNT NUMBER OF RECORDS FOR EACH SPECIES
def unique_values(table, field):
    resultspecies = ""
    expressionValue = table
    species = field
    expressionValue2 = "common_name = '{}'".format(species)
    with arcpy.da.SearchCursor(Points, "common_name", where_clause=expressionValue2) as cursor:
      for row in cursor:
        resultspecies = row[0]
        rowCount = 0
        rowCount = rowCount + 1
    print "There are " + str(rowCount) + " of " + resultspecies

    
# GET UNIQUE SPECIES FROM TABLE
for feature in arcpy.ListFeatureClasses():
    #print feature
    with arcpy.da.SearchCursor(Points,"common_name", sql_clause=(None,'ORDER BY common_name DESC')) as SCur:
      for row in SCur:
        if not row[0] in bList: # if not in list then add to list
          bList.append(row[0])
          species = row[0]
          expressionValue = "common_name = '{}'".format(species)
        uniques = unique_values(expressionValue, species)

 

0 Kudos
jaykapalczynski
Frequent Contributor

Now that I have the Unique Species I need to pass them 1 by one to a function that will either QUERY the point Feature Class and do something to JUST those records or Create a DEFINITION query and do something with just those point records.

In the DEF I have a unique Species name sent to it.  Whats the best way to query the points Feature Class and just work with those records?

Query or Definition Query....any examples?

0 Kudos
jaykapalczynski
Frequent Contributor

If I could figure out how to create a definition query based on a field value WHERE clause and then run code against just those records I would be ecstatic....

0 Kudos
jaykapalczynski
Frequent Contributor

First off THANK YOU ALL FOR YOUR THOUGHTS AND COMMENTS

They really helped steer me in the path and direction I took...

OK this is what I did and its working....

  1. Create a List of Unique types in the point Feature Class
  2. Call Function that reads this List by looping though that created unique list
  3. Each loop takes those unique value and calls another function that gets the correct field name and for that TYPE
  4. It then passes the (expression, type name and field name) to the last function which processes the data
  5. In the last function I am selecting the point records that match that TYPE value, I then create a new Point  Layer that has only those records.  I use that New Layer to Spatial Join, Statistics Analysis, Join Field Management, Calculate Field Management to Update the Polygon Layer with the number of occurrences for that TYPE in the Correct Field name that was set in the If Then Else

I used the If Then to change the TYPE value in the Data to a value that would work as a field name...so I can update the Polygon Layer as some of the TYPE values were really long

 

 

import arcpy

arcpy.env.workspace = r"E:/xxxxx/xxxx/Projects/xxx/xxx.sde"
Points = r"E:/xxxxx/xxxx/Projects/xxx/xxx.sde/Locations"
Grids = r"E:/xxxxx/xxxx/Projects/xxx/xxx.sde/Grids"

print "Started"

bList = []
expression = ""
expressionValue = ""
type= ""
rowCount = 0
uniquetypeList = []
countList = []   
txt_list = ""


# COUNT NUMBER OF RECORDS FOR EACH TYPE
def getFieldName(type):
    if type == "Needs Repair":
        return "NeedsRepair"
    elif type == "Broken":
        return "Broken"
    elif type == "Needs Replacement":
        return "NeedsReplacement"
    elif type == "Schedule Fix":
        return "ScheduleFix"
    else:
        return "nothing"

def processTypeUpdate(expressionValue, typeValues, fieldName):

    expressionValue2 = expressionValue
    typeName = typeValues
    fieldUpdateName = fieldName

    rowCount = 0
        
    arcpy.Delete_management('in_memory/PointsInPolys')   
    arcpy.Delete_management('in_memory/SS_PointsInPolys')
    arcpy.Delete_management('points_lyr')
    arcpy.Delete_management('points_lyr2')

    arcpy.MakeFeatureLayer_management(r'E:/xxxxx/xxxx/Projects/xxx/xxx.sde/Locations_Test', 'points_lyr')
    results = arcpy.SelectLayerByAttribute_management ('points_lyr', 'NEW_SELECTION', expressionValue2)
    arcpy.MakeFeatureLayer_management(results, 'points_lyr2')

    polygonID = "ID" ## unique polygon field name
    countField = fieldUpdateName  # The field name in the Grids FC to update 
    expression = "recalc(!FREQUENCY!)"
    codeblock = """def recalc(freq):
        if freq > -1:
            return freq
        else:
            return 0"""

    arcpy.SpatialJoin_analysis('points_lyr2', Grids, "in_memory/PointsInPolys")
        ### case field returns count per unique UID
    arcpy.Statistics_analysis ("in_memory/PointsInPolys", "in_memory/SS_PointsInPolys", [[polygonID, "Count"]], polygonID)
    arcpy.JoinField_management(Grids, polygonID, "in_memory/SS_PointsInPolys", polygonID, "FREQUENCY")
    arcpy.CalculateField_management(Grids, countField, expression, "PYTHON", codeblock)
    arcpy.DeleteField_management(Grids, "FREQUENCY")
    
    # GET THE CODES FROM THE RESULTS OF THE SELECTION
    rows = arcpy.SearchCursor('points_lyr2',"","","type_name")
    for row in rows:
        rowCount = rowCount + 1
        typeVal = str(row.type_name)  
        countList.append(typeVal)  
        txt_list = ','.join(countList)
    print "number of " + typeVal + " : " + str(rowCount)

    arcpy.Delete_management('in_memory/PointsInPolys')   
    arcpy.Delete_management('in_memory/SS_PointsInPolys')
    arcpy.Delete_management('points_lyr')
    arcpy.Delete_management('points_lyr2')  


    
# TAKE TYPE NAME AND GET THE CORRECT FIELD NAME
def processtypeNames(expressionValue, typeValues):
    type= str(typeValues)
    expressionValue2 = "type_name = '{}'".format(type)
    # GET THE CORRECT FIELD NAME
    fieldName = getFieldName(type)
    
    if fieldName == "nothing":
        print "No Value"
    else:
        # Call the function to actually update the Field Values
        uniques2 = processtypeUpdate(expressionValue2, type, fieldName)
        print "corrected field name is: " + fieldName
        

def uniquetypeList(uniquetypeValues):
    typeList = uniquetypeValues
    #print typeList
    for type in typeList:
        #print type
        expressionValue = "type_name = '{}'".format(type)
        uniques = processtypeNames(expressionValue, type)

    
# GET UNIQUE TYPS FROM FC CREATE LIST
for feature in arcpy.ListFeatureClasses():
    #print feature
    with arcpy.da.SearchCursor(Points,"type_name", sql_clause=(None,'ORDER BY type_name ASC')) as SCur:
      for row in SCur:
        if not row[0] in bList: # if not in list then add to list
          bList.append(row[0])
          type = row[0]
    del SCur
uniquetype = uniquetypeList(bList)

 

 

 

0 Kudos