{"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 * @function\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(\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} 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>>} 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} 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":";AACA,SAAS,mBAAmB;AAC5B,SAAS,aAAa;AACtB,SAAS,gBAAgB;AACzB,SAAqB,gBAAgB;;;ACMrC,SAAS,UAAU,IAAI,IAAI;AACzB,MAAI,KAAK,GAAG,CAAC,IAAI,GAAG,CAAC,GACnB,KAAK,GAAG,CAAC,IAAI,GAAG,CAAC;AAEnB,SAAO,KAAK,KAAK,KAAK;AACxB;AAGA,SAAS,aAAa,GAAG,IAAI,IAAI;AAC/B,MAAI,IAAI,GAAG,CAAC,GACV,IAAI,GAAG,CAAC,GACR,KAAK,GAAG,CAAC,IAAI,GACb,KAAK,GAAG,CAAC,IAAI;AAEf,MAAI,OAAO,KAAK,OAAO,GAAG;AACxB,QAAI,MAAM,EAAE,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC,IAAI,KAAK,OAAO,KAAK,KAAK,KAAK;AAE9D,QAAI,IAAI,GAAG;AACT,UAAI,GAAG,CAAC;AACR,UAAI,GAAG,CAAC;AAAA,IACV,WAAW,IAAI,GAAG;AAChB,WAAK,KAAK;AACV,WAAK,KAAK;AAAA,IACZ;AAAA,EACF;AAEA,OAAK,EAAE,CAAC,IAAI;AACZ,OAAK,EAAE,CAAC,IAAI;AAEZ,SAAO,KAAK,KAAK,KAAK;AACxB;AAIA,SAAS,mBAAmB,QAAQ,aAAa;AAC/C,MAAI,YAAY,OAAO,CAAC,GACtB,YAAY,CAAC,SAAS,GACtB;AAEF,WAAS,IAAI,GAAG,MAAM,OAAO,QAAQ,IAAI,KAAK,KAAK;AACjD,YAAQ,OAAO,CAAC;AAEhB,QAAI,UAAU,OAAO,SAAS,IAAI,aAAa;AAC7C,gBAAU,KAAK,KAAK;AACpB,kBAAY;AAAA,IACd;AAAA,EACF;AAEA,MAAI,cAAc,MAAO,WAAU,KAAK,KAAK;AAE7C,SAAO;AACT;AAEA,SAAS,eAAe,QAAQ,OAAO,MAAM,aAAa,YAAY;AACpE,MAAI,YAAY,aACd;AAEF,WAAS,IAAI,QAAQ,GAAG,IAAI,MAAM,KAAK;AACrC,QAAI,SAAS,aAAa,OAAO,CAAC,GAAG,OAAO,KAAK,GAAG,OAAO,IAAI,CAAC;AAEhE,QAAI,SAAS,WAAW;AACtB,cAAQ;AACR,kBAAY;AAAA,IACd;AAAA,EACF;AAEA,MAAI,YAAY,aAAa;AAC3B,QAAI,QAAQ,QAAQ;AAClB,qBAAe,QAAQ,OAAO,OAAO,aAAa,UAAU;AAC9D,eAAW,KAAK,OAAO,KAAK,CAAC;AAC7B,QAAI,OAAO,QAAQ;AACjB,qBAAe,QAAQ,OAAO,MAAM,aAAa,UAAU;AAAA,EAC/D;AACF;AAGA,SAAS,uBAAuB,QAAQ,aAAa;AACnD,MAAI,OAAO,OAAO,SAAS;AAE3B,MAAI,aAAa,CAAC,OAAO,CAAC,CAAC;AAC3B,iBAAe,QAAQ,GAAG,MAAM,aAAa,UAAU;AACvD,aAAW,KAAK,OAAO,IAAI,CAAC;AAE5B,SAAO;AACT;AAGA,SAAS,SAAS,QAAQ,WAAW,gBAAgB;AACnD,MAAI,OAAO,UAAU,EAAG,QAAO;AAE/B,MAAI,cAAc,cAAc,SAAY,YAAY,YAAY;AAEpE,WAAS,iBAAiB,SAAS,mBAAmB,QAAQ,WAAW;AACzE,WAAS,uBAAuB,QAAQ,WAAW;AAEnD,SAAO;AACT;;;AD1DA,SAASA,UACP,SACA,UAII,CAAC,GACF;AAvDL;AAyDE,YAAU,4BAAW,CAAC;AACtB,MAAI,CAAC,SAAS,OAAO,EAAG,OAAM,IAAI,MAAM,oBAAoB;AAC5D,QAAM,aAAY,aAAQ,cAAR,YAAqB;AACvC,QAAM,eAAc,aAAQ,gBAAR,YAAuB;AAC3C,QAAM,UAAS,aAAQ,WAAR,YAAkB;AAEjC,MAAI,CAAC,QAAS,OAAM,IAAI,MAAM,qBAAqB;AACnD,MAAI,aAAa,YAAY,EAAG,OAAM,IAAI,MAAM,mBAAmB;AAGnE,MAAI,WAAW,KAAM,WAAU,MAAM,OAAO;AAE5C,WAAS,SAAS,SAAU,MAAM;AAChC,iBAAa,MAAM,WAAW,WAAW;AAAA,EAC3C,CAAC;AACD,SAAO;AACT;AAWA,SAAS,aACP,UACA,WACA,aACA;AACA,QAAM,OAAO,SAAS;AAGtB,MAAI,SAAS,WAAW,SAAS,aAAc,QAAO;AAGtD,cAAY,UAAU,EAAE,QAAQ,KAAK,CAAC;AAEtC,MAAI,SAAS,sBAAsB;AAEjC,YAAQ,MAAM;AAAA,MACZ,KAAK;AACH,iBAAS,cAAc;AAAA,UACrB,SAAS;AAAA,UACT;AAAA,UACA;AAAA,QACF;AACA;AAAA,MACF,KAAK;AACH,iBAAS,cAAc,SAAS,YAAY;AAAA,UAAI,CAAC,UAC/C,SAAW,OAAO,WAAW,WAAW;AAAA,QAC1C;AACA;AAAA,MACF,KAAK;AACH,iBAAS,cAAc;AAAA,UACrB,SAAS;AAAA,UACT;AAAA,UACA;AAAA,QACF;AACA;AAAA,MACF,KAAK;AACH,iBAAS,cAAc,SAAS,YAAY;AAAA,UAAI,CAAC,UAC/C,gBAAgB,OAAO,WAAW,WAAW;AAAA,QAC/C;AAAA,IACJ;AAAA,EACF;AAEA,SAAO;AACT;AAWA,SAAS,gBACP,aACA,WACA,aACA;AACA,SAAO,YAAY,IAAI,SAAU,MAAM;AACrC,QAAI,KAAK,SAAS,GAAG;AACnB,YAAM,IAAI,MAAM,iBAAiB;AAAA,IACnC;AACA,QAAI,gBAAgB;AACpB,QAAI,aAAa,SAAW,MAAM,eAAe,WAAW;AAE5D,WAAO,CAAC,cAAc,UAAU,GAAG;AACjC,uBAAiB,gBAAgB;AACjC,mBAAa,SAAW,MAAM,eAAe,WAAW;AAAA,IAC1D;AACA,QACE,WAAW,WAAW,SAAS,CAAC,EAAE,CAAC,MAAM,WAAW,CAAC,EAAE,CAAC,KACxD,WAAW,WAAW,SAAS,CAAC,EAAE,CAAC,MAAM,WAAW,CAAC,EAAE,CAAC,GACxD;AACA,iBAAW,KAAK,WAAW,CAAC,CAAC;AAAA,IAC/B;AACA,WAAO;AAAA,EACT,CAAC;AACH;AASA,SAAS,cAAc,MAAkB;AACvC,MAAI,KAAK,SAAS,EAAG,QAAO;AAE5B,SAAO,EACL,KAAK,WAAW,KAChB,KAAK,CAAC,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC,KACxB,KAAK,CAAC,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;AAE5B;AAGA,IAAO,wBAAQC;","names":["simplify","simplify"]}