Display clusters

Clustering groups points into clusters based on their spatial proximity to one another. Clusters can reveal information that is difficult to visualize when there are hundreds or thousands of points in a map that may overlap or cover each other. Adopt clustering if you want to discover patterns in your data, such as:

  • Identify where students live in a city so that the local government can plan appropriate educational and accommodation resources. Clustering allows you to visualize this data without revealing the individual student addresses.
  • Visualize the most common type of environmental complaints that are registered across a city so that authorities can plan how to deploy their environmental officers.
  • Ensure that police units are evenly spread throughout city so that a rapid response time can be maintained for emergency calls from the public.

In the map below, for example, various power plants of north-west Europe are clustered together so that you can easily see the count of power plants in each region. The size of each cluster is proportional to the number of points in each cluster and is recalculated when the map is zoomed.


Clustering can be defined on a point feature layer authored and published using the ArcGIS Online Map Viewer or ArcGIS Pro. If you add a feature layer from an ArcGIS feature service, web map, or mobile map package to your app, any predefined clustering displays automatically.

If the published point feature layer is not enabled with clustering, or if you want to cluster point graphics, you can use this SDK to define clustering by following the steps detailed in Enable clustering. You can enhance the visual representation of the clusters and display summary statistics of the clustered point attributes (not just the number of points) by using a variety of more complex renderers, labels, and popups, as described in Enhanced statistics and renderers.

Enable clustering

To cluster point-based features or graphics in your app, you need to create a ClusteringFeatureReduction object that takes a renderer. The renderer determines the cluster's color and shape, but the cluster's size is determined by the number of points in the cluster. So, a cluster with more points is bigger than a cluster with fewer points. You can cluster point features or graphics as follows:

  1. Create a SimpleRenderer using a SimpleMarkerSymbol.
  2. Create a ClusteringFeatureReduction using the simple renderer.
  3. Pass the ClusteringFeatureReduction to the FeatureLayer.featureReduction or the GraphicsOverlay.featureReduction.

The map below contains a single point symbol for the 8000+ power plants in the United States. On the right side, the points are aggregated into clusters using the default clustering values. Every time the mapview's viewpoint changes the clusters may be recalculated and their symbols redrawn.


Label clusters

The number of points in the cluster is stored in a field called "cluster_count" and is updated every time the cluster redraws. You can display this information in the clusters label, as follows:

  1. Create a LabelDefinition that uses a SimpleLabelExpression of "[cluster_count]" and a black TextSymbol.
  2. Set label definition placement.
  3. Add the label definition to the ClusteringFeatureReduction.

The map below shows clusters labeled with a SimpleLabelExpression.


Configure clusters

The process of clustering groups points into clusters based on an area of influence defined in screen space by the ClusteringFeatureReduction.radius. This radius has a default value which is 60 device-independent pixels (dpi), but you can set it to a higher value to aggregate points from a larger area or to a lower value to aggregate points from a smaller area. The size of each cluster symbol on the map is proportional to the number of features within the cluster and is recalculated every time the viewpoint changes.

The map below shows points clustered with a clustering radius of 120.


Enhanced statistics and renderers

You can enhance the information displayed to your users by presenting statistical information, such as the average, max, and mode value of the cluster's point attributes. First, you need to aggregate, or summarize, the cluster's point data, and then you can:

  • Apply advanced renderers, such as class break and unique value renderers.
  • Configure labels that use simple or Arcade expressions.
  • Design user friendly popup text.

Aggregate the point data

First, examine the attributes in your feature layer or graphics overlay and decide which attributes you want to summarize. Next, specify how the attribute values are summarized and store the results in an aggregate field, as follows:

  1. Create a new AggregateField for each statistical operation you want to perform on an attribute. Give it a name.
  2. Set the statisticFieldName as the attribute (from the feature layer or graphic overlay) you want to analyze.
  3. State the AggregateStatisticType, such as count, average, mode, and max, that will be applied to the statisticFieldName.
  4. Add a collection of your aggregate fields to your ClusteringFeatureReduction so they can be used by its renderer, label, and popup definitions.

Apply a class breaks renderer

You can apply a renderer to the cluster to display the value of the aggregate fields. Class breaks renderers are useful if you want to apply different colors to ranges of values. You can apply a class breaks renderer to the cluster as follows:

  1. For each range of values, create a ClassBreak and assign a SimpleMarkerSymbol with a unique color.
  2. Create a ClassBreaksRenderer for the aggregate field and provide the collection of class breaks.
  3. Pass the class breaks renderer to the constructor of the ClusteringFeatureReduction and pass that to FeatureLayer.featureReduction or GraphicsOverlay.featureReduction.

The map below shows the clusters rendered with a class breaks renderer and reflects the range of total_capacity_mw values. For example, the red color indicates that the sum of the capacity_mw of all the points in a cluster is greater than 50000 MW.


Configure label expressions

As shown previously, you can label each cluster with the number of points in the cluster. However, now that you have created some aggregate fields, you can use these to label the clusters by configuring a SimpleLabelExpression or an ArcadeLabelExpression.

In the map below, the most_common_fuel aggregate field value of each cluster is displayed in a label by using a SimpleLabelExpression. For more information about how to format simple expression strings, see Simple expressions.


In the map below, the total_capacity_mw aggregate field value of each cluster is reformated, concatenated with the "MW", and displayed in a label by using an ArcadeLabelExpression. For more information about how to format Arcade expression strings, see Arcade expressions.


Configure popup expressions

You can configure your app to display a popup when the user clicks on a cluster. By default, the cluster's popup displays its "point_count" value; the number of points in the cluster. If the ClusteringFeatureReduction has aggregate fields, the cluster popup will display the aggregate field values. However, if you want to present a more user-friendly text, you can create an Arcade expression, as follows:

  1. Create a PopupDefinition using the ClusteringFeatureReduction.
  2. Assign the popup definition to the clustering feature reduction.
  3. Specify a title and remove all elements from the popup definition.
  4. Create a PopupExpression, provide an Arcade expression, and specify that the return type is string. In this example, the Arcade expression reformats and concatenates a few aggregate fields representing the average and total capacities, along with some helpful text.
  5. Create an ExpressionPopupElement using the popup expression.
  6. Add the expression popup element to the popup definition's collection of elements.

The map below shows a popup configured with a PopupExpression.



Your browser is no longer supported. Please upgrade your browser for the best experience. See our browser deprecation post for more details.