Skip to content

A fast and efficient library for merging multiple polygons in a GeoJSON FeatureCollection

License

Notifications You must be signed in to change notification settings

juanpujol/polyunion

Repository files navigation

PolyUnion

A fast and efficient Javascript utility function designed to mergE multiple polygons into a GeoJSON FeatureCollection. It utilizes spatial indexing provided by rbush and the geospatial processing of Turfjs to achieve high performance.

How fast?

When attempting to merge approximately 1000 circle-shaped polygons using only @turf/union, it took approximately 25 seconds. In contrast, PolyUnion completed the same task in about 350 milliseconds.

example-01

Installation

You can install PolyUnion via npm:

npm install polyunion

Usage

import { polyunion } from 'polyunion';

// Example GeoJSON FeatureCollection input
const features = {
  "type": "FeatureCollection",
  "features": [
    {
      "type": "Feature",
      "properties": {},
      "geometry": {
        "type": "Polygon",
        "coordinates": [[[0, 0], [0, 1], [1, 1], [1, 0], [0, 0]]]
      }
    },
    {
      "type": "Feature",
      "properties": {},
      "geometry": {
        "type": "Polygon",
        "coordinates": [[[1, 1], [1, 2], [2, 2], [2, 1], [1, 1]]]
      }
    }
  ]
};

// Merge polygons
const mergedFeatureCollection = polyunion(features, 2);

console.log(mergedFeatureCollection);

The function has 2 parameters:

  • fc (required): A GeoJSON FeatureCollection containing polygons to merge (make sure the polygons are valid).
  • totalPasses (optional, defaults to 3): The total number of passes for recursive calls. Increasing the number of iterations can improve the results, but it will also prolong the execution time. It depends on the number of polygons being merged. For the case in the picture above, 4 passes worked great (350ms).

Credits

I'm not smart enough to have created this from scratch. This took some back and forth with ChatGPT and I'm not ashamed to admit it. 😄