Point Pattern Analysis

For a theoretical discussion on point patter analysis,  see the lecture notes

Before tackling this tutorial, you will need to download and install a dataset following these instructions:

Open the project file

The map consists of two layers:  A Beilschmiedia tree point vector layer (bei.shp) that shows the location of 3605 trees (it is assumed to be a complete census of trees); An elevation raster layer (dem.tif) showing elevation values above mean sea level (recorded in meters). 

Uniform quadrat count 

We’ll first create a uniform grid polygon vector layer.


Selecting the dem.tif raster in the last step will automatically populate the fishnet extent fields.

You can define the grid intervals by grid cell size or grid dimensions. Here, we'll opt for the latter approach.

The new grid shapefile should now be present in your Contents pane.

Next, we will tally the number of trees within each grid cell. 


The geoprocess added a Join_Count column that provides the number of points in each  grid cell.

Because the cell sizes are the same, the modifiable areal unit problem is not an issue insofar that area is not influencing our perception of the point distribution. But changing cell sizes, even when kept uniform, can change the overall "look" of the density distribution.

Tessellated quadrat count

In the last step, you created quadrats from a uniform grid. Quadrats need not be uniform in shape and in size. In this step, you will create quadrats based on elevation intervals for the purpose of counting the number of trees at different elevation ranges.  We'll first reclassify the continuous raster into a coded integer raster where each code represents an elevation range. We'll then convert the integer raster to a polygon vector layer that will be used to tally the points,

In the geoprocessing pane, search for Reclassify.  Click on the second link (i.e. the Reclassify tool available in the Spatial Analyst toolbox).



Next, we’ll convert the integer raster to a vector polygon layer. Note that this new raster has an attribute table whereas the original raster did not. This is to be expected since the newly created raster has just four unique integer values (ArcGIS will not create a raster attribute table if there are too many unique pixel values). 

Note that you should not confuse the Count field in this new raster with the one we'll be creating from the point data.  This count field tallies the number of pixels belonging to each class.

Next, we'll convert this raster to a polygon layer.


By checking the multipart feature option, you ensure that each unique value appears just once in the attribute table. So if multiple polygons share the same attribute value, they will all point to the same record in the attribute table creating a one-to-many relationship between  record and features.

Next, we’ll tally the number of points in each tessellated surface using the spatial join workflow described earlier. 

The Join_Count attribute of the output layer stores the number of points falling in each elevation quadrats.

We could compare the counts between all four elevation intervals; however, the area of each interval may not be the same (recall the modifiable aerial unit problem). So we should normalize the count to area. This will require that we create a new attribute field: Density.  But first,  we will export this layer to a new layer called tess_join.shp to make the join permanent (this may be necessary when adding  new fields on certain versions of the software).

This will bring up the Fields tab.




Finally, we can make use of ArcGIS’ chart tool to plot count vs elevation range. 

You'll note that the color scheme adopted by the plot matches the color scheme used in the map. This facilitates comparison. Also, the figures are dynamically linked in that selecting an element in one figure will highlight the matching element(s) in the other.

The plot suggests a peak density at the third elevation interval. Referring back to the  reclassification table, this matches the elevation range of 139.6 m to 149.6 m. 

ArcGIS' point density tool

In this step we'll create a density map of tree counts using ArcGIS' Point Density tool.


Since the geoprocess will create a new raster from a vector layer,  we need to explicitly define the raster extent since the tool will default to the smallest rectangle encompassing the input point layer. 


Next, we'll modify the new raster layer's symbology.

We'll modify the first class to encompass just the 0 values.  This will allow us to assign no color to zero valued pixels.


Your output should look something like this. 

Each pixel is assigned the number of points within a 3x3 pixel search window and that value is then divided by the area of that search window. For example, if a cell has one point inside the search window, its output value will be: 

1 point / (9 cells * 0.0001 km2 area per cell) = 1111.1 points per square kilometer (within a 3x3 search window) 

ArcGIS' kernel density tool

ArcMap offers two density tools: a point density tool (covered in the last section) and a kernel density tool. This would seem to suggest that these two tools perform distinct operations when in fact the point density tool is simply a special case of a kernel density function whereby all input values in the focal operation are assigned equal weight. ArcMap’s Kernel density tool applies a quartic function that assigns a non-uniform weight to each point based on its proximity to the output cell's center. This tool tends to generate smoother looking density rasters. 

The Kernel density parameters differ slightly from those found in the Point Density tool. Most notably, it does not offer kernel options other than the default quartic kernel. It also limits the search window shape to a circle. 

Another difference between this tool and the Point Density tool is the added geodesic distance option which you might find useful when analyzing large surface extents.

Nearest neighbor tool

So far, we’ve explored density based approaches to quantifying point patterns. Density based analysis usually focuses on a point pattern’s first order property—i.e. its distribution vis-à-vis location. Another property of interest is a point pattern’s spatial interaction, a second order effect. A statistic that can be used to quantify a point pattern’s second order property is the average nearest neighbor (ANN) statistic. 

The output is not a data layer but a report saved as an HTML file. The filename is listed in the Geoprocess' Details window. 

ArcGIS should open the file in a web browser.

The infographic at the top of the report suggests that the trees are more clustered than expected had the trees been distributed at random across the study extent. The p-value of  <0.001 tells us that there is less than a 0.1 percent chance that we would be wrong in dismissing the null hypotheses (that being that the underlying process  that generated the observed pattern is completely random).

The bottom of the report gives us the observed mean distance between trees in our study area. The ANN value is 4.33 meters. In other words, on average, the trees are 4.33 meters apart from their first nearest neighbor.



A word of caution: This tool does not take the shape of the study area into consideration. Hence, you should interpret the hypothesis test results with caution if the study extent's shape differs from a square or rectangle. See the lecture notes for more detail.