{"version":3,"sources":["../../index.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Feature,\n LineString,\n Position,\n GeoJSON,\n Point,\n Polygon,\n GeometryCollection,\n FeatureCollection,\n MultiLineString,\n MultiPoint,\n MultiPolygon,\n GeoJsonProperties,\n} from \"geojson\";\n\n/**\n\n * GeoJSON equality checking utility.\n * Adapted from https://github.com/geosquare/geojson-equality\n *\n * @memberof helpers\n * @type {Class}\n */\nclass GeojsonEquality {\n private precision: number;\n private direction = false;\n private compareProperties = true;\n\n constructor(opts?: {\n precision?: number;\n direction?: boolean;\n compareProperties?: boolean;\n }) {\n this.precision = 10 ** -(opts?.precision ?? 17);\n this.direction = opts?.direction ?? false;\n this.compareProperties = opts?.compareProperties ?? true;\n }\n\n compare(g1: GeoJSON, g2: GeoJSON): boolean {\n if (g1.type !== g2.type) {\n return false;\n }\n\n if (!sameLength(g1, g2)) {\n return false;\n }\n\n switch (g1.type) {\n case \"Point\":\n return this.compareCoord(g1.coordinates, (g2 as Point).coordinates);\n case \"LineString\":\n return this.compareLine(g1.coordinates, (g2 as LineString).coordinates);\n case \"Polygon\":\n return this.comparePolygon(g1, g2 as Polygon);\n case \"GeometryCollection\":\n return this.compareGeometryCollection(g1, g2 as GeometryCollection);\n case \"Feature\":\n return this.compareFeature(g1, g2 as Feature);\n case \"FeatureCollection\":\n return this.compareFeatureCollection(g1, g2 as FeatureCollection);\n default:\n if (g1.type.startsWith(\"Multi\")) {\n const g1s = explode(g1);\n const g2s = explode(\n g2 as MultiLineString | MultiPoint | MultiPolygon\n );\n return g1s.every((g1part) =>\n g2s.some((g2part) => this.compare(g1part as any, g2part as any))\n );\n }\n }\n return false;\n }\n\n private compareCoord(c1: Position, c2: Position) {\n return (\n c1.length === c2.length &&\n c1.every((c, i) => Math.abs(c - c2[i]) < this.precision)\n );\n }\n\n private compareLine(\n path1: Position[],\n path2: Position[],\n ind = 0,\n isPoly = false\n ): boolean {\n if (!sameLength(path1, path2)) {\n return false;\n }\n const p1 = path1;\n let p2 = path2;\n if (isPoly && !this.compareCoord(p1[0], p2[0])) {\n // fix start index of both to same point\n const startIndex = this.fixStartIndex(p2, p1);\n if (!startIndex) {\n return false;\n } else {\n p2 = startIndex;\n }\n }\n // for linestring ind =0 and for polygon ind =1\n const sameDirection = this.compareCoord(p1[ind], p2[ind]);\n if (this.direction || sameDirection) {\n return this.comparePath(p1, p2);\n } else {\n if (this.compareCoord(p1[ind], p2[p2.length - (1 + ind)])) {\n return this.comparePath(p1.slice().reverse(), p2);\n }\n return false;\n }\n }\n\n private fixStartIndex(sourcePath: Position[], targetPath: Position[]) {\n //make sourcePath first point same as of targetPath\n let correctPath,\n ind = -1;\n for (let i = 0; i < sourcePath.length; i++) {\n if (this.compareCoord(sourcePath[i], targetPath[0])) {\n ind = i;\n break;\n }\n }\n if (ind >= 0) {\n correctPath = ([] as Position[]).concat(\n sourcePath.slice(ind, sourcePath.length),\n sourcePath.slice(1, ind + 1)\n );\n }\n return correctPath;\n }\n\n private comparePath(p1: Position[], p2: Position[]) {\n return p1.every((c, i) => this.compareCoord(c, p2[i]));\n }\n\n private comparePolygon(g1: Polygon, g2: Polygon) {\n if (this.compareLine(g1.coordinates[0], g2.coordinates[0], 1, true)) {\n const holes1 = g1.coordinates.slice(1, g1.coordinates.length);\n const holes2 = g2.coordinates.slice(1, g2.coordinates.length);\n return holes1.every((h1) =>\n holes2.some((h2) => this.compareLine(h1, h2, 1, true))\n );\n }\n return false;\n }\n\n private compareGeometryCollection(\n g1: GeometryCollection,\n g2: GeometryCollection\n ) {\n return (\n sameLength(g1.geometries, g2.geometries) &&\n this.compareBBox(g1, g2) &&\n g1.geometries.every((g, i) => this.compare(g, g2.geometries[i]))\n );\n }\n\n private compareFeature(g1: Feature, g2: Feature) {\n return (\n g1.id === g2.id &&\n (this.compareProperties ? equal(g1.properties, g2.properties) : true) &&\n this.compareBBox(g1, g2) &&\n this.compare(g1.geometry, g2.geometry)\n );\n }\n\n private compareFeatureCollection(\n g1: FeatureCollection,\n g2: FeatureCollection\n ) {\n return (\n sameLength(g1.features, g2.features) &&\n this.compareBBox(g1, g2) &&\n g1.features.every((f, i) => this.compare(f, g2.features[i]))\n );\n }\n\n private compareBBox(g1: GeoJSON, g2: GeoJSON): boolean {\n return (\n Boolean(!g1.bbox && !g2.bbox) ||\n (g1.bbox && g2.bbox ? this.compareCoord(g1.bbox, g2.bbox) : false)\n );\n }\n}\n\nfunction sameLength(g1: any, g2: any) {\n return g1.coordinates\n ? g1.coordinates.length === g2.coordinates.length\n : g1.length === g2.length;\n}\n\nfunction explode(g: MultiLineString | MultiPoint | MultiPolygon) {\n return g.coordinates.map((part) => ({\n type: g.type.replace(\"Multi\", \"\"),\n coordinates: part,\n }));\n}\n\nfunction geojsonEquality(\n g1: GeoJSON,\n g2: GeoJSON,\n opts?: {\n precision?: number;\n direction?: boolean;\n compareProperties?: boolean;\n }\n): boolean {\n const eq = new GeojsonEquality(opts);\n\n return eq.compare(g1, g2);\n}\n\n// Adapted from https://medium.com/syncfusion/5-different-ways-to-deep-compare-javascript-objects-6708a0da9f05\nfunction equal(object1: GeoJsonProperties, object2: GeoJsonProperties) {\n if (object1 === null && object2 === null) {\n return true;\n }\n\n if (object1 === null || object2 === null) {\n return false;\n }\n\n const objKeys1 = Object.keys(object1);\n const objKeys2 = Object.keys(object2);\n\n if (objKeys1.length !== objKeys2.length) return false;\n\n for (var key of objKeys1) {\n const value1 = object1[key];\n const value2 = object2[key];\n\n const isObjects = isObject(value1) && isObject(value2);\n\n if (\n (isObjects && !equal(value1, value2)) ||\n (!isObjects && value1 !== value2)\n ) {\n return false;\n }\n }\n return true;\n}\n\nconst isObject = (object: any) => {\n return object != null && typeof object === \"object\";\n};\n\nexport { GeojsonEquality, geojsonEquality };\nexport default GeojsonEquality;\n"]}