@turf/simplify 7.1.0 → 7.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -4,22 +4,22 @@
4
4
 
5
5
  ## simplify
6
6
 
7
- Takes a [GeoJSON][1] object and returns a simplified version. Internally uses the 2d version of
8
- [simplify-js][2] to perform simplification using the Ramer-Douglas-Peucker algorithm.
7
+ Simplifies the geometries in a GeoJSON object. Uses the 2d version of
8
+ [simplify-js][1].
9
9
 
10
10
  ### Parameters
11
11
 
12
- * `geojson` **[GeoJSON][1]** object to be simplified
12
+ * `geojson` **[GeoJSON][2]** GeoJSON object to be simplified
13
13
  * `options` **[Object][3]** Optional parameters (optional, default `{}`)
14
14
 
15
- * `options.tolerance` **[number][4]** simplification tolerance (optional, default `1`)
16
- * `options.highQuality` **[boolean][5]** whether or not to spend more time to create a higher-quality simplification with a different algorithm (optional, default `false`)
17
- * `options.mutate` **[boolean][5]** allows GeoJSON input to be mutated (significant performance increase if true) (optional, default `false`)
15
+ * `options.tolerance` **[number][4]** Simplification tolerance (optional, default `1`)
16
+ * `options.highQuality` **[boolean][5]** Produce a higher-quality simplification using a slower algorithm (optional, default `false`)
17
+ * `options.mutate` **[boolean][5]** Allow GeoJSON input to be mutated (significant performance improvement if true) (optional, default `false`)
18
18
 
19
19
  ### Examples
20
20
 
21
21
  ```javascript
22
- var geojson = turf.polygon([[
22
+ const geojson = turf.polygon([[
23
23
  [-70.603637, -33.399918],
24
24
  [-70.614624, -33.395332],
25
25
  [-70.639343, -33.392466],
@@ -41,18 +41,18 @@ var geojson = turf.polygon([[
41
41
  [-70.594711, -33.406224],
42
42
  [-70.603637, -33.399918]
43
43
  ]]);
44
- var options = {tolerance: 0.01, highQuality: false};
45
- var simplified = turf.simplify(geojson, options);
44
+ const result0_01 = turf.simplify(geojson, {tolerance: 0.01 });
45
+ const result0_005 = turf.simplify(geojson, {tolerance: 0.005 });
46
46
 
47
47
  //addToMap
48
- var addToMap = [geojson, simplified]
48
+ const addToMap = [geojson, result0_01, result0_005]
49
49
  ```
50
50
 
51
- Returns **[GeoJSON][1]** a simplified GeoJSON
51
+ Returns **[GeoJSON][2]** Simplified GeoJSON
52
52
 
53
- [1]: https://tools.ietf.org/html/rfc7946#section-3
53
+ [1]: https://mourner.github.io/simplify-js/
54
54
 
55
- [2]: http://mourner.github.io/simplify-js/
55
+ [2]: https://tools.ietf.org/html/rfc7946#section-3
56
56
 
57
57
  [3]: https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object
58
58
 
@@ -34,8 +34,7 @@ function simplifyRadialDist(points, sqTolerance) {
34
34
  prevPoint = point;
35
35
  }
36
36
  }
37
- if (prevPoint !== point)
38
- newPoints.push(point);
37
+ if (prevPoint !== point) newPoints.push(point);
39
38
  return newPoints;
40
39
  }
41
40
  function simplifyDPStep(points, first, last, sqTolerance, simplified) {
@@ -63,8 +62,7 @@ function simplifyDouglasPeucker(points, sqTolerance) {
63
62
  return simplified;
64
63
  }
65
64
  function simplify(points, tolerance, highestQuality) {
66
- if (points.length <= 2)
67
- return points;
65
+ if (points.length <= 2) return points;
68
66
  var sqTolerance = tolerance !== void 0 ? tolerance * tolerance : 1;
69
67
  points = highestQuality ? points : simplifyRadialDist(points, sqTolerance);
70
68
  points = simplifyDouglasPeucker(points, sqTolerance);
@@ -75,17 +73,13 @@ function simplify(points, tolerance, highestQuality) {
75
73
  function simplify2(geojson, options = {}) {
76
74
  var _a, _b, _c;
77
75
  options = options != null ? options : {};
78
- if (!_helpers.isObject.call(void 0, options))
79
- throw new Error("options is invalid");
76
+ if (!_helpers.isObject.call(void 0, options)) throw new Error("options is invalid");
80
77
  const tolerance = (_a = options.tolerance) != null ? _a : 1;
81
78
  const highQuality = (_b = options.highQuality) != null ? _b : false;
82
79
  const mutate = (_c = options.mutate) != null ? _c : false;
83
- if (!geojson)
84
- throw new Error("geojson is required");
85
- if (tolerance && tolerance < 0)
86
- throw new Error("invalid tolerance");
87
- if (mutate !== true)
88
- geojson = _clone.clone.call(void 0, geojson);
80
+ if (!geojson) throw new Error("geojson is required");
81
+ if (tolerance && tolerance < 0) throw new Error("invalid tolerance");
82
+ if (mutate !== true) geojson = _clone.clone.call(void 0, geojson);
89
83
  _meta.geomEach.call(void 0, geojson, function(geom) {
90
84
  simplifyGeom(geom, tolerance, highQuality);
91
85
  });
@@ -93,8 +87,7 @@ function simplify2(geojson, options = {}) {
93
87
  }
94
88
  function simplifyGeom(geometry, tolerance, highQuality) {
95
89
  const type = geometry.type;
96
- if (type === "Point" || type === "MultiPoint")
97
- return geometry;
90
+ if (type === "Point" || type === "MultiPoint") return geometry;
98
91
  _cleancoords.cleanCoords.call(void 0, geometry, { mutate: true });
99
92
  if (type !== "GeometryCollection") {
100
93
  switch (type) {
@@ -132,10 +125,13 @@ function simplifyPolygon(coordinates, tolerance, highQuality) {
132
125
  }
133
126
  let ringTolerance = tolerance;
134
127
  let simpleRing = simplify(ring, ringTolerance, highQuality);
135
- while (!checkValidity(simpleRing)) {
128
+ while (!checkValidity(simpleRing) && ringTolerance >= Number.EPSILON) {
136
129
  ringTolerance -= ringTolerance * 0.01;
137
130
  simpleRing = simplify(ring, ringTolerance, highQuality);
138
131
  }
132
+ if (!checkValidity(simpleRing)) {
133
+ return ring;
134
+ }
139
135
  if (simpleRing[simpleRing.length - 1][0] !== simpleRing[0][0] || simpleRing[simpleRing.length - 1][1] !== simpleRing[0][1]) {
140
136
  simpleRing.push(simpleRing[0]);
141
137
  }
@@ -143,13 +139,12 @@ function simplifyPolygon(coordinates, tolerance, highQuality) {
143
139
  });
144
140
  }
145
141
  function checkValidity(ring) {
146
- if (ring.length < 3)
147
- return false;
142
+ if (ring.length < 3) return false;
148
143
  return !(ring.length === 3 && ring[2][0] === ring[0][0] && ring[2][1] === ring[0][1]);
149
144
  }
150
- var turf_simplify_default = simplify2;
145
+ var index_default = simplify2;
151
146
 
152
147
 
153
148
 
154
- exports.default = turf_simplify_default; exports.simplify = simplify2;
149
+ exports.default = index_default; exports.simplify = simplify2;
155
150
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../index.ts","../../lib/simplify.js"],"names":["simplify"],"mappings":"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","sourcesContent":["import { Geometry, Position } from \"geojson\";\nimport { cleanCoords } from \"@turf/clean-coords\";\nimport { clone } from \"@turf/clone\";\nimport { geomEach } from \"@turf/meta\";\nimport { AllGeoJSON, isObject } from \"@turf/helpers\";\nimport { simplify as simplifyJS } from \"./lib/simplify.js\";\n\n/**\n * Takes a {@link GeoJSON} object and returns a simplified version. Internally uses the 2d version of\n * [simplify-js](http://mourner.github.io/simplify-js/) to perform simplification using the Ramer-Douglas-Peucker algorithm.\n *\n *\n * @name simplify\n * @param {GeoJSON} geojson object to be simplified\n * @param {Object} [options={}] Optional parameters\n * @param {number} [options.tolerance=1] simplification tolerance\n * @param {boolean} [options.highQuality=false] whether or not to spend more time to create a higher-quality simplification with a different algorithm\n * @param {boolean} [options.mutate=false] allows GeoJSON input to be mutated (significant performance increase if true)\n * @returns {GeoJSON} a simplified GeoJSON\n * @example\n * var geojson = turf.polygon([[\n * [-70.603637, -33.399918],\n * [-70.614624, -33.395332],\n * [-70.639343, -33.392466],\n * [-70.659942, -33.394759],\n * [-70.683975, -33.404504],\n * [-70.697021, -33.419406],\n * [-70.701141, -33.434306],\n * [-70.700454, -33.446339],\n * [-70.694274, -33.458369],\n * [-70.682601, -33.465816],\n * [-70.668869, -33.472117],\n * [-70.646209, -33.473835],\n * [-70.624923, -33.472117],\n * [-70.609817, -33.468107],\n * [-70.595397, -33.458369],\n * [-70.587158, -33.442901],\n * [-70.587158, -33.426283],\n * [-70.590591, -33.414248],\n * [-70.594711, -33.406224],\n * [-70.603637, -33.399918]\n * ]]);\n * var options = {tolerance: 0.01, highQuality: false};\n * var simplified = turf.simplify(geojson, options);\n *\n * //addToMap\n * var addToMap = [geojson, simplified]\n */\nfunction simplify<T extends AllGeoJSON>(\n geojson: T,\n options: {\n tolerance?: number;\n highQuality?: boolean;\n mutate?: boolean;\n } = {}\n): T {\n // Optional parameters\n options = options ?? {};\n if (!isObject(options)) throw new Error(\"options is invalid\");\n const tolerance = options.tolerance ?? 1;\n const highQuality = options.highQuality ?? false;\n const mutate = options.mutate ?? false;\n\n if (!geojson) throw new Error(\"geojson is required\");\n if (tolerance && tolerance < 0) throw new Error(\"invalid tolerance\");\n\n // Clone geojson to avoid side effects\n if (mutate !== true) geojson = clone(geojson);\n\n geomEach(geojson, function (geom) {\n simplifyGeom(geom, tolerance, highQuality);\n });\n return geojson;\n}\n\n/**\n * Simplifies a feature's coordinates\n *\n * @private\n * @param {Geometry} geometry to be simplified\n * @param {number} [tolerance=1] simplification tolerance\n * @param {boolean} [highQuality=false] whether or not to spend more time to create a higher-quality simplification with a different algorithm\n * @returns {Geometry} output\n */\nfunction simplifyGeom(\n geometry: Geometry,\n tolerance: number,\n highQuality: boolean\n) {\n const type = geometry.type;\n\n // \"unsimplyfiable\" geometry types\n if (type === \"Point\" || type === \"MultiPoint\") return geometry;\n\n // Remove any extra coordinates\n cleanCoords(geometry, { mutate: true });\n\n if (type !== \"GeometryCollection\") {\n // TODO should this cater for GeometryCollections too?\n switch (type) {\n case \"LineString\":\n geometry.coordinates = simplifyJS(\n geometry.coordinates,\n tolerance,\n highQuality\n );\n break;\n case \"MultiLineString\":\n geometry.coordinates = geometry.coordinates.map((lines) =>\n simplifyJS(lines, tolerance, highQuality)\n );\n break;\n case \"Polygon\":\n geometry.coordinates = simplifyPolygon(\n geometry.coordinates,\n tolerance,\n highQuality\n );\n break;\n case \"MultiPolygon\":\n geometry.coordinates = geometry.coordinates.map((rings) =>\n simplifyPolygon(rings, tolerance, highQuality)\n );\n }\n }\n\n return geometry;\n}\n\n/**\n * Simplifies the coordinates of a Polygon with simplify-js\n *\n * @private\n * @param {Array<number>} coordinates to be processed\n * @param {number} tolerance simplification tolerance\n * @param {boolean} highQuality whether or not to spend more time to create a higher-quality\n * @returns {Array<Array<Array<number>>>} simplified coords\n */\nfunction simplifyPolygon(\n coordinates: Position[][],\n tolerance: number,\n highQuality: boolean\n) {\n return coordinates.map(function (ring) {\n if (ring.length < 4) {\n throw new Error(\"invalid polygon\");\n }\n let ringTolerance = tolerance;\n let simpleRing = simplifyJS(ring, ringTolerance, highQuality);\n // remove 1 percent of tolerance until enough points to make a triangle\n while (!checkValidity(simpleRing)) {\n ringTolerance -= ringTolerance * 0.01;\n simpleRing = simplifyJS(ring, ringTolerance, highQuality);\n }\n if (\n simpleRing[simpleRing.length - 1][0] !== simpleRing[0][0] ||\n simpleRing[simpleRing.length - 1][1] !== simpleRing[0][1]\n ) {\n simpleRing.push(simpleRing[0]);\n }\n return simpleRing;\n });\n}\n\n/**\n * Returns true if ring has at least 3 coordinates and its first coordinate is the same as its last\n *\n * @private\n * @param {Array<number>} ring coordinates to be checked\n * @returns {boolean} true if valid\n */\nfunction checkValidity(ring: Position[]) {\n if (ring.length < 3) return false;\n //if the last point is the same as the first, it's not a triangle\n return !(\n ring.length === 3 &&\n ring[2][0] === ring[0][0] &&\n ring[2][1] === ring[0][1]\n );\n}\n\nexport { simplify };\nexport default simplify;\n","/*\n (c) 2013, Vladimir Agafonkin\n Simplify.js, a high-performance JS polyline simplification library\n mourner.github.io/simplify-js\n*/\n\n// to suit your point format, run search/replace for '.x' and '.y';\n// for 3D version, see 3d branch (configurability would draw significant performance overhead)\n\n// square distance between 2 points\nfunction getSqDist(p1, p2) {\n var dx = p1[0] - p2[0],\n dy = p1[1] - p2[1];\n\n return dx * dx + dy * dy;\n}\n\n// square distance from a point to a segment\nfunction getSqSegDist(p, p1, p2) {\n var x = p1[0],\n y = p1[1],\n dx = p2[0] - x,\n dy = p2[1] - y;\n\n if (dx !== 0 || dy !== 0) {\n var t = ((p[0] - x) * dx + (p[1] - y) * dy) / (dx * dx + dy * dy);\n\n if (t > 1) {\n x = p2[0];\n y = p2[1];\n } else if (t > 0) {\n x += dx * t;\n y += dy * t;\n }\n }\n\n dx = p[0] - x;\n dy = p[1] - y;\n\n return dx * dx + dy * dy;\n}\n// rest of the code doesn't care about point format\n\n// basic distance-based simplification\nfunction simplifyRadialDist(points, sqTolerance) {\n var prevPoint = points[0],\n newPoints = [prevPoint],\n point;\n\n for (var i = 1, len = points.length; i < len; i++) {\n point = points[i];\n\n if (getSqDist(point, prevPoint) > sqTolerance) {\n newPoints.push(point);\n prevPoint = point;\n }\n }\n\n if (prevPoint !== point) newPoints.push(point);\n\n return newPoints;\n}\n\nfunction simplifyDPStep(points, first, last, sqTolerance, simplified) {\n var maxSqDist = sqTolerance,\n index;\n\n for (var i = first + 1; i < last; i++) {\n var sqDist = getSqSegDist(points[i], points[first], points[last]);\n\n if (sqDist > maxSqDist) {\n index = i;\n maxSqDist = sqDist;\n }\n }\n\n if (maxSqDist > sqTolerance) {\n if (index - first > 1)\n simplifyDPStep(points, first, index, sqTolerance, simplified);\n simplified.push(points[index]);\n if (last - index > 1)\n simplifyDPStep(points, index, last, sqTolerance, simplified);\n }\n}\n\n// simplification using Ramer-Douglas-Peucker algorithm\nfunction simplifyDouglasPeucker(points, sqTolerance) {\n var last = points.length - 1;\n\n var simplified = [points[0]];\n simplifyDPStep(points, 0, last, sqTolerance, simplified);\n simplified.push(points[last]);\n\n return simplified;\n}\n\n// both algorithms combined for awesome performance\nfunction simplify(points, tolerance, highestQuality) {\n if (points.length <= 2) return points;\n\n var sqTolerance = tolerance !== undefined ? tolerance * tolerance : 1;\n\n points = highestQuality ? points : simplifyRadialDist(points, sqTolerance);\n points = simplifyDouglasPeucker(points, sqTolerance);\n\n return points;\n}\n\nexport { simplify };\nexport default simplify;\n"]}
1
+ {"version":3,"sources":["/home/runner/work/turf/turf/packages/turf-simplify/dist/cjs/index.cjs","../../index.ts","../../lib/simplify.js"],"names":["simplify"],"mappings":"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","file":"/home/runner/work/turf/turf/packages/turf-simplify/dist/cjs/index.cjs","sourcesContent":[null,"import { Geometry, Position } from \"geojson\";\nimport { cleanCoords } from \"@turf/clean-coords\";\nimport { clone } from \"@turf/clone\";\nimport { geomEach } from \"@turf/meta\";\nimport { AllGeoJSON, isObject } from \"@turf/helpers\";\nimport { simplify as simplifyJS } from \"./lib/simplify.js\";\n\n/**\n * Simplifies the geometries in a GeoJSON object. Uses the 2d version of\n * [simplify-js](https://mourner.github.io/simplify-js/).\n *\n * @function\n * @param {GeoJSON} geojson GeoJSON object to be simplified\n * @param {Object} [options={}] Optional parameters\n * @param {number} [options.tolerance=1] Simplification tolerance\n * @param {boolean} [options.highQuality=false] Produce a higher-quality simplification using a slower algorithm\n * @param {boolean} [options.mutate=false] Allow GeoJSON input to be mutated (significant performance improvement if true)\n * @returns {GeoJSON} Simplified GeoJSON\n * @example\n * const geojson = turf.polygon([[\n * [-70.603637, -33.399918],\n * [-70.614624, -33.395332],\n * [-70.639343, -33.392466],\n * [-70.659942, -33.394759],\n * [-70.683975, -33.404504],\n * [-70.697021, -33.419406],\n * [-70.701141, -33.434306],\n * [-70.700454, -33.446339],\n * [-70.694274, -33.458369],\n * [-70.682601, -33.465816],\n * [-70.668869, -33.472117],\n * [-70.646209, -33.473835],\n * [-70.624923, -33.472117],\n * [-70.609817, -33.468107],\n * [-70.595397, -33.458369],\n * [-70.587158, -33.442901],\n * [-70.587158, -33.426283],\n * [-70.590591, -33.414248],\n * [-70.594711, -33.406224],\n * [-70.603637, -33.399918]\n * ]]);\n * const result0_01 = turf.simplify(geojson, {tolerance: 0.01 });\n * const result0_005 = turf.simplify(geojson, {tolerance: 0.005 });\n *\n * //addToMap\n * const addToMap = [geojson, result0_01, result0_005]\n */\nfunction simplify<T extends AllGeoJSON>(\n geojson: T,\n options: {\n tolerance?: number;\n highQuality?: boolean;\n mutate?: boolean;\n } = {}\n): T {\n // Optional parameters\n options = options ?? {};\n if (!isObject(options)) throw new Error(\"options is invalid\");\n const tolerance = options.tolerance ?? 1;\n const highQuality = options.highQuality ?? false;\n const mutate = options.mutate ?? false;\n\n if (!geojson) throw new Error(\"geojson is required\");\n if (tolerance && tolerance < 0) throw new Error(\"invalid tolerance\");\n\n // Clone geojson to avoid side effects\n if (mutate !== true) geojson = clone(geojson);\n\n geomEach(geojson, function (geom) {\n simplifyGeom(geom, tolerance, highQuality);\n });\n return geojson;\n}\n\n/**\n * Simplifies a feature's coordinates\n *\n * @private\n * @param {Geometry} geometry to be simplified\n * @param {number} [tolerance=1] simplification tolerance\n * @param {boolean} [highQuality=false] whether or not to spend more time to create a higher-quality simplification with a different algorithm\n * @returns {Geometry} output\n */\nfunction simplifyGeom(\n geometry: Geometry,\n tolerance: number,\n highQuality: boolean\n) {\n const type = geometry.type;\n\n // \"unsimplyfiable\" geometry types\n if (type === \"Point\" || type === \"MultiPoint\") return geometry;\n\n // Remove any extra coordinates\n cleanCoords(geometry, { mutate: true });\n\n if (type !== \"GeometryCollection\") {\n // TODO should this cater for GeometryCollections too?\n switch (type) {\n case \"LineString\":\n geometry.coordinates = simplifyJS(\n geometry.coordinates,\n tolerance,\n highQuality\n );\n break;\n case \"MultiLineString\":\n geometry.coordinates = geometry.coordinates.map((lines) =>\n simplifyJS(lines, tolerance, highQuality)\n );\n break;\n case \"Polygon\":\n geometry.coordinates = simplifyPolygon(\n geometry.coordinates,\n tolerance,\n highQuality\n );\n break;\n case \"MultiPolygon\":\n geometry.coordinates = geometry.coordinates.map((rings) =>\n simplifyPolygon(rings, tolerance, highQuality)\n );\n }\n }\n\n return geometry;\n}\n\n/**\n * Simplifies the coordinates of a Polygon with simplify-js\n *\n * @private\n * @param {Array<number>} coordinates to be processed\n * @param {number} tolerance simplification tolerance\n * @param {boolean} highQuality whether or not to spend more time to create a higher-quality\n * @returns {Array<Array<Array<number>>>} simplified coords\n */\nfunction simplifyPolygon(\n coordinates: Position[][],\n tolerance: number,\n highQuality: boolean\n) {\n return coordinates.map(function (ring) {\n if (ring.length < 4) {\n throw new Error(\"invalid polygon\");\n }\n let ringTolerance = tolerance;\n let simpleRing = simplifyJS(ring, ringTolerance, highQuality);\n\n // If simplified ring isn't valid (has been over simplified) reduce the\n // tolerance by 1% and try again.\n while (!checkValidity(simpleRing) && ringTolerance >= Number.EPSILON) {\n ringTolerance -= ringTolerance * 0.01;\n simpleRing = simplifyJS(ring, ringTolerance, highQuality);\n }\n\n // If ring wasn't able to be simplified in a valid way, return it unchanged.\n if (!checkValidity(simpleRing)) {\n return ring;\n }\n\n // Close the ring if it wasn't already.\n if (\n simpleRing[simpleRing.length - 1][0] !== simpleRing[0][0] ||\n simpleRing[simpleRing.length - 1][1] !== simpleRing[0][1]\n ) {\n simpleRing.push(simpleRing[0]);\n }\n return simpleRing;\n });\n}\n\n/**\n * Returns true if ring has at least 3 coordinates and its first coordinate is the same as its last\n *\n * @private\n * @param {Array<number>} ring coordinates to be checked\n * @returns {boolean} true if valid\n */\nfunction checkValidity(ring: Position[]) {\n if (ring.length < 3) return false;\n //if the last point is the same as the first, it's not a triangle\n return !(\n ring.length === 3 &&\n ring[2][0] === ring[0][0] &&\n ring[2][1] === ring[0][1]\n );\n}\n\nexport { simplify };\nexport default simplify;\n","/*\n (c) 2013, Vladimir Agafonkin\n Simplify.js, a high-performance JS polyline simplification library\n mourner.github.io/simplify-js\n*/\n\n// to suit your point format, run search/replace for '.x' and '.y';\n// for 3D version, see 3d branch (configurability would draw significant performance overhead)\n\n// square distance between 2 points\nfunction getSqDist(p1, p2) {\n var dx = p1[0] - p2[0],\n dy = p1[1] - p2[1];\n\n return dx * dx + dy * dy;\n}\n\n// square distance from a point to a segment\nfunction getSqSegDist(p, p1, p2) {\n var x = p1[0],\n y = p1[1],\n dx = p2[0] - x,\n dy = p2[1] - y;\n\n if (dx !== 0 || dy !== 0) {\n var t = ((p[0] - x) * dx + (p[1] - y) * dy) / (dx * dx + dy * dy);\n\n if (t > 1) {\n x = p2[0];\n y = p2[1];\n } else if (t > 0) {\n x += dx * t;\n y += dy * t;\n }\n }\n\n dx = p[0] - x;\n dy = p[1] - y;\n\n return dx * dx + dy * dy;\n}\n// rest of the code doesn't care about point format\n\n// basic distance-based simplification\nfunction simplifyRadialDist(points, sqTolerance) {\n var prevPoint = points[0],\n newPoints = [prevPoint],\n point;\n\n for (var i = 1, len = points.length; i < len; i++) {\n point = points[i];\n\n if (getSqDist(point, prevPoint) > sqTolerance) {\n newPoints.push(point);\n prevPoint = point;\n }\n }\n\n if (prevPoint !== point) newPoints.push(point);\n\n return newPoints;\n}\n\nfunction simplifyDPStep(points, first, last, sqTolerance, simplified) {\n var maxSqDist = sqTolerance,\n index;\n\n for (var i = first + 1; i < last; i++) {\n var sqDist = getSqSegDist(points[i], points[first], points[last]);\n\n if (sqDist > maxSqDist) {\n index = i;\n maxSqDist = sqDist;\n }\n }\n\n if (maxSqDist > sqTolerance) {\n if (index - first > 1)\n simplifyDPStep(points, first, index, sqTolerance, simplified);\n simplified.push(points[index]);\n if (last - index > 1)\n simplifyDPStep(points, index, last, sqTolerance, simplified);\n }\n}\n\n// simplification using Ramer-Douglas-Peucker algorithm\nfunction simplifyDouglasPeucker(points, sqTolerance) {\n var last = points.length - 1;\n\n var simplified = [points[0]];\n simplifyDPStep(points, 0, last, sqTolerance, simplified);\n simplified.push(points[last]);\n\n return simplified;\n}\n\n// both algorithms combined for awesome performance\nfunction simplify(points, tolerance, highestQuality) {\n if (points.length <= 2) return points;\n\n var sqTolerance = tolerance !== undefined ? tolerance * tolerance : 1;\n\n points = highestQuality ? points : simplifyRadialDist(points, sqTolerance);\n points = simplifyDouglasPeucker(points, sqTolerance);\n\n return points;\n}\n\nexport { simplify };\nexport default simplify;\n"]}
@@ -1,19 +1,18 @@
1
1
  import { AllGeoJSON } from '@turf/helpers';
2
2
 
3
3
  /**
4
- * Takes a {@link GeoJSON} object and returns a simplified version. Internally uses the 2d version of
5
- * [simplify-js](http://mourner.github.io/simplify-js/) to perform simplification using the Ramer-Douglas-Peucker algorithm.
4
+ * Simplifies the geometries in a GeoJSON object. Uses the 2d version of
5
+ * [simplify-js](https://mourner.github.io/simplify-js/).
6
6
  *
7
- *
8
- * @name simplify
9
- * @param {GeoJSON} geojson object to be simplified
7
+ * @function
8
+ * @param {GeoJSON} geojson GeoJSON object to be simplified
10
9
  * @param {Object} [options={}] Optional parameters
11
- * @param {number} [options.tolerance=1] simplification tolerance
12
- * @param {boolean} [options.highQuality=false] whether or not to spend more time to create a higher-quality simplification with a different algorithm
13
- * @param {boolean} [options.mutate=false] allows GeoJSON input to be mutated (significant performance increase if true)
14
- * @returns {GeoJSON} a simplified GeoJSON
10
+ * @param {number} [options.tolerance=1] Simplification tolerance
11
+ * @param {boolean} [options.highQuality=false] Produce a higher-quality simplification using a slower algorithm
12
+ * @param {boolean} [options.mutate=false] Allow GeoJSON input to be mutated (significant performance improvement if true)
13
+ * @returns {GeoJSON} Simplified GeoJSON
15
14
  * @example
16
- * var geojson = turf.polygon([[
15
+ * const geojson = turf.polygon([[
17
16
  * [-70.603637, -33.399918],
18
17
  * [-70.614624, -33.395332],
19
18
  * [-70.639343, -33.392466],
@@ -35,11 +34,11 @@ import { AllGeoJSON } from '@turf/helpers';
35
34
  * [-70.594711, -33.406224],
36
35
  * [-70.603637, -33.399918]
37
36
  * ]]);
38
- * var options = {tolerance: 0.01, highQuality: false};
39
- * var simplified = turf.simplify(geojson, options);
37
+ * const result0_01 = turf.simplify(geojson, {tolerance: 0.01 });
38
+ * const result0_005 = turf.simplify(geojson, {tolerance: 0.005 });
40
39
  *
41
40
  * //addToMap
42
- * var addToMap = [geojson, simplified]
41
+ * const addToMap = [geojson, result0_01, result0_005]
43
42
  */
44
43
  declare function simplify<T extends AllGeoJSON>(geojson: T, options?: {
45
44
  tolerance?: number;
@@ -1,19 +1,18 @@
1
1
  import { AllGeoJSON } from '@turf/helpers';
2
2
 
3
3
  /**
4
- * Takes a {@link GeoJSON} object and returns a simplified version. Internally uses the 2d version of
5
- * [simplify-js](http://mourner.github.io/simplify-js/) to perform simplification using the Ramer-Douglas-Peucker algorithm.
4
+ * Simplifies the geometries in a GeoJSON object. Uses the 2d version of
5
+ * [simplify-js](https://mourner.github.io/simplify-js/).
6
6
  *
7
- *
8
- * @name simplify
9
- * @param {GeoJSON} geojson object to be simplified
7
+ * @function
8
+ * @param {GeoJSON} geojson GeoJSON object to be simplified
10
9
  * @param {Object} [options={}] Optional parameters
11
- * @param {number} [options.tolerance=1] simplification tolerance
12
- * @param {boolean} [options.highQuality=false] whether or not to spend more time to create a higher-quality simplification with a different algorithm
13
- * @param {boolean} [options.mutate=false] allows GeoJSON input to be mutated (significant performance increase if true)
14
- * @returns {GeoJSON} a simplified GeoJSON
10
+ * @param {number} [options.tolerance=1] Simplification tolerance
11
+ * @param {boolean} [options.highQuality=false] Produce a higher-quality simplification using a slower algorithm
12
+ * @param {boolean} [options.mutate=false] Allow GeoJSON input to be mutated (significant performance improvement if true)
13
+ * @returns {GeoJSON} Simplified GeoJSON
15
14
  * @example
16
- * var geojson = turf.polygon([[
15
+ * const geojson = turf.polygon([[
17
16
  * [-70.603637, -33.399918],
18
17
  * [-70.614624, -33.395332],
19
18
  * [-70.639343, -33.392466],
@@ -35,11 +34,11 @@ import { AllGeoJSON } from '@turf/helpers';
35
34
  * [-70.594711, -33.406224],
36
35
  * [-70.603637, -33.399918]
37
36
  * ]]);
38
- * var options = {tolerance: 0.01, highQuality: false};
39
- * var simplified = turf.simplify(geojson, options);
37
+ * const result0_01 = turf.simplify(geojson, {tolerance: 0.01 });
38
+ * const result0_005 = turf.simplify(geojson, {tolerance: 0.005 });
40
39
  *
41
40
  * //addToMap
42
- * var addToMap = [geojson, simplified]
41
+ * const addToMap = [geojson, result0_01, result0_005]
43
42
  */
44
43
  declare function simplify<T extends AllGeoJSON>(geojson: T, options?: {
45
44
  tolerance?: number;
package/dist/esm/index.js CHANGED
@@ -34,8 +34,7 @@ function simplifyRadialDist(points, sqTolerance) {
34
34
  prevPoint = point;
35
35
  }
36
36
  }
37
- if (prevPoint !== point)
38
- newPoints.push(point);
37
+ if (prevPoint !== point) newPoints.push(point);
39
38
  return newPoints;
40
39
  }
41
40
  function simplifyDPStep(points, first, last, sqTolerance, simplified) {
@@ -63,8 +62,7 @@ function simplifyDouglasPeucker(points, sqTolerance) {
63
62
  return simplified;
64
63
  }
65
64
  function simplify(points, tolerance, highestQuality) {
66
- if (points.length <= 2)
67
- return points;
65
+ if (points.length <= 2) return points;
68
66
  var sqTolerance = tolerance !== void 0 ? tolerance * tolerance : 1;
69
67
  points = highestQuality ? points : simplifyRadialDist(points, sqTolerance);
70
68
  points = simplifyDouglasPeucker(points, sqTolerance);
@@ -75,17 +73,13 @@ function simplify(points, tolerance, highestQuality) {
75
73
  function simplify2(geojson, options = {}) {
76
74
  var _a, _b, _c;
77
75
  options = options != null ? options : {};
78
- if (!isObject(options))
79
- throw new Error("options is invalid");
76
+ if (!isObject(options)) throw new Error("options is invalid");
80
77
  const tolerance = (_a = options.tolerance) != null ? _a : 1;
81
78
  const highQuality = (_b = options.highQuality) != null ? _b : false;
82
79
  const mutate = (_c = options.mutate) != null ? _c : false;
83
- if (!geojson)
84
- throw new Error("geojson is required");
85
- if (tolerance && tolerance < 0)
86
- throw new Error("invalid tolerance");
87
- if (mutate !== true)
88
- geojson = clone(geojson);
80
+ if (!geojson) throw new Error("geojson is required");
81
+ if (tolerance && tolerance < 0) throw new Error("invalid tolerance");
82
+ if (mutate !== true) geojson = clone(geojson);
89
83
  geomEach(geojson, function(geom) {
90
84
  simplifyGeom(geom, tolerance, highQuality);
91
85
  });
@@ -93,8 +87,7 @@ function simplify2(geojson, options = {}) {
93
87
  }
94
88
  function simplifyGeom(geometry, tolerance, highQuality) {
95
89
  const type = geometry.type;
96
- if (type === "Point" || type === "MultiPoint")
97
- return geometry;
90
+ if (type === "Point" || type === "MultiPoint") return geometry;
98
91
  cleanCoords(geometry, { mutate: true });
99
92
  if (type !== "GeometryCollection") {
100
93
  switch (type) {
@@ -132,10 +125,13 @@ function simplifyPolygon(coordinates, tolerance, highQuality) {
132
125
  }
133
126
  let ringTolerance = tolerance;
134
127
  let simpleRing = simplify(ring, ringTolerance, highQuality);
135
- while (!checkValidity(simpleRing)) {
128
+ while (!checkValidity(simpleRing) && ringTolerance >= Number.EPSILON) {
136
129
  ringTolerance -= ringTolerance * 0.01;
137
130
  simpleRing = simplify(ring, ringTolerance, highQuality);
138
131
  }
132
+ if (!checkValidity(simpleRing)) {
133
+ return ring;
134
+ }
139
135
  if (simpleRing[simpleRing.length - 1][0] !== simpleRing[0][0] || simpleRing[simpleRing.length - 1][1] !== simpleRing[0][1]) {
140
136
  simpleRing.push(simpleRing[0]);
141
137
  }
@@ -143,13 +139,12 @@ function simplifyPolygon(coordinates, tolerance, highQuality) {
143
139
  });
144
140
  }
145
141
  function checkValidity(ring) {
146
- if (ring.length < 3)
147
- return false;
142
+ if (ring.length < 3) return false;
148
143
  return !(ring.length === 3 && ring[2][0] === ring[0][0] && ring[2][1] === ring[0][1]);
149
144
  }
150
- var turf_simplify_default = simplify2;
145
+ var index_default = simplify2;
151
146
  export {
152
- turf_simplify_default as default,
147
+ index_default as default,
153
148
  simplify2 as simplify
154
149
  };
155
150
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../index.ts","../../lib/simplify.js"],"sourcesContent":["import { Geometry, Position } from \"geojson\";\nimport { cleanCoords } from \"@turf/clean-coords\";\nimport { clone } from \"@turf/clone\";\nimport { geomEach } from \"@turf/meta\";\nimport { AllGeoJSON, isObject } from \"@turf/helpers\";\nimport { simplify as simplifyJS } from \"./lib/simplify.js\";\n\n/**\n * Takes a {@link GeoJSON} object and returns a simplified version. Internally uses the 2d version of\n * [simplify-js](http://mourner.github.io/simplify-js/) to perform simplification using the Ramer-Douglas-Peucker algorithm.\n *\n *\n * @name simplify\n * @param {GeoJSON} geojson object to be simplified\n * @param {Object} [options={}] Optional parameters\n * @param {number} [options.tolerance=1] simplification tolerance\n * @param {boolean} [options.highQuality=false] whether or not to spend more time to create a higher-quality simplification with a different algorithm\n * @param {boolean} [options.mutate=false] allows GeoJSON input to be mutated (significant performance increase if true)\n * @returns {GeoJSON} a simplified GeoJSON\n * @example\n * var geojson = turf.polygon([[\n * [-70.603637, -33.399918],\n * [-70.614624, -33.395332],\n * [-70.639343, -33.392466],\n * [-70.659942, -33.394759],\n * [-70.683975, -33.404504],\n * [-70.697021, -33.419406],\n * [-70.701141, -33.434306],\n * [-70.700454, -33.446339],\n * [-70.694274, -33.458369],\n * [-70.682601, -33.465816],\n * [-70.668869, -33.472117],\n * [-70.646209, -33.473835],\n * [-70.624923, -33.472117],\n * [-70.609817, -33.468107],\n * [-70.595397, -33.458369],\n * [-70.587158, -33.442901],\n * [-70.587158, -33.426283],\n * [-70.590591, -33.414248],\n * [-70.594711, -33.406224],\n * [-70.603637, -33.399918]\n * ]]);\n * var options = {tolerance: 0.01, highQuality: false};\n * var simplified = turf.simplify(geojson, options);\n *\n * //addToMap\n * var addToMap = [geojson, simplified]\n */\nfunction simplify<T extends AllGeoJSON>(\n geojson: T,\n options: {\n tolerance?: number;\n highQuality?: boolean;\n mutate?: boolean;\n } = {}\n): T {\n // Optional parameters\n options = options ?? {};\n if (!isObject(options)) throw new Error(\"options is invalid\");\n const tolerance = options.tolerance ?? 1;\n const highQuality = options.highQuality ?? false;\n const mutate = options.mutate ?? false;\n\n if (!geojson) throw new Error(\"geojson is required\");\n if (tolerance && tolerance < 0) throw new Error(\"invalid tolerance\");\n\n // Clone geojson to avoid side effects\n if (mutate !== true) geojson = clone(geojson);\n\n geomEach(geojson, function (geom) {\n simplifyGeom(geom, tolerance, highQuality);\n });\n return geojson;\n}\n\n/**\n * Simplifies a feature's coordinates\n *\n * @private\n * @param {Geometry} geometry to be simplified\n * @param {number} [tolerance=1] simplification tolerance\n * @param {boolean} [highQuality=false] whether or not to spend more time to create a higher-quality simplification with a different algorithm\n * @returns {Geometry} output\n */\nfunction simplifyGeom(\n geometry: Geometry,\n tolerance: number,\n highQuality: boolean\n) {\n const type = geometry.type;\n\n // \"unsimplyfiable\" geometry types\n if (type === \"Point\" || type === \"MultiPoint\") return geometry;\n\n // Remove any extra coordinates\n cleanCoords(geometry, { mutate: true });\n\n if (type !== \"GeometryCollection\") {\n // TODO should this cater for GeometryCollections too?\n switch (type) {\n case \"LineString\":\n geometry.coordinates = simplifyJS(\n geometry.coordinates,\n tolerance,\n highQuality\n );\n break;\n case \"MultiLineString\":\n geometry.coordinates = geometry.coordinates.map((lines) =>\n simplifyJS(lines, tolerance, highQuality)\n );\n break;\n case \"Polygon\":\n geometry.coordinates = simplifyPolygon(\n geometry.coordinates,\n tolerance,\n highQuality\n );\n break;\n case \"MultiPolygon\":\n geometry.coordinates = geometry.coordinates.map((rings) =>\n simplifyPolygon(rings, tolerance, highQuality)\n );\n }\n }\n\n return geometry;\n}\n\n/**\n * Simplifies the coordinates of a Polygon with simplify-js\n *\n * @private\n * @param {Array<number>} coordinates to be processed\n * @param {number} tolerance simplification tolerance\n * @param {boolean} highQuality whether or not to spend more time to create a higher-quality\n * @returns {Array<Array<Array<number>>>} simplified coords\n */\nfunction simplifyPolygon(\n coordinates: Position[][],\n tolerance: number,\n highQuality: boolean\n) {\n return coordinates.map(function (ring) {\n if (ring.length < 4) {\n throw new Error(\"invalid polygon\");\n }\n let ringTolerance = tolerance;\n let simpleRing = simplifyJS(ring, ringTolerance, highQuality);\n // remove 1 percent of tolerance until enough points to make a triangle\n while (!checkValidity(simpleRing)) {\n ringTolerance -= ringTolerance * 0.01;\n simpleRing = simplifyJS(ring, ringTolerance, highQuality);\n }\n if (\n simpleRing[simpleRing.length - 1][0] !== simpleRing[0][0] ||\n simpleRing[simpleRing.length - 1][1] !== simpleRing[0][1]\n ) {\n simpleRing.push(simpleRing[0]);\n }\n return simpleRing;\n });\n}\n\n/**\n * Returns true if ring has at least 3 coordinates and its first coordinate is the same as its last\n *\n * @private\n * @param {Array<number>} ring coordinates to be checked\n * @returns {boolean} true if valid\n */\nfunction checkValidity(ring: Position[]) {\n if (ring.length < 3) return false;\n //if the last point is the same as the first, it's not a triangle\n return !(\n ring.length === 3 &&\n ring[2][0] === ring[0][0] &&\n ring[2][1] === ring[0][1]\n );\n}\n\nexport { simplify };\nexport default simplify;\n","/*\n (c) 2013, Vladimir Agafonkin\n Simplify.js, a high-performance JS polyline simplification library\n mourner.github.io/simplify-js\n*/\n\n// to suit your point format, run search/replace for '.x' and '.y';\n// for 3D version, see 3d branch (configurability would draw significant performance overhead)\n\n// square distance between 2 points\nfunction getSqDist(p1, p2) {\n var dx = p1[0] - p2[0],\n dy = p1[1] - p2[1];\n\n return dx * dx + dy * dy;\n}\n\n// square distance from a point to a segment\nfunction getSqSegDist(p, p1, p2) {\n var x = p1[0],\n y = p1[1],\n dx = p2[0] - x,\n dy = p2[1] - y;\n\n if (dx !== 0 || dy !== 0) {\n var t = ((p[0] - x) * dx + (p[1] - y) * dy) / (dx * dx + dy * dy);\n\n if (t > 1) {\n x = p2[0];\n y = p2[1];\n } else if (t > 0) {\n x += dx * t;\n y += dy * t;\n }\n }\n\n dx = p[0] - x;\n dy = p[1] - y;\n\n return dx * dx + dy * dy;\n}\n// rest of the code doesn't care about point format\n\n// basic distance-based simplification\nfunction simplifyRadialDist(points, sqTolerance) {\n var prevPoint = points[0],\n newPoints = [prevPoint],\n point;\n\n for (var i = 1, len = points.length; i < len; i++) {\n point = points[i];\n\n if (getSqDist(point, prevPoint) > sqTolerance) {\n newPoints.push(point);\n prevPoint = point;\n }\n }\n\n if (prevPoint !== point) newPoints.push(point);\n\n return newPoints;\n}\n\nfunction simplifyDPStep(points, first, last, sqTolerance, simplified) {\n var maxSqDist = sqTolerance,\n index;\n\n for (var i = first + 1; i < last; i++) {\n var sqDist = getSqSegDist(points[i], points[first], points[last]);\n\n if (sqDist > maxSqDist) {\n index = i;\n maxSqDist = sqDist;\n }\n }\n\n if (maxSqDist > sqTolerance) {\n if (index - first > 1)\n simplifyDPStep(points, first, index, sqTolerance, simplified);\n simplified.push(points[index]);\n if (last - index > 1)\n simplifyDPStep(points, index, last, sqTolerance, simplified);\n }\n}\n\n// simplification using Ramer-Douglas-Peucker algorithm\nfunction simplifyDouglasPeucker(points, sqTolerance) {\n var last = points.length - 1;\n\n var simplified = [points[0]];\n simplifyDPStep(points, 0, last, sqTolerance, simplified);\n simplified.push(points[last]);\n\n return simplified;\n}\n\n// both algorithms combined for awesome performance\nfunction simplify(points, tolerance, highestQuality) {\n if (points.length <= 2) return points;\n\n var sqTolerance = tolerance !== undefined ? tolerance * tolerance : 1;\n\n points = highestQuality ? points : simplifyRadialDist(points, sqTolerance);\n points = simplifyDouglasPeucker(points, sqTolerance);\n\n return points;\n}\n\nexport { simplify };\nexport default simplify;\n"],"mappings":"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","names":["simplify","simplify"]}
1
+ {"version":3,"sources":["../../index.ts","../../lib/simplify.js"],"sourcesContent":["import { Geometry, Position } from \"geojson\";\nimport { cleanCoords } from \"@turf/clean-coords\";\nimport { clone } from \"@turf/clone\";\nimport { geomEach } from \"@turf/meta\";\nimport { AllGeoJSON, isObject } from \"@turf/helpers\";\nimport { simplify as simplifyJS } from \"./lib/simplify.js\";\n\n/**\n * Simplifies the geometries in a GeoJSON object. Uses the 2d version of\n * [simplify-js](https://mourner.github.io/simplify-js/).\n *\n * @function\n * @param {GeoJSON} geojson GeoJSON object to be simplified\n * @param {Object} [options={}] Optional parameters\n * @param {number} [options.tolerance=1] Simplification tolerance\n * @param {boolean} [options.highQuality=false] Produce a higher-quality simplification using a slower algorithm\n * @param {boolean} [options.mutate=false] Allow GeoJSON input to be mutated (significant performance improvement if true)\n * @returns {GeoJSON} Simplified GeoJSON\n * @example\n * const geojson = turf.polygon([[\n * [-70.603637, -33.399918],\n * [-70.614624, -33.395332],\n * [-70.639343, -33.392466],\n * [-70.659942, -33.394759],\n * [-70.683975, -33.404504],\n * [-70.697021, -33.419406],\n * [-70.701141, -33.434306],\n * [-70.700454, -33.446339],\n * [-70.694274, -33.458369],\n * [-70.682601, -33.465816],\n * [-70.668869, -33.472117],\n * [-70.646209, -33.473835],\n * [-70.624923, -33.472117],\n * [-70.609817, -33.468107],\n * [-70.595397, -33.458369],\n * [-70.587158, -33.442901],\n * [-70.587158, -33.426283],\n * [-70.590591, -33.414248],\n * [-70.594711, -33.406224],\n * [-70.603637, -33.399918]\n * ]]);\n * const result0_01 = turf.simplify(geojson, {tolerance: 0.01 });\n * const result0_005 = turf.simplify(geojson, {tolerance: 0.005 });\n *\n * //addToMap\n * const addToMap = [geojson, result0_01, result0_005]\n */\nfunction simplify<T extends AllGeoJSON>(\n geojson: T,\n options: {\n tolerance?: number;\n highQuality?: boolean;\n mutate?: boolean;\n } = {}\n): T {\n // Optional parameters\n options = options ?? {};\n if (!isObject(options)) throw new Error(\"options is invalid\");\n const tolerance = options.tolerance ?? 1;\n const highQuality = options.highQuality ?? false;\n const mutate = options.mutate ?? false;\n\n if (!geojson) throw new Error(\"geojson is required\");\n if (tolerance && tolerance < 0) throw new Error(\"invalid tolerance\");\n\n // Clone geojson to avoid side effects\n if (mutate !== true) geojson = clone(geojson);\n\n geomEach(geojson, function (geom) {\n simplifyGeom(geom, tolerance, highQuality);\n });\n return geojson;\n}\n\n/**\n * Simplifies a feature's coordinates\n *\n * @private\n * @param {Geometry} geometry to be simplified\n * @param {number} [tolerance=1] simplification tolerance\n * @param {boolean} [highQuality=false] whether or not to spend more time to create a higher-quality simplification with a different algorithm\n * @returns {Geometry} output\n */\nfunction simplifyGeom(\n geometry: Geometry,\n tolerance: number,\n highQuality: boolean\n) {\n const type = geometry.type;\n\n // \"unsimplyfiable\" geometry types\n if (type === \"Point\" || type === \"MultiPoint\") return geometry;\n\n // Remove any extra coordinates\n cleanCoords(geometry, { mutate: true });\n\n if (type !== \"GeometryCollection\") {\n // TODO should this cater for GeometryCollections too?\n switch (type) {\n case \"LineString\":\n geometry.coordinates = simplifyJS(\n geometry.coordinates,\n tolerance,\n highQuality\n );\n break;\n case \"MultiLineString\":\n geometry.coordinates = geometry.coordinates.map((lines) =>\n simplifyJS(lines, tolerance, highQuality)\n );\n break;\n case \"Polygon\":\n geometry.coordinates = simplifyPolygon(\n geometry.coordinates,\n tolerance,\n highQuality\n );\n break;\n case \"MultiPolygon\":\n geometry.coordinates = geometry.coordinates.map((rings) =>\n simplifyPolygon(rings, tolerance, highQuality)\n );\n }\n }\n\n return geometry;\n}\n\n/**\n * Simplifies the coordinates of a Polygon with simplify-js\n *\n * @private\n * @param {Array<number>} coordinates to be processed\n * @param {number} tolerance simplification tolerance\n * @param {boolean} highQuality whether or not to spend more time to create a higher-quality\n * @returns {Array<Array<Array<number>>>} simplified coords\n */\nfunction simplifyPolygon(\n coordinates: Position[][],\n tolerance: number,\n highQuality: boolean\n) {\n return coordinates.map(function (ring) {\n if (ring.length < 4) {\n throw new Error(\"invalid polygon\");\n }\n let ringTolerance = tolerance;\n let simpleRing = simplifyJS(ring, ringTolerance, highQuality);\n\n // If simplified ring isn't valid (has been over simplified) reduce the\n // tolerance by 1% and try again.\n while (!checkValidity(simpleRing) && ringTolerance >= Number.EPSILON) {\n ringTolerance -= ringTolerance * 0.01;\n simpleRing = simplifyJS(ring, ringTolerance, highQuality);\n }\n\n // If ring wasn't able to be simplified in a valid way, return it unchanged.\n if (!checkValidity(simpleRing)) {\n return ring;\n }\n\n // Close the ring if it wasn't already.\n if (\n simpleRing[simpleRing.length - 1][0] !== simpleRing[0][0] ||\n simpleRing[simpleRing.length - 1][1] !== simpleRing[0][1]\n ) {\n simpleRing.push(simpleRing[0]);\n }\n return simpleRing;\n });\n}\n\n/**\n * Returns true if ring has at least 3 coordinates and its first coordinate is the same as its last\n *\n * @private\n * @param {Array<number>} ring coordinates to be checked\n * @returns {boolean} true if valid\n */\nfunction checkValidity(ring: Position[]) {\n if (ring.length < 3) return false;\n //if the last point is the same as the first, it's not a triangle\n return !(\n ring.length === 3 &&\n ring[2][0] === ring[0][0] &&\n ring[2][1] === ring[0][1]\n );\n}\n\nexport { simplify };\nexport default simplify;\n","/*\n (c) 2013, Vladimir Agafonkin\n Simplify.js, a high-performance JS polyline simplification library\n mourner.github.io/simplify-js\n*/\n\n// to suit your point format, run search/replace for '.x' and '.y';\n// for 3D version, see 3d branch (configurability would draw significant performance overhead)\n\n// square distance between 2 points\nfunction getSqDist(p1, p2) {\n var dx = p1[0] - p2[0],\n dy = p1[1] - p2[1];\n\n return dx * dx + dy * dy;\n}\n\n// square distance from a point to a segment\nfunction getSqSegDist(p, p1, p2) {\n var x = p1[0],\n y = p1[1],\n dx = p2[0] - x,\n dy = p2[1] - y;\n\n if (dx !== 0 || dy !== 0) {\n var t = ((p[0] - x) * dx + (p[1] - y) * dy) / (dx * dx + dy * dy);\n\n if (t > 1) {\n x = p2[0];\n y = p2[1];\n } else if (t > 0) {\n x += dx * t;\n y += dy * t;\n }\n }\n\n dx = p[0] - x;\n dy = p[1] - y;\n\n return dx * dx + dy * dy;\n}\n// rest of the code doesn't care about point format\n\n// basic distance-based simplification\nfunction simplifyRadialDist(points, sqTolerance) {\n var prevPoint = points[0],\n newPoints = [prevPoint],\n point;\n\n for (var i = 1, len = points.length; i < len; i++) {\n point = points[i];\n\n if (getSqDist(point, prevPoint) > sqTolerance) {\n newPoints.push(point);\n prevPoint = point;\n }\n }\n\n if (prevPoint !== point) newPoints.push(point);\n\n return newPoints;\n}\n\nfunction simplifyDPStep(points, first, last, sqTolerance, simplified) {\n var maxSqDist = sqTolerance,\n index;\n\n for (var i = first + 1; i < last; i++) {\n var sqDist = getSqSegDist(points[i], points[first], points[last]);\n\n if (sqDist > maxSqDist) {\n index = i;\n maxSqDist = sqDist;\n }\n }\n\n if (maxSqDist > sqTolerance) {\n if (index - first > 1)\n simplifyDPStep(points, first, index, sqTolerance, simplified);\n simplified.push(points[index]);\n if (last - index > 1)\n simplifyDPStep(points, index, last, sqTolerance, simplified);\n }\n}\n\n// simplification using Ramer-Douglas-Peucker algorithm\nfunction simplifyDouglasPeucker(points, sqTolerance) {\n var last = points.length - 1;\n\n var simplified = [points[0]];\n simplifyDPStep(points, 0, last, sqTolerance, simplified);\n simplified.push(points[last]);\n\n return simplified;\n}\n\n// both algorithms combined for awesome performance\nfunction simplify(points, tolerance, highestQuality) {\n if (points.length <= 2) return points;\n\n var sqTolerance = tolerance !== undefined ? tolerance * tolerance : 1;\n\n points = highestQuality ? points : simplifyRadialDist(points, sqTolerance);\n points = simplifyDouglasPeucker(points, sqTolerance);\n\n return points;\n}\n\nexport { simplify };\nexport default simplify;\n"],"mappings":"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","names":["simplify","simplify"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@turf/simplify",
3
- "version": "7.1.0",
4
- "description": "turf simplify module",
3
+ "version": "7.3.0",
4
+ "description": "Reduces the number of points in a shape while keeping its overall look.",
5
5
  "author": "Turf Authors",
6
6
  "contributors": [
7
7
  "Vladimir Agafonkin <@mourner>",
@@ -58,25 +58,25 @@
58
58
  "test:types": "tsc --esModuleInterop --module node16 --moduleResolution node16 --noEmit --strict types.ts"
59
59
  },
60
60
  "devDependencies": {
61
- "@turf/truncate": "^7.1.0",
61
+ "@turf/truncate": "7.3.0",
62
62
  "@types/benchmark": "^2.1.5",
63
- "@types/tape": "^4.2.32",
63
+ "@types/tape": "^5.8.1",
64
64
  "benchmark": "^2.1.4",
65
65
  "load-json-file": "^7.0.1",
66
66
  "npm-run-all": "^4.1.5",
67
- "tape": "^5.7.2",
68
- "tsup": "^8.0.1",
69
- "tsx": "^4.6.2",
70
- "typescript": "^5.2.2",
71
- "write-json-file": "^5.0.0"
67
+ "tape": "^5.9.0",
68
+ "tsup": "^8.4.0",
69
+ "tsx": "^4.19.4",
70
+ "typescript": "^5.8.3",
71
+ "write-json-file": "^6.0.0"
72
72
  },
73
73
  "dependencies": {
74
- "@turf/clean-coords": "^7.1.0",
75
- "@turf/clone": "^7.1.0",
76
- "@turf/helpers": "^7.1.0",
77
- "@turf/meta": "^7.1.0",
74
+ "@turf/clean-coords": "7.3.0",
75
+ "@turf/clone": "7.3.0",
76
+ "@turf/helpers": "7.3.0",
77
+ "@turf/meta": "7.3.0",
78
78
  "@types/geojson": "^7946.0.10",
79
- "tslib": "^2.6.2"
79
+ "tslib": "^2.8.1"
80
80
  },
81
- "gitHead": "68915eeebc9278bb40dec3f1034499698a0561ef"
81
+ "gitHead": "9f58a103e8f9a587ab640307ed03ba5233913ddd"
82
82
  }