0

I have something like this but with large sets it's awfully slow:

    let unionize = (triangles) => {
        if(triangles.length == 0) {
            return null
        }

        let ret = triangles[0].feature

        triangles.forEach((t, index) => {
            if(index > 0) {
                ret = turf.union(t, t)
            }
        })

        return ret
    }
mpr
  • 2,966
  • 22
  • 38

1 Answers1

0

featureEach tends to be faster than a trivial array forEach although with more features the gain decreases.

<script src="https://cdn.jsdelivr.net/npm/@turf/turf@5.1.6/turf.min.js"></script>
<script>
    const generateGrid = (cellSide = 100, units = "kilometers") => {
        const bbox = [-95, 30, -85, 40];

        return turf.triangleGrid(bbox, cellSide, {
            units
        });
    }

    const unionizeForEach = (triangles) => {
        console.time('unionizeForEach');
        if (triangles.length == 0) {
            return null
        }

        let ret = triangles[0];

        triangles.forEach((t, index) => {
            if (index > 0) {
                ret = turf.union(ret, t)
            }
        });

        console.timeEnd('unionizeForEach');
        return ret
    }

    const unionizeFeatureEach = (triangles) => {
        console.time('unionizeFeatureEach');
        if (triangles.features.length === 0) {
            return null
        }

        let ret = triangles.features[0];

        turf.featureEach(triangles, function (currentFeature, featureIndex) {
            if (featureIndex > 0) {
                ret = turf.union(ret, currentFeature)
            }
        });

        console.timeEnd('unionizeFeatureEach');
        return ret;
    }

    [100, 50, 10].map(cellSide => {
        const triangleGrid = generateGrid(cellSide, 'kilometers');
        console.info(`triangleGrid has ${triangleGrid.features.length} features`);

        const union_foreach = unionizeForEach(triangleGrid.features);
        const union_featureeach = unionizeFeatureEach(triangleGrid);

        console.assert(JSON.stringify(union_foreach) === JSON.stringify(union_featureeach));
        console.log('\n---\n');
    })
</script>
  • Accepted unless someone comes up with something faster! – mpr Mar 28 '20 at 23:43
  • featureEach is nothing else but a for loop, why would it be faster? https://github.com/Turfjs/turf/blob/41a123a0e151be6a7e312dfecb91b69c4ff3f3f2/packages/turf-meta/index.js#L390-L398 – hyperknot Feb 21 '21 at 01:22
  • It is indeed a for-loop and those [*tend* to be more optimized](https://stackoverflow.com/a/43032526/8160318) than for-each loops. – Joe - Elasticsearch Handbook Feb 21 '21 at 09:16