npm package: @mapbox/geojson-tidy
Description: tidy up a geojson input by filtering out noisy point clusters
Author: Arun Ganesh
Latest version: 2.0.0

[![Build Status](https://travis-ci.org/mapbox/geojson-tidy.png)](https://travis-ci.org/mapbox/geojson-tidy)

# geojson-tidy

Create a tidy geojson by resmapling points in the feature based on sampling time and distance. Handy when geometries that have been converted from a noisy GPS/GPX output.
- Set a minimum  sampling time between successive points (Default: 5 seconds)
- Set a minimum distance between successive points (Default: 10 metres)
- Set a maximum feature length to split long segments (Default: 100 points)

![untitled](https://cloud.githubusercontent.com/assets/126868/8111925/96012394-1032-11e5-9e9e-069746f4dcc9.gif)

### install

    npm install @mapbox/geojson-tidy

### usage

```js
var geojsonTidy = require('@mapbox/geojson-tidy');

var tidyLineString = geojsonTidy.tidy(obj, [options]);
```

### Input
Any geojson file from [togeojson](https://github.com/mapbox/togeojson) is a valid input for geojson-tidy. Only LineString features are processed currently.

The timestamp array for the trackpoints need to be stored stored in `features[].properties.coordTimes[]`.
Timestamps can either be JavaScript numeric [Time Values](http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.1.1)
(milliseconds since epoch) or strings in the [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format.

### Output
The default output is a geojson `FeatureCollection` with the timestamps stored in the `cordTimes[]` property. All other properties are stripped out.

```
{
    "type": "FeatureCollection",
    "features": [
        {
            "type": "Feature",
            "properties": {
                "coordTimes": []
            },
            "geometry": {
                "type": "LineString",
                "coordinates": []
            }
        }
    ]
}
```

## API

### `geojsonTidy.tidy(obj, [options])`

Given a geojson object, return contains a tidy geometry with extra points filtered out based on default settings

### options

Allows you to set custom values for the filter

```js
{
    minimumDistance: 10, // Minimum distance between points in metres
    minimumTime: 5,      // Minimum time interval between points in seconds
    maximumPoints: 100   // Maximum points in a feature
}
```

## CLI
```
./geojson-tidy -h
Usage: geojson-tidy [-d minimum distance between points] [-t minimum sample time between points] [-m maximum number of points in a single line feature] FILE
FILE is any valid geojson file generated by togeojson
geojson-tidy returns a stingified gejosn FeatureCollection
Example: ./geojson-tidy test/walk-1.json -d 10 -t 5 -m 100 > output.json
```

## Algorithm
1. Read a geojson FeatureCollection
2. Loop through the features for LineString features
3. Compare successive coordinates of the feature
4. If the dinstance between the points or timestamp difference is too small, delete it
5. Write a tidied geojson FeatureCollection with reduced points


## Development

### Build with Browserify

To run this project in the browser, you first need to build it with [browserify](http://browserify.org/):

```sh
git clone git@github.com:mapbox/geojson-tidy.git

cd geojson-tidy

# to run tests
npm install

# to build geojson-tidy
npm run build
```

`geojson-tidy.js` and `geojson-tidy.min.js` are **built files** generated
from `geojson-tidy.js` by `browserify`. If you find an issue, it either needs to be
fixed in `index.js`, or in one of the libraries mapbox-mapmatch uses
to parse formats.