simplify-geojson-visvalingam 1.3.7 → 1.3.9
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/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var v=Object.defineProperty;var $=Object.getOwnPropertyDescriptor;var q=Object.getOwnPropertyNames;var
|
|
1
|
+
"use strict";var v=Object.defineProperty;var $=Object.getOwnPropertyDescriptor;var q=Object.getOwnPropertyNames;var B=Object.prototype.hasOwnProperty;var T=(e,r)=>{for(var t in r)v(e,t,{get:r[t],enumerable:!0})},X=(e,r,t,n)=>{if(r&&typeof r=="object"||typeof r=="function")for(let u of q(r))!B.call(e,u)&&u!==t&&v(e,u,{get:()=>r[u],enumerable:!(n=$(r,u))||n.enumerable});return e};var _=e=>X(v({},"__esModule",{value:!0}),e);var W={};T(W,{default:()=>Q});module.exports=_(W);function s(e){return e!=null&&Number.isFinite(e)&&e>0}function d(e){return typeof e=="object"&&e!==null}function A(e){return d(e)&&e?.type==="Feature"}function U(e){return d(e)&&e?.type==="FeatureCollection"}function G(e){return d(e)&&e?.type==="LineString"}function O(e){return d(e)&&e?.type==="MultiLineString"}function h(e){return d(e)&&e?.type==="Polygon"}function g(e){return d(e)&&e?.type==="MultiPolygon"}function w(e){return d(e)&&e?.type==="GeometryCollection"}function J(e){let r=new Uint32Array(e.length),t=new Uint32Array(e.length),n=new Uint32Array(e.length),u=new Uint32Array(e.length),l=new Map;for(let f=0;f<e.length;f++){let b=e[f][0],a=e[f][1],c=l.get(b),o;if(c===void 0)o=f,l.set(b,f);else if(typeof c=="number")if(e[c][1]===a)o=c;else{o=f;let y=new Map;y.set(e[c][1],c),y.set(a,f),l.set(b,y)}else{let y=c.get(a);y===void 0?(o=f,c.set(a,f)):o=y}r[f]=o,o===f?(t[o]=1,u[o]=f):(t[o]++,n[u[o]]=f,u[o]=f),n[f]=e.length}return{groupOf:r,groupSize:t,nextInGroup:n}}function F(e,r){return Math.abs(r.coordinates[e][0]*(r.coordinates[r.prevIndexes[e]][1]-r.coordinates[r.nextIndexes[e]][1])+r.coordinates[r.prevIndexes[e]][0]*(r.coordinates[r.nextIndexes[e]][1]-r.coordinates[e][1])+r.coordinates[r.nextIndexes[e]][0]*(r.coordinates[e][1]-r.coordinates[r.prevIndexes[e]][1]))/2}function S(e,r,t,n){return t[e]-t[r]||n[e][0]-n[r][0]||n[e][1]-n[r][1]}function p(e,r,t,n,u){let l=e[t],f,b,a,c;for(;a=t,c=l,(f=t<<1)<=e[0]&&S(c,e[f],n,u)>0&&(a=f,c=e[f]),(b=f+1)<=e[0]&&S(c,e[b],n,u)>0&&(a=b),t!==a;)e[t]=e[a],r[e[t]]=t,t=a;return e[t]=l,r[l]=t,t}function Y(e,r,t,n,u){let l;for(;t>1&&(l=t>>>1,!(t===l||S(e[l],e[t],n,u)<=0));)C(e,r,t,l),t=l;return t}function M(e,r,t,n,u){Y(e,r,p(e,r,r[t],n,u),n,u)}function C(e,r,t,n){r[e[t]]=n,r[e[n]]=t,[e[t],e[n]]=[e[n],e[t]]}function H(e,r,t,n){return e[0]>1?(C(e,r,1,e[0]),e[0]--,p(e,r,1,t,n),e[e[0]+1]):e[0]===1?(e[0]--,e[1]):-1}function K(e,r,t,n){for(let u=e[0]>>>1;u>0;u--)p(e,r,u,t,n)}function L(e,r,t,n){let u=e.coordinates.length,l=new Uint8Array(u),f=Math.round(u*n),b=new Uint32Array(u),a=new Uint8Array(u),c=new Uint32Array(u+1),o=new Float64Array(u),y=new Uint32Array(u);for(let m=0;m<u;m++)e.prevIndexes[m]!==-1&&e.nextIndexes[m]!==-1&&(o[m]=F(m,e),c[0]++,c[c[0]]=m,y[m]=c[0]);K(c,y,o,e.coordinates);let x;for(;c[0];){if(x=H(c,y,o,e.coordinates),l[x])continue;if(o[x]>=t&&f<=0)break;let m=r.groupOf[x];if(a[x]||(a[x]=1,b[m]++),b[m]!==r.groupSize[m])continue;let i=m;for(;i<u;){if(l[i]){i=r.nextInGroup[i];continue}if(e.prevIndexes[i]!==-1&&e.prevIndexes[e.prevIndexes[i]]!==-1&&e.prevIndexes[e.prevIndexes[e.prevIndexes[i]]]===i){if(a[e.prevIndexes[i]]||(a[e.prevIndexes[i]]=1,b[r.groupOf[e.prevIndexes[i]]]++),a[e.nextIndexes[i]]||(a[e.nextIndexes[i]]=1,b[r.groupOf[e.nextIndexes[i]]]++),b[r.groupOf[e.prevIndexes[i]]]===r.groupSize[r.groupOf[e.prevIndexes[i]]]&&b[r.groupOf[e.nextIndexes[i]]]===r.groupSize[r.groupOf[e.nextIndexes[i]]]){l[i]=1,l[e.nextIndexes[i]]=1,l[e.prevIndexes[i]]=1,f-=3,i=m;continue}}else l[i]=1,f--,e.prevIndexes[e.nextIndexes[i]]=e.prevIndexes[i],e.nextIndexes[e.prevIndexes[i]]=e.nextIndexes[i],e.prevIndexes[e.prevIndexes[i]]!==-1&&(o[e.prevIndexes[i]]=F(e.prevIndexes[i],e),M(c,y,e.prevIndexes[i],o,e.coordinates)),e.nextIndexes[e.nextIndexes[i]]!==-1&&(o[e.nextIndexes[i]]=F(e.nextIndexes[i],e),M(c,y,e.nextIndexes[i],o,e.coordinates));i=r.nextInGroup[i]}}return l}function Q(e,r={}){if(!d(e))throw new TypeError(`Expected provided GeoJSON to be an object, but received ${e===null?"null":typeof e}.`);let t=0;if(r.tolerance!==void 0){if(!s(r.tolerance))throw new Error(`Expected provided tolerance to be a finite positive number, but received ${r.tolerance}.`);t=r.tolerance}let n=0;if(r.fraction!==void 0){if(!s(r.fraction))throw new Error(`Expected provided fraction to be a finite positive number, but received ${r.fraction}.`);if(r.fraction>1)throw new Error(`Expected provided fraction to be less or equal to 1, but received ${r.fraction}.`);n=r.fraction}let u=!0;if(r.mutate!==void 0&&(u=!!r.mutate),t===0&&n===0)return e;u||(e=structuredClone(e));let l={coordinates:[],nextIndexes:[],prevIndexes:[]};return P(e,l),l.coordinates.length&&I(e,L(l,J(l.coordinates),t,n),0),e}function I(e,r,t){if(U(e))for(let n=0;n<e.features.length;n++)t=I(e.features[n],r,t);else if(A(e))t=I(e.geometry,r,t);else if(w(e))for(let n=0;n<e.geometries.length;n++)t=I(e.geometries[n],r,t);else if(G(e))t=E(e.coordinates,r,t);else if(O(e))for(let n=0;n<e.coordinates.length;n++)t=E(e.coordinates[n],r,t);else if(h(e)){let n=!1;[t,n]=N(e.coordinates,r,t),n&&e.coordinates.splice(0)}else if(g(e)){let n=0;for(let u=!1,l=0;l<e.coordinates.length;l++)[t,u]=N(e.coordinates[l],r,t),u?n++:n&&(e.coordinates[l-n]=e.coordinates[l]);n&&e.coordinates.splice(e.coordinates.length-n)}return t}function E(e,r,t){let n=0;for(let u=0;u<e.length;u++)r[t]?n++:n&&(e[u-n]=e[u]),t++;return n&&e.splice(e.length-n),t}function N(e,r,t){let n=0;for(let u=!1,l=0;l<e.length;l++)if([t,u]=V(e[l],r,t),u){if(l===0){for(l=1;l<e.length;l++)e[l].length&&(t+=e[l].length-1);return[t,!0]}n++}else n&&(e[l-n]=e[l]);return n&&e.splice(e.length-n),[t,!1]}function V(e,r,t){let n=0;for(let u=0;u<e.length-1;u++)r[t]?n++:n&&(e[u-n]=e[u]),t++;if(n){if(e.length-1-n<3)return[t,!0];e.splice(e.length-1-n,n+1,e[0])}return[t,!1]}function P(e,r){if(U(e))for(let t=0;t<e.features.length;t++)P(e.features[t],r);else if(A(e))P(e.geometry,r);else if(w(e))for(let t=0;t<e.geometries.length;t++)P(e.geometries[t],r);else if(G(e))k(e.coordinates,r);else if(O(e))for(let t=0;t<e.coordinates.length;t++)k(e.coordinates[t],r);else if(h(e))for(let t=0;t<e.coordinates.length;t++)z(e.coordinates[t],r);else if(g(e))for(let t,n=0;n<e.coordinates.length;n++)for(t=0;t<e.coordinates[n].length;t++)z(e.coordinates[n][t],r)}function k(e,r){for(let t=r.coordinates.length,n=e.length,u=0;u<n;u++)r.coordinates.push(e[u]),r.prevIndexes.push(u===0?-1:t+u-1),r.nextIndexes.push(u===n-1?-1:t+u+1)}function z(e,r){for(let t=r.coordinates.length,n=e.length-1,u=0;u<n;u++)r.coordinates.push(e[u]),r.prevIndexes.push(u===0?t+n-1:t+u-1),r.nextIndexes.push(u===n-1?t:t+u+1)}
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/lib/typeGuards.ts","../src/lib/functions.ts"],"sourcesContent":["import { GeoJsonObject, Position } from 'geojson'\nimport {\n isObject,\n isFinitePositiveNumber,\n isFeature,\n isFeatureCollection,\n isLineString,\n isMultiLineString,\n isPolygon,\n isMultiPolygon,\n isGeometryCollection,\n} from '@lib/typeGuards'\nimport { deletePositions, groupPositions, type Positions } from '@lib/functions'\n\nexport type SimplifyOptions = {\n tolerance?: number\n fraction?: number\n mutate?: boolean\n}\n\nexport default function (geojson: GeoJsonObject, options: SimplifyOptions = {}): GeoJsonObject {\n // validate input data\n if (!isObject(geojson)) {\n throw new TypeError(\n `Expected provided GeoJSON to be an object, but received ${geojson === null ? 'null' : typeof geojson}.`,\n )\n }\n\n // validate options\n let tolerance = 0\n if (options.tolerance !== undefined) {\n if (!isFinitePositiveNumber(options.tolerance)) {\n throw new Error(`Expected provided tolerance to be a finite positive number, but received ${options.tolerance}.`)\n }\n tolerance = options.tolerance\n }\n let fraction = 0\n if (options.fraction !== undefined) {\n if (!isFinitePositiveNumber(options.fraction)) {\n throw new Error(`Expected provided fraction to be a finite positive number, but received ${options.fraction}.`)\n }\n if (options.fraction > 1) {\n throw new Error(`Expected provided fraction to be less or equal to 1, but received ${options.fraction}.`)\n }\n fraction = options.fraction\n }\n let mutate = true\n if (options.mutate !== undefined) {\n mutate = !!options.mutate\n }\n\n // exit if no simplification options provided\n if (tolerance === 0 && fraction === 0) {\n return geojson\n }\n\n if (!mutate) {\n geojson = structuredClone(geojson)\n }\n\n const positions: Positions = {\n coordinates: [],\n nextIndexes: [],\n prevIndexes: [],\n }\n collectPositions(geojson, positions)\n\n if (positions.coordinates.length) {\n updatePositions(geojson, deletePositions(positions, groupPositions(positions.coordinates), tolerance, fraction), 0)\n }\n\n return geojson\n}\nfunction updatePositions(geojson: GeoJsonObject, isDeleted: Uint8Array, index: number): number {\n if (isFeatureCollection(geojson)) {\n for (let i = 0; i < geojson.features.length; i++) {\n index = updatePositions(geojson.features[i], isDeleted, index)\n }\n } else if (isFeature(geojson)) {\n index = updatePositions(geojson.geometry, isDeleted, index)\n } else if (isGeometryCollection(geojson)) {\n for (let i = 0; i < geojson.geometries.length; i++) {\n index = updatePositions(geojson.geometries[i], isDeleted, index)\n }\n } else if (isLineString(geojson)) {\n index = updateLinePositions(geojson.coordinates, isDeleted, index)\n } else if (isMultiLineString(geojson)) {\n for (let i = 0; i < geojson.coordinates.length; i++) {\n index = updateLinePositions(geojson.coordinates[i], isDeleted, index)\n }\n } else if (isPolygon(geojson)) {\n let remove = false\n ;[index, remove] = updateRingsPositions(geojson.coordinates, isDeleted, index)\n if (remove) geojson.coordinates.splice(0)\n } else if (isMultiPolygon(geojson)) {\n let offset = 0\n for (let remove = false, i = 0; i < geojson.coordinates.length; i++) {\n ;[index, remove] = updateRingsPositions(geojson.coordinates[i], isDeleted, index)\n if (remove) {\n offset++\n } else if (offset) {\n geojson.coordinates[i - offset] = geojson.coordinates[i]\n }\n }\n if (offset) geojson.coordinates.splice(geojson.coordinates.length - offset)\n }\n return index\n}\n\nfunction updateLinePositions(coordinates: Position[], isDeleted: Uint8Array, index: number): number {\n let offset = 0\n for (let i = 0; i < coordinates.length; i++) {\n if (isDeleted[index]) {\n offset++\n } else if (offset) {\n coordinates[i - offset] = coordinates[i]\n }\n index++\n }\n if (offset) coordinates.splice(coordinates.length - offset)\n return index\n}\n\nfunction updateRingsPositions(coordinates: Position[][], isDeleted: Uint8Array, index: number): [number, boolean] {\n let offset = 0\n for (let remove = false, i = 0; i < coordinates.length; i++) {\n ;[index, remove] = updateRingPositions(coordinates[i], isDeleted, index)\n if (remove) {\n // skip interior rings if exterior ring is removed\n if (i === 0) {\n for (i = 1; i < coordinates.length; i++) {\n if (coordinates[i].length) index += coordinates[i].length - 1\n }\n // avoid alternating coordinates array if exterior ring is removed\n return [index, true]\n }\n offset++\n } else if (offset) {\n coordinates[i - offset] = coordinates[i]\n }\n }\n if (offset) coordinates.splice(coordinates.length - offset)\n return [index, false]\n}\n\nfunction updateRingPositions(coordinates: Position[], isDeleted: Uint8Array, index: number): [number, boolean] {\n let offset = 0\n for (let i = 0; i < coordinates.length - 1; i++) {\n if (isDeleted[index]) {\n offset++\n } else if (offset) {\n coordinates[i - offset] = coordinates[i]\n }\n index++\n }\n if (offset) {\n if (coordinates.length - 1 - offset < 3) {\n // avoid alternating coordinates array if ring is removed\n return [index, true]\n }\n coordinates.splice(coordinates.length - 1 - offset, offset + 1, coordinates[0])\n }\n return [index, false]\n}\n\nfunction collectPositions(geojson: GeoJsonObject, positions: Positions): void {\n if (isFeatureCollection(geojson)) {\n for (let i = 0; i < geojson.features.length; i++) {\n collectPositions(geojson.features[i], positions)\n }\n } else if (isFeature(geojson)) {\n collectPositions(geojson.geometry, positions)\n } else if (isGeometryCollection(geojson)) {\n for (let i = 0; i < geojson.geometries.length; i++) {\n collectPositions(geojson.geometries[i], positions)\n }\n } else if (isLineString(geojson)) {\n collectLinePositions(geojson.coordinates, positions)\n } else if (isMultiLineString(geojson)) {\n for (let i = 0; i < geojson.coordinates.length; i++) {\n collectLinePositions(geojson.coordinates[i], positions)\n }\n } else if (isPolygon(geojson)) {\n for (let i = 0; i < geojson.coordinates.length; i++) {\n collectRingPositions(geojson.coordinates[i], positions)\n }\n } else if (isMultiPolygon(geojson)) {\n for (let j, i = 0; i < geojson.coordinates.length; i++) {\n for (j = 0; j < geojson.coordinates[i].length; j++) {\n collectRingPositions(geojson.coordinates[i][j], positions)\n }\n }\n }\n}\n\nfunction collectLinePositions(coordinates: Position[], positions: Positions) {\n for (let p = positions.coordinates.length, n = coordinates.length, i = 0; i < n; i++) {\n positions.coordinates.push(coordinates[i])\n positions.prevIndexes.push(i === 0 ? -1 : p + i - 1)\n positions.nextIndexes.push(i === n - 1 ? -1 : p + i + 1)\n }\n}\n\nfunction collectRingPositions(coordinates: Position[], positions: Positions) {\n for (let p = positions.coordinates.length, n = coordinates.length - 1, i = 0; i < n; i++) {\n positions.coordinates.push(coordinates[i])\n positions.prevIndexes.push(i === 0 ? p + n - 1 : p + i - 1)\n positions.nextIndexes.push(i === n - 1 ? p : p + i + 1)\n }\n}\n","import {\n GeoJsonObject,\n Feature,\n FeatureCollection,\n LineString,\n MultiLineString,\n Polygon,\n MultiPolygon,\n GeometryCollection,\n} from 'geojson'\n\nexport type FinitePositiveNumber = number & { readonly __type: unique symbol }\n\nexport function isFinitePositiveNumber(value: number): value is FinitePositiveNumber {\n return value != null && Number.isFinite(value) && value > 0\n}\n\nexport function isObject(value: object): value is object {\n return typeof value === 'object' && value !== null\n}\n\nexport function isFeature(value: GeoJsonObject): value is Feature {\n return isObject(value) && value?.type === 'Feature'\n}\n\nexport function isFeatureCollection(value: GeoJsonObject): value is FeatureCollection {\n return isObject(value) && value?.type === 'FeatureCollection'\n}\n\nexport function isLineString(value: GeoJsonObject): value is LineString {\n return isObject(value) && value?.type === 'LineString'\n}\n\nexport function isMultiLineString(value: GeoJsonObject): value is MultiLineString {\n return isObject(value) && value?.type === 'MultiLineString'\n}\n\nexport function isPolygon(value: GeoJsonObject): value is Polygon {\n return isObject(value) && value?.type === 'Polygon'\n}\n\nexport function isMultiPolygon(value: GeoJsonObject): value is MultiPolygon {\n return isObject(value) && value?.type === 'MultiPolygon'\n}\n\nexport function isGeometryCollection(value: GeoJsonObject): value is GeometryCollection {\n return isObject(value) && value?.type === 'GeometryCollection'\n}\n","import { Position } from 'geojson'\n\nexport type Positions = {\n coordinates: Position[]\n nextIndexes: number[]\n prevIndexes: number[]\n}\n\nexport type Groups = {\n sortIndexes: Uint32Array\n groupedFrom: Uint32Array\n groupedTo: Uint32Array\n}\n\nexport function groupPositions(coordinates: Position[]): Groups {\n const sortIndexes = new Uint32Array(coordinates.length)\n const groupedFrom = new Uint32Array(coordinates.length)\n const groupedTo = new Uint32Array(coordinates.length)\n for (let i = 0; i < coordinates.length; i++) {\n sortIndexes[i] = i\n }\n sortIndexes.sort((a, b) => {\n const deltaX = coordinates[a][0] - coordinates[b][0]\n if (deltaX) {\n return deltaX < 0 ? -1 : 1\n }\n const deltaY = coordinates[a][1] - coordinates[b][1]\n return deltaY < 0 ? -1 : deltaY > 0 ? 1 : 0\n })\n if (coordinates.length) {\n groupedTo[sortIndexes[coordinates.length - 1]] = groupedTo.length - 1\n }\n for (let i = 1, j = coordinates.length - 2; i < coordinates.length; i++, j--) {\n if (\n coordinates[sortIndexes[i]][0] !== coordinates[sortIndexes[i - 1]][0] ||\n coordinates[sortIndexes[i]][1] !== coordinates[sortIndexes[i - 1]][1]\n ) {\n groupedFrom[sortIndexes[i]] = i\n } else {\n groupedFrom[sortIndexes[i]] = groupedFrom[sortIndexes[i - 1]]\n }\n if (\n coordinates[sortIndexes[j]][0] !== coordinates[sortIndexes[j + 1]][0] ||\n coordinates[sortIndexes[j]][1] !== coordinates[sortIndexes[j + 1]][1]\n ) {\n groupedTo[sortIndexes[j]] = j\n } else {\n groupedTo[sortIndexes[j]] = groupedTo[sortIndexes[j + 1]]\n }\n }\n return {\n sortIndexes,\n groupedFrom,\n groupedTo,\n }\n}\n\nfunction getPositionArea(i: number, positions: Positions): number {\n return (\n Math.abs(\n positions.coordinates[i][0] *\n (positions.coordinates[positions.prevIndexes[i]][1] - positions.coordinates[positions.nextIndexes[i]][1]) +\n positions.coordinates[positions.prevIndexes[i]][0] *\n (positions.coordinates[positions.nextIndexes[i]][1] - positions.coordinates[i][1]) +\n positions.coordinates[positions.nextIndexes[i]][0] *\n (positions.coordinates[i][1] - positions.coordinates[positions.prevIndexes[i]][1]),\n ) / 2\n )\n}\n\nfunction heapcompare(a: number, b: number, priority: Float64Array, coordinates: Position[]): number {\n return priority[a] - priority[b] || coordinates[a][0] - coordinates[b][0] || coordinates[a][1] - coordinates[b][1]\n}\n\nfunction heapsink(\n heap: Uint32Array,\n heapRev: Uint32Array,\n i: number,\n priority: Float64Array,\n coordinates: Position[],\n): number {\n let l: number, r: number, t: number\n while (true) {\n t = i\n if ((l = i << 1) <= heap[0] && heapcompare(heap[t], heap[l], priority, coordinates) > 0) t = l\n if ((r = l + 1) <= heap[0] && heapcompare(heap[t], heap[r], priority, coordinates) > 0) t = r\n if (i === t) break\n heapswap(heap, heapRev, i, t)\n i = t\n }\n return i\n}\n\nfunction heapbubble(\n heap: Uint32Array,\n heapRev: Uint32Array,\n i: number,\n priority: Float64Array,\n coordinates: Position[],\n): number {\n let t: number\n while (i > 1) {\n t = i >>> 1\n if (i === t || heapcompare(heap[t], heap[i], priority, coordinates) <= 0) break\n heapswap(heap, heapRev, i, t)\n i = t\n }\n return i\n}\n\nfunction heapupdate(\n heap: Uint32Array,\n heapRev: Uint32Array,\n val: number,\n priority: Float64Array,\n coordinates: Position[],\n): void {\n heapbubble(heap, heapRev, heapsink(heap, heapRev, heapRev[val], priority, coordinates), priority, coordinates)\n}\n\nfunction heapswap(heap: Uint32Array, heapRev: Uint32Array, i: number, t: number): void {\n heapRev[heap[i]] = t\n heapRev[heap[t]] = i\n ;[heap[i], heap[t]] = [heap[t], heap[i]]\n}\n\nfunction heappop(heap: Uint32Array, heapRev: Uint32Array, priority: Float64Array, coordinates: Position[]): number {\n if (heap[0] > 1) {\n heapswap(heap, heapRev, 1, heap[0])\n heap[0]--\n heapsink(heap, heapRev, 1, priority, coordinates)\n return heap[heap[0] + 1]\n } else if (heap[0] === 1) {\n heap[0]--\n return heap[1]\n }\n return -1\n}\n\nfunction heapify(heap: Uint32Array, heapRev: Uint32Array, priority: Float64Array, coordinates: Position[]): void {\n for (let i = heap[0] >>> 1; i > 0; i--) {\n heapsink(heap, heapRev, i, priority, coordinates)\n }\n}\n\nexport function deletePositions(positions: Positions, groups: Groups, tolerance: number, fraction: number): Uint8Array {\n const n = positions.coordinates.length\n\n const isDeleted = new Uint8Array(n)\n let toDelete = Math.round(n * fraction)\n\n const candidatesByGroupFrom = new Uint32Array(n)\n const isCandidate = new Uint8Array(n)\n\n const heap = new Uint32Array(n + 1)\n const priority = new Float64Array(n)\n const heapRev = new Uint32Array(n)\n\n for (let i = 0; i < n; i++) {\n if (positions.prevIndexes[i] !== -1 && positions.nextIndexes[i] !== -1) {\n priority[i] = getPositionArea(i, positions)\n heap[0]++\n heap[heap[0]] = i\n heapRev[i] = heap[0]\n }\n }\n heapify(heap, heapRev, priority, positions.coordinates)\n\n let i: number\n while (heap[0]) {\n i = heappop(heap, heapRev, priority, positions.coordinates)\n\n if (isDeleted[i]) {\n continue\n }\n\n if (priority[i] >= tolerance && toDelete <= 0) {\n break\n }\n\n if (!isCandidate[i]) {\n isCandidate[i] = 1\n candidatesByGroupFrom[groups.groupedFrom[i]]++\n }\n\n if (candidatesByGroupFrom[groups.groupedFrom[i]] !== groups.groupedTo[i] - groups.groupedFrom[i] + 1) {\n continue\n }\n\n for (let k: number, j = groups.groupedFrom[i]; j <= groups.groupedTo[i]; j++) {\n k = groups.sortIndexes[j]\n if (isDeleted[k]) {\n continue\n }\n\n if (\n positions.prevIndexes[k] !== -1 &&\n positions.prevIndexes[positions.prevIndexes[k]] !== -1 &&\n positions.prevIndexes[positions.prevIndexes[positions.prevIndexes[k]]] === k\n ) {\n if (!isCandidate[positions.prevIndexes[k]]) {\n isCandidate[positions.prevIndexes[k]] = 1\n candidatesByGroupFrom[groups.groupedFrom[positions.prevIndexes[k]]]++\n }\n if (!isCandidate[positions.nextIndexes[k]]) {\n isCandidate[positions.nextIndexes[k]] = 1\n candidatesByGroupFrom[groups.groupedFrom[positions.nextIndexes[k]]]++\n }\n\n if (\n candidatesByGroupFrom[groups.groupedFrom[positions.prevIndexes[k]]] ===\n groups.groupedTo[positions.prevIndexes[k]] - groups.groupedFrom[positions.prevIndexes[k]] + 1 &&\n candidatesByGroupFrom[groups.groupedFrom[positions.nextIndexes[k]]] ===\n groups.groupedTo[positions.nextIndexes[k]] - groups.groupedFrom[positions.nextIndexes[k]] + 1\n ) {\n isDeleted[k] = 1\n isDeleted[positions.nextIndexes[k]] = 1\n isDeleted[positions.prevIndexes[k]] = 1\n toDelete -= 3\n j = groups.groupedFrom[i] - 1\n }\n } else {\n isDeleted[k] = 1\n toDelete--\n positions.prevIndexes[positions.nextIndexes[k]] = positions.prevIndexes[k]\n positions.nextIndexes[positions.prevIndexes[k]] = positions.nextIndexes[k]\n\n if (positions.prevIndexes[positions.prevIndexes[k]] !== -1) {\n priority[positions.prevIndexes[k]] = getPositionArea(positions.prevIndexes[k], positions)\n heapupdate(heap, heapRev, positions.prevIndexes[k], priority, positions.coordinates)\n }\n if (positions.nextIndexes[positions.nextIndexes[k]] !== -1) {\n priority[positions.nextIndexes[k]] = getPositionArea(positions.nextIndexes[k], positions)\n heapupdate(heap, heapRev, positions.nextIndexes[k], priority, positions.coordinates)\n }\n }\n }\n }\n return isDeleted\n}\n"],"mappings":"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","names":["index_exports","__export","index_default","__toCommonJS","isFinitePositiveNumber","value","isObject","isFeature","isFeatureCollection","isLineString","isMultiLineString","isPolygon","isMultiPolygon","isGeometryCollection","groupPositions","coordinates","sortIndexes","groupedFrom","groupedTo","i","a","b","deltaX","deltaY","j","getPositionArea","positions","heapcompare","priority","heapsink","heap","heapRev","l","r","t","heapswap","heapbubble","heapupdate","val","heappop","heapify","deletePositions","groups","tolerance","fraction","n","isDeleted","toDelete","candidatesByGroupFrom","isCandidate","k","index_default","geojson","options","isObject","tolerance","isFinitePositiveNumber","fraction","mutate","positions","collectPositions","updatePositions","deletePositions","groupPositions","isDeleted","index","isFeatureCollection","i","isFeature","isGeometryCollection","isLineString","updateLinePositions","isMultiLineString","isPolygon","remove","updateRingsPositions","isMultiPolygon","offset","coordinates","updateRingPositions","collectLinePositions","collectRingPositions","j","p"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/lib/typeGuards.ts","../src/lib/functions.ts"],"sourcesContent":["import { GeoJsonObject, Position } from 'geojson'\nimport {\n isObject,\n isFinitePositiveNumber,\n isFeature,\n isFeatureCollection,\n isLineString,\n isMultiLineString,\n isPolygon,\n isMultiPolygon,\n isGeometryCollection,\n} from '@lib/typeGuards'\nimport { deletePositions, groupPositions, type Positions } from '@lib/functions'\n\nexport type SimplifyOptions = {\n tolerance?: number\n fraction?: number\n mutate?: boolean\n}\n\nexport default function (geojson: GeoJsonObject, options: SimplifyOptions = {}): GeoJsonObject {\n // validate input data\n if (!isObject(geojson)) {\n throw new TypeError(\n `Expected provided GeoJSON to be an object, but received ${geojson === null ? 'null' : typeof geojson}.`,\n )\n }\n\n // validate options\n let tolerance = 0\n if (options.tolerance !== undefined) {\n if (!isFinitePositiveNumber(options.tolerance)) {\n throw new Error(`Expected provided tolerance to be a finite positive number, but received ${options.tolerance}.`)\n }\n tolerance = options.tolerance\n }\n let fraction = 0\n if (options.fraction !== undefined) {\n if (!isFinitePositiveNumber(options.fraction)) {\n throw new Error(`Expected provided fraction to be a finite positive number, but received ${options.fraction}.`)\n }\n if (options.fraction > 1) {\n throw new Error(`Expected provided fraction to be less or equal to 1, but received ${options.fraction}.`)\n }\n fraction = options.fraction\n }\n let mutate = true\n if (options.mutate !== undefined) {\n mutate = !!options.mutate\n }\n\n // exit if no simplification options provided\n if (tolerance === 0 && fraction === 0) {\n return geojson\n }\n\n if (!mutate) {\n geojson = structuredClone(geojson)\n }\n\n const positions: Positions = {\n coordinates: [],\n nextIndexes: [],\n prevIndexes: [],\n }\n collectPositions(geojson, positions)\n\n if (positions.coordinates.length) {\n updatePositions(geojson, deletePositions(positions, groupPositions(positions.coordinates), tolerance, fraction), 0)\n }\n\n return geojson\n}\nfunction updatePositions(geojson: GeoJsonObject, isDeleted: Uint8Array, index: number): number {\n if (isFeatureCollection(geojson)) {\n for (let i = 0; i < geojson.features.length; i++) {\n index = updatePositions(geojson.features[i], isDeleted, index)\n }\n } else if (isFeature(geojson)) {\n index = updatePositions(geojson.geometry, isDeleted, index)\n } else if (isGeometryCollection(geojson)) {\n for (let i = 0; i < geojson.geometries.length; i++) {\n index = updatePositions(geojson.geometries[i], isDeleted, index)\n }\n } else if (isLineString(geojson)) {\n index = updateLinePositions(geojson.coordinates, isDeleted, index)\n } else if (isMultiLineString(geojson)) {\n for (let i = 0; i < geojson.coordinates.length; i++) {\n index = updateLinePositions(geojson.coordinates[i], isDeleted, index)\n }\n } else if (isPolygon(geojson)) {\n let remove = false\n ;[index, remove] = updateRingsPositions(geojson.coordinates, isDeleted, index)\n if (remove) geojson.coordinates.splice(0)\n } else if (isMultiPolygon(geojson)) {\n let offset = 0\n for (let remove = false, i = 0; i < geojson.coordinates.length; i++) {\n ;[index, remove] = updateRingsPositions(geojson.coordinates[i], isDeleted, index)\n if (remove) {\n offset++\n } else if (offset) {\n geojson.coordinates[i - offset] = geojson.coordinates[i]\n }\n }\n if (offset) geojson.coordinates.splice(geojson.coordinates.length - offset)\n }\n return index\n}\n\nfunction updateLinePositions(coordinates: Position[], isDeleted: Uint8Array, index: number): number {\n let offset = 0\n for (let i = 0; i < coordinates.length; i++) {\n if (isDeleted[index]) {\n offset++\n } else if (offset) {\n coordinates[i - offset] = coordinates[i]\n }\n index++\n }\n if (offset) coordinates.splice(coordinates.length - offset)\n return index\n}\n\nfunction updateRingsPositions(coordinates: Position[][], isDeleted: Uint8Array, index: number): [number, boolean] {\n let offset = 0\n for (let remove = false, i = 0; i < coordinates.length; i++) {\n ;[index, remove] = updateRingPositions(coordinates[i], isDeleted, index)\n if (remove) {\n // skip interior rings if exterior ring is removed\n if (i === 0) {\n for (i = 1; i < coordinates.length; i++) {\n if (coordinates[i].length) index += coordinates[i].length - 1\n }\n // avoid alternating coordinates array if exterior ring is removed\n return [index, true]\n }\n offset++\n } else if (offset) {\n coordinates[i - offset] = coordinates[i]\n }\n }\n if (offset) coordinates.splice(coordinates.length - offset)\n return [index, false]\n}\n\nfunction updateRingPositions(coordinates: Position[], isDeleted: Uint8Array, index: number): [number, boolean] {\n let offset = 0\n for (let i = 0; i < coordinates.length - 1; i++) {\n if (isDeleted[index]) {\n offset++\n } else if (offset) {\n coordinates[i - offset] = coordinates[i]\n }\n index++\n }\n if (offset) {\n if (coordinates.length - 1 - offset < 3) {\n // avoid alternating coordinates array if ring is removed\n return [index, true]\n }\n coordinates.splice(coordinates.length - 1 - offset, offset + 1, coordinates[0])\n }\n return [index, false]\n}\n\nfunction collectPositions(geojson: GeoJsonObject, positions: Positions): void {\n if (isFeatureCollection(geojson)) {\n for (let i = 0; i < geojson.features.length; i++) {\n collectPositions(geojson.features[i], positions)\n }\n } else if (isFeature(geojson)) {\n collectPositions(geojson.geometry, positions)\n } else if (isGeometryCollection(geojson)) {\n for (let i = 0; i < geojson.geometries.length; i++) {\n collectPositions(geojson.geometries[i], positions)\n }\n } else if (isLineString(geojson)) {\n collectLinePositions(geojson.coordinates, positions)\n } else if (isMultiLineString(geojson)) {\n for (let i = 0; i < geojson.coordinates.length; i++) {\n collectLinePositions(geojson.coordinates[i], positions)\n }\n } else if (isPolygon(geojson)) {\n for (let i = 0; i < geojson.coordinates.length; i++) {\n collectRingPositions(geojson.coordinates[i], positions)\n }\n } else if (isMultiPolygon(geojson)) {\n for (let j, i = 0; i < geojson.coordinates.length; i++) {\n for (j = 0; j < geojson.coordinates[i].length; j++) {\n collectRingPositions(geojson.coordinates[i][j], positions)\n }\n }\n }\n}\n\nfunction collectLinePositions(coordinates: Position[], positions: Positions) {\n for (let p = positions.coordinates.length, n = coordinates.length, i = 0; i < n; i++) {\n positions.coordinates.push(coordinates[i])\n positions.prevIndexes.push(i === 0 ? -1 : p + i - 1)\n positions.nextIndexes.push(i === n - 1 ? -1 : p + i + 1)\n }\n}\n\nfunction collectRingPositions(coordinates: Position[], positions: Positions) {\n for (let p = positions.coordinates.length, n = coordinates.length - 1, i = 0; i < n; i++) {\n positions.coordinates.push(coordinates[i])\n positions.prevIndexes.push(i === 0 ? p + n - 1 : p + i - 1)\n positions.nextIndexes.push(i === n - 1 ? p : p + i + 1)\n }\n}\n","import {\n GeoJsonObject,\n Feature,\n FeatureCollection,\n LineString,\n MultiLineString,\n Polygon,\n MultiPolygon,\n GeometryCollection,\n} from 'geojson'\n\nexport type FinitePositiveNumber = number & { readonly __type: unique symbol }\n\nexport function isFinitePositiveNumber(value: number): value is FinitePositiveNumber {\n return value != null && Number.isFinite(value) && value > 0\n}\n\nexport function isObject(value: object): value is object {\n return typeof value === 'object' && value !== null\n}\n\nexport function isFeature(value: GeoJsonObject): value is Feature {\n return isObject(value) && value?.type === 'Feature'\n}\n\nexport function isFeatureCollection(value: GeoJsonObject): value is FeatureCollection {\n return isObject(value) && value?.type === 'FeatureCollection'\n}\n\nexport function isLineString(value: GeoJsonObject): value is LineString {\n return isObject(value) && value?.type === 'LineString'\n}\n\nexport function isMultiLineString(value: GeoJsonObject): value is MultiLineString {\n return isObject(value) && value?.type === 'MultiLineString'\n}\n\nexport function isPolygon(value: GeoJsonObject): value is Polygon {\n return isObject(value) && value?.type === 'Polygon'\n}\n\nexport function isMultiPolygon(value: GeoJsonObject): value is MultiPolygon {\n return isObject(value) && value?.type === 'MultiPolygon'\n}\n\nexport function isGeometryCollection(value: GeoJsonObject): value is GeometryCollection {\n return isObject(value) && value?.type === 'GeometryCollection'\n}\n","import { Position } from 'geojson'\n\nexport type Positions = {\n coordinates: Position[]\n nextIndexes: number[]\n prevIndexes: number[]\n}\n\nexport type Groups = {\n groupOf: Uint32Array\n groupSize: Uint32Array\n nextInGroup: Uint32Array\n}\n\nexport function groupPositions(coordinates: Position[]): Groups {\n const groupOf = new Uint32Array(coordinates.length)\n const groupSize = new Uint32Array(coordinates.length)\n const nextInGroup = new Uint32Array(coordinates.length)\n const groupTail = new Uint32Array(coordinates.length)\n const groupsByX = new Map<number, number | Map<number, number>>()\n for (let i = 0; i < coordinates.length; i++) {\n const x = coordinates[i][0]\n const y = coordinates[i][1]\n const byX = groupsByX.get(x)\n let root: number\n if (byX === undefined) {\n root = i\n groupsByX.set(x, i)\n } else if (typeof byX === 'number') {\n if (coordinates[byX][1] === y) {\n root = byX\n } else {\n root = i\n const byY = new Map<number, number>()\n byY.set(coordinates[byX][1], byX)\n byY.set(y, i)\n groupsByX.set(x, byY)\n }\n } else {\n const existing = byX.get(y)\n if (existing === undefined) {\n root = i\n byX.set(y, i)\n } else {\n root = existing\n }\n }\n groupOf[i] = root\n if (root === i) {\n groupSize[root] = 1\n groupTail[root] = i\n } else {\n groupSize[root]++\n nextInGroup[groupTail[root]] = i\n groupTail[root] = i\n }\n nextInGroup[i] = coordinates.length\n }\n return {\n groupOf,\n groupSize,\n nextInGroup,\n }\n}\n\nfunction getPositionArea(i: number, positions: Positions): number {\n return (\n Math.abs(\n positions.coordinates[i][0] *\n (positions.coordinates[positions.prevIndexes[i]][1] - positions.coordinates[positions.nextIndexes[i]][1]) +\n positions.coordinates[positions.prevIndexes[i]][0] *\n (positions.coordinates[positions.nextIndexes[i]][1] - positions.coordinates[i][1]) +\n positions.coordinates[positions.nextIndexes[i]][0] *\n (positions.coordinates[i][1] - positions.coordinates[positions.prevIndexes[i]][1]),\n ) / 2\n )\n}\n\nfunction heapcompare(a: number, b: number, priority: Float64Array, coordinates: Position[]): number {\n return priority[a] - priority[b] || coordinates[a][0] - coordinates[b][0] || coordinates[a][1] - coordinates[b][1]\n}\n\nfunction heapsink(\n heap: Uint32Array,\n heapRev: Uint32Array,\n i: number,\n priority: Float64Array,\n coordinates: Position[],\n): number {\n const value = heap[i]\n let l: number, r: number, t: number\n let selected: number\n while (true) {\n t = i\n selected = value\n if ((l = i << 1) <= heap[0] && heapcompare(selected, heap[l], priority, coordinates) > 0) {\n t = l\n selected = heap[l]\n }\n if ((r = l + 1) <= heap[0] && heapcompare(selected, heap[r], priority, coordinates) > 0) t = r\n if (i === t) break\n heap[i] = heap[t]\n heapRev[heap[i]] = i\n i = t\n }\n heap[i] = value\n heapRev[value] = i\n return i\n}\n\nfunction heapbubble(\n heap: Uint32Array,\n heapRev: Uint32Array,\n i: number,\n priority: Float64Array,\n coordinates: Position[],\n): number {\n let t: number\n while (i > 1) {\n t = i >>> 1\n if (i === t || heapcompare(heap[t], heap[i], priority, coordinates) <= 0) break\n heapswap(heap, heapRev, i, t)\n i = t\n }\n return i\n}\n\nfunction heapupdate(\n heap: Uint32Array,\n heapRev: Uint32Array,\n val: number,\n priority: Float64Array,\n coordinates: Position[],\n): void {\n heapbubble(heap, heapRev, heapsink(heap, heapRev, heapRev[val], priority, coordinates), priority, coordinates)\n}\n\nfunction heapswap(heap: Uint32Array, heapRev: Uint32Array, i: number, t: number): void {\n heapRev[heap[i]] = t\n heapRev[heap[t]] = i\n ;[heap[i], heap[t]] = [heap[t], heap[i]]\n}\n\nfunction heappop(heap: Uint32Array, heapRev: Uint32Array, priority: Float64Array, coordinates: Position[]): number {\n if (heap[0] > 1) {\n heapswap(heap, heapRev, 1, heap[0])\n heap[0]--\n heapsink(heap, heapRev, 1, priority, coordinates)\n return heap[heap[0] + 1]\n } else if (heap[0] === 1) {\n heap[0]--\n return heap[1]\n }\n return -1\n}\n\nfunction heapify(heap: Uint32Array, heapRev: Uint32Array, priority: Float64Array, coordinates: Position[]): void {\n for (let i = heap[0] >>> 1; i > 0; i--) {\n heapsink(heap, heapRev, i, priority, coordinates)\n }\n}\n\nexport function deletePositions(positions: Positions, groups: Groups, tolerance: number, fraction: number): Uint8Array {\n const n = positions.coordinates.length\n\n const isDeleted = new Uint8Array(n)\n let toDelete = Math.round(n * fraction)\n\n const candidatesByGroup = new Uint32Array(n)\n const isCandidate = new Uint8Array(n)\n\n const heap = new Uint32Array(n + 1)\n const priority = new Float64Array(n)\n const heapRev = new Uint32Array(n)\n\n for (let i = 0; i < n; i++) {\n if (positions.prevIndexes[i] !== -1 && positions.nextIndexes[i] !== -1) {\n priority[i] = getPositionArea(i, positions)\n heap[0]++\n heap[heap[0]] = i\n heapRev[i] = heap[0]\n }\n }\n heapify(heap, heapRev, priority, positions.coordinates)\n\n let i: number\n while (heap[0]) {\n i = heappop(heap, heapRev, priority, positions.coordinates)\n\n if (isDeleted[i]) {\n continue\n }\n\n if (priority[i] >= tolerance && toDelete <= 0) {\n break\n }\n\n const groupId = groups.groupOf[i]\n if (!isCandidate[i]) {\n isCandidate[i] = 1\n candidatesByGroup[groupId]++\n }\n\n if (candidatesByGroup[groupId] !== groups.groupSize[groupId]) {\n continue\n }\n\n let k = groupId\n while (k < n) {\n if (isDeleted[k]) {\n k = groups.nextInGroup[k]\n continue\n }\n\n if (\n positions.prevIndexes[k] !== -1 &&\n positions.prevIndexes[positions.prevIndexes[k]] !== -1 &&\n positions.prevIndexes[positions.prevIndexes[positions.prevIndexes[k]]] === k\n ) {\n if (!isCandidate[positions.prevIndexes[k]]) {\n isCandidate[positions.prevIndexes[k]] = 1\n candidatesByGroup[groups.groupOf[positions.prevIndexes[k]]]++\n }\n if (!isCandidate[positions.nextIndexes[k]]) {\n isCandidate[positions.nextIndexes[k]] = 1\n candidatesByGroup[groups.groupOf[positions.nextIndexes[k]]]++\n }\n\n if (\n candidatesByGroup[groups.groupOf[positions.prevIndexes[k]]] ===\n groups.groupSize[groups.groupOf[positions.prevIndexes[k]]] &&\n candidatesByGroup[groups.groupOf[positions.nextIndexes[k]]] ===\n groups.groupSize[groups.groupOf[positions.nextIndexes[k]]]\n ) {\n isDeleted[k] = 1\n isDeleted[positions.nextIndexes[k]] = 1\n isDeleted[positions.prevIndexes[k]] = 1\n toDelete -= 3\n k = groupId\n continue\n }\n } else {\n isDeleted[k] = 1\n toDelete--\n positions.prevIndexes[positions.nextIndexes[k]] = positions.prevIndexes[k]\n positions.nextIndexes[positions.prevIndexes[k]] = positions.nextIndexes[k]\n\n if (positions.prevIndexes[positions.prevIndexes[k]] !== -1) {\n priority[positions.prevIndexes[k]] = getPositionArea(positions.prevIndexes[k], positions)\n heapupdate(heap, heapRev, positions.prevIndexes[k], priority, positions.coordinates)\n }\n if (positions.nextIndexes[positions.nextIndexes[k]] !== -1) {\n priority[positions.nextIndexes[k]] = getPositionArea(positions.nextIndexes[k], positions)\n heapupdate(heap, heapRev, positions.nextIndexes[k], priority, positions.coordinates)\n }\n }\n k = groups.nextInGroup[k]\n }\n }\n return isDeleted\n}\n"],"mappings":"yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,aAAAE,IAAA,eAAAC,EAAAH,GCaO,SAASI,EAAuBC,EAA8C,CACnF,OAAOA,GAAS,MAAQ,OAAO,SAASA,CAAK,GAAKA,EAAQ,CAC5D,CAEO,SAASC,EAASD,EAAgC,CACvD,OAAO,OAAOA,GAAU,UAAYA,IAAU,IAChD,CAEO,SAASE,EAAUF,EAAwC,CAChE,OAAOC,EAASD,CAAK,GAAKA,GAAO,OAAS,SAC5C,CAEO,SAASG,EAAoBH,EAAkD,CACpF,OAAOC,EAASD,CAAK,GAAKA,GAAO,OAAS,mBAC5C,CAEO,SAASI,EAAaJ,EAA2C,CACtE,OAAOC,EAASD,CAAK,GAAKA,GAAO,OAAS,YAC5C,CAEO,SAASK,EAAkBL,EAAgD,CAChF,OAAOC,EAASD,CAAK,GAAKA,GAAO,OAAS,iBAC5C,CAEO,SAASM,EAAUN,EAAwC,CAChE,OAAOC,EAASD,CAAK,GAAKA,GAAO,OAAS,SAC5C,CAEO,SAASO,EAAeP,EAA6C,CAC1E,OAAOC,EAASD,CAAK,GAAKA,GAAO,OAAS,cAC5C,CAEO,SAASQ,EAAqBR,EAAmD,CACtF,OAAOC,EAASD,CAAK,GAAKA,GAAO,OAAS,oBAC5C,CCjCO,SAASS,EAAeC,EAAiC,CAC9D,IAAMC,EAAU,IAAI,YAAYD,EAAY,MAAM,EAC5CE,EAAY,IAAI,YAAYF,EAAY,MAAM,EAC9CG,EAAc,IAAI,YAAYH,EAAY,MAAM,EAChDI,EAAY,IAAI,YAAYJ,EAAY,MAAM,EAC9CK,EAAY,IAAI,IACtB,QAASC,EAAI,EAAGA,EAAIN,EAAY,OAAQM,IAAK,CAC3C,IAAMC,EAAIP,EAAYM,CAAC,EAAE,CAAC,EACpBE,EAAIR,EAAYM,CAAC,EAAE,CAAC,EACpBG,EAAMJ,EAAU,IAAIE,CAAC,EACvBG,EACJ,GAAID,IAAQ,OACVC,EAAOJ,EACPD,EAAU,IAAIE,EAAGD,CAAC,UACT,OAAOG,GAAQ,SACxB,GAAIT,EAAYS,CAAG,EAAE,CAAC,IAAMD,EAC1BE,EAAOD,MACF,CACLC,EAAOJ,EACP,IAAMK,EAAM,IAAI,IAChBA,EAAI,IAAIX,EAAYS,CAAG,EAAE,CAAC,EAAGA,CAAG,EAChCE,EAAI,IAAIH,EAAGF,CAAC,EACZD,EAAU,IAAIE,EAAGI,CAAG,CACtB,KACK,CACL,IAAMC,EAAWH,EAAI,IAAID,CAAC,EACtBI,IAAa,QACfF,EAAOJ,EACPG,EAAI,IAAID,EAAGF,CAAC,GAEZI,EAAOE,CAEX,CACAX,EAAQK,CAAC,EAAII,EACTA,IAASJ,GACXJ,EAAUQ,CAAI,EAAI,EAClBN,EAAUM,CAAI,EAAIJ,IAElBJ,EAAUQ,CAAI,IACdP,EAAYC,EAAUM,CAAI,CAAC,EAAIJ,EAC/BF,EAAUM,CAAI,EAAIJ,GAEpBH,EAAYG,CAAC,EAAIN,EAAY,MAC/B,CACA,MAAO,CACL,QAAAC,EACA,UAAAC,EACA,YAAAC,CACF,CACF,CAEA,SAASU,EAAgBP,EAAWQ,EAA8B,CAChE,OACE,KAAK,IACHA,EAAU,YAAYR,CAAC,EAAE,CAAC,GACvBQ,EAAU,YAAYA,EAAU,YAAYR,CAAC,CAAC,EAAE,CAAC,EAAIQ,EAAU,YAAYA,EAAU,YAAYR,CAAC,CAAC,EAAE,CAAC,GACvGQ,EAAU,YAAYA,EAAU,YAAYR,CAAC,CAAC,EAAE,CAAC,GAC9CQ,EAAU,YAAYA,EAAU,YAAYR,CAAC,CAAC,EAAE,CAAC,EAAIQ,EAAU,YAAYR,CAAC,EAAE,CAAC,GAClFQ,EAAU,YAAYA,EAAU,YAAYR,CAAC,CAAC,EAAE,CAAC,GAC9CQ,EAAU,YAAYR,CAAC,EAAE,CAAC,EAAIQ,EAAU,YAAYA,EAAU,YAAYR,CAAC,CAAC,EAAE,CAAC,EACtF,EAAI,CAER,CAEA,SAASS,EAAYC,EAAWC,EAAWC,EAAwBlB,EAAiC,CAClG,OAAOkB,EAASF,CAAC,EAAIE,EAASD,CAAC,GAAKjB,EAAYgB,CAAC,EAAE,CAAC,EAAIhB,EAAYiB,CAAC,EAAE,CAAC,GAAKjB,EAAYgB,CAAC,EAAE,CAAC,EAAIhB,EAAYiB,CAAC,EAAE,CAAC,CACnH,CAEA,SAASE,EACPC,EACAC,EACAf,EACAY,EACAlB,EACQ,CACR,IAAMsB,EAAQF,EAAKd,CAAC,EAChBiB,EAAWC,EAAWC,EACtBC,EACJ,KACED,EAAInB,EACJoB,EAAWJ,GACNC,EAAIjB,GAAK,IAAMc,EAAK,CAAC,GAAKL,EAAYW,EAAUN,EAAKG,CAAC,EAAGL,EAAUlB,CAAW,EAAI,IACrFyB,EAAIF,EACJG,EAAWN,EAAKG,CAAC,IAEdC,EAAID,EAAI,IAAMH,EAAK,CAAC,GAAKL,EAAYW,EAAUN,EAAKI,CAAC,EAAGN,EAAUlB,CAAW,EAAI,IAAGyB,EAAID,GACzFlB,IAAMmB,GACVL,EAAKd,CAAC,EAAIc,EAAKK,CAAC,EAChBJ,EAAQD,EAAKd,CAAC,CAAC,EAAIA,EACnBA,EAAImB,EAEN,OAAAL,EAAKd,CAAC,EAAIgB,EACVD,EAAQC,CAAK,EAAIhB,EACVA,CACT,CAEA,SAASqB,EACPP,EACAC,EACAf,EACAY,EACAlB,EACQ,CACR,IAAIyB,EACJ,KAAOnB,EAAI,IACTmB,EAAInB,IAAM,EACN,EAAAA,IAAMmB,GAAKV,EAAYK,EAAKK,CAAC,EAAGL,EAAKd,CAAC,EAAGY,EAAUlB,CAAW,GAAK,KACvE4B,EAASR,EAAMC,EAASf,EAAGmB,CAAC,EAC5BnB,EAAImB,EAEN,OAAOnB,CACT,CAEA,SAASuB,EACPT,EACAC,EACAS,EACAZ,EACAlB,EACM,CACN2B,EAAWP,EAAMC,EAASF,EAASC,EAAMC,EAASA,EAAQS,CAAG,EAAGZ,EAAUlB,CAAW,EAAGkB,EAAUlB,CAAW,CAC/G,CAEA,SAAS4B,EAASR,EAAmBC,EAAsBf,EAAWmB,EAAiB,CACrFJ,EAAQD,EAAKd,CAAC,CAAC,EAAImB,EACnBJ,EAAQD,EAAKK,CAAC,CAAC,EAAInB,EAClB,CAACc,EAAKd,CAAC,EAAGc,EAAKK,CAAC,CAAC,EAAI,CAACL,EAAKK,CAAC,EAAGL,EAAKd,CAAC,CAAC,CACzC,CAEA,SAASyB,EAAQX,EAAmBC,EAAsBH,EAAwBlB,EAAiC,CACjH,OAAIoB,EAAK,CAAC,EAAI,GACZQ,EAASR,EAAMC,EAAS,EAAGD,EAAK,CAAC,CAAC,EAClCA,EAAK,CAAC,IACND,EAASC,EAAMC,EAAS,EAAGH,EAAUlB,CAAW,EACzCoB,EAAKA,EAAK,CAAC,EAAI,CAAC,GACdA,EAAK,CAAC,IAAM,GACrBA,EAAK,CAAC,IACCA,EAAK,CAAC,GAER,EACT,CAEA,SAASY,EAAQZ,EAAmBC,EAAsBH,EAAwBlB,EAA+B,CAC/G,QAASM,EAAIc,EAAK,CAAC,IAAM,EAAGd,EAAI,EAAGA,IACjCa,EAASC,EAAMC,EAASf,EAAGY,EAAUlB,CAAW,CAEpD,CAEO,SAASiC,EAAgBnB,EAAsBoB,EAAgBC,EAAmBC,EAA8B,CACrH,IAAMC,EAAIvB,EAAU,YAAY,OAE1BwB,EAAY,IAAI,WAAWD,CAAC,EAC9BE,EAAW,KAAK,MAAMF,EAAID,CAAQ,EAEhCI,EAAoB,IAAI,YAAYH,CAAC,EACrCI,EAAc,IAAI,WAAWJ,CAAC,EAE9BjB,EAAO,IAAI,YAAYiB,EAAI,CAAC,EAC5BnB,EAAW,IAAI,aAAamB,CAAC,EAC7BhB,EAAU,IAAI,YAAYgB,CAAC,EAEjC,QAAS/B,EAAI,EAAGA,EAAI+B,EAAG/B,IACjBQ,EAAU,YAAYR,CAAC,IAAM,IAAMQ,EAAU,YAAYR,CAAC,IAAM,KAClEY,EAASZ,CAAC,EAAIO,EAAgBP,EAAGQ,CAAS,EAC1CM,EAAK,CAAC,IACNA,EAAKA,EAAK,CAAC,CAAC,EAAId,EAChBe,EAAQf,CAAC,EAAIc,EAAK,CAAC,GAGvBY,EAAQZ,EAAMC,EAASH,EAAUJ,EAAU,WAAW,EAEtD,IAAIR,EACJ,KAAOc,EAAK,CAAC,GAAG,CAGd,GAFAd,EAAIyB,EAAQX,EAAMC,EAASH,EAAUJ,EAAU,WAAW,EAEtDwB,EAAUhC,CAAC,EACb,SAGF,GAAIY,EAASZ,CAAC,GAAK6B,GAAaI,GAAY,EAC1C,MAGF,IAAMG,EAAUR,EAAO,QAAQ5B,CAAC,EAMhC,GALKmC,EAAYnC,CAAC,IAChBmC,EAAYnC,CAAC,EAAI,EACjBkC,EAAkBE,CAAO,KAGvBF,EAAkBE,CAAO,IAAMR,EAAO,UAAUQ,CAAO,EACzD,SAGF,IAAIC,EAAID,EACR,KAAOC,EAAIN,GAAG,CACZ,GAAIC,EAAUK,CAAC,EAAG,CAChBA,EAAIT,EAAO,YAAYS,CAAC,EACxB,QACF,CAEA,GACE7B,EAAU,YAAY6B,CAAC,IAAM,IAC7B7B,EAAU,YAAYA,EAAU,YAAY6B,CAAC,CAAC,IAAM,IACpD7B,EAAU,YAAYA,EAAU,YAAYA,EAAU,YAAY6B,CAAC,CAAC,CAAC,IAAMA,GAW3E,GATKF,EAAY3B,EAAU,YAAY6B,CAAC,CAAC,IACvCF,EAAY3B,EAAU,YAAY6B,CAAC,CAAC,EAAI,EACxCH,EAAkBN,EAAO,QAAQpB,EAAU,YAAY6B,CAAC,CAAC,CAAC,KAEvDF,EAAY3B,EAAU,YAAY6B,CAAC,CAAC,IACvCF,EAAY3B,EAAU,YAAY6B,CAAC,CAAC,EAAI,EACxCH,EAAkBN,EAAO,QAAQpB,EAAU,YAAY6B,CAAC,CAAC,CAAC,KAI1DH,EAAkBN,EAAO,QAAQpB,EAAU,YAAY6B,CAAC,CAAC,CAAC,IACxDT,EAAO,UAAUA,EAAO,QAAQpB,EAAU,YAAY6B,CAAC,CAAC,CAAC,GAC3DH,EAAkBN,EAAO,QAAQpB,EAAU,YAAY6B,CAAC,CAAC,CAAC,IACxDT,EAAO,UAAUA,EAAO,QAAQpB,EAAU,YAAY6B,CAAC,CAAC,CAAC,EAC3D,CACAL,EAAUK,CAAC,EAAI,EACfL,EAAUxB,EAAU,YAAY6B,CAAC,CAAC,EAAI,EACtCL,EAAUxB,EAAU,YAAY6B,CAAC,CAAC,EAAI,EACtCJ,GAAY,EACZI,EAAID,EACJ,QACF,OAEAJ,EAAUK,CAAC,EAAI,EACfJ,IACAzB,EAAU,YAAYA,EAAU,YAAY6B,CAAC,CAAC,EAAI7B,EAAU,YAAY6B,CAAC,EACzE7B,EAAU,YAAYA,EAAU,YAAY6B,CAAC,CAAC,EAAI7B,EAAU,YAAY6B,CAAC,EAErE7B,EAAU,YAAYA,EAAU,YAAY6B,CAAC,CAAC,IAAM,KACtDzB,EAASJ,EAAU,YAAY6B,CAAC,CAAC,EAAI9B,EAAgBC,EAAU,YAAY6B,CAAC,EAAG7B,CAAS,EACxFe,EAAWT,EAAMC,EAASP,EAAU,YAAY6B,CAAC,EAAGzB,EAAUJ,EAAU,WAAW,GAEjFA,EAAU,YAAYA,EAAU,YAAY6B,CAAC,CAAC,IAAM,KACtDzB,EAASJ,EAAU,YAAY6B,CAAC,CAAC,EAAI9B,EAAgBC,EAAU,YAAY6B,CAAC,EAAG7B,CAAS,EACxFe,EAAWT,EAAMC,EAASP,EAAU,YAAY6B,CAAC,EAAGzB,EAAUJ,EAAU,WAAW,GAGvF6B,EAAIT,EAAO,YAAYS,CAAC,CAC1B,CACF,CACA,OAAOL,CACT,CFhPe,SAARM,EAAkBC,EAAwBC,EAA2B,CAAC,EAAkB,CAE7F,GAAI,CAACC,EAASF,CAAO,EACnB,MAAM,IAAI,UACR,2DAA2DA,IAAY,KAAO,OAAS,OAAOA,CAAO,GACvG,EAIF,IAAIG,EAAY,EAChB,GAAIF,EAAQ,YAAc,OAAW,CACnC,GAAI,CAACG,EAAuBH,EAAQ,SAAS,EAC3C,MAAM,IAAI,MAAM,4EAA4EA,EAAQ,SAAS,GAAG,EAElHE,EAAYF,EAAQ,SACtB,CACA,IAAII,EAAW,EACf,GAAIJ,EAAQ,WAAa,OAAW,CAClC,GAAI,CAACG,EAAuBH,EAAQ,QAAQ,EAC1C,MAAM,IAAI,MAAM,2EAA2EA,EAAQ,QAAQ,GAAG,EAEhH,GAAIA,EAAQ,SAAW,EACrB,MAAM,IAAI,MAAM,qEAAqEA,EAAQ,QAAQ,GAAG,EAE1GI,EAAWJ,EAAQ,QACrB,CACA,IAAIK,EAAS,GAMb,GALIL,EAAQ,SAAW,SACrBK,EAAS,CAAC,CAACL,EAAQ,QAIjBE,IAAc,GAAKE,IAAa,EAClC,OAAOL,EAGJM,IACHN,EAAU,gBAAgBA,CAAO,GAGnC,IAAMO,EAAuB,CAC3B,YAAa,CAAC,EACd,YAAa,CAAC,EACd,YAAa,CAAC,CAChB,EACA,OAAAC,EAAiBR,EAASO,CAAS,EAE/BA,EAAU,YAAY,QACxBE,EAAgBT,EAASU,EAAgBH,EAAWI,EAAeJ,EAAU,WAAW,EAAGJ,EAAWE,CAAQ,EAAG,CAAC,EAG7GL,CACT,CACA,SAASS,EAAgBT,EAAwBY,EAAuBC,EAAuB,CAC7F,GAAIC,EAAoBd,CAAO,EAC7B,QAASe,EAAI,EAAGA,EAAIf,EAAQ,SAAS,OAAQe,IAC3CF,EAAQJ,EAAgBT,EAAQ,SAASe,CAAC,EAAGH,EAAWC,CAAK,UAEtDG,EAAUhB,CAAO,EAC1Ba,EAAQJ,EAAgBT,EAAQ,SAAUY,EAAWC,CAAK,UACjDI,EAAqBjB,CAAO,EACrC,QAASe,EAAI,EAAGA,EAAIf,EAAQ,WAAW,OAAQe,IAC7CF,EAAQJ,EAAgBT,EAAQ,WAAWe,CAAC,EAAGH,EAAWC,CAAK,UAExDK,EAAalB,CAAO,EAC7Ba,EAAQM,EAAoBnB,EAAQ,YAAaY,EAAWC,CAAK,UACxDO,EAAkBpB,CAAO,EAClC,QAASe,EAAI,EAAGA,EAAIf,EAAQ,YAAY,OAAQe,IAC9CF,EAAQM,EAAoBnB,EAAQ,YAAYe,CAAC,EAAGH,EAAWC,CAAK,UAE7DQ,EAAUrB,CAAO,EAAG,CAC7B,IAAIsB,EAAS,GACZ,CAACT,EAAOS,CAAM,EAAIC,EAAqBvB,EAAQ,YAAaY,EAAWC,CAAK,EACzES,GAAQtB,EAAQ,YAAY,OAAO,CAAC,CAC1C,SAAWwB,EAAexB,CAAO,EAAG,CAClC,IAAIyB,EAAS,EACb,QAASH,EAAS,GAAOP,EAAI,EAAGA,EAAIf,EAAQ,YAAY,OAAQe,IAC7D,CAACF,EAAOS,CAAM,EAAIC,EAAqBvB,EAAQ,YAAYe,CAAC,EAAGH,EAAWC,CAAK,EAC5ES,EACFG,IACSA,IACTzB,EAAQ,YAAYe,EAAIU,CAAM,EAAIzB,EAAQ,YAAYe,CAAC,GAGvDU,GAAQzB,EAAQ,YAAY,OAAOA,EAAQ,YAAY,OAASyB,CAAM,CAC5E,CACA,OAAOZ,CACT,CAEA,SAASM,EAAoBO,EAAyBd,EAAuBC,EAAuB,CAClG,IAAIY,EAAS,EACb,QAASV,EAAI,EAAGA,EAAIW,EAAY,OAAQX,IAClCH,EAAUC,CAAK,EACjBY,IACSA,IACTC,EAAYX,EAAIU,CAAM,EAAIC,EAAYX,CAAC,GAEzCF,IAEF,OAAIY,GAAQC,EAAY,OAAOA,EAAY,OAASD,CAAM,EACnDZ,CACT,CAEA,SAASU,EAAqBG,EAA2Bd,EAAuBC,EAAkC,CAChH,IAAIY,EAAS,EACb,QAASH,EAAS,GAAOP,EAAI,EAAGA,EAAIW,EAAY,OAAQX,IAEtD,GADC,CAACF,EAAOS,CAAM,EAAIK,EAAoBD,EAAYX,CAAC,EAAGH,EAAWC,CAAK,EACnES,EAAQ,CAEV,GAAIP,IAAM,EAAG,CACX,IAAKA,EAAI,EAAGA,EAAIW,EAAY,OAAQX,IAC9BW,EAAYX,CAAC,EAAE,SAAQF,GAASa,EAAYX,CAAC,EAAE,OAAS,GAG9D,MAAO,CAACF,EAAO,EAAI,CACrB,CACAY,GACF,MAAWA,IACTC,EAAYX,EAAIU,CAAM,EAAIC,EAAYX,CAAC,GAG3C,OAAIU,GAAQC,EAAY,OAAOA,EAAY,OAASD,CAAM,EACnD,CAACZ,EAAO,EAAK,CACtB,CAEA,SAASc,EAAoBD,EAAyBd,EAAuBC,EAAkC,CAC7G,IAAIY,EAAS,EACb,QAASV,EAAI,EAAGA,EAAIW,EAAY,OAAS,EAAGX,IACtCH,EAAUC,CAAK,EACjBY,IACSA,IACTC,EAAYX,EAAIU,CAAM,EAAIC,EAAYX,CAAC,GAEzCF,IAEF,GAAIY,EAAQ,CACV,GAAIC,EAAY,OAAS,EAAID,EAAS,EAEpC,MAAO,CAACZ,EAAO,EAAI,EAErBa,EAAY,OAAOA,EAAY,OAAS,EAAID,EAAQA,EAAS,EAAGC,EAAY,CAAC,CAAC,CAChF,CACA,MAAO,CAACb,EAAO,EAAK,CACtB,CAEA,SAASL,EAAiBR,EAAwBO,EAA4B,CAC5E,GAAIO,EAAoBd,CAAO,EAC7B,QAASe,EAAI,EAAGA,EAAIf,EAAQ,SAAS,OAAQe,IAC3CP,EAAiBR,EAAQ,SAASe,CAAC,EAAGR,CAAS,UAExCS,EAAUhB,CAAO,EAC1BQ,EAAiBR,EAAQ,SAAUO,CAAS,UACnCU,EAAqBjB,CAAO,EACrC,QAASe,EAAI,EAAGA,EAAIf,EAAQ,WAAW,OAAQe,IAC7CP,EAAiBR,EAAQ,WAAWe,CAAC,EAAGR,CAAS,UAE1CW,EAAalB,CAAO,EAC7B4B,EAAqB5B,EAAQ,YAAaO,CAAS,UAC1Ca,EAAkBpB,CAAO,EAClC,QAASe,EAAI,EAAGA,EAAIf,EAAQ,YAAY,OAAQe,IAC9Ca,EAAqB5B,EAAQ,YAAYe,CAAC,EAAGR,CAAS,UAE/Cc,EAAUrB,CAAO,EAC1B,QAASe,EAAI,EAAGA,EAAIf,EAAQ,YAAY,OAAQe,IAC9Cc,EAAqB7B,EAAQ,YAAYe,CAAC,EAAGR,CAAS,UAE/CiB,EAAexB,CAAO,EAC/B,QAAS8B,EAAGf,EAAI,EAAGA,EAAIf,EAAQ,YAAY,OAAQe,IACjD,IAAKe,EAAI,EAAGA,EAAI9B,EAAQ,YAAYe,CAAC,EAAE,OAAQe,IAC7CD,EAAqB7B,EAAQ,YAAYe,CAAC,EAAEe,CAAC,EAAGvB,CAAS,CAIjE,CAEA,SAASqB,EAAqBF,EAAyBnB,EAAsB,CAC3E,QAASwB,EAAIxB,EAAU,YAAY,OAAQ,EAAImB,EAAY,OAAQX,EAAI,EAAGA,EAAI,EAAGA,IAC/ER,EAAU,YAAY,KAAKmB,EAAYX,CAAC,CAAC,EACzCR,EAAU,YAAY,KAAKQ,IAAM,EAAI,GAAKgB,EAAIhB,EAAI,CAAC,EACnDR,EAAU,YAAY,KAAKQ,IAAM,EAAI,EAAI,GAAKgB,EAAIhB,EAAI,CAAC,CAE3D,CAEA,SAASc,EAAqBH,EAAyBnB,EAAsB,CAC3E,QAASwB,EAAIxB,EAAU,YAAY,OAAQ,EAAImB,EAAY,OAAS,EAAGX,EAAI,EAAGA,EAAI,EAAGA,IACnFR,EAAU,YAAY,KAAKmB,EAAYX,CAAC,CAAC,EACzCR,EAAU,YAAY,KAAKQ,IAAM,EAAIgB,EAAI,EAAI,EAAIA,EAAIhB,EAAI,CAAC,EAC1DR,EAAU,YAAY,KAAKQ,IAAM,EAAI,EAAIgB,EAAIA,EAAIhB,EAAI,CAAC,CAE1D","names":["index_exports","__export","index_default","__toCommonJS","isFinitePositiveNumber","value","isObject","isFeature","isFeatureCollection","isLineString","isMultiLineString","isPolygon","isMultiPolygon","isGeometryCollection","groupPositions","coordinates","groupOf","groupSize","nextInGroup","groupTail","groupsByX","i","x","y","byX","root","byY","existing","getPositionArea","positions","heapcompare","a","b","priority","heapsink","heap","heapRev","value","l","r","t","selected","heapbubble","heapswap","heapupdate","val","heappop","heapify","deletePositions","groups","tolerance","fraction","n","isDeleted","toDelete","candidatesByGroup","isCandidate","groupId","k","index_default","geojson","options","isObject","tolerance","isFinitePositiveNumber","fraction","mutate","positions","collectPositions","updatePositions","deletePositions","groupPositions","isDeleted","index","isFeatureCollection","i","isFeature","isGeometryCollection","isLineString","updateLinePositions","isMultiLineString","isPolygon","remove","updateRingsPositions","isMultiPolygon","offset","coordinates","updateRingPositions","collectLinePositions","collectRingPositions","j","p"]}
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
function v(e){return e!=null&&Number.isFinite(e)&&e>0}function d(e){return typeof e=="object"&&e!==null}function
|
|
1
|
+
function v(e){return e!=null&&Number.isFinite(e)&&e>0}function d(e){return typeof e=="object"&&e!==null}function s(e){return d(e)&&e?.type==="Feature"}function A(e){return d(e)&&e?.type==="FeatureCollection"}function U(e){return d(e)&&e?.type==="LineString"}function G(e){return d(e)&&e?.type==="MultiLineString"}function O(e){return d(e)&&e?.type==="Polygon"}function h(e){return d(e)&&e?.type==="MultiPolygon"}function g(e){return d(e)&&e?.type==="GeometryCollection"}function M(e){let r=new Uint32Array(e.length),t=new Uint32Array(e.length),n=new Uint32Array(e.length),u=new Uint32Array(e.length),l=new Map;for(let f=0;f<e.length;f++){let b=e[f][0],a=e[f][1],c=l.get(b),o;if(c===void 0)o=f,l.set(b,f);else if(typeof c=="number")if(e[c][1]===a)o=c;else{o=f;let y=new Map;y.set(e[c][1],c),y.set(a,f),l.set(b,y)}else{let y=c.get(a);y===void 0?(o=f,c.set(a,f)):o=y}r[f]=o,o===f?(t[o]=1,u[o]=f):(t[o]++,n[u[o]]=f,u[o]=f),n[f]=e.length}return{groupOf:r,groupSize:t,nextInGroup:n}}function w(e,r){return Math.abs(r.coordinates[e][0]*(r.coordinates[r.prevIndexes[e]][1]-r.coordinates[r.nextIndexes[e]][1])+r.coordinates[r.prevIndexes[e]][0]*(r.coordinates[r.nextIndexes[e]][1]-r.coordinates[e][1])+r.coordinates[r.nextIndexes[e]][0]*(r.coordinates[e][1]-r.coordinates[r.prevIndexes[e]][1]))/2}function F(e,r,t,n){return t[e]-t[r]||n[e][0]-n[r][0]||n[e][1]-n[r][1]}function S(e,r,t,n,u){let l=e[t],f,b,a,c;for(;a=t,c=l,(f=t<<1)<=e[0]&&F(c,e[f],n,u)>0&&(a=f,c=e[f]),(b=f+1)<=e[0]&&F(c,e[b],n,u)>0&&(a=b),t!==a;)e[t]=e[a],r[e[t]]=t,t=a;return e[t]=l,r[l]=t,t}function z(e,r,t,n,u){let l;for(;t>1&&(l=t>>>1,!(t===l||F(e[l],e[t],n,u)<=0));)J(e,r,t,l),t=l;return t}function p(e,r,t,n,u){z(e,r,S(e,r,r[t],n,u),n,u)}function J(e,r,t,n){r[e[t]]=n,r[e[n]]=t,[e[t],e[n]]=[e[n],e[t]]}function $(e,r,t,n){return e[0]>1?(J(e,r,1,e[0]),e[0]--,S(e,r,1,t,n),e[e[0]+1]):e[0]===1?(e[0]--,e[1]):-1}function q(e,r,t,n){for(let u=e[0]>>>1;u>0;u--)S(e,r,u,t,n)}function C(e,r,t,n){let u=e.coordinates.length,l=new Uint8Array(u),f=Math.round(u*n),b=new Uint32Array(u),a=new Uint8Array(u),c=new Uint32Array(u+1),o=new Float64Array(u),y=new Uint32Array(u);for(let m=0;m<u;m++)e.prevIndexes[m]!==-1&&e.nextIndexes[m]!==-1&&(o[m]=w(m,e),c[0]++,c[c[0]]=m,y[m]=c[0]);q(c,y,o,e.coordinates);let x;for(;c[0];){if(x=$(c,y,o,e.coordinates),l[x])continue;if(o[x]>=t&&f<=0)break;let m=r.groupOf[x];if(a[x]||(a[x]=1,b[m]++),b[m]!==r.groupSize[m])continue;let i=m;for(;i<u;){if(l[i]){i=r.nextInGroup[i];continue}if(e.prevIndexes[i]!==-1&&e.prevIndexes[e.prevIndexes[i]]!==-1&&e.prevIndexes[e.prevIndexes[e.prevIndexes[i]]]===i){if(a[e.prevIndexes[i]]||(a[e.prevIndexes[i]]=1,b[r.groupOf[e.prevIndexes[i]]]++),a[e.nextIndexes[i]]||(a[e.nextIndexes[i]]=1,b[r.groupOf[e.nextIndexes[i]]]++),b[r.groupOf[e.prevIndexes[i]]]===r.groupSize[r.groupOf[e.prevIndexes[i]]]&&b[r.groupOf[e.nextIndexes[i]]]===r.groupSize[r.groupOf[e.nextIndexes[i]]]){l[i]=1,l[e.nextIndexes[i]]=1,l[e.prevIndexes[i]]=1,f-=3,i=m;continue}}else l[i]=1,f--,e.prevIndexes[e.nextIndexes[i]]=e.prevIndexes[i],e.nextIndexes[e.prevIndexes[i]]=e.nextIndexes[i],e.prevIndexes[e.prevIndexes[i]]!==-1&&(o[e.prevIndexes[i]]=w(e.prevIndexes[i],e),p(c,y,e.prevIndexes[i],o,e.coordinates)),e.nextIndexes[e.nextIndexes[i]]!==-1&&(o[e.nextIndexes[i]]=w(e.nextIndexes[i],e),p(c,y,e.nextIndexes[i],o,e.coordinates));i=r.nextInGroup[i]}}return l}function H(e,r={}){if(!d(e))throw new TypeError(`Expected provided GeoJSON to be an object, but received ${e===null?"null":typeof e}.`);let t=0;if(r.tolerance!==void 0){if(!v(r.tolerance))throw new Error(`Expected provided tolerance to be a finite positive number, but received ${r.tolerance}.`);t=r.tolerance}let n=0;if(r.fraction!==void 0){if(!v(r.fraction))throw new Error(`Expected provided fraction to be a finite positive number, but received ${r.fraction}.`);if(r.fraction>1)throw new Error(`Expected provided fraction to be less or equal to 1, but received ${r.fraction}.`);n=r.fraction}let u=!0;if(r.mutate!==void 0&&(u=!!r.mutate),t===0&&n===0)return e;u||(e=structuredClone(e));let l={coordinates:[],nextIndexes:[],prevIndexes:[]};return P(e,l),l.coordinates.length&&I(e,C(l,M(l.coordinates),t,n),0),e}function I(e,r,t){if(A(e))for(let n=0;n<e.features.length;n++)t=I(e.features[n],r,t);else if(s(e))t=I(e.geometry,r,t);else if(g(e))for(let n=0;n<e.geometries.length;n++)t=I(e.geometries[n],r,t);else if(U(e))t=L(e.coordinates,r,t);else if(G(e))for(let n=0;n<e.coordinates.length;n++)t=L(e.coordinates[n],r,t);else if(O(e)){let n=!1;[t,n]=E(e.coordinates,r,t),n&&e.coordinates.splice(0)}else if(h(e)){let n=0;for(let u=!1,l=0;l<e.coordinates.length;l++)[t,u]=E(e.coordinates[l],r,t),u?n++:n&&(e.coordinates[l-n]=e.coordinates[l]);n&&e.coordinates.splice(e.coordinates.length-n)}return t}function L(e,r,t){let n=0;for(let u=0;u<e.length;u++)r[t]?n++:n&&(e[u-n]=e[u]),t++;return n&&e.splice(e.length-n),t}function E(e,r,t){let n=0;for(let u=!1,l=0;l<e.length;l++)if([t,u]=B(e[l],r,t),u){if(l===0){for(l=1;l<e.length;l++)e[l].length&&(t+=e[l].length-1);return[t,!0]}n++}else n&&(e[l-n]=e[l]);return n&&e.splice(e.length-n),[t,!1]}function B(e,r,t){let n=0;for(let u=0;u<e.length-1;u++)r[t]?n++:n&&(e[u-n]=e[u]),t++;if(n){if(e.length-1-n<3)return[t,!0];e.splice(e.length-1-n,n+1,e[0])}return[t,!1]}function P(e,r){if(A(e))for(let t=0;t<e.features.length;t++)P(e.features[t],r);else if(s(e))P(e.geometry,r);else if(g(e))for(let t=0;t<e.geometries.length;t++)P(e.geometries[t],r);else if(U(e))N(e.coordinates,r);else if(G(e))for(let t=0;t<e.coordinates.length;t++)N(e.coordinates[t],r);else if(O(e))for(let t=0;t<e.coordinates.length;t++)k(e.coordinates[t],r);else if(h(e))for(let t,n=0;n<e.coordinates.length;n++)for(t=0;t<e.coordinates[n].length;t++)k(e.coordinates[n][t],r)}function N(e,r){for(let t=r.coordinates.length,n=e.length,u=0;u<n;u++)r.coordinates.push(e[u]),r.prevIndexes.push(u===0?-1:t+u-1),r.nextIndexes.push(u===n-1?-1:t+u+1)}function k(e,r){for(let t=r.coordinates.length,n=e.length-1,u=0;u<n;u++)r.coordinates.push(e[u]),r.prevIndexes.push(u===0?t+n-1:t+u-1),r.nextIndexes.push(u===n-1?t:t+u+1)}export{H as default};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lib/typeGuards.ts","../src/lib/functions.ts","../src/index.ts"],"sourcesContent":["import {\n GeoJsonObject,\n Feature,\n FeatureCollection,\n LineString,\n MultiLineString,\n Polygon,\n MultiPolygon,\n GeometryCollection,\n} from 'geojson'\n\nexport type FinitePositiveNumber = number & { readonly __type: unique symbol }\n\nexport function isFinitePositiveNumber(value: number): value is FinitePositiveNumber {\n return value != null && Number.isFinite(value) && value > 0\n}\n\nexport function isObject(value: object): value is object {\n return typeof value === 'object' && value !== null\n}\n\nexport function isFeature(value: GeoJsonObject): value is Feature {\n return isObject(value) && value?.type === 'Feature'\n}\n\nexport function isFeatureCollection(value: GeoJsonObject): value is FeatureCollection {\n return isObject(value) && value?.type === 'FeatureCollection'\n}\n\nexport function isLineString(value: GeoJsonObject): value is LineString {\n return isObject(value) && value?.type === 'LineString'\n}\n\nexport function isMultiLineString(value: GeoJsonObject): value is MultiLineString {\n return isObject(value) && value?.type === 'MultiLineString'\n}\n\nexport function isPolygon(value: GeoJsonObject): value is Polygon {\n return isObject(value) && value?.type === 'Polygon'\n}\n\nexport function isMultiPolygon(value: GeoJsonObject): value is MultiPolygon {\n return isObject(value) && value?.type === 'MultiPolygon'\n}\n\nexport function isGeometryCollection(value: GeoJsonObject): value is GeometryCollection {\n return isObject(value) && value?.type === 'GeometryCollection'\n}\n","import { Position } from 'geojson'\n\nexport type Positions = {\n coordinates: Position[]\n nextIndexes: number[]\n prevIndexes: number[]\n}\n\nexport type Groups = {\n sortIndexes: Uint32Array\n groupedFrom: Uint32Array\n groupedTo: Uint32Array\n}\n\nexport function groupPositions(coordinates: Position[]): Groups {\n const sortIndexes = new Uint32Array(coordinates.length)\n const groupedFrom = new Uint32Array(coordinates.length)\n const groupedTo = new Uint32Array(coordinates.length)\n for (let i = 0; i < coordinates.length; i++) {\n sortIndexes[i] = i\n }\n sortIndexes.sort((a, b) => {\n const deltaX = coordinates[a][0] - coordinates[b][0]\n if (deltaX) {\n return deltaX < 0 ? -1 : 1\n }\n const deltaY = coordinates[a][1] - coordinates[b][1]\n return deltaY < 0 ? -1 : deltaY > 0 ? 1 : 0\n })\n if (coordinates.length) {\n groupedTo[sortIndexes[coordinates.length - 1]] = groupedTo.length - 1\n }\n for (let i = 1, j = coordinates.length - 2; i < coordinates.length; i++, j--) {\n if (\n coordinates[sortIndexes[i]][0] !== coordinates[sortIndexes[i - 1]][0] ||\n coordinates[sortIndexes[i]][1] !== coordinates[sortIndexes[i - 1]][1]\n ) {\n groupedFrom[sortIndexes[i]] = i\n } else {\n groupedFrom[sortIndexes[i]] = groupedFrom[sortIndexes[i - 1]]\n }\n if (\n coordinates[sortIndexes[j]][0] !== coordinates[sortIndexes[j + 1]][0] ||\n coordinates[sortIndexes[j]][1] !== coordinates[sortIndexes[j + 1]][1]\n ) {\n groupedTo[sortIndexes[j]] = j\n } else {\n groupedTo[sortIndexes[j]] = groupedTo[sortIndexes[j + 1]]\n }\n }\n return {\n sortIndexes,\n groupedFrom,\n groupedTo,\n }\n}\n\nfunction getPositionArea(i: number, positions: Positions): number {\n return (\n Math.abs(\n positions.coordinates[i][0] *\n (positions.coordinates[positions.prevIndexes[i]][1] - positions.coordinates[positions.nextIndexes[i]][1]) +\n positions.coordinates[positions.prevIndexes[i]][0] *\n (positions.coordinates[positions.nextIndexes[i]][1] - positions.coordinates[i][1]) +\n positions.coordinates[positions.nextIndexes[i]][0] *\n (positions.coordinates[i][1] - positions.coordinates[positions.prevIndexes[i]][1]),\n ) / 2\n )\n}\n\nfunction heapcompare(a: number, b: number, priority: Float64Array, coordinates: Position[]): number {\n return priority[a] - priority[b] || coordinates[a][0] - coordinates[b][0] || coordinates[a][1] - coordinates[b][1]\n}\n\nfunction heapsink(\n heap: Uint32Array,\n heapRev: Uint32Array,\n i: number,\n priority: Float64Array,\n coordinates: Position[],\n): number {\n let l: number, r: number, t: number\n while (true) {\n t = i\n if ((l = i << 1) <= heap[0] && heapcompare(heap[t], heap[l], priority, coordinates) > 0) t = l\n if ((r = l + 1) <= heap[0] && heapcompare(heap[t], heap[r], priority, coordinates) > 0) t = r\n if (i === t) break\n heapswap(heap, heapRev, i, t)\n i = t\n }\n return i\n}\n\nfunction heapbubble(\n heap: Uint32Array,\n heapRev: Uint32Array,\n i: number,\n priority: Float64Array,\n coordinates: Position[],\n): number {\n let t: number\n while (i > 1) {\n t = i >>> 1\n if (i === t || heapcompare(heap[t], heap[i], priority, coordinates) <= 0) break\n heapswap(heap, heapRev, i, t)\n i = t\n }\n return i\n}\n\nfunction heapupdate(\n heap: Uint32Array,\n heapRev: Uint32Array,\n val: number,\n priority: Float64Array,\n coordinates: Position[],\n): void {\n heapbubble(heap, heapRev, heapsink(heap, heapRev, heapRev[val], priority, coordinates), priority, coordinates)\n}\n\nfunction heapswap(heap: Uint32Array, heapRev: Uint32Array, i: number, t: number): void {\n heapRev[heap[i]] = t\n heapRev[heap[t]] = i\n ;[heap[i], heap[t]] = [heap[t], heap[i]]\n}\n\nfunction heappop(heap: Uint32Array, heapRev: Uint32Array, priority: Float64Array, coordinates: Position[]): number {\n if (heap[0] > 1) {\n heapswap(heap, heapRev, 1, heap[0])\n heap[0]--\n heapsink(heap, heapRev, 1, priority, coordinates)\n return heap[heap[0] + 1]\n } else if (heap[0] === 1) {\n heap[0]--\n return heap[1]\n }\n return -1\n}\n\nfunction heapify(heap: Uint32Array, heapRev: Uint32Array, priority: Float64Array, coordinates: Position[]): void {\n for (let i = heap[0] >>> 1; i > 0; i--) {\n heapsink(heap, heapRev, i, priority, coordinates)\n }\n}\n\nexport function deletePositions(positions: Positions, groups: Groups, tolerance: number, fraction: number): Uint8Array {\n const n = positions.coordinates.length\n\n const isDeleted = new Uint8Array(n)\n let toDelete = Math.round(n * fraction)\n\n const candidatesByGroupFrom = new Uint32Array(n)\n const isCandidate = new Uint8Array(n)\n\n const heap = new Uint32Array(n + 1)\n const priority = new Float64Array(n)\n const heapRev = new Uint32Array(n)\n\n for (let i = 0; i < n; i++) {\n if (positions.prevIndexes[i] !== -1 && positions.nextIndexes[i] !== -1) {\n priority[i] = getPositionArea(i, positions)\n heap[0]++\n heap[heap[0]] = i\n heapRev[i] = heap[0]\n }\n }\n heapify(heap, heapRev, priority, positions.coordinates)\n\n let i: number\n while (heap[0]) {\n i = heappop(heap, heapRev, priority, positions.coordinates)\n\n if (isDeleted[i]) {\n continue\n }\n\n if (priority[i] >= tolerance && toDelete <= 0) {\n break\n }\n\n if (!isCandidate[i]) {\n isCandidate[i] = 1\n candidatesByGroupFrom[groups.groupedFrom[i]]++\n }\n\n if (candidatesByGroupFrom[groups.groupedFrom[i]] !== groups.groupedTo[i] - groups.groupedFrom[i] + 1) {\n continue\n }\n\n for (let k: number, j = groups.groupedFrom[i]; j <= groups.groupedTo[i]; j++) {\n k = groups.sortIndexes[j]\n if (isDeleted[k]) {\n continue\n }\n\n if (\n positions.prevIndexes[k] !== -1 &&\n positions.prevIndexes[positions.prevIndexes[k]] !== -1 &&\n positions.prevIndexes[positions.prevIndexes[positions.prevIndexes[k]]] === k\n ) {\n if (!isCandidate[positions.prevIndexes[k]]) {\n isCandidate[positions.prevIndexes[k]] = 1\n candidatesByGroupFrom[groups.groupedFrom[positions.prevIndexes[k]]]++\n }\n if (!isCandidate[positions.nextIndexes[k]]) {\n isCandidate[positions.nextIndexes[k]] = 1\n candidatesByGroupFrom[groups.groupedFrom[positions.nextIndexes[k]]]++\n }\n\n if (\n candidatesByGroupFrom[groups.groupedFrom[positions.prevIndexes[k]]] ===\n groups.groupedTo[positions.prevIndexes[k]] - groups.groupedFrom[positions.prevIndexes[k]] + 1 &&\n candidatesByGroupFrom[groups.groupedFrom[positions.nextIndexes[k]]] ===\n groups.groupedTo[positions.nextIndexes[k]] - groups.groupedFrom[positions.nextIndexes[k]] + 1\n ) {\n isDeleted[k] = 1\n isDeleted[positions.nextIndexes[k]] = 1\n isDeleted[positions.prevIndexes[k]] = 1\n toDelete -= 3\n j = groups.groupedFrom[i] - 1\n }\n } else {\n isDeleted[k] = 1\n toDelete--\n positions.prevIndexes[positions.nextIndexes[k]] = positions.prevIndexes[k]\n positions.nextIndexes[positions.prevIndexes[k]] = positions.nextIndexes[k]\n\n if (positions.prevIndexes[positions.prevIndexes[k]] !== -1) {\n priority[positions.prevIndexes[k]] = getPositionArea(positions.prevIndexes[k], positions)\n heapupdate(heap, heapRev, positions.prevIndexes[k], priority, positions.coordinates)\n }\n if (positions.nextIndexes[positions.nextIndexes[k]] !== -1) {\n priority[positions.nextIndexes[k]] = getPositionArea(positions.nextIndexes[k], positions)\n heapupdate(heap, heapRev, positions.nextIndexes[k], priority, positions.coordinates)\n }\n }\n }\n }\n return isDeleted\n}\n","import { GeoJsonObject, Position } from 'geojson'\nimport {\n isObject,\n isFinitePositiveNumber,\n isFeature,\n isFeatureCollection,\n isLineString,\n isMultiLineString,\n isPolygon,\n isMultiPolygon,\n isGeometryCollection,\n} from '@lib/typeGuards'\nimport { deletePositions, groupPositions, type Positions } from '@lib/functions'\n\nexport type SimplifyOptions = {\n tolerance?: number\n fraction?: number\n mutate?: boolean\n}\n\nexport default function (geojson: GeoJsonObject, options: SimplifyOptions = {}): GeoJsonObject {\n // validate input data\n if (!isObject(geojson)) {\n throw new TypeError(\n `Expected provided GeoJSON to be an object, but received ${geojson === null ? 'null' : typeof geojson}.`,\n )\n }\n\n // validate options\n let tolerance = 0\n if (options.tolerance !== undefined) {\n if (!isFinitePositiveNumber(options.tolerance)) {\n throw new Error(`Expected provided tolerance to be a finite positive number, but received ${options.tolerance}.`)\n }\n tolerance = options.tolerance\n }\n let fraction = 0\n if (options.fraction !== undefined) {\n if (!isFinitePositiveNumber(options.fraction)) {\n throw new Error(`Expected provided fraction to be a finite positive number, but received ${options.fraction}.`)\n }\n if (options.fraction > 1) {\n throw new Error(`Expected provided fraction to be less or equal to 1, but received ${options.fraction}.`)\n }\n fraction = options.fraction\n }\n let mutate = true\n if (options.mutate !== undefined) {\n mutate = !!options.mutate\n }\n\n // exit if no simplification options provided\n if (tolerance === 0 && fraction === 0) {\n return geojson\n }\n\n if (!mutate) {\n geojson = structuredClone(geojson)\n }\n\n const positions: Positions = {\n coordinates: [],\n nextIndexes: [],\n prevIndexes: [],\n }\n collectPositions(geojson, positions)\n\n if (positions.coordinates.length) {\n updatePositions(geojson, deletePositions(positions, groupPositions(positions.coordinates), tolerance, fraction), 0)\n }\n\n return geojson\n}\nfunction updatePositions(geojson: GeoJsonObject, isDeleted: Uint8Array, index: number): number {\n if (isFeatureCollection(geojson)) {\n for (let i = 0; i < geojson.features.length; i++) {\n index = updatePositions(geojson.features[i], isDeleted, index)\n }\n } else if (isFeature(geojson)) {\n index = updatePositions(geojson.geometry, isDeleted, index)\n } else if (isGeometryCollection(geojson)) {\n for (let i = 0; i < geojson.geometries.length; i++) {\n index = updatePositions(geojson.geometries[i], isDeleted, index)\n }\n } else if (isLineString(geojson)) {\n index = updateLinePositions(geojson.coordinates, isDeleted, index)\n } else if (isMultiLineString(geojson)) {\n for (let i = 0; i < geojson.coordinates.length; i++) {\n index = updateLinePositions(geojson.coordinates[i], isDeleted, index)\n }\n } else if (isPolygon(geojson)) {\n let remove = false\n ;[index, remove] = updateRingsPositions(geojson.coordinates, isDeleted, index)\n if (remove) geojson.coordinates.splice(0)\n } else if (isMultiPolygon(geojson)) {\n let offset = 0\n for (let remove = false, i = 0; i < geojson.coordinates.length; i++) {\n ;[index, remove] = updateRingsPositions(geojson.coordinates[i], isDeleted, index)\n if (remove) {\n offset++\n } else if (offset) {\n geojson.coordinates[i - offset] = geojson.coordinates[i]\n }\n }\n if (offset) geojson.coordinates.splice(geojson.coordinates.length - offset)\n }\n return index\n}\n\nfunction updateLinePositions(coordinates: Position[], isDeleted: Uint8Array, index: number): number {\n let offset = 0\n for (let i = 0; i < coordinates.length; i++) {\n if (isDeleted[index]) {\n offset++\n } else if (offset) {\n coordinates[i - offset] = coordinates[i]\n }\n index++\n }\n if (offset) coordinates.splice(coordinates.length - offset)\n return index\n}\n\nfunction updateRingsPositions(coordinates: Position[][], isDeleted: Uint8Array, index: number): [number, boolean] {\n let offset = 0\n for (let remove = false, i = 0; i < coordinates.length; i++) {\n ;[index, remove] = updateRingPositions(coordinates[i], isDeleted, index)\n if (remove) {\n // skip interior rings if exterior ring is removed\n if (i === 0) {\n for (i = 1; i < coordinates.length; i++) {\n if (coordinates[i].length) index += coordinates[i].length - 1\n }\n // avoid alternating coordinates array if exterior ring is removed\n return [index, true]\n }\n offset++\n } else if (offset) {\n coordinates[i - offset] = coordinates[i]\n }\n }\n if (offset) coordinates.splice(coordinates.length - offset)\n return [index, false]\n}\n\nfunction updateRingPositions(coordinates: Position[], isDeleted: Uint8Array, index: number): [number, boolean] {\n let offset = 0\n for (let i = 0; i < coordinates.length - 1; i++) {\n if (isDeleted[index]) {\n offset++\n } else if (offset) {\n coordinates[i - offset] = coordinates[i]\n }\n index++\n }\n if (offset) {\n if (coordinates.length - 1 - offset < 3) {\n // avoid alternating coordinates array if ring is removed\n return [index, true]\n }\n coordinates.splice(coordinates.length - 1 - offset, offset + 1, coordinates[0])\n }\n return [index, false]\n}\n\nfunction collectPositions(geojson: GeoJsonObject, positions: Positions): void {\n if (isFeatureCollection(geojson)) {\n for (let i = 0; i < geojson.features.length; i++) {\n collectPositions(geojson.features[i], positions)\n }\n } else if (isFeature(geojson)) {\n collectPositions(geojson.geometry, positions)\n } else if (isGeometryCollection(geojson)) {\n for (let i = 0; i < geojson.geometries.length; i++) {\n collectPositions(geojson.geometries[i], positions)\n }\n } else if (isLineString(geojson)) {\n collectLinePositions(geojson.coordinates, positions)\n } else if (isMultiLineString(geojson)) {\n for (let i = 0; i < geojson.coordinates.length; i++) {\n collectLinePositions(geojson.coordinates[i], positions)\n }\n } else if (isPolygon(geojson)) {\n for (let i = 0; i < geojson.coordinates.length; i++) {\n collectRingPositions(geojson.coordinates[i], positions)\n }\n } else if (isMultiPolygon(geojson)) {\n for (let j, i = 0; i < geojson.coordinates.length; i++) {\n for (j = 0; j < geojson.coordinates[i].length; j++) {\n collectRingPositions(geojson.coordinates[i][j], positions)\n }\n }\n }\n}\n\nfunction collectLinePositions(coordinates: Position[], positions: Positions) {\n for (let p = positions.coordinates.length, n = coordinates.length, i = 0; i < n; i++) {\n positions.coordinates.push(coordinates[i])\n positions.prevIndexes.push(i === 0 ? -1 : p + i - 1)\n positions.nextIndexes.push(i === n - 1 ? -1 : p + i + 1)\n }\n}\n\nfunction collectRingPositions(coordinates: Position[], positions: Positions) {\n for (let p = positions.coordinates.length, n = coordinates.length - 1, i = 0; i < n; i++) {\n positions.coordinates.push(coordinates[i])\n positions.prevIndexes.push(i === 0 ? p + n - 1 : p + i - 1)\n positions.nextIndexes.push(i === n - 1 ? p : p + i + 1)\n }\n}\n"],"mappings":"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","names":["isFinitePositiveNumber","value","isObject","isFeature","isFeatureCollection","isLineString","isMultiLineString","isPolygon","isMultiPolygon","isGeometryCollection","groupPositions","coordinates","sortIndexes","groupedFrom","groupedTo","i","a","b","deltaX","deltaY","j","getPositionArea","positions","heapcompare","priority","heapsink","heap","heapRev","l","r","t","heapswap","heapbubble","heapupdate","val","heappop","heapify","deletePositions","groups","tolerance","fraction","n","isDeleted","toDelete","candidatesByGroupFrom","isCandidate","k","index_default","geojson","options","isObject","tolerance","isFinitePositiveNumber","fraction","mutate","positions","collectPositions","updatePositions","deletePositions","groupPositions","isDeleted","index","isFeatureCollection","i","isFeature","isGeometryCollection","isLineString","updateLinePositions","isMultiLineString","isPolygon","remove","updateRingsPositions","isMultiPolygon","offset","coordinates","updateRingPositions","collectLinePositions","collectRingPositions","j","p"]}
|
|
1
|
+
{"version":3,"sources":["../src/lib/typeGuards.ts","../src/lib/functions.ts","../src/index.ts"],"sourcesContent":["import {\n GeoJsonObject,\n Feature,\n FeatureCollection,\n LineString,\n MultiLineString,\n Polygon,\n MultiPolygon,\n GeometryCollection,\n} from 'geojson'\n\nexport type FinitePositiveNumber = number & { readonly __type: unique symbol }\n\nexport function isFinitePositiveNumber(value: number): value is FinitePositiveNumber {\n return value != null && Number.isFinite(value) && value > 0\n}\n\nexport function isObject(value: object): value is object {\n return typeof value === 'object' && value !== null\n}\n\nexport function isFeature(value: GeoJsonObject): value is Feature {\n return isObject(value) && value?.type === 'Feature'\n}\n\nexport function isFeatureCollection(value: GeoJsonObject): value is FeatureCollection {\n return isObject(value) && value?.type === 'FeatureCollection'\n}\n\nexport function isLineString(value: GeoJsonObject): value is LineString {\n return isObject(value) && value?.type === 'LineString'\n}\n\nexport function isMultiLineString(value: GeoJsonObject): value is MultiLineString {\n return isObject(value) && value?.type === 'MultiLineString'\n}\n\nexport function isPolygon(value: GeoJsonObject): value is Polygon {\n return isObject(value) && value?.type === 'Polygon'\n}\n\nexport function isMultiPolygon(value: GeoJsonObject): value is MultiPolygon {\n return isObject(value) && value?.type === 'MultiPolygon'\n}\n\nexport function isGeometryCollection(value: GeoJsonObject): value is GeometryCollection {\n return isObject(value) && value?.type === 'GeometryCollection'\n}\n","import { Position } from 'geojson'\n\nexport type Positions = {\n coordinates: Position[]\n nextIndexes: number[]\n prevIndexes: number[]\n}\n\nexport type Groups = {\n groupOf: Uint32Array\n groupSize: Uint32Array\n nextInGroup: Uint32Array\n}\n\nexport function groupPositions(coordinates: Position[]): Groups {\n const groupOf = new Uint32Array(coordinates.length)\n const groupSize = new Uint32Array(coordinates.length)\n const nextInGroup = new Uint32Array(coordinates.length)\n const groupTail = new Uint32Array(coordinates.length)\n const groupsByX = new Map<number, number | Map<number, number>>()\n for (let i = 0; i < coordinates.length; i++) {\n const x = coordinates[i][0]\n const y = coordinates[i][1]\n const byX = groupsByX.get(x)\n let root: number\n if (byX === undefined) {\n root = i\n groupsByX.set(x, i)\n } else if (typeof byX === 'number') {\n if (coordinates[byX][1] === y) {\n root = byX\n } else {\n root = i\n const byY = new Map<number, number>()\n byY.set(coordinates[byX][1], byX)\n byY.set(y, i)\n groupsByX.set(x, byY)\n }\n } else {\n const existing = byX.get(y)\n if (existing === undefined) {\n root = i\n byX.set(y, i)\n } else {\n root = existing\n }\n }\n groupOf[i] = root\n if (root === i) {\n groupSize[root] = 1\n groupTail[root] = i\n } else {\n groupSize[root]++\n nextInGroup[groupTail[root]] = i\n groupTail[root] = i\n }\n nextInGroup[i] = coordinates.length\n }\n return {\n groupOf,\n groupSize,\n nextInGroup,\n }\n}\n\nfunction getPositionArea(i: number, positions: Positions): number {\n return (\n Math.abs(\n positions.coordinates[i][0] *\n (positions.coordinates[positions.prevIndexes[i]][1] - positions.coordinates[positions.nextIndexes[i]][1]) +\n positions.coordinates[positions.prevIndexes[i]][0] *\n (positions.coordinates[positions.nextIndexes[i]][1] - positions.coordinates[i][1]) +\n positions.coordinates[positions.nextIndexes[i]][0] *\n (positions.coordinates[i][1] - positions.coordinates[positions.prevIndexes[i]][1]),\n ) / 2\n )\n}\n\nfunction heapcompare(a: number, b: number, priority: Float64Array, coordinates: Position[]): number {\n return priority[a] - priority[b] || coordinates[a][0] - coordinates[b][0] || coordinates[a][1] - coordinates[b][1]\n}\n\nfunction heapsink(\n heap: Uint32Array,\n heapRev: Uint32Array,\n i: number,\n priority: Float64Array,\n coordinates: Position[],\n): number {\n const value = heap[i]\n let l: number, r: number, t: number\n let selected: number\n while (true) {\n t = i\n selected = value\n if ((l = i << 1) <= heap[0] && heapcompare(selected, heap[l], priority, coordinates) > 0) {\n t = l\n selected = heap[l]\n }\n if ((r = l + 1) <= heap[0] && heapcompare(selected, heap[r], priority, coordinates) > 0) t = r\n if (i === t) break\n heap[i] = heap[t]\n heapRev[heap[i]] = i\n i = t\n }\n heap[i] = value\n heapRev[value] = i\n return i\n}\n\nfunction heapbubble(\n heap: Uint32Array,\n heapRev: Uint32Array,\n i: number,\n priority: Float64Array,\n coordinates: Position[],\n): number {\n let t: number\n while (i > 1) {\n t = i >>> 1\n if (i === t || heapcompare(heap[t], heap[i], priority, coordinates) <= 0) break\n heapswap(heap, heapRev, i, t)\n i = t\n }\n return i\n}\n\nfunction heapupdate(\n heap: Uint32Array,\n heapRev: Uint32Array,\n val: number,\n priority: Float64Array,\n coordinates: Position[],\n): void {\n heapbubble(heap, heapRev, heapsink(heap, heapRev, heapRev[val], priority, coordinates), priority, coordinates)\n}\n\nfunction heapswap(heap: Uint32Array, heapRev: Uint32Array, i: number, t: number): void {\n heapRev[heap[i]] = t\n heapRev[heap[t]] = i\n ;[heap[i], heap[t]] = [heap[t], heap[i]]\n}\n\nfunction heappop(heap: Uint32Array, heapRev: Uint32Array, priority: Float64Array, coordinates: Position[]): number {\n if (heap[0] > 1) {\n heapswap(heap, heapRev, 1, heap[0])\n heap[0]--\n heapsink(heap, heapRev, 1, priority, coordinates)\n return heap[heap[0] + 1]\n } else if (heap[0] === 1) {\n heap[0]--\n return heap[1]\n }\n return -1\n}\n\nfunction heapify(heap: Uint32Array, heapRev: Uint32Array, priority: Float64Array, coordinates: Position[]): void {\n for (let i = heap[0] >>> 1; i > 0; i--) {\n heapsink(heap, heapRev, i, priority, coordinates)\n }\n}\n\nexport function deletePositions(positions: Positions, groups: Groups, tolerance: number, fraction: number): Uint8Array {\n const n = positions.coordinates.length\n\n const isDeleted = new Uint8Array(n)\n let toDelete = Math.round(n * fraction)\n\n const candidatesByGroup = new Uint32Array(n)\n const isCandidate = new Uint8Array(n)\n\n const heap = new Uint32Array(n + 1)\n const priority = new Float64Array(n)\n const heapRev = new Uint32Array(n)\n\n for (let i = 0; i < n; i++) {\n if (positions.prevIndexes[i] !== -1 && positions.nextIndexes[i] !== -1) {\n priority[i] = getPositionArea(i, positions)\n heap[0]++\n heap[heap[0]] = i\n heapRev[i] = heap[0]\n }\n }\n heapify(heap, heapRev, priority, positions.coordinates)\n\n let i: number\n while (heap[0]) {\n i = heappop(heap, heapRev, priority, positions.coordinates)\n\n if (isDeleted[i]) {\n continue\n }\n\n if (priority[i] >= tolerance && toDelete <= 0) {\n break\n }\n\n const groupId = groups.groupOf[i]\n if (!isCandidate[i]) {\n isCandidate[i] = 1\n candidatesByGroup[groupId]++\n }\n\n if (candidatesByGroup[groupId] !== groups.groupSize[groupId]) {\n continue\n }\n\n let k = groupId\n while (k < n) {\n if (isDeleted[k]) {\n k = groups.nextInGroup[k]\n continue\n }\n\n if (\n positions.prevIndexes[k] !== -1 &&\n positions.prevIndexes[positions.prevIndexes[k]] !== -1 &&\n positions.prevIndexes[positions.prevIndexes[positions.prevIndexes[k]]] === k\n ) {\n if (!isCandidate[positions.prevIndexes[k]]) {\n isCandidate[positions.prevIndexes[k]] = 1\n candidatesByGroup[groups.groupOf[positions.prevIndexes[k]]]++\n }\n if (!isCandidate[positions.nextIndexes[k]]) {\n isCandidate[positions.nextIndexes[k]] = 1\n candidatesByGroup[groups.groupOf[positions.nextIndexes[k]]]++\n }\n\n if (\n candidatesByGroup[groups.groupOf[positions.prevIndexes[k]]] ===\n groups.groupSize[groups.groupOf[positions.prevIndexes[k]]] &&\n candidatesByGroup[groups.groupOf[positions.nextIndexes[k]]] ===\n groups.groupSize[groups.groupOf[positions.nextIndexes[k]]]\n ) {\n isDeleted[k] = 1\n isDeleted[positions.nextIndexes[k]] = 1\n isDeleted[positions.prevIndexes[k]] = 1\n toDelete -= 3\n k = groupId\n continue\n }\n } else {\n isDeleted[k] = 1\n toDelete--\n positions.prevIndexes[positions.nextIndexes[k]] = positions.prevIndexes[k]\n positions.nextIndexes[positions.prevIndexes[k]] = positions.nextIndexes[k]\n\n if (positions.prevIndexes[positions.prevIndexes[k]] !== -1) {\n priority[positions.prevIndexes[k]] = getPositionArea(positions.prevIndexes[k], positions)\n heapupdate(heap, heapRev, positions.prevIndexes[k], priority, positions.coordinates)\n }\n if (positions.nextIndexes[positions.nextIndexes[k]] !== -1) {\n priority[positions.nextIndexes[k]] = getPositionArea(positions.nextIndexes[k], positions)\n heapupdate(heap, heapRev, positions.nextIndexes[k], priority, positions.coordinates)\n }\n }\n k = groups.nextInGroup[k]\n }\n }\n return isDeleted\n}\n","import { GeoJsonObject, Position } from 'geojson'\nimport {\n isObject,\n isFinitePositiveNumber,\n isFeature,\n isFeatureCollection,\n isLineString,\n isMultiLineString,\n isPolygon,\n isMultiPolygon,\n isGeometryCollection,\n} from '@lib/typeGuards'\nimport { deletePositions, groupPositions, type Positions } from '@lib/functions'\n\nexport type SimplifyOptions = {\n tolerance?: number\n fraction?: number\n mutate?: boolean\n}\n\nexport default function (geojson: GeoJsonObject, options: SimplifyOptions = {}): GeoJsonObject {\n // validate input data\n if (!isObject(geojson)) {\n throw new TypeError(\n `Expected provided GeoJSON to be an object, but received ${geojson === null ? 'null' : typeof geojson}.`,\n )\n }\n\n // validate options\n let tolerance = 0\n if (options.tolerance !== undefined) {\n if (!isFinitePositiveNumber(options.tolerance)) {\n throw new Error(`Expected provided tolerance to be a finite positive number, but received ${options.tolerance}.`)\n }\n tolerance = options.tolerance\n }\n let fraction = 0\n if (options.fraction !== undefined) {\n if (!isFinitePositiveNumber(options.fraction)) {\n throw new Error(`Expected provided fraction to be a finite positive number, but received ${options.fraction}.`)\n }\n if (options.fraction > 1) {\n throw new Error(`Expected provided fraction to be less or equal to 1, but received ${options.fraction}.`)\n }\n fraction = options.fraction\n }\n let mutate = true\n if (options.mutate !== undefined) {\n mutate = !!options.mutate\n }\n\n // exit if no simplification options provided\n if (tolerance === 0 && fraction === 0) {\n return geojson\n }\n\n if (!mutate) {\n geojson = structuredClone(geojson)\n }\n\n const positions: Positions = {\n coordinates: [],\n nextIndexes: [],\n prevIndexes: [],\n }\n collectPositions(geojson, positions)\n\n if (positions.coordinates.length) {\n updatePositions(geojson, deletePositions(positions, groupPositions(positions.coordinates), tolerance, fraction), 0)\n }\n\n return geojson\n}\nfunction updatePositions(geojson: GeoJsonObject, isDeleted: Uint8Array, index: number): number {\n if (isFeatureCollection(geojson)) {\n for (let i = 0; i < geojson.features.length; i++) {\n index = updatePositions(geojson.features[i], isDeleted, index)\n }\n } else if (isFeature(geojson)) {\n index = updatePositions(geojson.geometry, isDeleted, index)\n } else if (isGeometryCollection(geojson)) {\n for (let i = 0; i < geojson.geometries.length; i++) {\n index = updatePositions(geojson.geometries[i], isDeleted, index)\n }\n } else if (isLineString(geojson)) {\n index = updateLinePositions(geojson.coordinates, isDeleted, index)\n } else if (isMultiLineString(geojson)) {\n for (let i = 0; i < geojson.coordinates.length; i++) {\n index = updateLinePositions(geojson.coordinates[i], isDeleted, index)\n }\n } else if (isPolygon(geojson)) {\n let remove = false\n ;[index, remove] = updateRingsPositions(geojson.coordinates, isDeleted, index)\n if (remove) geojson.coordinates.splice(0)\n } else if (isMultiPolygon(geojson)) {\n let offset = 0\n for (let remove = false, i = 0; i < geojson.coordinates.length; i++) {\n ;[index, remove] = updateRingsPositions(geojson.coordinates[i], isDeleted, index)\n if (remove) {\n offset++\n } else if (offset) {\n geojson.coordinates[i - offset] = geojson.coordinates[i]\n }\n }\n if (offset) geojson.coordinates.splice(geojson.coordinates.length - offset)\n }\n return index\n}\n\nfunction updateLinePositions(coordinates: Position[], isDeleted: Uint8Array, index: number): number {\n let offset = 0\n for (let i = 0; i < coordinates.length; i++) {\n if (isDeleted[index]) {\n offset++\n } else if (offset) {\n coordinates[i - offset] = coordinates[i]\n }\n index++\n }\n if (offset) coordinates.splice(coordinates.length - offset)\n return index\n}\n\nfunction updateRingsPositions(coordinates: Position[][], isDeleted: Uint8Array, index: number): [number, boolean] {\n let offset = 0\n for (let remove = false, i = 0; i < coordinates.length; i++) {\n ;[index, remove] = updateRingPositions(coordinates[i], isDeleted, index)\n if (remove) {\n // skip interior rings if exterior ring is removed\n if (i === 0) {\n for (i = 1; i < coordinates.length; i++) {\n if (coordinates[i].length) index += coordinates[i].length - 1\n }\n // avoid alternating coordinates array if exterior ring is removed\n return [index, true]\n }\n offset++\n } else if (offset) {\n coordinates[i - offset] = coordinates[i]\n }\n }\n if (offset) coordinates.splice(coordinates.length - offset)\n return [index, false]\n}\n\nfunction updateRingPositions(coordinates: Position[], isDeleted: Uint8Array, index: number): [number, boolean] {\n let offset = 0\n for (let i = 0; i < coordinates.length - 1; i++) {\n if (isDeleted[index]) {\n offset++\n } else if (offset) {\n coordinates[i - offset] = coordinates[i]\n }\n index++\n }\n if (offset) {\n if (coordinates.length - 1 - offset < 3) {\n // avoid alternating coordinates array if ring is removed\n return [index, true]\n }\n coordinates.splice(coordinates.length - 1 - offset, offset + 1, coordinates[0])\n }\n return [index, false]\n}\n\nfunction collectPositions(geojson: GeoJsonObject, positions: Positions): void {\n if (isFeatureCollection(geojson)) {\n for (let i = 0; i < geojson.features.length; i++) {\n collectPositions(geojson.features[i], positions)\n }\n } else if (isFeature(geojson)) {\n collectPositions(geojson.geometry, positions)\n } else if (isGeometryCollection(geojson)) {\n for (let i = 0; i < geojson.geometries.length; i++) {\n collectPositions(geojson.geometries[i], positions)\n }\n } else if (isLineString(geojson)) {\n collectLinePositions(geojson.coordinates, positions)\n } else if (isMultiLineString(geojson)) {\n for (let i = 0; i < geojson.coordinates.length; i++) {\n collectLinePositions(geojson.coordinates[i], positions)\n }\n } else if (isPolygon(geojson)) {\n for (let i = 0; i < geojson.coordinates.length; i++) {\n collectRingPositions(geojson.coordinates[i], positions)\n }\n } else if (isMultiPolygon(geojson)) {\n for (let j, i = 0; i < geojson.coordinates.length; i++) {\n for (j = 0; j < geojson.coordinates[i].length; j++) {\n collectRingPositions(geojson.coordinates[i][j], positions)\n }\n }\n }\n}\n\nfunction collectLinePositions(coordinates: Position[], positions: Positions) {\n for (let p = positions.coordinates.length, n = coordinates.length, i = 0; i < n; i++) {\n positions.coordinates.push(coordinates[i])\n positions.prevIndexes.push(i === 0 ? -1 : p + i - 1)\n positions.nextIndexes.push(i === n - 1 ? -1 : p + i + 1)\n }\n}\n\nfunction collectRingPositions(coordinates: Position[], positions: Positions) {\n for (let p = positions.coordinates.length, n = coordinates.length - 1, i = 0; i < n; i++) {\n positions.coordinates.push(coordinates[i])\n positions.prevIndexes.push(i === 0 ? p + n - 1 : p + i - 1)\n positions.nextIndexes.push(i === n - 1 ? p : p + i + 1)\n }\n}\n"],"mappings":"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","names":["isFinitePositiveNumber","value","isObject","isFeature","isFeatureCollection","isLineString","isMultiLineString","isPolygon","isMultiPolygon","isGeometryCollection","groupPositions","coordinates","groupOf","groupSize","nextInGroup","groupTail","groupsByX","i","x","y","byX","root","byY","existing","getPositionArea","positions","heapcompare","a","b","priority","heapsink","heap","heapRev","value","l","r","t","selected","heapbubble","heapswap","heapupdate","val","heappop","heapify","deletePositions","groups","tolerance","fraction","n","isDeleted","toDelete","candidatesByGroup","isCandidate","groupId","k","index_default","geojson","options","isObject","tolerance","isFinitePositiveNumber","fraction","mutate","positions","collectPositions","updatePositions","deletePositions","groupPositions","isDeleted","index","isFeatureCollection","i","isFeature","isGeometryCollection","isLineString","updateLinePositions","isMultiLineString","isPolygon","remove","updateRingsPositions","isMultiPolygon","offset","coordinates","updateRingPositions","collectLinePositions","collectRingPositions","j","p"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "simplify-geojson-visvalingam",
|
|
3
|
-
"version": "1.3.
|
|
3
|
+
"version": "1.3.9",
|
|
4
4
|
"description": "GeoJSON simplification library using the Visvalingam algorithm for efficient point reduction and geometry preservation.",
|
|
5
5
|
"author": "Alexander Kolobov",
|
|
6
6
|
"license": "MIT",
|