This sample highlights the separation between featureReduction (e.g. clustering) and the renderer of a FeatureLayer. While clustering is used for visualization purposes, it is not a property of the renderer; it is a property of the layer. Therefore, when featureReduction is enabled, the renderer is still applied to the layer. If a renderer is driven by a numeric attribute, then each aggregate graphic is visualized using the average value of the features comprising that cluster. If a UniqueValueRenderer is applied to the layer, then each cluster's color represents the predominant value represented by features comprising the cluster.
Support for feature reduction is limited to the following scenarios:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="viewport" content="initial-scale=1,maximum-scale=1,user-scalable=no"/>
<title>Toggle FeatureLayer clustering</title>
<link rel="stylesheet" href="https://js.arcgis.com/3.46/esri/css/esri.css">
<script src="https://js.arcgis.com/3.46/"></script>
<style>
html, body, #viewDiv {
height: 100%;
width: 100%;
margin: 0;
padding: 0;
}
#infoDiv{
top: 0px;
right: 0px;
position: absolute;
z-index: 2;
opacity: 0.9;
background-color: whitesmoke;
padding: 8px;
font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;
font-size: 12px;
}
</style>
<script>
require([
"esri/map",
"esri/layers/FeatureLayer",
"esri/dijit/PopupTemplate",
"esri/dijit/Legend",
"dojo/domReady!"
], function(Map, FeatureLayer, PopupTemplate, Legend
) {
var map = new Map("viewDiv", {
basemap: "gray-vector",
center: [ -117.9145, 33.9773 ],
zoom: 9
});
// Enable clustering on the layer and add it to the map
var serviceUrl = "https://services.arcgis.com/V6ZHFr6zdgNZuVG0/arcgis/rest/services/socal_precincts_points_2008/FeatureServer/0";
var layer = new FeatureLayer(serviceUrl, {
outFields: [ "P2008_D", "P2008_R", "D_Percent", "R_Percent", "Majority" ],
infoTemplate: new PopupTemplate({
title: "Winner: {Majority}",
description: "{P2008_D} votes for Obama ({D_Percent}%)"
+ "<br>{P2008_R} votes for McCain ({R_Percent}%)"
})
});
map.addLayer(layer);
map.on("load", function(evt){
toggleFeatureReduction(true);
var legend = new Legend({
map: map,
layerInfos: [{
layer: layer,
title: "Voting precincts (2008)"
}]
}, "legendDiv");
legend.startup();
var clusteringCheckbox = document.getElementById("use-clustering");
// toggles clustering on and off in sync with the checkbox
clusteringCheckbox.addEventListener("click", function(event){
var checked = event.target.checked;
toggleFeatureReduction(checked);
});
});
// Sets feature reduction on the layer if not previously done so.
// If indicated, then feature reduction is disabled. The initial
// feature reduction settings are enabled if indicated.
function toggleFeatureReduction(yes){
if(yes){
if(!layer.getFeatureReduction()){
layer.setFeatureReduction({
type: "cluster"
});
} else {
layer.enableFeatureReduction();
}
} else {
layer.disableFeatureReduction();
}
}
});
</script>
</head>
<body>
<div id="viewDiv"></div>
<div id="infoDiv">
<input type="checkbox" id="use-clustering" checked> Use clustering?<br><br>
<div id="legendDiv"></div>
</div>
</body>
</html>