All Projects → rowanwins → polygon-splitter

rowanwins / polygon-splitter

Licence: MIT license
A small (<10kb minified) javascript library for splitting polygons by a polyline.

Programming Languages

javascript
184084 projects - #8 most used programming language
Vue
7211 projects
HTML
75241 projects

Projects that are alternatives of or similar to polygon-splitter

Cgal
The public CGAL repository, see the README below
Stars: ✭ 2,825 (+14025%)
Mutual labels:  geometry, polygon, computational-geometry
Matgeom
Matlab geometry toolbox for 2D/3D geometric computing
Stars: ✭ 168 (+740%)
Mutual labels:  geometry, polygon
geofeatures2
A lightweight, high performance geometry library in Swift.
Stars: ✭ 18 (-10%)
Mutual labels:  geometry, polygon
Geokit
Geo-Toolkit for PHP.
Stars: ✭ 223 (+1015%)
Mutual labels:  geometry, polygon
polliwog
2D and 3D computational geometry library
Stars: ✭ 22 (+10%)
Mutual labels:  geometry, computational-geometry
Wagyu
A general library for geometry operations of union, intersections, difference, and xor
Stars: ✭ 116 (+480%)
Mutual labels:  geometry, computational-geometry
Unity.library.eppz.geometry
2D Geometry for Unity. Suited for everyday polygon hassle. Polygon clipping, polygon winding direction, polygon area, polygon centroid, centroid of multiple polygons, line intersection, point-line distance, segment intersection, polygon-point containment, polygon triangulation, polygon Voronoi diagram, polygon offset, polygon outline, polygon buffer, polygon union, polygon substraction, polygon boolean operations, and more. It is a polygon fest.
Stars: ✭ 198 (+890%)
Mutual labels:  geometry, polygon
Plexus
Polygonal mesh processing.
Stars: ✭ 90 (+350%)
Mutual labels:  geometry, polygon
Shape-Your-Music
A web application for drawing music.
Stars: ✭ 106 (+430%)
Mutual labels:  geometry, polygon
osm-static-maps
Openstreetmap static maps is a nodejs lib, CLI and server open source inspired on google static map service
Stars: ✭ 130 (+550%)
Mutual labels:  geometry, polygon
envelope ex
Utilities for calculating and comparing envelopes from geometries
Stars: ✭ 15 (-25%)
Mutual labels:  geometry, polygon
Lazysets.jl
A Julia package for calculus with convex sets
Stars: ✭ 107 (+435%)
Mutual labels:  geometry, computational-geometry
Polylidar
Polylidar3D - Fast polygon extraction from 3D Data
Stars: ✭ 106 (+430%)
Mutual labels:  geometry, polygon
Cavaliercontours
2D polyline library for offsetting, combining, etc.
Stars: ✭ 135 (+575%)
Mutual labels:  geometry, computational-geometry
Hgeometry
HGeometry
Stars: ✭ 98 (+390%)
Mutual labels:  geometry, computational-geometry
EsriRESTScraper
A Python class that scrapes ESRI Rest Endpoints and exports data to a geodatabase
Stars: ✭ 43 (+115%)
Mutual labels:  geometry, polygon
Polyclip Go
Go library for Boolean operations on 2D polygons.
Stars: ✭ 70 (+250%)
Mutual labels:  geometry, polygon
Graphical Debugging
GraphicalDebugging extension for Visual Studio
Stars: ✭ 88 (+340%)
Mutual labels:  geometry, polygon
SplashGeom
Open-source C++ library for geometry and linear algebra
Stars: ✭ 22 (+10%)
Mutual labels:  geometry, computational-geometry
topo
A Geometry library for Elixir that calculates spatial relationships between two geometries
Stars: ✭ 125 (+525%)
Mutual labels:  geometry, computational-geometry

polygon-splitter

A small (<10kb minified) javascript library for splitting geojson polygons by a polyline.

Works with

  • Concave polygons
  • Polygons with holes
  • Single & Multi-part geometries

Install

npm install polygon-splitter

API

Accepts either a geojson Feature or Geometry (inc MultiPolygon and MultiLineString).

import polygonSplitter from 'polygon-splitter'
// or
const polygonSplitter = require('polygon-splitter')

const polygon = {
    "type": "Polygon",
    "coordinates": [[[0, 0],[10, -10], [20, 0], [10, 10], [0, 0]]]
}

const polyline = {
    "type": "LineString",
    "coordinates": [[20, 10], [5, 0], [20, -10]]
}
const output = polygonSplitter(polygon, polyline)

Performance

Splitting a polygon with a hole into 4 pieces. Compared with an approach outlined here, and also another one described here

polygon-splitter x 228,391 ops/sec ±0.63% (88 runs sampled)
alternate approach x 2,052 ops/sec ±3.60% (78 runs sampled)
alternate approach 2 x 900 ops/sec ±3.60% (78 runs sampled)

Describing the algorithm

This is basically my own implementation of this algorithm. If you're interested in the details it's probably best to read to the source code. Some key points of understanding

  • Each intersection point will be used in two output polygons so we'll need to keep track of how many times we visit each intersection point in constructing the output
  • The algorithm works by switching back and forth walking along the polyline and polygon to collect an output polygon
  • An output polygon must contain at least one stretch from the linestring, and at least one stretch from the polgon, but it might also contain many, so we'll use a while loop to just keep going till we get back to the start
  • For each intersection point we mark whether the polyline is heading into the polygon or not, this is helpful for knowing which we need to walk the polyline in constructing the output (eg it could be backwards or forwards).

Acknowledgements

Thanks to mourner for the most excellent robust-predicates library.

Thanks for my employer FrontierSI for freeing up some of my time to finish off this algorithm.

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].