GeoJSON Merge Tool

Merge multiple GeoJSON files into a single FeatureCollection.

Skip to the tool

State boundaries, district shapefiles, weekly delivery exports — geospatial data arrives in chunks. To render a national map or analyse a quarter's deliveries together, the chunks have to merge into one FeatureCollection. The structural merge is trivial; the property-collision and id-uniqueness handling is where most ad-hoc jq scripts get it wrong.

Paste two or more FeatureCollections on the left, separated by blank lines. The tool concatenates the features arrays, deduplicates feature IDs (with a configurable suffix strategy), unions the bbox values, and warns you if two inputs use different CRS declarations. The combined collection is rendered on the map and ready to download.

Below the merger: the property-collision rules (last-write-wins, namespaced, or per-feature), how to merge by spatial intersection rather than concatenation (use union/clip instead), and the geojson-merge npm package for scripted runs. For combining geometries into one shape, use the union tool instead.

Watch out for: mismatched property schemas. Two FeatureCollections described with the same domain language often disagree on field types — one source has population as a number, another as a string with thousands separators ("1,234,567"). Vector tile generators and Mapbox GL's data-driven styling will fail or misrender on the inconsistency. The merger flags type-collisions in a summary so you can normalise upstream rather than discovering the problem on-map, and refuses to coerce silently — explicit normalisation beats a magical guess every time.

How GeoJSON Merging Works

This tool combines two GeoJSON FeatureCollections into a single FeatureCollection. All features from both inputs are included in the output, preserving their original geometries and properties. No spatial operations are performed — features are simply concatenated.

Paste GeoJSON into both input panels, then click Merge. If either input is a bare Geometry or single Feature, it is automatically wrapped in a FeatureCollection before merging.

When to Merge GeoJSON

  • Combining data from multiple API responses into a single file
  • Joining layers exported separately from QGIS or other GIS tools
  • Aggregating regional datasets into a national dataset
  • Combining different feature types (points, lines, polygons) into one collection

Merge vs. Union

Merging and union are different operations. Merging concatenates features — overlapping polygons remain as separate features. Union combines overlapping polygon geometries into a single merged shape. Use merge when you want to keep features distinct, and union when you want to dissolve overlapping boundaries.

Try It

Merge a collection containing Central Park with a collection containing Brooklyn Bridge and Times Square. Paste the first collection into Input A and the second into Input B:

GeoJSON{
  "type": "FeatureCollection",
  "features": [
    {
      "type": "Feature",
      "properties": { "name": "Central Park" },
      "geometry": {
        "type": "Point",
        "coordinates": [-73.9654, 40.7829]
      }
    },
    {
      "type": "Feature",
      "properties": { "name": "Brooklyn Bridge" },
      "geometry": {
        "type": "Point",
        "coordinates": [-73.9969, 40.7061]
      }
    },
    {
      "type": "Feature",
      "properties": { "name": "Times Square" },
      "geometry": {
        "type": "Point",
        "coordinates": [-73.9855, 40.7580]
      }
    }
  ]
}

The merged output contains all three features in a single FeatureCollection. Each feature retains its original geometry and properties. The order is Input A features first, followed by Input B features. Use the length check (fc.features.length) to verify the result contains the expected number of features.

How It Works

The merge tool reads the features array from each input FeatureCollection and concatenates them into a new array. No coordinate transformations or spatial calculations are performed. If an input is a bare Feature or Geometry, it is first wrapped in a FeatureCollection before concatenation. The result is always a valid FeatureCollection regardless of input types.