0.1.0 • Published 5 years ago

geojson-antimeridian-cut v0.1.0

Weekly downloads
3,579
License
MIT
Repository
gitlab
Last release
5 years ago

Geojson Antimeridian Cutting

GeoJSON is a standard for representing geographic data in a JSON file. Features and FeatureCollections are composed of different geometry objects, including:

  • LineStrings
  • MultiLineStrings
  • Polygons
  • MultiPolygons
  • GeometryCollections

It is very likely that some geographic data may cross the Antimeridian (180° E or 180° W). RFC 7946 Section 3.1.9 specifies that such objects SHOULD be broken up into two or more objects, none of which cross the antimeridian, and which together are all equivalent. This package implements that splitting.

The API currently provides one function: splitGeoJSON(object), which takes any valid GeoJSON object and, if it crosses the antimeridian, creates a new Object that is equivalent but does not cross the antimeridian. LineStrings may become MultiLineStrings, and MultiLineStrings will gain more entries. The same goes for Polygons and MultiPolygons.

All feature properties and object foreign members are preserved.

Example usage:

const splitGeoJSON = require('geojson-antimeridian-cut');

const lineString = {
  type: 'Polygon',
  coordinates: [
    [
      [170, 10],
      [170, -10],
      [-170, -10],
      [-170, 10],
      [170, 10],
    ],
  ],
};

console.log(splitGeoJSON(lineString));
/*
{
  "type": "MultiPolygon",
  "coordinates": [
    [
      [180, 10],
      [170, 10],
      [170, -10],
      [180, -10],
      [180, 10]
    ],
    [
      [-180, -10],
      [-170, -10],
      [-170, 10],
      [-180, 10],
      [-180, -10]
    ]
  ]
}
*/

const feature = {
  type: 'Feature',
  properties: {
    name: 'Anchorage to Tokyo',
  },
  geometry: {
    type: 'LineString',
    coordinates: [
      [-149.89, 61.23],
      [-220.29, 35.69],
    ],
  },
};

console.log(splitGeoJSON(feature));
/*
{
  "type": "Feature",
  "properties": {
    "name": "Anchorage to Tokyo"
  },
  "geometry": {
    "type": "MultiLineString",
    "coordinates": [
      [
        [-149.89, 61.23],
        [-180, 50.31]
      ],
      [
        [-180, 50.31],
        [-220.29, 35.69]
      ]
    ]
  }
}
*/