Turf.jsMeta

turf.clusterEach

What is turf.clusterEach?

turf.clusterEach groups a FeatureCollection by a property and iterates over the resulting clusters, calling a callback once per unique cluster value with a sub-FeatureCollection of its members.

JavaScript
turf.clusterEach(geojson, property, callback) → void

The callback receives (cluster, clusterValue, currentIndex).

When would you use turf.clusterEach?

Use turf.clusterEach after turf.clustersKmeans or turf.clustersDbscan (or any workflow that labels Features with a cluster id) when you need per-cluster statistics — centroids, convex hulls, summary counts — without running a separate getCluster call for each label.

It is also useful for grouping-then-aggregating tasks on any property, not just cluster ids — the argument property can be any attribute you want to group by.

JavaScript
1const labelled = turf.clustersKmeans(points, { numberOfClusters: 4 });
2turf.clusterEach(labelled, 'cluster', (cluster, clusterId) => {
3  const centroid = turf.centroid(cluster);
4  centroid.properties.clusterId = clusterId;
5  centroids.push(centroid);
6});

FAQs

How do I install Turf.js to use this function?

Install npm install @turf/clusters and import import { clusterEach } from '@turf/clusters', or use turf.clusterEach from @turf/turf.

Can I group by any property, not just `cluster`?

Yes. The second argument is the property name to group on — for example clusterEach(fc, 'zoneId', callback) groups by zone.

What if a Feature has no value for the property?

Features missing the property are excluded from iteration. If you want them captured, assign a sentinel value beforehand with turf.propEach.

Should I use clusterEach or getCluster?

Use clusterEach when you want every group in one pass. Use getCluster when you need only one specific group.