1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- "use strict";
- var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
- };
- Object.defineProperty(exports, "__esModule", { value: true });
- var clone_1 = __importDefault(require("@turf/clone"));
- var meta_1 = require("@turf/meta");
- var skmeans_1 = __importDefault(require("skmeans"));
- /**
- * Takes a set of {@link Point|points} and partition them into clusters using the k-mean .
- * It uses the [k-means algorithm](https://en.wikipedia.org/wiki/K-means_clustering)
- *
- * @name clustersKmeans
- * @param {FeatureCollection<Point>} points to be clustered
- * @param {Object} [options={}] Optional parameters
- * @param {number} [options.numberOfClusters=Math.sqrt(numberOfPoints/2)] numberOfClusters that will be generated
- * @param {boolean} [options.mutate=false] allows GeoJSON input to be mutated (significant performance increase if true)
- * @returns {FeatureCollection<Point>} Clustered Points with an additional two properties associated to each Feature:
- * - {number} cluster - the associated clusterId
- * - {[number, number]} centroid - Centroid of the cluster [Longitude, Latitude]
- * @example
- * // create random points with random z-values in their properties
- * var points = turf.randomPoint(100, {bbox: [0, 30, 20, 50]});
- * var options = {numberOfClusters: 7};
- * var clustered = turf.clustersKmeans(points, options);
- *
- * //addToMap
- * var addToMap = [clustered];
- */
- function clustersKmeans(points, options) {
- if (options === void 0) { options = {}; }
- // Default Params
- var count = points.features.length;
- options.numberOfClusters =
- options.numberOfClusters || Math.round(Math.sqrt(count / 2));
- // numberOfClusters can't be greater than the number of points
- // fallbacks to count
- if (options.numberOfClusters > count)
- options.numberOfClusters = count;
- // Clone points to prevent any mutations (enabled by default)
- if (options.mutate !== true)
- points = clone_1.default(points);
- // collect points coordinates
- var data = meta_1.coordAll(points);
- // create seed to avoid skmeans to drift
- var initialCentroids = data.slice(0, options.numberOfClusters);
- // create skmeans clusters
- var skmeansResult = skmeans_1.default(data, options.numberOfClusters, initialCentroids);
- // store centroids {clusterId: [number, number]}
- var centroids = {};
- skmeansResult.centroids.forEach(function (coord, idx) {
- centroids[idx] = coord;
- });
- // add associated cluster number
- meta_1.featureEach(points, function (point, index) {
- var clusterId = skmeansResult.idxs[index];
- point.properties.cluster = clusterId;
- point.properties.centroid = centroids[clusterId];
- });
- return points;
- }
- exports.default = clustersKmeans;
|