@kalisio/common-geospatial 0.9.0 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -3
- package/dist/foundation/index.cjs +2 -0
- package/dist/foundation/index.cjs.map +1 -0
- package/dist/foundation/index.mjs +77 -0
- package/dist/foundation/index.mjs.map +1 -0
- package/dist/geojson-CJ6QZ9pN.js +647 -0
- package/dist/geojson-CJ6QZ9pN.js.map +1 -0
- package/dist/geojson-QgqoCFjn.cjs +2 -0
- package/dist/geojson-QgqoCFjn.cjs.map +1 -0
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +99 -1919
- package/dist/index.mjs.map +1 -1
- package/dist/io/index.cjs +11 -0
- package/dist/io/index.cjs.map +1 -0
- package/dist/io/index.mjs +539 -0
- package/dist/io/index.mjs.map +1 -0
- package/dist/line-CcfAx7LP.js +16 -0
- package/dist/line-CcfAx7LP.js.map +1 -0
- package/dist/line-Doxbvzns.cjs +2 -0
- package/dist/line-Doxbvzns.cjs.map +1 -0
- package/dist/operators/index.cjs +2 -0
- package/dist/operators/index.cjs.map +1 -0
- package/dist/operators/index.mjs +28 -0
- package/dist/operators/index.mjs.map +1 -0
- package/dist/ring-Cks2pGr8.js +1334 -0
- package/dist/ring-Cks2pGr8.js.map +1 -0
- package/dist/ring-CnFBeolv.cjs +2 -0
- package/dist/ring-CnFBeolv.cjs.map +1 -0
- package/dist/truncate-Cb17e4VI.cjs +2 -0
- package/dist/truncate-Cb17e4VI.cjs.map +1 -0
- package/dist/truncate-Cs8jmwOi.js +139 -0
- package/dist/truncate-Cs8jmwOi.js.map +1 -0
- package/package.json +22 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"geojson-CJ6QZ9pN.js","sources":["../src/operators/is-like.js","../src/operators/compute/bounding-box.js","../src/operators/validate/codes.js","../src/operators/fix.js","../src/operators/simplify.js","../src/operators/validate/crs.js","../src/operators/validate/position.js","../src/operators/validate/bbox.js","../src/operators/validate/utils.js","../src/operators/validate/geometry.js","../src/operators/validate/geojson.js"],"sourcesContent":["import { is } from '@kalisio/common-core/predicates'\nimport { isValidPosition } from '../foundation/index.js'\n\nexport const CRS_TYPES = {\n NAME: 'name',\n LINK: 'link'\n}\n\nexport const GEOMETRY_TYPES = {\n POINT: 'Point',\n MULTI_POINT: 'MultiPoint',\n LINESTRING: 'LineString',\n MULTI_LINESTRING: 'MultiLineString',\n POLYGON: 'Polygon',\n MULTI_POLYGON: 'MultiPolygon',\n GEOMETRY_COLLECTION: 'GeometryCollection'\n}\n\nexport const FEATURE_TYPES = {\n FEATURE: 'Feature',\n FEATURE_COLLECTION: 'FeatureCollection'\n}\n\nexport function isLikeCRS (object) {\n if (!is.plainObject(object)) return false\n if (object.type === CRS_TYPES.NAME) {\n return is.nonEmptyString(object.properties?.name)\n }\n if (object.type === CRS_TYPES.LINK) {\n return is.nonEmptyString(object.properties?.href)\n }\n return false\n}\n\nexport function isLikePosition (object) {\n return isValidPosition(object)\n}\n\nexport function isLikeBBox (object) {\n if (!is.arrayOfLength(object, 4) && !is.arrayOfLength(object, 6)) return false\n return object.every(is.number)\n}\n\nexport function isLikeGeometry (object) {\n if (!is.plainObject(object)) return false\n if (!is.oneOf(object.type, Object.values(GEOMETRY_TYPES))) return false\n if (object.type === GEOMETRY_TYPES.GEOMETRY_COLLECTION) {\n return is.array(object.geometries)\n }\n return is.array(object.coordinates)\n}\n\nexport function isLikeFeature (object) {\n return is.plainObject(object) &&\n object.type === FEATURE_TYPES.FEATURE\n}\n\nexport function isLikeFeatureCollection (object) {\n return is.plainObject(object) &&\n object.type === FEATURE_TYPES.FEATURE_COLLECTION &&\n is.array(object.features)\n}\n\nexport function isLikeFeatureOrFeatureCollection (object) {\n return isLikeFeature(object) || isLikeFeatureCollection(object)\n}\n\nexport function isLikeGeoJson (object) {\n return isLikeFeatureOrFeatureCollection(object) || isLikeGeometry(object)\n}\n","import { coordAll } from '@turf/meta'\nimport { assert, is, optional, conform } from '@kalisio/common-core/predicates'\nimport { computeBBox } from '../../foundation/index.js'\nimport { FEATURE_TYPES, isLikeGeoJson } from '../is-like.js'\n\nconst BOUNDING_BOX_OPTIONS_SCHEMA = {\n ignore3D: optional(is.boolean)\n}\n\nexport function computeGeoJsonBoundingBox (geoJson, options = {}) {\n assert.all([\n { value: geoJson, validator: isLikeGeoJson, message: 'geoJson must be a GeoJson object' },\n { value: options, validator: (v) => conform.schema(v, BOUNDING_BOX_OPTIONS_SCHEMA), message: 'options must be a valid options object' }\n ])\n if (geoJson.type === FEATURE_TYPES.FEATURE) {\n if (!geoJson.geometry) return null\n return computeBBox(coordAll(geoJson.geometry), options)\n }\n if (geoJson.type === FEATURE_TYPES.FEATURE_COLLECTION) {\n const positions = coordAll(geoJson)\n if (!positions.length) return null\n return computeBBox(positions, options)\n }\n // Geometry\n return computeBBox(coordAll(geoJson), options)\n}\n","import en from '../../foundation/i18n/en.json'\n\nexport const VALIDATION_CODES = Object.freeze(\n Object.fromEntries(\n Object.keys(en.VALIDATION).map(code => [code, code])\n )\n)\n","import buffer from '@turf/buffer'\nimport { is, assert, conform, optional } from '@kalisio/common-core/predicates'\nimport {\n deduplicatePositions,\n isClockwiseRing,\n ringSelfIntersections,\n ringsIntersect,\n DEFAULT_COORDINATE_PRECISION\n} from '../foundation/index.js'\nimport { FEATURE_TYPES, GEOMETRY_TYPES, isLikeGeoJson } from './is-like.js'\nimport { VALIDATION_CODES } from './validate/codes.js'\n\n// Winding order / self-intersection / hole overlap only apply to ring-based geometries.\nconst RING_TYPES = [GEOMETRY_TYPES.POLYGON, GEOMETRY_TYPES.MULTI_POLYGON]\n\n// Duplicate position removal applies to any coordinate path, ring or line.\nconst DEDUPABLE_TYPES = [\n GEOMETRY_TYPES.LINESTRING,\n GEOMETRY_TYPES.MULTI_LINESTRING,\n GEOMETRY_TYPES.POLYGON,\n GEOMETRY_TYPES.MULTI_POLYGON\n]\nconst FIXABLE_CODES = [\n VALIDATION_CODES.INVALID_WINDING_ORDER,\n VALIDATION_CODES.SELF_INTERSECTION,\n VALIDATION_CODES.HOLE_INTERSECTS_SHELL,\n VALIDATION_CODES.DUPLICATE_POSITION\n]\nconst FIX_OPTIONS_SCHEMA = {\n validation: is.nonEmptyObject,\n windingOrder: optional(is.boolean),\n selfIntersection: optional(is.boolean),\n holeIntersectsShell: optional(is.boolean),\n duplicatePosition: optional(is.boolean),\n precision: optional(is.positive)\n}\n\n// Winding order is computed spherically (isClockwiseRing), identical to what\n// validate uses, so a ring validate flags is exactly one fix will reverse --\n// the two stay in lockstep near the antimeridian and the poles.\nfunction fixRingWindingOrder (ring, shouldBeClockwise) {\n if (isClockwiseRing(ring) !== shouldBeClockwise) {\n ring.reverse()\n return true\n }\n return false\n}\n\nfunction fixPolygonWindingOrder (coordinates) {\n let corrected = false\n if (fixRingWindingOrder(coordinates[0], false)) corrected = true\n for (let i = 1; i < coordinates.length; i++) {\n if (fixRingWindingOrder(coordinates[i], true)) corrected = true\n }\n return corrected\n}\n\n// Fixes winding for a Polygon or every polygon of a MultiPolygon.\nfunction fixWindingOrder (geometry) {\n if (geometry.type === GEOMETRY_TYPES.POLYGON) {\n return fixPolygonWindingOrder(geometry.coordinates)\n }\n let corrected = false\n for (const polygonCoordinates of geometry.coordinates) {\n if (fixPolygonWindingOrder(polygonCoordinates)) corrected = true\n }\n return corrected\n}\n\n// Rings of a Polygon or MultiPolygon, flattened to a single array either way.\nfunction ringsOf (geometry) {\n return geometry.type === GEOMETRY_TYPES.POLYGON ? geometry.coordinates : geometry.coordinates.flat(1)\n}\n\n// Polygons of a Polygon or MultiPolygon, as an array of ring-arrays either way.\nfunction polygonsOf (geometry) {\n return geometry.type === GEOMETRY_TYPES.POLYGON ? [geometry.coordinates] : geometry.coordinates\n}\n\n// Self-intersection is detected spherically (ringSelfIntersections), identical\n// to validate. The repair below (buffer(0)) stays planar, but detection agrees\n// with what flagged the issue in the first place.\nfunction hasSelfIntersection (geometry) {\n return ringsOf(geometry).some(ring => ringSelfIntersections(ring).length > 0)\n}\n\n// Hole/shell overlap is detected spherically (ringsIntersect), identical to\n// validate: for each polygon, does any hole cross its exterior ring.\nfunction hasHoleIntersectingShell (geometry) {\n return polygonsOf(geometry).some(rings => {\n const shell = rings[0]\n for (let i = 1; i < rings.length; i++) {\n if (ringsIntersect(shell, rings[i])) return true\n }\n return false\n })\n}\n\n// buffer(0) rebuilds the geometry as a valid (multi)polygon. It is the classic\n// topological repair for both self-intersections and hole/shell overlaps: it\n// resolves a wide range of cases, but is planar and more aggressive than a\n// dilate/erode pass (it can drop very small legitimate loops). Returns a plain\n// { type, coordinates } candidate, or null if turf produced nothing.\nfunction bufferRebuild (geometry) {\n const feature = { type: 'Feature', properties: {}, geometry }\n const repaired = buffer(feature, 0)\n if (!repaired) return null\n return { type: repaired.geometry.type, coordinates: repaired.geometry.coordinates }\n}\n\nfunction fixDuplicatePositions (geometry, precision) {\n let deduped = false\n const dedupeAndTrack = (positions) => {\n const before = positions.length\n const result = deduplicatePositions(positions, { precision })\n if (result.length !== before) deduped = true\n return result\n }\n\n switch (geometry.type) {\n case GEOMETRY_TYPES.LINESTRING:\n geometry.coordinates = dedupeAndTrack(geometry.coordinates)\n break\n case GEOMETRY_TYPES.MULTI_LINESTRING:\n geometry.coordinates = geometry.coordinates.map(dedupeAndTrack)\n break\n case GEOMETRY_TYPES.POLYGON:\n geometry.coordinates = geometry.coordinates.map(dedupeAndTrack)\n break\n case GEOMETRY_TYPES.MULTI_POLYGON:\n geometry.coordinates = geometry.coordinates.map(poly => poly.map(dedupeAndTrack))\n break\n }\n return deduped\n}\n\n// Self-intersection and hole/shell overlap are both repaired by a single\n// buffer(0) topological rebuild, run at most once when either applies. Returns\n// the list of correction codes to report; mutates geometry only if the rebuild\n// resolves every triggering defect.\nfunction fixTopology (geometry, options) {\n const wantsSelfIntersection = options.selfIntersection\n const wantsHoleIntersectsShell = options.holeIntersectsShell\n if (!wantsSelfIntersection && !wantsHoleIntersectsShell) return []\n\n // Detect what is still present after the earlier dedupe/winding steps.\n const selfIntersectionPresent = wantsSelfIntersection && hasSelfIntersection(geometry)\n const holeIntersectsShellPresent = wantsHoleIntersectsShell && hasHoleIntersectingShell(geometry)\n\n // A flagged defect that is already gone -- e.g. a self-intersection resolved\n // as a side effect of dedupe -- is reported corrected without a rebuild.\n const corrected = []\n if (wantsSelfIntersection && !selfIntersectionPresent) corrected.push(VALIDATION_CODES.SELF_INTERSECTION)\n if (wantsHoleIntersectsShell && !holeIntersectsShellPresent) corrected.push(VALIDATION_CODES.HOLE_INTERSECTS_SHELL)\n\n if (!selfIntersectionPresent && !holeIntersectsShellPresent) return corrected\n\n // buffer(0) is planar and cannot repair every case (e.g. across the\n // antimeridian). Commit only if every defect that triggered the rebuild is\n // actually gone -- checked with the same spherical tests that flagged them --\n // otherwise leave the original untouched and report them unfixed.\n const candidate = bufferRebuild(geometry)\n if (!candidate) return corrected\n if (selfIntersectionPresent && hasSelfIntersection(candidate)) return corrected\n if (holeIntersectsShellPresent && hasHoleIntersectingShell(candidate)) return corrected\n\n geometry.type = candidate.type\n geometry.coordinates = candidate.coordinates\n if (selfIntersectionPresent) corrected.push(VALIDATION_CODES.SELF_INTERSECTION)\n if (holeIntersectsShellPresent) corrected.push(VALIDATION_CODES.HOLE_INTERSECTS_SHELL)\n return corrected\n}\n\nfunction fixGeometry (geometry, options) {\n const corrections = []\n const precision = options.precision ?? DEFAULT_COORDINATE_PRECISION\n\n if (options.duplicatePosition && DEDUPABLE_TYPES.includes(geometry.type)) {\n if (fixDuplicatePositions(geometry, precision)) {\n corrections.push({ code: VALIDATION_CODES.DUPLICATE_POSITION })\n }\n }\n\n if (!RING_TYPES.includes(geometry.type)) {\n return { fixed: geometry, corrections }\n }\n\n if (options.windingOrder && fixWindingOrder(geometry)) {\n corrections.push({ code: VALIDATION_CODES.INVALID_WINDING_ORDER })\n }\n\n for (const code of fixTopology(geometry, options)) {\n corrections.push({ code })\n }\n\n return { fixed: geometry, corrections }\n}\n\n// Issues relevant to a given geometry path (the issue's own path is at or below it).\nfunction issuesAt (issues, path) {\n return issues.filter(issue => issue.path === path || issue.path?.startsWith(`${path}/`))\n}\n\n// Attempts a fix for a single geometry, and reports both what was corrected\n// and what remained unfixed (option disabled, or the fix attempt failed).\nfunction fixGeometryIssues (geometry, relevantIssues, path, options) {\n const fixOptions = {\n windingOrder: options.windingOrder !== false && relevantIssues.some(i => i.code === VALIDATION_CODES.INVALID_WINDING_ORDER),\n selfIntersection: options.selfIntersection !== false && relevantIssues.some(i => i.code === VALIDATION_CODES.SELF_INTERSECTION),\n holeIntersectsShell: options.holeIntersectsShell !== false && relevantIssues.some(i => i.code === VALIDATION_CODES.HOLE_INTERSECTS_SHELL),\n duplicatePosition: options.duplicatePosition !== false && relevantIssues.some(i => i.code === VALIDATION_CODES.DUPLICATE_POSITION),\n precision: options.precision\n }\n\n const result = (fixOptions.windingOrder || fixOptions.selfIntersection || fixOptions.holeIntersectsShell || fixOptions.duplicatePosition)\n ? fixGeometry(geometry, fixOptions)\n : { corrections: [] }\n\n const correctedCodes = new Set(result.corrections.map(c => c.code))\n const corrections = result.corrections.map(c => ({ ...c, path }))\n const unfixed = relevantIssues.filter(issue => !correctedCodes.has(issue.code))\n\n return { corrections, unfixed }\n}\n\nexport function fixGeoJson (geoJson, options) {\n assert.all([\n {\n value: geoJson,\n validator: isLikeGeoJson,\n message: 'geoJson must be a GeoJson object'\n },\n {\n value: options,\n validator: (v) => conform.schema(v, FIX_OPTIONS_SCHEMA),\n message: 'options must be a valid options object, with a mandatory validation result'\n }\n ])\n const allIssues = [...options.validation.errors, ...options.validation.warnings]\n const fixableIssues = allIssues.filter(issue => FIXABLE_CODES.includes(issue.code))\n const unfixed = allIssues.filter(issue => !FIXABLE_CODES.includes(issue.code))\n if (fixableIssues.length === 0) return { fixed: geoJson, corrections: [], unfixed }\n if (geoJson.type === FEATURE_TYPES.FEATURE_COLLECTION) {\n const corrections = []\n geoJson.features.forEach((feature, index) => {\n const featurePath = `/features/${index}/geometry`\n const relevant = issuesAt(fixableIssues, featurePath)\n if (relevant.length === 0) return\n const result = fixGeometryIssues(feature.geometry, relevant, featurePath, options)\n corrections.push(...result.corrections)\n unfixed.push(...result.unfixed)\n })\n return { fixed: geoJson, corrections, unfixed }\n }\n if (geoJson.type === FEATURE_TYPES.FEATURE) {\n const relevant = issuesAt(fixableIssues, '/geometry')\n const result = fixGeometryIssues(geoJson.geometry, relevant, '/geometry', options)\n return { fixed: geoJson, corrections: result.corrections, unfixed: [...unfixed, ...result.unfixed] }\n }\n const relevant = issuesAt(fixableIssues, '')\n const result = fixGeometryIssues(geoJson, relevant, '', options)\n return { fixed: geoJson, corrections: result.corrections, unfixed: [...unfixed, ...result.unfixed] }\n}\n\nexport function isGeoJsonFixable (validation) {\n assert.all([\n {\n value: validation,\n validator: is.nonEmptyObject,\n message: 'validation must be a non-empty object'\n },\n {\n value: validation?.errors,\n validator: is.array,\n message: 'validation.errors must be an array'\n }\n ])\n if (validation.errors.length === 0) return false\n return validation.errors.every(error =>\n FIXABLE_CODES.includes(error.code)\n )\n}\n","import { Heap } from 'heap-js'\nimport { assert, is, optional, conform } from '@kalisio/common-core/predicates'\nimport { FEATURE_TYPES, GEOMETRY_TYPES, isLikeGeoJson } from './is-like.js'\n\nconst SIMPLIFY_OPTIONS_SCHEMA = {\n tolerance: optional(is.number),\n getWeight: optional(is.function)\n}\n\nfunction triangleArea (a, b, c) {\n return Math.abs(\n (a[0] * (b[1] - c[1]) +\n b[0] * (c[1] - a[1]) +\n c[0] * (a[1] - b[1])) / 2\n )\n}\n\n// Visvalingam-Whyatt simplification algorithm.\nfunction visvalingam (coords, { tolerance = 0, getWeight = () => 1 } = {}) {\n if (coords.length <= 2) return coords\n const pts = coords.map((coord, i) => ({ coord, i, area: Infinity, removed: false, prev: null, next: null }))\n for (let i = 0; i < pts.length; i++) {\n if (i > 0) pts[i].prev = pts[i - 1]\n if (i < pts.length - 1) pts[i].next = pts[i + 1]\n }\n const computeArea = (node) => {\n if (!node.prev || !node.next) return Infinity\n return triangleArea(node.prev.coord, node.coord, node.next.coord) * getWeight(node.coord, node.i)\n }\n // Heap entries are immutable snapshots { node, area }, never reused after\n // push. A stale duplicate (left behind when a node's area is recomputed\n // after a neighbor is removed) is detected by comparing the entry's frozen\n // area to the node's current authoritative area, without ever mutating a\n // value the heap has already positioned internally.\n const heap = new Heap((a, b) => a.area - b.area)\n const pushNode = (node) => {\n node.area = computeArea(node)\n heap.push({ node, area: node.area })\n }\n for (let i = 1; i < pts.length - 1; i++) pushNode(pts[i])\n\n let maxArea = 0\n while (heap.size() > 0) {\n const entry = heap.pop()\n const node = entry.node\n if (node.removed) continue\n if (entry.area !== node.area) continue\n if (node.area < maxArea) node.area = maxArea\n else maxArea = node.area\n if (node.area >= tolerance) break\n node.removed = true\n if (node.prev) node.prev.next = node.next\n if (node.next) node.next.prev = node.prev\n if (node.prev?.prev) pushNode(node.prev)\n if (node.next?.next) pushNode(node.next)\n }\n const result = []\n let cur = pts[0]\n while (cur) {\n if (!cur.removed) result.push(cur.coord)\n cur = cur.next\n }\n return result\n}\n\nexport function simplifyGeoJson (geoJson, options = {}) {\n assert.all([\n { value: geoJson, validator: isLikeGeoJson, message: 'geoJson must be a GeoJson object' },\n { value: options, validator: (v) => conform.schema(v, SIMPLIFY_OPTIONS_SCHEMA), message: 'options must be a valid options object' }\n ])\n if (geoJson.type === FEATURE_TYPES.FEATURE) {\n if (geoJson.geometry) simplifyGeoJson(geoJson.geometry, options)\n return geoJson\n }\n if (geoJson.type === FEATURE_TYPES.FEATURE_COLLECTION) {\n for (const feature of geoJson.features) simplifyGeoJson(feature, options)\n return geoJson\n }\n // Geometry\n switch (geoJson.type) {\n case GEOMETRY_TYPES.LINESTRING:\n geoJson.coordinates = visvalingam(geoJson.coordinates, options)\n break\n case GEOMETRY_TYPES.POLYGON:\n case GEOMETRY_TYPES.MULTI_LINESTRING:\n // getWeight receives an index local to each ring/line (each one is\n // simplified independently, restarting at 0), not a global index\n // across the whole geometry. This mirrors the fact that a ring is\n // itself a plain zero-indexed coordinate array.\n geoJson.coordinates = geoJson.coordinates.map(ring => visvalingam(ring, options))\n break\n case GEOMETRY_TYPES.MULTI_POLYGON:\n geoJson.coordinates = geoJson.coordinates.map(poly => poly.map(ring => visvalingam(ring, options)))\n break\n case GEOMETRY_TYPES.GEOMETRY_COLLECTION:\n geoJson.geometries.forEach(g => simplifyGeoJson(g, options))\n break\n }\n return geoJson\n}\n","import { is } from '@kalisio/common-core/predicates'\nimport { WGS84, hasProjection, normalizeCrsName, isWGS84Projection } from '../../foundation/index.js'\nimport { CRS_TYPES } from '../is-like.js'\nimport { VALIDATION_CODES } from './codes.js'\n\nconst ROOT_CRS_PATH = '/crs'\n\nexport function validateOptionalCRS (crs, path = '', context = {}) {\n // CRS is optional; absence defaults to WGS84 and drives geodesic validation.\n if (!is.defined(crs)) {\n if (path === ROOT_CRS_PATH) {\n context.geodesic = true\n return { crs: WGS84, valid: true }\n }\n return { valid: true }\n }\n // A present crs is only supported at the root; anything deeper is nested and\n // rejected regardless of its shape.\n if (path !== ROOT_CRS_PATH) {\n return {\n valid: false,\n errors: [{ code: VALIDATION_CODES.UNSUPPORTED_NESTED_CRS, path }],\n warnings: []\n }\n }\n // Check CRS structure\n if (!is.plainObject(crs)) {\n return {\n valid: false,\n errors: [{ code: VALIDATION_CODES.INVALID_CRS_OBJECT, path }],\n warnings: []\n }\n }\n // Check CRS type\n switch (crs.type) {\n case CRS_TYPES.NAME: {\n if (!is.nonEmptyString(crs.properties?.name)) {\n return {\n valid: false,\n errors: [{ code: VALIDATION_CODES.INVALID_CRS_NAME, path }],\n warnings: []\n }\n }\n // A named CRS is valid as long as its projection is registered, whatever\n // the datum. URN normalization stays consistent with extractGeoJsonCRS.\n const crsName = normalizeCrsName(crs.properties.name)\n if (!hasProjection(crsName)) {\n return {\n valid: false,\n errors: [{\n code: VALIDATION_CODES.UNSUPPORTED_CRS,\n path,\n params: { name: crs.properties.name }\n }],\n warnings: []\n }\n }\n context.geodesic = isWGS84Projection(crsName)\n return {\n crs: crsName,\n valid: true,\n errors: [],\n warnings: []\n }\n }\n case CRS_TYPES.LINK: {\n if (!is.nonEmptyString(crs.properties?.href)) {\n return {\n valid: false,\n errors: [{ code: VALIDATION_CODES.INVALID_CRS_LINK, path }],\n warnings: []\n }\n }\n // Link CRS stay structurally valid for isLikeGeoJson but cannot be\n // resolved without fetching external resources, so validation rejects them.\n return {\n valid: false,\n errors: [{ code: VALIDATION_CODES.UNSUPPORTED_LINK_CRS, path }],\n warnings: []\n }\n }\n default:\n return {\n valid: false,\n errors: [{\n code: VALIDATION_CODES.INVALID_CRS_TYPE,\n path,\n params: { type: crs.type }\n }],\n warnings: []\n }\n }\n}\n","import { is } from '@kalisio/common-core/predicates'\nimport { getCoordinatePrecision, DEFAULT_COORDINATE_PRECISION } from '../../foundation/index.js'\nimport { VALIDATION_CODES } from './codes.js'\n\nexport function validatePosition (coordinates, path = '', context = {}) {\n const geodesic = context.geodesic\n if (!is.arrayOfLengthBetween(coordinates, 2, 3)) {\n return {\n valid: false,\n errors: [{ code: VALIDATION_CODES.INVALID_POSITION_LENGTH, path }],\n warnings: []\n }\n }\n // Finiteness is CRS-independent (is.number rejects NaN/Infinity).\n if (!is.number(coordinates[0]) || !is.number(coordinates[1])) {\n return {\n valid: false,\n errors: [{ code: VALIDATION_CODES.INVALID_POSITION_COORDINATES, path }],\n warnings: []\n }\n }\n // Longitude/latitude ranges only make sense for geographic WGS84 coordinates.\n if (geodesic) {\n if (!is.inRange(coordinates[0], -180, 180)) {\n return {\n valid: false,\n errors: [{ code: VALIDATION_CODES.INVALID_LONGITUDE_RANGE, path, params: { value: coordinates[0] } }],\n warnings: []\n }\n }\n if (!is.inRange(coordinates[1], -90, 90)) {\n return {\n valid: false,\n errors: [{ code: VALIDATION_CODES.INVALID_LATITUDE_RANGE, path, params: { value: coordinates[1] } }],\n warnings: []\n }\n }\n }\n if (coordinates.length === 3 && !is.number(coordinates[2])) {\n return {\n valid: false,\n errors: [{ code: VALIDATION_CODES.INVALID_ALTITUDE, path }],\n warnings: []\n }\n }\n const response = { valid: true, errors: [], warnings: [] }\n // Precision warnings assume degrees, so they are geodesic-only too.\n if (geodesic) {\n const precision = context.precision ?? DEFAULT_COORDINATE_PRECISION\n const lonPrecision = getCoordinatePrecision(coordinates[0])\n if (lonPrecision > precision) {\n response.warnings.push({ code: VALIDATION_CODES.EXCESSIVE_LONGITUDE_PRECISION, path, params: { precision: lonPrecision, max: precision } })\n }\n const latPrecision = getCoordinatePrecision(coordinates[1])\n if (latPrecision > precision) {\n response.warnings.push({ code: VALIDATION_CODES.EXCESSIVE_LATITUDE_PRECISION, path, params: { precision: latPrecision, max: precision } })\n }\n }\n return response\n}\n","import { is } from '@kalisio/common-core/predicates'\nimport { validatePosition } from './position.js'\nimport { VALIDATION_CODES } from './codes.js'\n\nexport function validateOptionalBBox (bbox, path = '', context = {}) {\n const geodesic = context?.geodesic\n // bbox is optional\n if (!is.defined(bbox)) {\n return {\n valid: true\n }\n }\n // test the bbox values\n if (!is.arrayOfLength(bbox, 4) && !is.arrayOfLength(bbox, 6)) {\n return {\n valid: false,\n errors: [{ code: VALIDATION_CODES.INVALID_BBOX_LENGTH, path }],\n warnings: []\n }\n }\n const is2D = bbox.length === 4\n const min = is2D ? [bbox[0], bbox[1]] : [bbox[0], bbox[1], bbox[2]]\n const max = is2D ? [bbox[2], bbox[3]] : [bbox[3], bbox[4], bbox[5]]\n const minResult = validatePosition(min, `${path}/min`, context)\n if (!minResult.valid) {\n return { valid: false, errors: minResult.errors, warnings: [] }\n }\n const maxResult = validatePosition(max, `${path}/max`, context)\n if (!maxResult.valid) {\n return { valid: false, errors: maxResult.errors, warnings: [] }\n }\n const [west, south] = min\n const [east, north] = max\n // min/max consistency is CRS-independent.\n if (south > north) {\n return {\n valid: false,\n errors: [{ code: VALIDATION_CODES.INVALID_BBOX_LATITUDE_ORDER, path, params: { south, north } }],\n warnings: []\n }\n }\n // For a projected CRS there is no antimeridian, so X must be ordered too.\n if (!geodesic && west > east) {\n return {\n valid: false,\n errors: [{ code: VALIDATION_CODES.INVALID_BBOX_LONGITUDE_ORDER, path, params: { west, east } }],\n warnings: []\n }\n }\n if (!is2D) {\n const minAlt = bbox[2]\n const maxAlt = bbox[5]\n if (minAlt > maxAlt) {\n return {\n valid: false,\n errors: [{ code: VALIDATION_CODES.INVALID_BBOX_ALTITUDE_ORDER, path, params: { minAlt, maxAlt } }],\n warnings: []\n }\n }\n }\n const result = { valid: true, errors: [], warnings: [] }\n // An antimeridian-crossing bbox (west > east) only makes sense in WGS84.\n if (geodesic && west > east) {\n result.warnings.push({ code: VALIDATION_CODES.BBOX_ANTIMERIDIAN_CROSSING, path, params: { west, east } })\n }\n result.warnings.push(...minResult.warnings)\n result.warnings.push(...maxResult.warnings)\n return result\n}\n","import { is } from '@kalisio/common-core/predicates'\n\nfunction emptyStatistics () {\n return { Feature: 0, FeatureCollection: 0, geometries: {} }\n}\n\nexport function emptyResult () {\n return {\n crs: undefined,\n valid: true,\n errors: [],\n warnings: [],\n statistics: emptyStatistics()\n }\n}\n\nfunction mergeStatistics (...results) {\n const statistics = emptyStatistics()\n for (const result of results) {\n const s = result.statistics\n if (!s) continue\n statistics.Feature += s.Feature ?? 0\n statistics.FeatureCollection += s.FeatureCollection ?? 0\n for (const [type, count] of Object.entries(s.geometries ?? {})) {\n statistics.geometries[type] = (statistics.geometries[type] ?? 0) + count\n }\n }\n return statistics\n}\n\nexport function mergeResult (result, ...others) {\n for (const other of others) {\n result.valid = result.valid && (other.valid ?? true)\n if (other.errors) result.errors.push(...other.errors)\n if (other.warnings) result.warnings.push(...other.warnings)\n if (other.crs !== undefined) result.crs = other.crs\n }\n result.statistics = mergeStatistics(result, ...others)\n return result\n}\n\nexport function validateArray (items, validator, path = '') {\n const response = {\n valid: true,\n errors: [],\n warnings: [],\n statistics: emptyStatistics()\n }\n for (let i = 0; i < items.length; i++) {\n const itemPath = `${path}/${i}`\n const result = validator(items[i], itemPath, i)\n if (result.statistics) {\n response.statistics = mergeStatistics(response, result)\n }\n if (!result.valid) {\n response.valid = false\n response.errors = response.errors.concat(result.errors.map(e => ({ ...e, path: e.path || itemPath, index: i })))\n }\n if (!is.empty(result.warnings)) {\n response.warnings = response.warnings.concat(result.warnings.map(w => ({ ...w, path: w.path || itemPath, index: i })))\n }\n }\n return response\n}\n","import { is } from '@kalisio/common-core/predicates'\nimport {\n DEFAULT_COORDINATE_PRECISION,\n isSamePosition,\n ringsIntersect,\n isClockwiseRing,\n isClosedRing,\n ringSelfIntersections\n} from '../../foundation/index.js'\nimport { GEOMETRY_TYPES } from '../is-like.js'\nimport { VALIDATION_CODES } from './codes.js'\nimport { validatePosition } from './position.js'\nimport { validateOptionalCRS } from './crs.js'\nimport { validateOptionalBBox } from './bbox.js'\nimport { emptyResult, mergeResult, validateArray } from './utils.js'\n\nfunction findConsecutiveDuplicateIndex (positions, startAt = 0, precision = DEFAULT_COORDINATE_PRECISION) {\n for (let i = startAt; i < positions.length - 1; i++) {\n if (isSamePosition(positions[i], positions[i + 1], { precision })) return i\n }\n return -1\n}\n\nfunction checkDuplicatePositions (positions, path, warnings, precision = DEFAULT_COORDINATE_PRECISION) {\n let i = findConsecutiveDuplicateIndex(positions, 0, precision)\n while (i !== -1) {\n warnings.push({ code: VALIDATION_CODES.DUPLICATE_POSITION, path: `${path}/${i}` })\n i = findConsecutiveDuplicateIndex(positions, i + 1, precision)\n }\n}\n\nfunction validateCoordinatesArray (coordinates, minimumLength = 0, path = '', context = {}) {\n if (!is.arrayOfLengthAtLeast(coordinates, minimumLength)) {\n return {\n valid: false,\n errors: [{ code: VALIDATION_CODES.INVALID_COORDINATES_LENGTH, path, params: { minimumLength } }],\n warnings: []\n }\n }\n // Closure injects context; validateArray would otherwise pass the index as 3rd arg\n return validateArray(coordinates, (pos, p) => validatePosition(pos, p, context), path)\n}\n\nfunction validateLineStringCoordinates (coordinates, path = '', context = {}) {\n const result = validateCoordinatesArray(coordinates, 2, path, context)\n if (!result.valid) return result\n checkDuplicatePositions(coordinates, path, result.warnings, context.precision ?? DEFAULT_COORDINATE_PRECISION)\n // Antimeridian crossings assume geographic longitudes.\n if (context.geodesic ?? true) {\n for (let i = 0; i < coordinates.length - 1; i++) {\n const lon1 = coordinates[i][0]\n const lon2 = coordinates[i + 1][0]\n if (Math.abs(lon2 - lon1) > 180) {\n result.warnings.push({ code: VALIDATION_CODES.ANTIMERIDIAN_CROSSING, path: `${path}/${i}` })\n }\n }\n }\n return result\n}\n\nfunction validateMultiLineStringCoordinates (coordinates, path = '', context = {}) {\n if (!is.nonEmptyArray(coordinates)) {\n return {\n valid: false,\n errors: [{ code: VALIDATION_CODES.INVALID_MULTI_LINESTRING_COORDINATES, path }],\n warnings: []\n }\n }\n return validateArray(coordinates, (line, p) => validateLineStringCoordinates(line, p, context), path)\n}\n\nfunction validateLinearRing (coordinates, expectedWindingOrder, path = '', context = {}) {\n const precision = context.precision ?? DEFAULT_COORDINATE_PRECISION\n const geodesic = context.geodesic ?? true\n const result = validateCoordinatesArray(coordinates, 4, path, context)\n if (!result.valid) return result\n // Ring closure shares the foundation's notion of \"same position\"\n // (precision-tolerant), so a ring validate reports as not closed is exactly\n // one fix's closeRing would repair. Keeps validate and fix in lockstep.\n if (!isClosedRing(coordinates, { precision })) {\n result.valid = false\n result.errors.push({ code: VALIDATION_CODES.RING_NOT_CLOSED, path })\n return result\n }\n // Check for duplicate consecutive positions (the intentional closing\n // duplicate is never flagged, since first/last are only equal across the\n // whole array, not adjacent to each other).\n checkDuplicatePositions(coordinates, path, result.warnings, precision)\n // Winding order and self-intersection rely on n-vector/spherical geometry,\n // so they only apply to geographic WGS84 coordinates.\n if (geodesic) {\n // check winding order (spherical, matching what S2/MongoDB use)\n const actualWindingOrder = isClockwiseRing(coordinates) ? 'clockwise' : 'counter-clockwise'\n if (actualWindingOrder !== expectedWindingOrder) {\n result.valid = false\n result.errors.push({\n code: VALIDATION_CODES.INVALID_WINDING_ORDER,\n path,\n params: { expected: expectedWindingOrder, actual: actualWindingOrder }\n })\n }\n // check self-intersection (spherical, matching what S2/MongoDB use)\n const selfIntersections = ringSelfIntersections(coordinates)\n if (selfIntersections.length > 0) {\n result.valid = false\n result.errors.push({\n code: VALIDATION_CODES.SELF_INTERSECTION,\n path,\n params: { count: selfIntersections.length }\n })\n }\n }\n return result\n}\n\nfunction validatePolygonCoordinates (coordinates, path = '', context = {}) {\n if (!is.nonEmptyArray(coordinates)) {\n return {\n valid: false,\n errors: [{ code: VALIDATION_CODES.INVALID_POLYGON_COORDINATES, path }],\n warnings: []\n }\n }\n const result = validateArray(coordinates, (ring, p, i) => validateLinearRing(ring, i === 0 ? 'counter-clockwise' : 'clockwise', p, context), path)\n // Hole/shell intersection relies on n-vector geometry, so it is geodesic-only.\n if ((context.geodesic ?? true) && result.valid && coordinates.length > 1) {\n const shell = coordinates[0]\n for (let i = 1; i < coordinates.length; i++) {\n if (ringsIntersect(shell, coordinates[i])) {\n result.valid = false\n result.errors.push({ code: VALIDATION_CODES.HOLE_INTERSECTS_SHELL, path: `${path}/${i}` })\n }\n }\n }\n return result\n}\n\nfunction validateMultiPolygonCoordinates (coordinates, path = '', context = {}) {\n if (!is.nonEmptyArray(coordinates)) {\n return {\n valid: false,\n errors: [{ code: VALIDATION_CODES.INVALID_MULTIPOLYGON_COORDINATES, path }],\n warnings: []\n }\n }\n return validateArray(coordinates, (c, p) => validatePolygonCoordinates(c, p, context), path)\n}\n\nfunction validateGeometryCollectionGeometries (geometries, path = '', context = {}) {\n if (!is.nonEmptyArray(geometries)) {\n return {\n valid: false,\n errors: [{ code: VALIDATION_CODES.INVALID_GEOMETRYCOLLECTION_GEOMETRIES, path }],\n warnings: []\n }\n }\n return validateArray(geometries, (g, p) => validateGeometry(g, p, context), path)\n}\n\nexport function validateGeometry (geometry, path = '', context = {}) {\n let result = emptyResult()\n // check whether the geometry is a non empty object\n if (!is.nonEmptyObject(geometry)) {\n result.valid = false\n result.errors.push({ code: VALIDATION_CODES.INVALID_GEOMETRY, path })\n return result\n }\n // Handle the CRS first: it poses context.geodesic, which the coordinate\n // checks below read. A nested crs (deeper than root) is rejected inside\n // validateOptionalCRS; its absence is a no-op that leaves geodesic untouched.\n result = mergeResult(result, validateOptionalCRS(geometry.crs, `${path}/crs`, context))\n // handle the bbox\n result = mergeResult(result, validateOptionalBBox(geometry.bbox, `${path}/bbox`, context))\n // handle the coordinates by geometry type\n const coordsPath = `${path}/coordinates`\n switch (geometry.type) {\n case GEOMETRY_TYPES.POINT:\n result = mergeResult(result, validatePosition(geometry.coordinates, coordsPath, context))\n break\n case GEOMETRY_TYPES.MULTI_POINT:\n result = mergeResult(result, validateCoordinatesArray(geometry.coordinates, 0, coordsPath, context))\n break\n case GEOMETRY_TYPES.LINESTRING:\n result = mergeResult(result, validateLineStringCoordinates(geometry.coordinates, coordsPath, context))\n break\n case GEOMETRY_TYPES.MULTI_LINESTRING:\n result = mergeResult(result, validateMultiLineStringCoordinates(geometry.coordinates, coordsPath, context))\n break\n case GEOMETRY_TYPES.POLYGON:\n result = mergeResult(result, validatePolygonCoordinates(geometry.coordinates, coordsPath, context))\n break\n case GEOMETRY_TYPES.MULTI_POLYGON:\n result = mergeResult(result, validateMultiPolygonCoordinates(geometry.coordinates, coordsPath, context))\n break\n case GEOMETRY_TYPES.GEOMETRY_COLLECTION:\n result = mergeResult(result, validateGeometryCollectionGeometries(geometry.geometries, `${path}/geometries`, context))\n break\n default:\n // Unknown type: report it and do not count it in statistics.\n result.valid = false\n result.errors.push({ code: VALIDATION_CODES.INVALID_GEOMETRY_TYPE, path, params: { type: geometry.type } })\n return result\n }\n // Count this geometry by its own type. A GeometryCollection counts as one and\n // its members are NOT decomposed, so we overwrite any statistics that bubbled\n // up from the members.\n result.statistics = { Feature: 0, FeatureCollection: 0, geometries: { [geometry.type]: 1 } }\n return result\n}\n","import { assert, is, conform, optional } from '@kalisio/common-core/predicates'\nimport { DEFAULT_COORDINATE_PRECISION } from '../../foundation/index.js'\nimport { FEATURE_TYPES, GEOMETRY_TYPES } from '../is-like.js'\nimport { VALIDATION_CODES } from './codes.js'\nimport { validateOptionalCRS } from './crs.js'\nimport { validateOptionalBBox } from './bbox.js'\nimport { emptyResult, mergeResult, validateArray } from './utils.js'\nimport { validateGeometry } from './geometry.js'\n\nconst VALIDATE_OPTIONS_SCHEMA = {\n precision: optional(is.positiveInteger)\n}\n\nfunction validateFeature (feature, path, context) {\n let result = emptyResult()\n // check whether the feature is a non empty object\n if (!is.nonEmptyObject(feature)) {\n result.valid = false\n result.errors.push({\n code: VALIDATION_CODES.EMPTY_OBJECT,\n path\n })\n return result\n }\n // handle the CRS\n result = mergeResult(result, validateOptionalCRS(feature.crs, `${path}/crs`, context))\n // handle the bbox\n result = mergeResult(result, validateOptionalBBox(feature.bbox, `${path}/bbox`, context))\n // handle the Feature type\n if (feature.type === FEATURE_TYPES.FEATURE) {\n result.statistics.Feature++\n if (is.nonEmptyObject(feature.geometry)) {\n result = mergeResult(result, validateGeometry(feature.geometry, `${path}/geometry`, context))\n } else {\n result.warnings.push({\n code: VALIDATION_CODES.MISSING_GEOMETRY,\n path\n })\n }\n return result\n }\n // handle the FeatureCollection type\n result.statistics.FeatureCollection++\n if (is.nonEmptyArray(feature.features)) {\n result = mergeResult(result, validateArray(feature.features, (f, p) => validateFeature(f, p, context), `${path}/features`))\n } else if (!is.array(feature.features)) {\n result.valid = false\n result.errors.push({\n code: VALIDATION_CODES.INVALID_FEATURES_ARRAY,\n path\n })\n }\n return result\n}\n\nexport function validateGeoJson (geoJson, options = {}) {\n assert.that(options, (v) => conform.schema(v, VALIDATE_OPTIONS_SCHEMA), 'options must be a valid options object')\n const { precision = DEFAULT_COORDINATE_PRECISION } = options\n // handle whether the geoJson is an object\n if (!is.plainObject(geoJson)) {\n return {\n ...emptyResult(),\n valid: false,\n errors: [{\n code: VALIDATION_CODES.INVALID_CONTENT,\n path: ''\n }]\n }\n }\n // handle whether the geoJson is a non empty object\n if (is.emptyObject(geoJson)) {\n return {\n ...emptyResult(),\n valid: false,\n errors: [{\n code: VALIDATION_CODES.EMPTY_OBJECT,\n path: ''\n }]\n }\n }\n // handle whether the geoJson is a Feature\n if (geoJson.type === FEATURE_TYPES.FEATURE || geoJson.type === FEATURE_TYPES.FEATURE_COLLECTION) {\n return validateFeature(geoJson, '', { precision })\n }\n // handle whether the geoJson is a Geometry\n if (is.oneOf(geoJson.type, Object.values(GEOMETRY_TYPES))) {\n return validateGeometry(geoJson, '', { precision })\n }\n // If none, the geoJson is invalid\n return {\n ...emptyResult(),\n valid: false,\n errors: [{\n code: VALIDATION_CODES.UNKNOWN_TYPE,\n path: '',\n params: { type: geoJson.type }\n }]\n }\n}\n"],"names":["CRS_TYPES","GEOMETRY_TYPES","FEATURE_TYPES","isLikeCRS","object","is","isLikePosition","isValidPosition","isLikeBBox","isLikeGeometry","isLikeFeature","isLikeFeatureCollection","isLikeFeatureOrFeatureCollection","isLikeGeoJson","BOUNDING_BOX_OPTIONS_SCHEMA","optional","computeGeoJsonBoundingBox","geoJson","options","assert","v","conform","computeBBox","coordAll","positions","VALIDATION_CODES","en","code","RING_TYPES","DEDUPABLE_TYPES","FIXABLE_CODES","FIX_OPTIONS_SCHEMA","fixRingWindingOrder","ring","shouldBeClockwise","isClockwiseRing","fixPolygonWindingOrder","coordinates","corrected","fixWindingOrder","geometry","polygonCoordinates","ringsOf","polygonsOf","hasSelfIntersection","ringSelfIntersections","hasHoleIntersectingShell","rings","shell","i","ringsIntersect","bufferRebuild","repaired","buffer","fixDuplicatePositions","precision","deduped","dedupeAndTrack","before","result","deduplicatePositions","poly","fixTopology","wantsSelfIntersection","wantsHoleIntersectsShell","selfIntersectionPresent","holeIntersectsShellPresent","candidate","fixGeometry","corrections","DEFAULT_COORDINATE_PRECISION","issuesAt","issues","path","issue","fixGeometryIssues","relevantIssues","fixOptions","correctedCodes","c","unfixed","fixGeoJson","allIssues","fixableIssues","feature","index","featurePath","relevant","isGeoJsonFixable","validation","error","SIMPLIFY_OPTIONS_SCHEMA","triangleArea","a","b","visvalingam","coords","tolerance","getWeight","pts","coord","computeArea","node","heap","Heap","pushNode","maxArea","entry","cur","simplifyGeoJson","g","ROOT_CRS_PATH","validateOptionalCRS","crs","context","WGS84","crsName","normalizeCrsName","hasProjection","isWGS84Projection","validatePosition","geodesic","response","lonPrecision","getCoordinatePrecision","latPrecision","validateOptionalBBox","bbox","is2D","min","max","minResult","maxResult","west","south","east","north","minAlt","maxAlt","emptyStatistics","emptyResult","mergeStatistics","results","statistics","s","type","count","mergeResult","others","other","validateArray","items","validator","itemPath","e","w","findConsecutiveDuplicateIndex","startAt","isSamePosition","checkDuplicatePositions","warnings","validateCoordinatesArray","minimumLength","pos","p","validateLineStringCoordinates","lon1","lon2","validateMultiLineStringCoordinates","line","validateLinearRing","expectedWindingOrder","isClosedRing","actualWindingOrder","selfIntersections","validatePolygonCoordinates","validateMultiPolygonCoordinates","validateGeometryCollectionGeometries","geometries","validateGeometry","coordsPath","VALIDATE_OPTIONS_SCHEMA","validateFeature","f","validateGeoJson"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";const C=require("@turf/meta"),i=require("./ring-CnFBeolv.cjs"),Z=require("@turf/buffer"),J=require("heap-js"),p={NAME:"name",LINK:"link"},I={POINT:"Point",MULTI_POINT:"MultiPoint",LINESTRING:"LineString",MULTI_LINESTRING:"MultiLineString",POLYGON:"Polygon",MULTI_POLYGON:"MultiPolygon",GEOMETRY_COLLECTION:"GeometryCollection"},N={FEATURE:"Feature",FEATURE_COLLECTION:"FeatureCollection"};function ee(e){return i.t.plainObject(e)?e.type===p.NAME?i.t.nonEmptyString(e.properties?.name):e.type===p.LINK?i.t.nonEmptyString(e.properties?.href):!1:!1}function re(e){return i.isValidPosition(e)}function te(e){return!i.t.arrayOfLength(e,4)&&!i.t.arrayOfLength(e,6)?!1:e.every(i.t.number)}function b(e){return!i.t.plainObject(e)||!i.t.oneOf(e.type,Object.values(I))?!1:e.type===I.GEOMETRY_COLLECTION?i.t.array(e.geometries):i.t.array(e.coordinates)}function x(e){return i.t.plainObject(e)&&e.type===N.FEATURE}function H(e){return i.t.plainObject(e)&&e.type===N.FEATURE_COLLECTION&&i.t.array(e.features)}function $(e){return x(e)||H(e)}function A(e){return $(e)||b(e)}const ne={ignore3D:i.O(i.t.boolean)};function ie(e,r={}){if(i.a.all([{value:e,validator:A,message:"geoJson must be a GeoJson object"},{value:r,validator:n=>i.d.schema(n,ne),message:"options must be a valid options object"}]),e.type===N.FEATURE)return e.geometry?i.computeBBox(C.coordAll(e.geometry),r):null;if(e.type===N.FEATURE_COLLECTION){const n=C.coordAll(e);return n.length?i.computeBBox(n,r):null}return i.computeBBox(C.coordAll(e),r)}const a=Object.freeze(Object.fromEntries(Object.keys(i.en.VALIDATION).map(e=>[e,e]))),se=[I.POLYGON,I.MULTI_POLYGON],ae=[I.LINESTRING,I.MULTI_LINESTRING,I.POLYGON,I.MULTI_POLYGON],D=[a.INVALID_WINDING_ORDER,a.SELF_INTERSECTION,a.HOLE_INTERSECTS_SHELL,a.DUPLICATE_POSITION],oe={validation:i.t.nonEmptyObject,windingOrder:i.O(i.t.boolean),selfIntersection:i.O(i.t.boolean),holeIntersectsShell:i.O(i.t.boolean),duplicatePosition:i.O(i.t.boolean),precision:i.O(i.t.positive)};function F(e,r){return i.isClockwiseRing(e)!==r?(e.reverse(),!0):!1}function M(e){let r=!1;F(e[0],!1)&&(r=!0);for(let n=1;n<e.length;n++)F(e[n],!0)&&(r=!0);return r}function ce(e){if(e.type===I.POLYGON)return M(e.coordinates);let r=!1;for(const n of e.coordinates)M(n)&&(r=!0);return r}function le(e){return e.type===I.POLYGON?e.coordinates:e.coordinates.flat(1)}function ue(e){return e.type===I.POLYGON?[e.coordinates]:e.coordinates}function k(e){return le(e).some(r=>i.ringSelfIntersections(r).length>0)}function Y(e){return ue(e).some(r=>{const n=r[0];for(let t=1;t<r.length;t++)if(i.ringsIntersect(n,r[t]))return!0;return!1})}function fe(e){const n=Z({type:"Feature",properties:{},geometry:e},0);return n?{type:n.geometry.type,coordinates:n.geometry.coordinates}:null}function Ie(e,r){let n=!1;const t=s=>{const c=s.length,o=i.deduplicatePositions(s,{precision:r});return o.length!==c&&(n=!0),o};switch(e.type){case I.LINESTRING:e.coordinates=t(e.coordinates);break;case I.MULTI_LINESTRING:e.coordinates=e.coordinates.map(t);break;case I.POLYGON:e.coordinates=e.coordinates.map(t);break;case I.MULTI_POLYGON:e.coordinates=e.coordinates.map(s=>s.map(t));break}return n}function de(e,r){const n=r.selfIntersection,t=r.holeIntersectsShell;if(!n&&!t)return[];const s=n&&k(e),c=t&&Y(e),o=[];if(n&&!s&&o.push(a.SELF_INTERSECTION),t&&!c&&o.push(a.HOLE_INTERSECTS_SHELL),!s&&!c)return o;const l=fe(e);return!l||s&&k(l)||c&&Y(l)||(e.type=l.type,e.coordinates=l.coordinates,s&&o.push(a.SELF_INTERSECTION),c&&o.push(a.HOLE_INTERSECTS_SHELL)),o}function Ee(e,r){const n=[],t=r.precision??i.DEFAULT_COORDINATE_PRECISION;if(r.duplicatePosition&&ae.includes(e.type)&&Ie(e,t)&&n.push({code:a.DUPLICATE_POSITION}),!se.includes(e.type))return{fixed:e,corrections:n};r.windingOrder&&ce(e)&&n.push({code:a.INVALID_WINDING_ORDER});for(const s of de(e,r))n.push({code:s});return{fixed:e,corrections:n}}function m(e,r){return e.filter(n=>n.path===r||n.path?.startsWith(`${r}/`))}function P(e,r,n,t){const s={windingOrder:t.windingOrder!==!1&&r.some(d=>d.code===a.INVALID_WINDING_ORDER),selfIntersection:t.selfIntersection!==!1&&r.some(d=>d.code===a.SELF_INTERSECTION),holeIntersectsShell:t.holeIntersectsShell!==!1&&r.some(d=>d.code===a.HOLE_INTERSECTS_SHELL),duplicatePosition:t.duplicatePosition!==!1&&r.some(d=>d.code===a.DUPLICATE_POSITION),precision:t.precision},c=s.windingOrder||s.selfIntersection||s.holeIntersectsShell||s.duplicatePosition?Ee(e,s):{corrections:[]},o=new Set(c.corrections.map(d=>d.code)),l=c.corrections.map(d=>({...d,path:n})),E=r.filter(d=>!o.has(d.code));return{corrections:l,unfixed:E}}function Oe(e,r){i.a.all([{value:e,validator:A,message:"geoJson must be a GeoJson object"},{value:r,validator:l=>i.d.schema(l,oe),message:"options must be a valid options object, with a mandatory validation result"}]);const n=[...r.validation.errors,...r.validation.warnings],t=n.filter(l=>D.includes(l.code)),s=n.filter(l=>!D.includes(l.code));if(t.length===0)return{fixed:e,corrections:[],unfixed:s};if(e.type===N.FEATURE_COLLECTION){const l=[];return e.features.forEach((E,d)=>{const u=`/features/${d}/geometry`,f=m(t,u);if(f.length===0)return;const T=P(E.geometry,f,u,r);l.push(...T.corrections),s.push(...T.unfixed)}),{fixed:e,corrections:l,unfixed:s}}if(e.type===N.FEATURE){const l=m(t,"/geometry"),E=P(e.geometry,l,"/geometry",r);return{fixed:e,corrections:E.corrections,unfixed:[...s,...E.unfixed]}}const c=m(t,""),o=P(e,c,"",r);return{fixed:e,corrections:o.corrections,unfixed:[...s,...o.unfixed]}}function Ne(e){return i.a.all([{value:e,validator:i.t.nonEmptyObject,message:"validation must be a non-empty object"},{value:e?.errors,validator:i.t.array,message:"validation.errors must be an array"}]),e.errors.length===0?!1:e.errors.every(r=>D.includes(r.code))}const Le={tolerance:i.O(i.t.number),getWeight:i.O(i.t.function)};function Te(e,r,n){return Math.abs((e[0]*(r[1]-n[1])+r[0]*(n[1]-e[1])+n[0]*(e[1]-r[1]))/2)}function g(e,{tolerance:r=0,getWeight:n=()=>1}={}){if(e.length<=2)return e;const t=e.map((u,f)=>({coord:u,i:f,area:1/0,removed:!1,prev:null,next:null}));for(let u=0;u<t.length;u++)u>0&&(t[u].prev=t[u-1]),u<t.length-1&&(t[u].next=t[u+1]);const s=u=>!u.prev||!u.next?1/0:Te(u.prev.coord,u.coord,u.next.coord)*n(u.coord,u.i),c=new J.Heap((u,f)=>u.area-f.area),o=u=>{u.area=s(u),c.push({node:u,area:u.area})};for(let u=1;u<t.length-1;u++)o(t[u]);let l=0;for(;c.size()>0;){const u=c.pop(),f=u.node;if(!f.removed&&u.area===f.area){if(f.area<l?f.area=l:l=f.area,f.area>=r)break;f.removed=!0,f.prev&&(f.prev.next=f.next),f.next&&(f.next.prev=f.prev),f.prev?.prev&&o(f.prev),f.next?.next&&o(f.next)}}const E=[];let d=t[0];for(;d;)d.removed||E.push(d.coord),d=d.next;return E}function R(e,r={}){if(i.a.all([{value:e,validator:A,message:"geoJson must be a GeoJson object"},{value:r,validator:n=>i.d.schema(n,Le),message:"options must be a valid options object"}]),e.type===N.FEATURE)return e.geometry&&R(e.geometry,r),e;if(e.type===N.FEATURE_COLLECTION){for(const n of e.features)R(n,r);return e}switch(e.type){case I.LINESTRING:e.coordinates=g(e.coordinates,r);break;case I.POLYGON:case I.MULTI_LINESTRING:e.coordinates=e.coordinates.map(n=>g(n,r));break;case I.MULTI_POLYGON:e.coordinates=e.coordinates.map(n=>n.map(t=>g(t,r)));break;case I.GEOMETRY_COLLECTION:e.geometries.forEach(n=>R(n,r));break}return e}const B="/crs";function j(e,r="",n={}){if(!i.t.defined(e))return r===B?(n.geodesic=!0,{crs:i.WGS84,valid:!0}):{valid:!0};if(r!==B)return{valid:!1,errors:[{code:a.UNSUPPORTED_NESTED_CRS,path:r}],warnings:[]};if(!i.t.plainObject(e))return{valid:!1,errors:[{code:a.INVALID_CRS_OBJECT,path:r}],warnings:[]};switch(e.type){case p.NAME:{if(!i.t.nonEmptyString(e.properties?.name))return{valid:!1,errors:[{code:a.INVALID_CRS_NAME,path:r}],warnings:[]};const t=i.normalizeCrsName(e.properties.name);return i.hasProjection(t)?(n.geodesic=i.isWGS84Projection(t),{crs:t,valid:!0,errors:[],warnings:[]}):{valid:!1,errors:[{code:a.UNSUPPORTED_CRS,path:r,params:{name:e.properties.name}}],warnings:[]}}case p.LINK:return i.t.nonEmptyString(e.properties?.href)?{valid:!1,errors:[{code:a.UNSUPPORTED_LINK_CRS,path:r}],warnings:[]}:{valid:!1,errors:[{code:a.INVALID_CRS_LINK,path:r}],warnings:[]};default:return{valid:!1,errors:[{code:a.INVALID_CRS_TYPE,path:r,params:{type:e.type}}],warnings:[]}}}function v(e,r="",n={}){const t=n.geodesic;if(!i.t.arrayOfLengthBetween(e,2,3))return{valid:!1,errors:[{code:a.INVALID_POSITION_LENGTH,path:r}],warnings:[]};if(!i.t.number(e[0])||!i.t.number(e[1]))return{valid:!1,errors:[{code:a.INVALID_POSITION_COORDINATES,path:r}],warnings:[]};if(t){if(!i.t.inRange(e[0],-180,180))return{valid:!1,errors:[{code:a.INVALID_LONGITUDE_RANGE,path:r,params:{value:e[0]}}],warnings:[]};if(!i.t.inRange(e[1],-90,90))return{valid:!1,errors:[{code:a.INVALID_LATITUDE_RANGE,path:r,params:{value:e[1]}}],warnings:[]}}if(e.length===3&&!i.t.number(e[2]))return{valid:!1,errors:[{code:a.INVALID_ALTITUDE,path:r}],warnings:[]};const s={valid:!0,errors:[],warnings:[]};if(t){const c=n.precision??i.DEFAULT_COORDINATE_PRECISION,o=i.getCoordinatePrecision(e[0]);o>c&&s.warnings.push({code:a.EXCESSIVE_LONGITUDE_PRECISION,path:r,params:{precision:o,max:c}});const l=i.getCoordinatePrecision(e[1]);l>c&&s.warnings.push({code:a.EXCESSIVE_LATITUDE_PRECISION,path:r,params:{precision:l,max:c}})}return s}function W(e,r="",n={}){const t=n?.geodesic;if(!i.t.defined(e))return{valid:!0};if(!i.t.arrayOfLength(e,4)&&!i.t.arrayOfLength(e,6))return{valid:!1,errors:[{code:a.INVALID_BBOX_LENGTH,path:r}],warnings:[]};const s=e.length===4,c=s?[e[0],e[1]]:[e[0],e[1],e[2]],o=s?[e[2],e[3]]:[e[3],e[4],e[5]],l=v(c,`${r}/min`,n);if(!l.valid)return{valid:!1,errors:l.errors,warnings:[]};const E=v(o,`${r}/max`,n);if(!E.valid)return{valid:!1,errors:E.errors,warnings:[]};const[d,u]=c,[f,T]=o;if(u>T)return{valid:!1,errors:[{code:a.INVALID_BBOX_LATITUDE_ORDER,path:r,params:{south:u,north:T}}],warnings:[]};if(!t&&d>f)return{valid:!1,errors:[{code:a.INVALID_BBOX_LONGITUDE_ORDER,path:r,params:{west:d,east:f}}],warnings:[]};if(!s){const w=e[2],U=e[5];if(w>U)return{valid:!1,errors:[{code:a.INVALID_BBOX_ALTITUDE_ORDER,path:r,params:{minAlt:w,maxAlt:U}}],warnings:[]}}const S={valid:!0,errors:[],warnings:[]};return t&&d>f&&S.warnings.push({code:a.BBOX_ANTIMERIDIAN_CROSSING,path:r,params:{west:d,east:f}}),S.warnings.push(...l.warnings),S.warnings.push(...E.warnings),S}function G(){return{Feature:0,FeatureCollection:0,geometries:{}}}function _(){return{crs:void 0,valid:!0,errors:[],warnings:[],statistics:G()}}function X(...e){const r=G();for(const n of e){const t=n.statistics;if(t){r.Feature+=t.Feature??0,r.FeatureCollection+=t.FeatureCollection??0;for(const[s,c]of Object.entries(t.geometries??{}))r.geometries[s]=(r.geometries[s]??0)+c}}return r}function O(e,...r){for(const n of r)e.valid=e.valid&&(n.valid??!0),n.errors&&e.errors.push(...n.errors),n.warnings&&e.warnings.push(...n.warnings),n.crs!==void 0&&(e.crs=n.crs);return e.statistics=X(e,...r),e}function L(e,r,n=""){const t={valid:!0,errors:[],warnings:[],statistics:G()};for(let s=0;s<e.length;s++){const c=`${n}/${s}`,o=r(e[s],c,s);o.statistics&&(t.statistics=X(t,o)),o.valid||(t.valid=!1,t.errors=t.errors.concat(o.errors.map(l=>({...l,path:l.path||c,index:s})))),i.t.empty(o.warnings)||(t.warnings=t.warnings.concat(o.warnings.map(l=>({...l,path:l.path||c,index:s}))))}return t}function V(e,r=0,n=i.DEFAULT_COORDINATE_PRECISION){for(let t=r;t<e.length-1;t++)if(i.isSamePosition(e[t],e[t+1],{precision:n}))return t;return-1}function K(e,r,n,t=i.DEFAULT_COORDINATE_PRECISION){let s=V(e,0,t);for(;s!==-1;)n.push({code:a.DUPLICATE_POSITION,path:`${r}/${s}`}),s=V(e,s+1,t)}function y(e,r=0,n="",t={}){return i.t.arrayOfLengthAtLeast(e,r)?L(e,(s,c)=>v(s,c,t),n):{valid:!1,errors:[{code:a.INVALID_COORDINATES_LENGTH,path:n,params:{minimumLength:r}}],warnings:[]}}function q(e,r="",n={}){const t=y(e,2,r,n);if(!t.valid)return t;if(K(e,r,t.warnings,n.precision??i.DEFAULT_COORDINATE_PRECISION),n.geodesic??!0)for(let s=0;s<e.length-1;s++){const c=e[s][0],o=e[s+1][0];Math.abs(o-c)>180&&t.warnings.push({code:a.ANTIMERIDIAN_CROSSING,path:`${r}/${s}`})}return t}function _e(e,r="",n={}){return i.t.nonEmptyArray(e)?L(e,(t,s)=>q(t,s,n),r):{valid:!1,errors:[{code:a.INVALID_MULTI_LINESTRING_COORDINATES,path:r}],warnings:[]}}function pe(e,r,n="",t={}){const s=t.precision??i.DEFAULT_COORDINATE_PRECISION,c=t.geodesic??!0,o=y(e,4,n,t);if(!o.valid)return o;if(!i.isClosedRing(e,{precision:s}))return o.valid=!1,o.errors.push({code:a.RING_NOT_CLOSED,path:n}),o;if(K(e,n,o.warnings,s),c){const l=i.isClockwiseRing(e)?"clockwise":"counter-clockwise";l!==r&&(o.valid=!1,o.errors.push({code:a.INVALID_WINDING_ORDER,path:n,params:{expected:r,actual:l}}));const E=i.ringSelfIntersections(e);E.length>0&&(o.valid=!1,o.errors.push({code:a.SELF_INTERSECTION,path:n,params:{count:E.length}}))}return o}function z(e,r="",n={}){if(!i.t.nonEmptyArray(e))return{valid:!1,errors:[{code:a.INVALID_POLYGON_COORDINATES,path:r}],warnings:[]};const t=L(e,(s,c,o)=>pe(s,o===0?"counter-clockwise":"clockwise",c,n),r);if((n.geodesic??!0)&&t.valid&&e.length>1){const s=e[0];for(let c=1;c<e.length;c++)i.ringsIntersect(s,e[c])&&(t.valid=!1,t.errors.push({code:a.HOLE_INTERSECTS_SHELL,path:`${r}/${c}`}))}return t}function Se(e,r="",n={}){return i.t.nonEmptyArray(e)?L(e,(t,s)=>z(t,s,n),r):{valid:!1,errors:[{code:a.INVALID_MULTIPOLYGON_COORDINATES,path:r}],warnings:[]}}function Re(e,r="",n={}){return i.t.nonEmptyArray(e)?L(e,(t,s)=>h(t,s,n),r):{valid:!1,errors:[{code:a.INVALID_GEOMETRYCOLLECTION_GEOMETRIES,path:r}],warnings:[]}}function h(e,r="",n={}){let t=_();if(!i.t.nonEmptyObject(e))return t.valid=!1,t.errors.push({code:a.INVALID_GEOMETRY,path:r}),t;t=O(t,j(e.crs,`${r}/crs`,n)),t=O(t,W(e.bbox,`${r}/bbox`,n));const s=`${r}/coordinates`;switch(e.type){case I.POINT:t=O(t,v(e.coordinates,s,n));break;case I.MULTI_POINT:t=O(t,y(e.coordinates,0,s,n));break;case I.LINESTRING:t=O(t,q(e.coordinates,s,n));break;case I.MULTI_LINESTRING:t=O(t,_e(e.coordinates,s,n));break;case I.POLYGON:t=O(t,z(e.coordinates,s,n));break;case I.MULTI_POLYGON:t=O(t,Se(e.coordinates,s,n));break;case I.GEOMETRY_COLLECTION:t=O(t,Re(e.geometries,`${r}/geometries`,n));break;default:return t.valid=!1,t.errors.push({code:a.INVALID_GEOMETRY_TYPE,path:r,params:{type:e.type}}),t}return t.statistics={Feature:0,FeatureCollection:0,geometries:{[e.type]:1}},t}const ve={precision:i.O(i.t.positiveInteger)};function Q(e,r,n){let t=_();return i.t.nonEmptyObject(e)?(t=O(t,j(e.crs,`${r}/crs`,n)),t=O(t,W(e.bbox,`${r}/bbox`,n)),e.type===N.FEATURE?(t.statistics.Feature++,i.t.nonEmptyObject(e.geometry)?t=O(t,h(e.geometry,`${r}/geometry`,n)):t.warnings.push({code:a.MISSING_GEOMETRY,path:r}),t):(t.statistics.FeatureCollection++,i.t.nonEmptyArray(e.features)?t=O(t,L(e.features,(s,c)=>Q(s,c,n),`${r}/features`)):i.t.array(e.features)||(t.valid=!1,t.errors.push({code:a.INVALID_FEATURES_ARRAY,path:r})),t)):(t.valid=!1,t.errors.push({code:a.EMPTY_OBJECT,path:r}),t)}function Ae(e,r={}){i.a.that(r,t=>i.d.schema(t,ve),"options must be a valid options object");const{precision:n=i.DEFAULT_COORDINATE_PRECISION}=r;return i.t.plainObject(e)?i.t.emptyObject(e)?{..._(),valid:!1,errors:[{code:a.EMPTY_OBJECT,path:""}]}:e.type===N.FEATURE||e.type===N.FEATURE_COLLECTION?Q(e,"",{precision:n}):i.t.oneOf(e.type,Object.values(I))?h(e,"",{precision:n}):{..._(),valid:!1,errors:[{code:a.UNKNOWN_TYPE,path:"",params:{type:e.type}}]}:{..._(),valid:!1,errors:[{code:a.INVALID_CONTENT,path:""}]}}exports.CRS_TYPES=p;exports.FEATURE_TYPES=N;exports.GEOMETRY_TYPES=I;exports.VALIDATION_CODES=a;exports.computeGeoJsonBoundingBox=ie;exports.fixGeoJson=Oe;exports.isGeoJsonFixable=Ne;exports.isLikeBBox=te;exports.isLikeCRS=ee;exports.isLikeFeature=x;exports.isLikeFeatureCollection=H;exports.isLikeFeatureOrFeatureCollection=$;exports.isLikeGeoJson=A;exports.isLikeGeometry=b;exports.isLikePosition=re;exports.simplifyGeoJson=R;exports.validateGeoJson=Ae;
|
|
2
|
+
//# sourceMappingURL=geojson-QgqoCFjn.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"geojson-QgqoCFjn.cjs","sources":["../src/operators/is-like.js","../src/operators/compute/bounding-box.js","../src/operators/validate/codes.js","../src/operators/fix.js","../src/operators/simplify.js","../src/operators/validate/crs.js","../src/operators/validate/position.js","../src/operators/validate/bbox.js","../src/operators/validate/utils.js","../src/operators/validate/geometry.js","../src/operators/validate/geojson.js"],"sourcesContent":["import { is } from '@kalisio/common-core/predicates'\nimport { isValidPosition } from '../foundation/index.js'\n\nexport const CRS_TYPES = {\n NAME: 'name',\n LINK: 'link'\n}\n\nexport const GEOMETRY_TYPES = {\n POINT: 'Point',\n MULTI_POINT: 'MultiPoint',\n LINESTRING: 'LineString',\n MULTI_LINESTRING: 'MultiLineString',\n POLYGON: 'Polygon',\n MULTI_POLYGON: 'MultiPolygon',\n GEOMETRY_COLLECTION: 'GeometryCollection'\n}\n\nexport const FEATURE_TYPES = {\n FEATURE: 'Feature',\n FEATURE_COLLECTION: 'FeatureCollection'\n}\n\nexport function isLikeCRS (object) {\n if (!is.plainObject(object)) return false\n if (object.type === CRS_TYPES.NAME) {\n return is.nonEmptyString(object.properties?.name)\n }\n if (object.type === CRS_TYPES.LINK) {\n return is.nonEmptyString(object.properties?.href)\n }\n return false\n}\n\nexport function isLikePosition (object) {\n return isValidPosition(object)\n}\n\nexport function isLikeBBox (object) {\n if (!is.arrayOfLength(object, 4) && !is.arrayOfLength(object, 6)) return false\n return object.every(is.number)\n}\n\nexport function isLikeGeometry (object) {\n if (!is.plainObject(object)) return false\n if (!is.oneOf(object.type, Object.values(GEOMETRY_TYPES))) return false\n if (object.type === GEOMETRY_TYPES.GEOMETRY_COLLECTION) {\n return is.array(object.geometries)\n }\n return is.array(object.coordinates)\n}\n\nexport function isLikeFeature (object) {\n return is.plainObject(object) &&\n object.type === FEATURE_TYPES.FEATURE\n}\n\nexport function isLikeFeatureCollection (object) {\n return is.plainObject(object) &&\n object.type === FEATURE_TYPES.FEATURE_COLLECTION &&\n is.array(object.features)\n}\n\nexport function isLikeFeatureOrFeatureCollection (object) {\n return isLikeFeature(object) || isLikeFeatureCollection(object)\n}\n\nexport function isLikeGeoJson (object) {\n return isLikeFeatureOrFeatureCollection(object) || isLikeGeometry(object)\n}\n","import { coordAll } from '@turf/meta'\nimport { assert, is, optional, conform } from '@kalisio/common-core/predicates'\nimport { computeBBox } from '../../foundation/index.js'\nimport { FEATURE_TYPES, isLikeGeoJson } from '../is-like.js'\n\nconst BOUNDING_BOX_OPTIONS_SCHEMA = {\n ignore3D: optional(is.boolean)\n}\n\nexport function computeGeoJsonBoundingBox (geoJson, options = {}) {\n assert.all([\n { value: geoJson, validator: isLikeGeoJson, message: 'geoJson must be a GeoJson object' },\n { value: options, validator: (v) => conform.schema(v, BOUNDING_BOX_OPTIONS_SCHEMA), message: 'options must be a valid options object' }\n ])\n if (geoJson.type === FEATURE_TYPES.FEATURE) {\n if (!geoJson.geometry) return null\n return computeBBox(coordAll(geoJson.geometry), options)\n }\n if (geoJson.type === FEATURE_TYPES.FEATURE_COLLECTION) {\n const positions = coordAll(geoJson)\n if (!positions.length) return null\n return computeBBox(positions, options)\n }\n // Geometry\n return computeBBox(coordAll(geoJson), options)\n}\n","import en from '../../foundation/i18n/en.json'\n\nexport const VALIDATION_CODES = Object.freeze(\n Object.fromEntries(\n Object.keys(en.VALIDATION).map(code => [code, code])\n )\n)\n","import buffer from '@turf/buffer'\nimport { is, assert, conform, optional } from '@kalisio/common-core/predicates'\nimport {\n deduplicatePositions,\n isClockwiseRing,\n ringSelfIntersections,\n ringsIntersect,\n DEFAULT_COORDINATE_PRECISION\n} from '../foundation/index.js'\nimport { FEATURE_TYPES, GEOMETRY_TYPES, isLikeGeoJson } from './is-like.js'\nimport { VALIDATION_CODES } from './validate/codes.js'\n\n// Winding order / self-intersection / hole overlap only apply to ring-based geometries.\nconst RING_TYPES = [GEOMETRY_TYPES.POLYGON, GEOMETRY_TYPES.MULTI_POLYGON]\n\n// Duplicate position removal applies to any coordinate path, ring or line.\nconst DEDUPABLE_TYPES = [\n GEOMETRY_TYPES.LINESTRING,\n GEOMETRY_TYPES.MULTI_LINESTRING,\n GEOMETRY_TYPES.POLYGON,\n GEOMETRY_TYPES.MULTI_POLYGON\n]\nconst FIXABLE_CODES = [\n VALIDATION_CODES.INVALID_WINDING_ORDER,\n VALIDATION_CODES.SELF_INTERSECTION,\n VALIDATION_CODES.HOLE_INTERSECTS_SHELL,\n VALIDATION_CODES.DUPLICATE_POSITION\n]\nconst FIX_OPTIONS_SCHEMA = {\n validation: is.nonEmptyObject,\n windingOrder: optional(is.boolean),\n selfIntersection: optional(is.boolean),\n holeIntersectsShell: optional(is.boolean),\n duplicatePosition: optional(is.boolean),\n precision: optional(is.positive)\n}\n\n// Winding order is computed spherically (isClockwiseRing), identical to what\n// validate uses, so a ring validate flags is exactly one fix will reverse --\n// the two stay in lockstep near the antimeridian and the poles.\nfunction fixRingWindingOrder (ring, shouldBeClockwise) {\n if (isClockwiseRing(ring) !== shouldBeClockwise) {\n ring.reverse()\n return true\n }\n return false\n}\n\nfunction fixPolygonWindingOrder (coordinates) {\n let corrected = false\n if (fixRingWindingOrder(coordinates[0], false)) corrected = true\n for (let i = 1; i < coordinates.length; i++) {\n if (fixRingWindingOrder(coordinates[i], true)) corrected = true\n }\n return corrected\n}\n\n// Fixes winding for a Polygon or every polygon of a MultiPolygon.\nfunction fixWindingOrder (geometry) {\n if (geometry.type === GEOMETRY_TYPES.POLYGON) {\n return fixPolygonWindingOrder(geometry.coordinates)\n }\n let corrected = false\n for (const polygonCoordinates of geometry.coordinates) {\n if (fixPolygonWindingOrder(polygonCoordinates)) corrected = true\n }\n return corrected\n}\n\n// Rings of a Polygon or MultiPolygon, flattened to a single array either way.\nfunction ringsOf (geometry) {\n return geometry.type === GEOMETRY_TYPES.POLYGON ? geometry.coordinates : geometry.coordinates.flat(1)\n}\n\n// Polygons of a Polygon or MultiPolygon, as an array of ring-arrays either way.\nfunction polygonsOf (geometry) {\n return geometry.type === GEOMETRY_TYPES.POLYGON ? [geometry.coordinates] : geometry.coordinates\n}\n\n// Self-intersection is detected spherically (ringSelfIntersections), identical\n// to validate. The repair below (buffer(0)) stays planar, but detection agrees\n// with what flagged the issue in the first place.\nfunction hasSelfIntersection (geometry) {\n return ringsOf(geometry).some(ring => ringSelfIntersections(ring).length > 0)\n}\n\n// Hole/shell overlap is detected spherically (ringsIntersect), identical to\n// validate: for each polygon, does any hole cross its exterior ring.\nfunction hasHoleIntersectingShell (geometry) {\n return polygonsOf(geometry).some(rings => {\n const shell = rings[0]\n for (let i = 1; i < rings.length; i++) {\n if (ringsIntersect(shell, rings[i])) return true\n }\n return false\n })\n}\n\n// buffer(0) rebuilds the geometry as a valid (multi)polygon. It is the classic\n// topological repair for both self-intersections and hole/shell overlaps: it\n// resolves a wide range of cases, but is planar and more aggressive than a\n// dilate/erode pass (it can drop very small legitimate loops). Returns a plain\n// { type, coordinates } candidate, or null if turf produced nothing.\nfunction bufferRebuild (geometry) {\n const feature = { type: 'Feature', properties: {}, geometry }\n const repaired = buffer(feature, 0)\n if (!repaired) return null\n return { type: repaired.geometry.type, coordinates: repaired.geometry.coordinates }\n}\n\nfunction fixDuplicatePositions (geometry, precision) {\n let deduped = false\n const dedupeAndTrack = (positions) => {\n const before = positions.length\n const result = deduplicatePositions(positions, { precision })\n if (result.length !== before) deduped = true\n return result\n }\n\n switch (geometry.type) {\n case GEOMETRY_TYPES.LINESTRING:\n geometry.coordinates = dedupeAndTrack(geometry.coordinates)\n break\n case GEOMETRY_TYPES.MULTI_LINESTRING:\n geometry.coordinates = geometry.coordinates.map(dedupeAndTrack)\n break\n case GEOMETRY_TYPES.POLYGON:\n geometry.coordinates = geometry.coordinates.map(dedupeAndTrack)\n break\n case GEOMETRY_TYPES.MULTI_POLYGON:\n geometry.coordinates = geometry.coordinates.map(poly => poly.map(dedupeAndTrack))\n break\n }\n return deduped\n}\n\n// Self-intersection and hole/shell overlap are both repaired by a single\n// buffer(0) topological rebuild, run at most once when either applies. Returns\n// the list of correction codes to report; mutates geometry only if the rebuild\n// resolves every triggering defect.\nfunction fixTopology (geometry, options) {\n const wantsSelfIntersection = options.selfIntersection\n const wantsHoleIntersectsShell = options.holeIntersectsShell\n if (!wantsSelfIntersection && !wantsHoleIntersectsShell) return []\n\n // Detect what is still present after the earlier dedupe/winding steps.\n const selfIntersectionPresent = wantsSelfIntersection && hasSelfIntersection(geometry)\n const holeIntersectsShellPresent = wantsHoleIntersectsShell && hasHoleIntersectingShell(geometry)\n\n // A flagged defect that is already gone -- e.g. a self-intersection resolved\n // as a side effect of dedupe -- is reported corrected without a rebuild.\n const corrected = []\n if (wantsSelfIntersection && !selfIntersectionPresent) corrected.push(VALIDATION_CODES.SELF_INTERSECTION)\n if (wantsHoleIntersectsShell && !holeIntersectsShellPresent) corrected.push(VALIDATION_CODES.HOLE_INTERSECTS_SHELL)\n\n if (!selfIntersectionPresent && !holeIntersectsShellPresent) return corrected\n\n // buffer(0) is planar and cannot repair every case (e.g. across the\n // antimeridian). Commit only if every defect that triggered the rebuild is\n // actually gone -- checked with the same spherical tests that flagged them --\n // otherwise leave the original untouched and report them unfixed.\n const candidate = bufferRebuild(geometry)\n if (!candidate) return corrected\n if (selfIntersectionPresent && hasSelfIntersection(candidate)) return corrected\n if (holeIntersectsShellPresent && hasHoleIntersectingShell(candidate)) return corrected\n\n geometry.type = candidate.type\n geometry.coordinates = candidate.coordinates\n if (selfIntersectionPresent) corrected.push(VALIDATION_CODES.SELF_INTERSECTION)\n if (holeIntersectsShellPresent) corrected.push(VALIDATION_CODES.HOLE_INTERSECTS_SHELL)\n return corrected\n}\n\nfunction fixGeometry (geometry, options) {\n const corrections = []\n const precision = options.precision ?? DEFAULT_COORDINATE_PRECISION\n\n if (options.duplicatePosition && DEDUPABLE_TYPES.includes(geometry.type)) {\n if (fixDuplicatePositions(geometry, precision)) {\n corrections.push({ code: VALIDATION_CODES.DUPLICATE_POSITION })\n }\n }\n\n if (!RING_TYPES.includes(geometry.type)) {\n return { fixed: geometry, corrections }\n }\n\n if (options.windingOrder && fixWindingOrder(geometry)) {\n corrections.push({ code: VALIDATION_CODES.INVALID_WINDING_ORDER })\n }\n\n for (const code of fixTopology(geometry, options)) {\n corrections.push({ code })\n }\n\n return { fixed: geometry, corrections }\n}\n\n// Issues relevant to a given geometry path (the issue's own path is at or below it).\nfunction issuesAt (issues, path) {\n return issues.filter(issue => issue.path === path || issue.path?.startsWith(`${path}/`))\n}\n\n// Attempts a fix for a single geometry, and reports both what was corrected\n// and what remained unfixed (option disabled, or the fix attempt failed).\nfunction fixGeometryIssues (geometry, relevantIssues, path, options) {\n const fixOptions = {\n windingOrder: options.windingOrder !== false && relevantIssues.some(i => i.code === VALIDATION_CODES.INVALID_WINDING_ORDER),\n selfIntersection: options.selfIntersection !== false && relevantIssues.some(i => i.code === VALIDATION_CODES.SELF_INTERSECTION),\n holeIntersectsShell: options.holeIntersectsShell !== false && relevantIssues.some(i => i.code === VALIDATION_CODES.HOLE_INTERSECTS_SHELL),\n duplicatePosition: options.duplicatePosition !== false && relevantIssues.some(i => i.code === VALIDATION_CODES.DUPLICATE_POSITION),\n precision: options.precision\n }\n\n const result = (fixOptions.windingOrder || fixOptions.selfIntersection || fixOptions.holeIntersectsShell || fixOptions.duplicatePosition)\n ? fixGeometry(geometry, fixOptions)\n : { corrections: [] }\n\n const correctedCodes = new Set(result.corrections.map(c => c.code))\n const corrections = result.corrections.map(c => ({ ...c, path }))\n const unfixed = relevantIssues.filter(issue => !correctedCodes.has(issue.code))\n\n return { corrections, unfixed }\n}\n\nexport function fixGeoJson (geoJson, options) {\n assert.all([\n {\n value: geoJson,\n validator: isLikeGeoJson,\n message: 'geoJson must be a GeoJson object'\n },\n {\n value: options,\n validator: (v) => conform.schema(v, FIX_OPTIONS_SCHEMA),\n message: 'options must be a valid options object, with a mandatory validation result'\n }\n ])\n const allIssues = [...options.validation.errors, ...options.validation.warnings]\n const fixableIssues = allIssues.filter(issue => FIXABLE_CODES.includes(issue.code))\n const unfixed = allIssues.filter(issue => !FIXABLE_CODES.includes(issue.code))\n if (fixableIssues.length === 0) return { fixed: geoJson, corrections: [], unfixed }\n if (geoJson.type === FEATURE_TYPES.FEATURE_COLLECTION) {\n const corrections = []\n geoJson.features.forEach((feature, index) => {\n const featurePath = `/features/${index}/geometry`\n const relevant = issuesAt(fixableIssues, featurePath)\n if (relevant.length === 0) return\n const result = fixGeometryIssues(feature.geometry, relevant, featurePath, options)\n corrections.push(...result.corrections)\n unfixed.push(...result.unfixed)\n })\n return { fixed: geoJson, corrections, unfixed }\n }\n if (geoJson.type === FEATURE_TYPES.FEATURE) {\n const relevant = issuesAt(fixableIssues, '/geometry')\n const result = fixGeometryIssues(geoJson.geometry, relevant, '/geometry', options)\n return { fixed: geoJson, corrections: result.corrections, unfixed: [...unfixed, ...result.unfixed] }\n }\n const relevant = issuesAt(fixableIssues, '')\n const result = fixGeometryIssues(geoJson, relevant, '', options)\n return { fixed: geoJson, corrections: result.corrections, unfixed: [...unfixed, ...result.unfixed] }\n}\n\nexport function isGeoJsonFixable (validation) {\n assert.all([\n {\n value: validation,\n validator: is.nonEmptyObject,\n message: 'validation must be a non-empty object'\n },\n {\n value: validation?.errors,\n validator: is.array,\n message: 'validation.errors must be an array'\n }\n ])\n if (validation.errors.length === 0) return false\n return validation.errors.every(error =>\n FIXABLE_CODES.includes(error.code)\n )\n}\n","import { Heap } from 'heap-js'\nimport { assert, is, optional, conform } from '@kalisio/common-core/predicates'\nimport { FEATURE_TYPES, GEOMETRY_TYPES, isLikeGeoJson } from './is-like.js'\n\nconst SIMPLIFY_OPTIONS_SCHEMA = {\n tolerance: optional(is.number),\n getWeight: optional(is.function)\n}\n\nfunction triangleArea (a, b, c) {\n return Math.abs(\n (a[0] * (b[1] - c[1]) +\n b[0] * (c[1] - a[1]) +\n c[0] * (a[1] - b[1])) / 2\n )\n}\n\n// Visvalingam-Whyatt simplification algorithm.\nfunction visvalingam (coords, { tolerance = 0, getWeight = () => 1 } = {}) {\n if (coords.length <= 2) return coords\n const pts = coords.map((coord, i) => ({ coord, i, area: Infinity, removed: false, prev: null, next: null }))\n for (let i = 0; i < pts.length; i++) {\n if (i > 0) pts[i].prev = pts[i - 1]\n if (i < pts.length - 1) pts[i].next = pts[i + 1]\n }\n const computeArea = (node) => {\n if (!node.prev || !node.next) return Infinity\n return triangleArea(node.prev.coord, node.coord, node.next.coord) * getWeight(node.coord, node.i)\n }\n // Heap entries are immutable snapshots { node, area }, never reused after\n // push. A stale duplicate (left behind when a node's area is recomputed\n // after a neighbor is removed) is detected by comparing the entry's frozen\n // area to the node's current authoritative area, without ever mutating a\n // value the heap has already positioned internally.\n const heap = new Heap((a, b) => a.area - b.area)\n const pushNode = (node) => {\n node.area = computeArea(node)\n heap.push({ node, area: node.area })\n }\n for (let i = 1; i < pts.length - 1; i++) pushNode(pts[i])\n\n let maxArea = 0\n while (heap.size() > 0) {\n const entry = heap.pop()\n const node = entry.node\n if (node.removed) continue\n if (entry.area !== node.area) continue\n if (node.area < maxArea) node.area = maxArea\n else maxArea = node.area\n if (node.area >= tolerance) break\n node.removed = true\n if (node.prev) node.prev.next = node.next\n if (node.next) node.next.prev = node.prev\n if (node.prev?.prev) pushNode(node.prev)\n if (node.next?.next) pushNode(node.next)\n }\n const result = []\n let cur = pts[0]\n while (cur) {\n if (!cur.removed) result.push(cur.coord)\n cur = cur.next\n }\n return result\n}\n\nexport function simplifyGeoJson (geoJson, options = {}) {\n assert.all([\n { value: geoJson, validator: isLikeGeoJson, message: 'geoJson must be a GeoJson object' },\n { value: options, validator: (v) => conform.schema(v, SIMPLIFY_OPTIONS_SCHEMA), message: 'options must be a valid options object' }\n ])\n if (geoJson.type === FEATURE_TYPES.FEATURE) {\n if (geoJson.geometry) simplifyGeoJson(geoJson.geometry, options)\n return geoJson\n }\n if (geoJson.type === FEATURE_TYPES.FEATURE_COLLECTION) {\n for (const feature of geoJson.features) simplifyGeoJson(feature, options)\n return geoJson\n }\n // Geometry\n switch (geoJson.type) {\n case GEOMETRY_TYPES.LINESTRING:\n geoJson.coordinates = visvalingam(geoJson.coordinates, options)\n break\n case GEOMETRY_TYPES.POLYGON:\n case GEOMETRY_TYPES.MULTI_LINESTRING:\n // getWeight receives an index local to each ring/line (each one is\n // simplified independently, restarting at 0), not a global index\n // across the whole geometry. This mirrors the fact that a ring is\n // itself a plain zero-indexed coordinate array.\n geoJson.coordinates = geoJson.coordinates.map(ring => visvalingam(ring, options))\n break\n case GEOMETRY_TYPES.MULTI_POLYGON:\n geoJson.coordinates = geoJson.coordinates.map(poly => poly.map(ring => visvalingam(ring, options)))\n break\n case GEOMETRY_TYPES.GEOMETRY_COLLECTION:\n geoJson.geometries.forEach(g => simplifyGeoJson(g, options))\n break\n }\n return geoJson\n}\n","import { is } from '@kalisio/common-core/predicates'\nimport { WGS84, hasProjection, normalizeCrsName, isWGS84Projection } from '../../foundation/index.js'\nimport { CRS_TYPES } from '../is-like.js'\nimport { VALIDATION_CODES } from './codes.js'\n\nconst ROOT_CRS_PATH = '/crs'\n\nexport function validateOptionalCRS (crs, path = '', context = {}) {\n // CRS is optional; absence defaults to WGS84 and drives geodesic validation.\n if (!is.defined(crs)) {\n if (path === ROOT_CRS_PATH) {\n context.geodesic = true\n return { crs: WGS84, valid: true }\n }\n return { valid: true }\n }\n // A present crs is only supported at the root; anything deeper is nested and\n // rejected regardless of its shape.\n if (path !== ROOT_CRS_PATH) {\n return {\n valid: false,\n errors: [{ code: VALIDATION_CODES.UNSUPPORTED_NESTED_CRS, path }],\n warnings: []\n }\n }\n // Check CRS structure\n if (!is.plainObject(crs)) {\n return {\n valid: false,\n errors: [{ code: VALIDATION_CODES.INVALID_CRS_OBJECT, path }],\n warnings: []\n }\n }\n // Check CRS type\n switch (crs.type) {\n case CRS_TYPES.NAME: {\n if (!is.nonEmptyString(crs.properties?.name)) {\n return {\n valid: false,\n errors: [{ code: VALIDATION_CODES.INVALID_CRS_NAME, path }],\n warnings: []\n }\n }\n // A named CRS is valid as long as its projection is registered, whatever\n // the datum. URN normalization stays consistent with extractGeoJsonCRS.\n const crsName = normalizeCrsName(crs.properties.name)\n if (!hasProjection(crsName)) {\n return {\n valid: false,\n errors: [{\n code: VALIDATION_CODES.UNSUPPORTED_CRS,\n path,\n params: { name: crs.properties.name }\n }],\n warnings: []\n }\n }\n context.geodesic = isWGS84Projection(crsName)\n return {\n crs: crsName,\n valid: true,\n errors: [],\n warnings: []\n }\n }\n case CRS_TYPES.LINK: {\n if (!is.nonEmptyString(crs.properties?.href)) {\n return {\n valid: false,\n errors: [{ code: VALIDATION_CODES.INVALID_CRS_LINK, path }],\n warnings: []\n }\n }\n // Link CRS stay structurally valid for isLikeGeoJson but cannot be\n // resolved without fetching external resources, so validation rejects them.\n return {\n valid: false,\n errors: [{ code: VALIDATION_CODES.UNSUPPORTED_LINK_CRS, path }],\n warnings: []\n }\n }\n default:\n return {\n valid: false,\n errors: [{\n code: VALIDATION_CODES.INVALID_CRS_TYPE,\n path,\n params: { type: crs.type }\n }],\n warnings: []\n }\n }\n}\n","import { is } from '@kalisio/common-core/predicates'\nimport { getCoordinatePrecision, DEFAULT_COORDINATE_PRECISION } from '../../foundation/index.js'\nimport { VALIDATION_CODES } from './codes.js'\n\nexport function validatePosition (coordinates, path = '', context = {}) {\n const geodesic = context.geodesic\n if (!is.arrayOfLengthBetween(coordinates, 2, 3)) {\n return {\n valid: false,\n errors: [{ code: VALIDATION_CODES.INVALID_POSITION_LENGTH, path }],\n warnings: []\n }\n }\n // Finiteness is CRS-independent (is.number rejects NaN/Infinity).\n if (!is.number(coordinates[0]) || !is.number(coordinates[1])) {\n return {\n valid: false,\n errors: [{ code: VALIDATION_CODES.INVALID_POSITION_COORDINATES, path }],\n warnings: []\n }\n }\n // Longitude/latitude ranges only make sense for geographic WGS84 coordinates.\n if (geodesic) {\n if (!is.inRange(coordinates[0], -180, 180)) {\n return {\n valid: false,\n errors: [{ code: VALIDATION_CODES.INVALID_LONGITUDE_RANGE, path, params: { value: coordinates[0] } }],\n warnings: []\n }\n }\n if (!is.inRange(coordinates[1], -90, 90)) {\n return {\n valid: false,\n errors: [{ code: VALIDATION_CODES.INVALID_LATITUDE_RANGE, path, params: { value: coordinates[1] } }],\n warnings: []\n }\n }\n }\n if (coordinates.length === 3 && !is.number(coordinates[2])) {\n return {\n valid: false,\n errors: [{ code: VALIDATION_CODES.INVALID_ALTITUDE, path }],\n warnings: []\n }\n }\n const response = { valid: true, errors: [], warnings: [] }\n // Precision warnings assume degrees, so they are geodesic-only too.\n if (geodesic) {\n const precision = context.precision ?? DEFAULT_COORDINATE_PRECISION\n const lonPrecision = getCoordinatePrecision(coordinates[0])\n if (lonPrecision > precision) {\n response.warnings.push({ code: VALIDATION_CODES.EXCESSIVE_LONGITUDE_PRECISION, path, params: { precision: lonPrecision, max: precision } })\n }\n const latPrecision = getCoordinatePrecision(coordinates[1])\n if (latPrecision > precision) {\n response.warnings.push({ code: VALIDATION_CODES.EXCESSIVE_LATITUDE_PRECISION, path, params: { precision: latPrecision, max: precision } })\n }\n }\n return response\n}\n","import { is } from '@kalisio/common-core/predicates'\nimport { validatePosition } from './position.js'\nimport { VALIDATION_CODES } from './codes.js'\n\nexport function validateOptionalBBox (bbox, path = '', context = {}) {\n const geodesic = context?.geodesic\n // bbox is optional\n if (!is.defined(bbox)) {\n return {\n valid: true\n }\n }\n // test the bbox values\n if (!is.arrayOfLength(bbox, 4) && !is.arrayOfLength(bbox, 6)) {\n return {\n valid: false,\n errors: [{ code: VALIDATION_CODES.INVALID_BBOX_LENGTH, path }],\n warnings: []\n }\n }\n const is2D = bbox.length === 4\n const min = is2D ? [bbox[0], bbox[1]] : [bbox[0], bbox[1], bbox[2]]\n const max = is2D ? [bbox[2], bbox[3]] : [bbox[3], bbox[4], bbox[5]]\n const minResult = validatePosition(min, `${path}/min`, context)\n if (!minResult.valid) {\n return { valid: false, errors: minResult.errors, warnings: [] }\n }\n const maxResult = validatePosition(max, `${path}/max`, context)\n if (!maxResult.valid) {\n return { valid: false, errors: maxResult.errors, warnings: [] }\n }\n const [west, south] = min\n const [east, north] = max\n // min/max consistency is CRS-independent.\n if (south > north) {\n return {\n valid: false,\n errors: [{ code: VALIDATION_CODES.INVALID_BBOX_LATITUDE_ORDER, path, params: { south, north } }],\n warnings: []\n }\n }\n // For a projected CRS there is no antimeridian, so X must be ordered too.\n if (!geodesic && west > east) {\n return {\n valid: false,\n errors: [{ code: VALIDATION_CODES.INVALID_BBOX_LONGITUDE_ORDER, path, params: { west, east } }],\n warnings: []\n }\n }\n if (!is2D) {\n const minAlt = bbox[2]\n const maxAlt = bbox[5]\n if (minAlt > maxAlt) {\n return {\n valid: false,\n errors: [{ code: VALIDATION_CODES.INVALID_BBOX_ALTITUDE_ORDER, path, params: { minAlt, maxAlt } }],\n warnings: []\n }\n }\n }\n const result = { valid: true, errors: [], warnings: [] }\n // An antimeridian-crossing bbox (west > east) only makes sense in WGS84.\n if (geodesic && west > east) {\n result.warnings.push({ code: VALIDATION_CODES.BBOX_ANTIMERIDIAN_CROSSING, path, params: { west, east } })\n }\n result.warnings.push(...minResult.warnings)\n result.warnings.push(...maxResult.warnings)\n return result\n}\n","import { is } from '@kalisio/common-core/predicates'\n\nfunction emptyStatistics () {\n return { Feature: 0, FeatureCollection: 0, geometries: {} }\n}\n\nexport function emptyResult () {\n return {\n crs: undefined,\n valid: true,\n errors: [],\n warnings: [],\n statistics: emptyStatistics()\n }\n}\n\nfunction mergeStatistics (...results) {\n const statistics = emptyStatistics()\n for (const result of results) {\n const s = result.statistics\n if (!s) continue\n statistics.Feature += s.Feature ?? 0\n statistics.FeatureCollection += s.FeatureCollection ?? 0\n for (const [type, count] of Object.entries(s.geometries ?? {})) {\n statistics.geometries[type] = (statistics.geometries[type] ?? 0) + count\n }\n }\n return statistics\n}\n\nexport function mergeResult (result, ...others) {\n for (const other of others) {\n result.valid = result.valid && (other.valid ?? true)\n if (other.errors) result.errors.push(...other.errors)\n if (other.warnings) result.warnings.push(...other.warnings)\n if (other.crs !== undefined) result.crs = other.crs\n }\n result.statistics = mergeStatistics(result, ...others)\n return result\n}\n\nexport function validateArray (items, validator, path = '') {\n const response = {\n valid: true,\n errors: [],\n warnings: [],\n statistics: emptyStatistics()\n }\n for (let i = 0; i < items.length; i++) {\n const itemPath = `${path}/${i}`\n const result = validator(items[i], itemPath, i)\n if (result.statistics) {\n response.statistics = mergeStatistics(response, result)\n }\n if (!result.valid) {\n response.valid = false\n response.errors = response.errors.concat(result.errors.map(e => ({ ...e, path: e.path || itemPath, index: i })))\n }\n if (!is.empty(result.warnings)) {\n response.warnings = response.warnings.concat(result.warnings.map(w => ({ ...w, path: w.path || itemPath, index: i })))\n }\n }\n return response\n}\n","import { is } from '@kalisio/common-core/predicates'\nimport {\n DEFAULT_COORDINATE_PRECISION,\n isSamePosition,\n ringsIntersect,\n isClockwiseRing,\n isClosedRing,\n ringSelfIntersections\n} from '../../foundation/index.js'\nimport { GEOMETRY_TYPES } from '../is-like.js'\nimport { VALIDATION_CODES } from './codes.js'\nimport { validatePosition } from './position.js'\nimport { validateOptionalCRS } from './crs.js'\nimport { validateOptionalBBox } from './bbox.js'\nimport { emptyResult, mergeResult, validateArray } from './utils.js'\n\nfunction findConsecutiveDuplicateIndex (positions, startAt = 0, precision = DEFAULT_COORDINATE_PRECISION) {\n for (let i = startAt; i < positions.length - 1; i++) {\n if (isSamePosition(positions[i], positions[i + 1], { precision })) return i\n }\n return -1\n}\n\nfunction checkDuplicatePositions (positions, path, warnings, precision = DEFAULT_COORDINATE_PRECISION) {\n let i = findConsecutiveDuplicateIndex(positions, 0, precision)\n while (i !== -1) {\n warnings.push({ code: VALIDATION_CODES.DUPLICATE_POSITION, path: `${path}/${i}` })\n i = findConsecutiveDuplicateIndex(positions, i + 1, precision)\n }\n}\n\nfunction validateCoordinatesArray (coordinates, minimumLength = 0, path = '', context = {}) {\n if (!is.arrayOfLengthAtLeast(coordinates, minimumLength)) {\n return {\n valid: false,\n errors: [{ code: VALIDATION_CODES.INVALID_COORDINATES_LENGTH, path, params: { minimumLength } }],\n warnings: []\n }\n }\n // Closure injects context; validateArray would otherwise pass the index as 3rd arg\n return validateArray(coordinates, (pos, p) => validatePosition(pos, p, context), path)\n}\n\nfunction validateLineStringCoordinates (coordinates, path = '', context = {}) {\n const result = validateCoordinatesArray(coordinates, 2, path, context)\n if (!result.valid) return result\n checkDuplicatePositions(coordinates, path, result.warnings, context.precision ?? DEFAULT_COORDINATE_PRECISION)\n // Antimeridian crossings assume geographic longitudes.\n if (context.geodesic ?? true) {\n for (let i = 0; i < coordinates.length - 1; i++) {\n const lon1 = coordinates[i][0]\n const lon2 = coordinates[i + 1][0]\n if (Math.abs(lon2 - lon1) > 180) {\n result.warnings.push({ code: VALIDATION_CODES.ANTIMERIDIAN_CROSSING, path: `${path}/${i}` })\n }\n }\n }\n return result\n}\n\nfunction validateMultiLineStringCoordinates (coordinates, path = '', context = {}) {\n if (!is.nonEmptyArray(coordinates)) {\n return {\n valid: false,\n errors: [{ code: VALIDATION_CODES.INVALID_MULTI_LINESTRING_COORDINATES, path }],\n warnings: []\n }\n }\n return validateArray(coordinates, (line, p) => validateLineStringCoordinates(line, p, context), path)\n}\n\nfunction validateLinearRing (coordinates, expectedWindingOrder, path = '', context = {}) {\n const precision = context.precision ?? DEFAULT_COORDINATE_PRECISION\n const geodesic = context.geodesic ?? true\n const result = validateCoordinatesArray(coordinates, 4, path, context)\n if (!result.valid) return result\n // Ring closure shares the foundation's notion of \"same position\"\n // (precision-tolerant), so a ring validate reports as not closed is exactly\n // one fix's closeRing would repair. Keeps validate and fix in lockstep.\n if (!isClosedRing(coordinates, { precision })) {\n result.valid = false\n result.errors.push({ code: VALIDATION_CODES.RING_NOT_CLOSED, path })\n return result\n }\n // Check for duplicate consecutive positions (the intentional closing\n // duplicate is never flagged, since first/last are only equal across the\n // whole array, not adjacent to each other).\n checkDuplicatePositions(coordinates, path, result.warnings, precision)\n // Winding order and self-intersection rely on n-vector/spherical geometry,\n // so they only apply to geographic WGS84 coordinates.\n if (geodesic) {\n // check winding order (spherical, matching what S2/MongoDB use)\n const actualWindingOrder = isClockwiseRing(coordinates) ? 'clockwise' : 'counter-clockwise'\n if (actualWindingOrder !== expectedWindingOrder) {\n result.valid = false\n result.errors.push({\n code: VALIDATION_CODES.INVALID_WINDING_ORDER,\n path,\n params: { expected: expectedWindingOrder, actual: actualWindingOrder }\n })\n }\n // check self-intersection (spherical, matching what S2/MongoDB use)\n const selfIntersections = ringSelfIntersections(coordinates)\n if (selfIntersections.length > 0) {\n result.valid = false\n result.errors.push({\n code: VALIDATION_CODES.SELF_INTERSECTION,\n path,\n params: { count: selfIntersections.length }\n })\n }\n }\n return result\n}\n\nfunction validatePolygonCoordinates (coordinates, path = '', context = {}) {\n if (!is.nonEmptyArray(coordinates)) {\n return {\n valid: false,\n errors: [{ code: VALIDATION_CODES.INVALID_POLYGON_COORDINATES, path }],\n warnings: []\n }\n }\n const result = validateArray(coordinates, (ring, p, i) => validateLinearRing(ring, i === 0 ? 'counter-clockwise' : 'clockwise', p, context), path)\n // Hole/shell intersection relies on n-vector geometry, so it is geodesic-only.\n if ((context.geodesic ?? true) && result.valid && coordinates.length > 1) {\n const shell = coordinates[0]\n for (let i = 1; i < coordinates.length; i++) {\n if (ringsIntersect(shell, coordinates[i])) {\n result.valid = false\n result.errors.push({ code: VALIDATION_CODES.HOLE_INTERSECTS_SHELL, path: `${path}/${i}` })\n }\n }\n }\n return result\n}\n\nfunction validateMultiPolygonCoordinates (coordinates, path = '', context = {}) {\n if (!is.nonEmptyArray(coordinates)) {\n return {\n valid: false,\n errors: [{ code: VALIDATION_CODES.INVALID_MULTIPOLYGON_COORDINATES, path }],\n warnings: []\n }\n }\n return validateArray(coordinates, (c, p) => validatePolygonCoordinates(c, p, context), path)\n}\n\nfunction validateGeometryCollectionGeometries (geometries, path = '', context = {}) {\n if (!is.nonEmptyArray(geometries)) {\n return {\n valid: false,\n errors: [{ code: VALIDATION_CODES.INVALID_GEOMETRYCOLLECTION_GEOMETRIES, path }],\n warnings: []\n }\n }\n return validateArray(geometries, (g, p) => validateGeometry(g, p, context), path)\n}\n\nexport function validateGeometry (geometry, path = '', context = {}) {\n let result = emptyResult()\n // check whether the geometry is a non empty object\n if (!is.nonEmptyObject(geometry)) {\n result.valid = false\n result.errors.push({ code: VALIDATION_CODES.INVALID_GEOMETRY, path })\n return result\n }\n // Handle the CRS first: it poses context.geodesic, which the coordinate\n // checks below read. A nested crs (deeper than root) is rejected inside\n // validateOptionalCRS; its absence is a no-op that leaves geodesic untouched.\n result = mergeResult(result, validateOptionalCRS(geometry.crs, `${path}/crs`, context))\n // handle the bbox\n result = mergeResult(result, validateOptionalBBox(geometry.bbox, `${path}/bbox`, context))\n // handle the coordinates by geometry type\n const coordsPath = `${path}/coordinates`\n switch (geometry.type) {\n case GEOMETRY_TYPES.POINT:\n result = mergeResult(result, validatePosition(geometry.coordinates, coordsPath, context))\n break\n case GEOMETRY_TYPES.MULTI_POINT:\n result = mergeResult(result, validateCoordinatesArray(geometry.coordinates, 0, coordsPath, context))\n break\n case GEOMETRY_TYPES.LINESTRING:\n result = mergeResult(result, validateLineStringCoordinates(geometry.coordinates, coordsPath, context))\n break\n case GEOMETRY_TYPES.MULTI_LINESTRING:\n result = mergeResult(result, validateMultiLineStringCoordinates(geometry.coordinates, coordsPath, context))\n break\n case GEOMETRY_TYPES.POLYGON:\n result = mergeResult(result, validatePolygonCoordinates(geometry.coordinates, coordsPath, context))\n break\n case GEOMETRY_TYPES.MULTI_POLYGON:\n result = mergeResult(result, validateMultiPolygonCoordinates(geometry.coordinates, coordsPath, context))\n break\n case GEOMETRY_TYPES.GEOMETRY_COLLECTION:\n result = mergeResult(result, validateGeometryCollectionGeometries(geometry.geometries, `${path}/geometries`, context))\n break\n default:\n // Unknown type: report it and do not count it in statistics.\n result.valid = false\n result.errors.push({ code: VALIDATION_CODES.INVALID_GEOMETRY_TYPE, path, params: { type: geometry.type } })\n return result\n }\n // Count this geometry by its own type. A GeometryCollection counts as one and\n // its members are NOT decomposed, so we overwrite any statistics that bubbled\n // up from the members.\n result.statistics = { Feature: 0, FeatureCollection: 0, geometries: { [geometry.type]: 1 } }\n return result\n}\n","import { assert, is, conform, optional } from '@kalisio/common-core/predicates'\nimport { DEFAULT_COORDINATE_PRECISION } from '../../foundation/index.js'\nimport { FEATURE_TYPES, GEOMETRY_TYPES } from '../is-like.js'\nimport { VALIDATION_CODES } from './codes.js'\nimport { validateOptionalCRS } from './crs.js'\nimport { validateOptionalBBox } from './bbox.js'\nimport { emptyResult, mergeResult, validateArray } from './utils.js'\nimport { validateGeometry } from './geometry.js'\n\nconst VALIDATE_OPTIONS_SCHEMA = {\n precision: optional(is.positiveInteger)\n}\n\nfunction validateFeature (feature, path, context) {\n let result = emptyResult()\n // check whether the feature is a non empty object\n if (!is.nonEmptyObject(feature)) {\n result.valid = false\n result.errors.push({\n code: VALIDATION_CODES.EMPTY_OBJECT,\n path\n })\n return result\n }\n // handle the CRS\n result = mergeResult(result, validateOptionalCRS(feature.crs, `${path}/crs`, context))\n // handle the bbox\n result = mergeResult(result, validateOptionalBBox(feature.bbox, `${path}/bbox`, context))\n // handle the Feature type\n if (feature.type === FEATURE_TYPES.FEATURE) {\n result.statistics.Feature++\n if (is.nonEmptyObject(feature.geometry)) {\n result = mergeResult(result, validateGeometry(feature.geometry, `${path}/geometry`, context))\n } else {\n result.warnings.push({\n code: VALIDATION_CODES.MISSING_GEOMETRY,\n path\n })\n }\n return result\n }\n // handle the FeatureCollection type\n result.statistics.FeatureCollection++\n if (is.nonEmptyArray(feature.features)) {\n result = mergeResult(result, validateArray(feature.features, (f, p) => validateFeature(f, p, context), `${path}/features`))\n } else if (!is.array(feature.features)) {\n result.valid = false\n result.errors.push({\n code: VALIDATION_CODES.INVALID_FEATURES_ARRAY,\n path\n })\n }\n return result\n}\n\nexport function validateGeoJson (geoJson, options = {}) {\n assert.that(options, (v) => conform.schema(v, VALIDATE_OPTIONS_SCHEMA), 'options must be a valid options object')\n const { precision = DEFAULT_COORDINATE_PRECISION } = options\n // handle whether the geoJson is an object\n if (!is.plainObject(geoJson)) {\n return {\n ...emptyResult(),\n valid: false,\n errors: [{\n code: VALIDATION_CODES.INVALID_CONTENT,\n path: ''\n }]\n }\n }\n // handle whether the geoJson is a non empty object\n if (is.emptyObject(geoJson)) {\n return {\n ...emptyResult(),\n valid: false,\n errors: [{\n code: VALIDATION_CODES.EMPTY_OBJECT,\n path: ''\n }]\n }\n }\n // handle whether the geoJson is a Feature\n if (geoJson.type === FEATURE_TYPES.FEATURE || geoJson.type === FEATURE_TYPES.FEATURE_COLLECTION) {\n return validateFeature(geoJson, '', { precision })\n }\n // handle whether the geoJson is a Geometry\n if (is.oneOf(geoJson.type, Object.values(GEOMETRY_TYPES))) {\n return validateGeometry(geoJson, '', { precision })\n }\n // If none, the geoJson is invalid\n return {\n ...emptyResult(),\n valid: false,\n errors: [{\n code: VALIDATION_CODES.UNKNOWN_TYPE,\n path: '',\n params: { type: geoJson.type }\n }]\n }\n}\n"],"names":["CRS_TYPES","GEOMETRY_TYPES","FEATURE_TYPES","isLikeCRS","object","is","isLikePosition","isValidPosition","isLikeBBox","isLikeGeometry","isLikeFeature","isLikeFeatureCollection","isLikeFeatureOrFeatureCollection","isLikeGeoJson","BOUNDING_BOX_OPTIONS_SCHEMA","optional","computeGeoJsonBoundingBox","geoJson","options","assert","v","conform","computeBBox","coordAll","positions","VALIDATION_CODES","en","code","RING_TYPES","DEDUPABLE_TYPES","FIXABLE_CODES","FIX_OPTIONS_SCHEMA","fixRingWindingOrder","ring","shouldBeClockwise","isClockwiseRing","fixPolygonWindingOrder","coordinates","corrected","i","fixWindingOrder","geometry","polygonCoordinates","ringsOf","polygonsOf","hasSelfIntersection","ringSelfIntersections","hasHoleIntersectingShell","rings","shell","ringsIntersect","bufferRebuild","repaired","buffer","fixDuplicatePositions","precision","deduped","dedupeAndTrack","before","result","deduplicatePositions","poly","fixTopology","wantsSelfIntersection","wantsHoleIntersectsShell","selfIntersectionPresent","holeIntersectsShellPresent","candidate","fixGeometry","corrections","DEFAULT_COORDINATE_PRECISION","issuesAt","issues","path","issue","fixGeometryIssues","relevantIssues","fixOptions","correctedCodes","c","unfixed","fixGeoJson","allIssues","fixableIssues","feature","index","featurePath","relevant","isGeoJsonFixable","validation","error","SIMPLIFY_OPTIONS_SCHEMA","triangleArea","a","b","visvalingam","coords","tolerance","getWeight","pts","coord","computeArea","node","heap","Heap","pushNode","maxArea","entry","cur","simplifyGeoJson","g","ROOT_CRS_PATH","validateOptionalCRS","crs","context","WGS84","crsName","normalizeCrsName","hasProjection","isWGS84Projection","validatePosition","geodesic","response","lonPrecision","getCoordinatePrecision","latPrecision","validateOptionalBBox","bbox","is2D","min","max","minResult","maxResult","west","south","east","north","minAlt","maxAlt","emptyStatistics","emptyResult","mergeStatistics","results","statistics","s","type","count","mergeResult","others","other","validateArray","items","validator","itemPath","e","w","findConsecutiveDuplicateIndex","startAt","isSamePosition","checkDuplicatePositions","warnings","validateCoordinatesArray","minimumLength","pos","p","validateLineStringCoordinates","lon1","lon2","validateMultiLineStringCoordinates","line","validateLinearRing","expectedWindingOrder","isClosedRing","actualWindingOrder","selfIntersections","validatePolygonCoordinates","validateMultiPolygonCoordinates","validateGeometryCollectionGeometries","geometries","validateGeometry","coordsPath","VALIDATE_OPTIONS_SCHEMA","validateFeature","f","validateGeoJson"],"mappings":"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"}
|
package/dist/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=require("@kalisio/common-core"),h=require("proj4"),q=require("@turf/meta"),jt=require("@turf/convex"),Xe=require("@turf/helpers"),xt=require("@turf/buffer"),Bt=require("heap-js"),fe=typeof process>"u"||process.env?.NODE_ENV!=="production";class ve extends Error{constructor(t){super(t),this.name="AssertionError"}}function ze(e,t,n){if(!t(e))throw new ve(n)}const l={that(e,t,n){fe&&ze(e,t,n)},all(e){if(fe)for(const{value:t,validator:n,message:r}of e)ze(t,n,r)},any(e){if(!(!fe||e.length===0)&&!e.some(({value:t,validator:n})=>n(t)))throw new ve(e.map(({message:t})=>t).join(" or "))}},s={defined(e){return e!=null},nil(e){return!s.defined(e)},plainObject(e){return s.defined(e)&&typeof e=="object"&&!Array.isArray(e)&&e.constructor===Object},emptyObject(e){return s.plainObject(e)&&Object.keys(e).length===0},nonEmptyObject(e){return s.plainObject(e)&&Object.keys(e).length>0},boolean(e){return typeof e=="boolean"},booleanTrue(e){return e===!0},booleanFalse(e){return e===!1},string(e){return typeof e=="string"},emptyString(e){return s.string(e)&&e.trim().length===0},nonEmptyString(e){return s.string(e)&&e.trim().length>0},char(e){return s.string(e)&&/^.$/u.test(e)},hex(e){return s.nonEmptyString(e)&&e.length%2===0&&/^[0-9a-fA-F]*$/.test(e)},dataUri(e){return s.string(e)?e.startsWith("data:")&&e.includes(";base64,"):!1},url(e){if(typeof e!="string")return!1;const t=/^([a-z][a-z0-9+.-]*:\/\/)([^/?#]+)(\/[^?#]*)?(\?[^#]*)?(#.*)?$/i.exec(e);if(!t?.[2].includes(","))return URL.canParse(e);const[,n,r,i="",a="",u=""]=t;return r.split(",").every((c,g)=>(c=c.trim(),!c||g>0&&c.includes("@")?!1:URL.canParse(`${n}${c}${i}${a}${u}`)))},email(e){if(!s.string(e))return!1;const t=/^[-!#$%&'*+/0-9=?A-Z^_a-z`{|}~](\.?[-!#$%&'*+/0-9=?A-Z^_a-z`{|}~])*@[a-zA-Z0-9](-?\.?[a-zA-Z0-9])*\.[a-zA-Z](-?[a-zA-Z0-9])+$/,[n,r]=e.split("@");return!n||!r||n.length>64||r.length>255||r.split(".").some(i=>i.length>63)?!1:t.test(e)},regularExpression(e){return s.defined(e)&&e instanceof RegExp},number(e){return typeof e=="number"&&!isNaN(e)&&isFinite(e)},positive(e){return s.number(e)&&e>0},nonPositive(e){return s.number(e)&&e<=0},negative(e){return s.number(e)&&e<0},nonNegative(e){return s.number(e)&&e>=0},inRange(e,t,n){return l.that(n,r=>r>=t,"max must be greater than or equal to min"),s.number(e)&&e>=t&&e<=n},inRangeExclusive(e,t,n){return l.that(n,r=>r>t,"max must be greater than min"),s.number(e)&&e>t&&e<n},inRangeExclusiveMin(e,t,n){return l.that(n,r=>r>t,"max must be greater than min"),s.number(e)&&e>t&&e<=n},inRangeExclusiveMax(e,t,n){return l.that(n,r=>r>=t,"max must be greater than or equal to min"),s.number(e)&&e>=t&&e<n},integer(e){return s.number(e)&&Number.isInteger(e)},positiveInteger(e){return s.integer(e)&&s.positive(e)},nonPositiveInteger(e){return s.integer(e)&&s.nonPositive(e)},negativeInteger(e){return s.integer(e)&&s.negative(e)},nonNegativeInteger(e){return s.integer(e)&&s.nonNegative(e)},array(e){return Array.isArray(e)},emptyArray(e){return s.array(e)&&e.length===0},nonEmptyArray(e){return s.array(e)&&e.length>0},arrayOfLength(e,t){return l.that(t,s.nonNegativeInteger,"length must be a non negative integer"),s.array(e)&&e.length===t},arrayOfLengthAtLeast(e,t){return l.that(t,s.nonNegativeInteger,"minLength must be a non negative integer"),s.array(e)&&e.length>=t},arrayOfLengthAtMost(e,t){return l.that(t,s.nonNegativeInteger,"maxLength must be a non negative integer"),s.array(e)&&e.length<=t},arrayOfLengthBetween(e,t,n){return l.all([{value:t,validator:s.nonNegativeInteger,message:"minLength must be a non negative integer"},{value:n,validator:s.nonNegativeInteger,message:"maxLength must be a non negative integer"},{value:t,validator:r=>r<=n,message:"minLength must be less than or equal to maxLength"}]),s.array(e)&&e.length>=t&&e.length<=n},map(e){return s.defined(e)&&e instanceof Map},emptyMap(e){return s.map(e)&&e.size===0},nonEmptyMap(e){return s.map(e)&&e.size>0},set(e){return s.defined(e)&&e instanceof Set},emptySet(e){return s.set(e)&&e.size===0},nonEmptySet(e){return s.set(e)&&e.size>0},function(e){return typeof e=="function"},oneOf(e,t){return l.that(t,s.nonEmptyArray,"allowed values must be a non empty array"),t.includes(e)},empty(e){return s.nil(e)?!0:s.string(e)?s.emptyString(e):s.array(e)?s.emptyArray(e):s.plainObject(e)?s.emptyObject(e):s.map(e)?s.emptyMap(e):s.set(e)?s.emptySet(e):!1}},D={key(e,t){return l.all([{value:e,validator:s.plainObject,message:"obj must be an object"},{value:t,validator:s.nonEmptyString,message:"key must be a non empty string"}]),Object.hasOwn(e,t)},keys(e,t){return l.all([{value:e,validator:s.plainObject,message:"obj must be an object"},{value:t,validator:n=>s.array(n)&&n.length>0&&n.every(s.nonEmptyString),message:"keys must be an array of non empty strings"}]),t.every(n=>D.key(e,n))},keyWithValue(e,t){return D.key(e,t)&&s.defined(e[t])},path(e,t){l.all([{value:e,validator:s.plainObject,message:"obj must be an object"},{value:t,validator:s.nonEmptyString,message:"path must be a non empty string"}]);let n=e;for(const r of t.split(".")){if(!n||!s.plainObject(n)||!(r in n))return!1;n=n[r]}return!0}};function it(e,t,n=""){return Object.entries(t).every(([r,i])=>{const a=n?`${n}.${r}`:r;if(!D.key(e,r))return i._optional===!0;const u=e[r];if(s.plainObject(i))return s.plainObject(u)&&it(u,i,a);if(typeof i=="function")return i(u);throw new ve(`Invalid validator for key "${a}"`)})}const y={schema(e,t){return l.all([{value:e,validator:s.plainObject,message:"obj must be an object"},{value:t,validator:s.plainObject,message:"schema must be an object"}]),it(e,t)}};function L(e){l.that(e,s.function,"validator must be a function");function t(n){return s.nil(n)?!0:e(n)}return t._optional=!0,t}const O={LATITUDE:"LAT",LONGITUDE:"LON",ALTITUDE:"ALT"};function Se(e){return l.that(e,s.string,"axis must be a string"),Object.values(O).includes(e)}function x(e){return l.that(e,s.string,"axis must be a string"),e===O.LATITUDE}function se(e){return l.that(e,s.string,"axis must be a string"),e===O.LONGITUDE}function kt(e){return l.that(e,s.string,"axis must be a string"),e===O.ALTITUDE}const Ft={NORTH:{label:"Nord",symbol:"N"},SOUTH:{label:"Sud",symbol:"S"},EAST:{label:"Est",symbol:"E"},WEST:{label:"Ouest",symbol:"O"}},$t={EMPTY_OBJECT:"L'objet est vide",UNKNOWN_TYPE:"Le type GeoJSON est inconnu",MISSING_GEOMETRY:"La géométrie est manquante",INVALID_FEATURES_ARRAY:"Le tableau de features est invalide",INVALID_GEOMETRY:"La géométrie est invalide",INVALID_GEOMETRY_TYPE:"Le type de géométrie est invalide",INVALID_COORDINATES_LENGTH:"Le nombre de coordonnées est invalide",INVALID_MULTI_LINESTRING_COORDINATES:"Les coordonnées du MultiLineString sont invalides",INVALID_POLYGON_COORDINATES:"Les coordonnées du Polygon sont invalides",INVALID_MULTIPOLYGON_COORDINATES:"Les coordonnées du MultiPolygon sont invalides",INVALID_GEOMETRYCOLLECTION_GEOMETRIES:"Les géométries de la GeometryCollection sont invalides",RING_NOT_CLOSED:"L'anneau n'est pas fermé",INVALID_WINDING_ORDER:"L'ordre d'orientation de l'anneau est invalide",SELF_INTERSECTION:"Une auto-intersection a été détectée",HOLE_INTERSECTS_SHELL:"Un trou intersecte le contour extérieur",ANTIMERIDIAN_CROSSING:"La géométrie traverse l'antiméridien",DUPLICATE_POSITION:"Une position consécutive est dupliquée",INVALID_POSITION_LENGTH:"Le nombre de coordonnées de la position est invalide",INVALID_POSITION_COORDINATES:"Les coordonnées de la position sont invalides",INVALID_LONGITUDE_RANGE:"La longitude est hors limites",INVALID_LATITUDE_RANGE:"La latitude est hors limites",INVALID_ALTITUDE:"L'altitude est invalide",EXCESSIVE_LONGITUDE_PRECISION:"La précision de la longitude est excessive",EXCESSIVE_LATITUDE_PRECISION:"La précision de la latitude est excessive",INVALID_BBOX_LENGTH:"Le nombre de coordonnées de la boîte englobante est invalide",INVALID_BBOX_LATITUDE_ORDER:"L'ordre des latitudes de la boîte englobante est invalide",INVALID_BBOX_LONGITUDE_ORDER:"L'ordre des longitudes de la boîte englobante est invalide",INVALID_BBOX_ALTITUDE_ORDER:"L'ordre des altitudes de la boîte englobante est invalide",BBOX_ANTIMERIDIAN_CROSSING:"La boîte englobante traverse l'antiméridien",INVALID_CRS_OBJECT:"L'objet CRS est invalide",INVALID_CRS_NAME:"Le nom du CRS est invalide",INVALID_CRS_LINK:"Le lien du CRS est invalide",INVALID_CRS_TYPE:"Le type de CRS est invalide",UNSUPPORTED_CRS:"Le CRS n'est pas pris en charge",UNSUPPORTED_LINK_CRS:"Le lien CRS n'est pas pris en charge",UNSUPPORTED_NESTED_CRS:"Le CRS imbriqué n'est pas pris en charge"},Yt={DIRECTIONS:Ft,VALIDATION:$t},Ht={NORTH:{label:"North",symbol:"N"},SOUTH:{label:"South",symbol:"S"},EAST:{label:"East",symbol:"E"},WEST:{label:"West",symbol:"W"}},Wt={EMPTY_OBJECT:"Object is empty",UNKNOWN_TYPE:"Unknown GeoJSON type",MISSING_GEOMETRY:"Geometry is missing",INVALID_FEATURES_ARRAY:"Features array is invalid",INVALID_GEOMETRY:"Geometry is invalid",INVALID_GEOMETRY_TYPE:"Geometry type is invalid",INVALID_COORDINATES_LENGTH:"Coordinates length is invalid",INVALID_MULTI_LINESTRING_COORDINATES:"MultiLineString coordinates are invalid",INVALID_POLYGON_COORDINATES:"Polygon coordinates are invalid",INVALID_MULTIPOLYGON_COORDINATES:"MultiPolygon coordinates are invalid",INVALID_GEOMETRYCOLLECTION_GEOMETRIES:"GeometryCollection geometries are invalid",RING_NOT_CLOSED:"Ring is not closed",INVALID_WINDING_ORDER:"Ring winding order is invalid",SELF_INTERSECTION:"Self-intersection detected",HOLE_INTERSECTS_SHELL:"A hole intersects the exterior ring",ANTIMERIDIAN_CROSSING:"Geometry crosses the antimeridian",DUPLICATE_POSITION:"Consecutive position is duplicated",INVALID_POSITION_LENGTH:"Position length is invalid",INVALID_POSITION_COORDINATES:"Position coordinates are invalid",INVALID_LONGITUDE_RANGE:"Longitude is out of range",INVALID_LATITUDE_RANGE:"Latitude is out of range",INVALID_ALTITUDE:"Altitude is invalid",EXCESSIVE_LONGITUDE_PRECISION:"Longitude precision is excessive",EXCESSIVE_LATITUDE_PRECISION:"Latitude precision is excessive",INVALID_BBOX_LENGTH:"Bounding box length is invalid",INVALID_BBOX_LATITUDE_ORDER:"Bounding box latitude order is invalid",INVALID_BBOX_LONGITUDE_ORDER:"Bounding box longitude order is invalid",INVALID_BBOX_ALTITUDE_ORDER:"Bounding box altitude order is invalid",BBOX_ANTIMERIDIAN_CROSSING:"Bounding box crosses the antimeridian",INVALID_CRS_OBJECT:"CRS object is invalid",INVALID_CRS_NAME:"CRS name is invalid",INVALID_CRS_LINK:"CRS link is invalid",INVALID_CRS_TYPE:"CRS type is invalid",UNSUPPORTED_CRS:"CRS is not supported",UNSUPPORTED_LINK_CRS:"CRS link is not supported",UNSUPPORTED_NESTED_CRS:"Nested CRS is not supported"},st={DIRECTIONS:Ht,VALIDATION:Wt},Xt={DIRECTIONS:{NORTH:{label:s.string,symbol:s.char},SOUTH:{label:s.string,symbol:s.char},EAST:{label:s.string,symbol:s.char},WEST:{label:s.string,symbol:s.char}}},P={en:st,fr:Yt};let j="en";const qe="en";function zt(){return Object.keys(P)}function qt(e){l.all([{value:e,validator:s.string,message:"code must be a string"},{value:e,validator:t=>D.key(P,t),message:"code is unknown"}]),j=e}function at(){return j}function _e(){return j===qe?[j]:[j,qe]}function Kt(e,t){l.all([{value:e,validator:s.string,message:"code must be a string"},{value:e,validator:n=>!D.key(P,n),message:"messages already registered"},{value:t,validator:s.plainObject,message:"messages must be an object"},{value:t,validator:n=>y.schema(n,Xt),message:"messages do not conform to schema"}]),P[e]=t}function ae(e){return l.all([{value:e,validator:s.string,message:"code must be a string"},{value:e,validator:t=>D.key(P,t),message:"code is unknown"}]),P[e]}function Y(){return ae(at()).DIRECTIONS}function me(e){const t=new Set;for(const n of _e()){const{DIRECTIONS:r}=ae(n);for(const i of e)t.add(r[i].symbol)}return[...t]}function oe(e,t){const n=t.toUpperCase();return _e().some(r=>{const{label:i,symbol:a}=ae(r).DIRECTIONS[e];return n===i.toUpperCase()||n===a.toUpperCase()})}function Zt(e=null){const t=Y();return s.defined(e)?(l.that(e,Se,"axis must be a valid axis"),x(e)?[t.SOUTH,t.NORTH]:se(e)?[t.EAST,t.WEST]:[]):[t.SOUTH,t.NORTH,t.EAST,t.WEST]}function U(e=null){return s.defined(e)?(l.that(e,Se,"axis must be a valid axis"),x(e)?me(["NORTH","SOUTH"]):se(e)?me(["EAST","WEST"]):[]):me(["NORTH","SOUTH","EAST","WEST"])}function Qt(){return Y().NORTH}function Jt(){return Y().SOUTH}function en(){return Y().EAST}function tn(){return Y().WEST}function R(e){return l.that(e,s.string,"dir must be a string"),ot(e)||he(e)||ue(e)||H(e)}function ot(e){return l.that(e,s.string,"dir must be a string"),oe("NORTH",e)}function he(e){return l.that(e,s.string,"dir must be a string"),oe("SOUTH",e)}function ue(e){return l.that(e,s.string,"dir must be a string"),oe("EAST",e)}function H(e){return l.that(e,s.string,"dir must be a string"),oe("WEST",e)}function ut(e){return l.that(e,R,"dir must be a direction"),H(e)||ue(e)?O.LONGITUDE:O.LATITUDE}const nn={degrees:o.is.number,direction:o.optional(R)},rn=/^(-?\d{1,3}(?:\.\d+)?)°?$/;function sn(){return new RegExp(`^(\\d{1,3}(?:\\.\\d+)?)°?([${U()}])$`,"i")}function W(e){let t=null,n=null;if(o.is.plainObject(e)&&o.conform.schema(e,nn))o.is.defined(e.direction)?e.degrees>=0&&(t=e.degrees,n=e.direction):t=e.degrees;else if(o.is.string(e)){const r=e.replace(/\s+/g,""),i=r.match(rn)??r.match(sn());i&&(t=parseFloat(i[1]),n=i[2]??null)}return{get degrees(){return t},get direction(){return n},get format(){return"DD"},isValid(){return o.is.number(t)},toString(r){if(o.assert.that(r,o.is.positiveInteger,"decimalPlaces must be a positive integer"),!this.isValid())return"";let i=`${t.toFixed(r)}°`;return n&&(i+=` ${n}`),i},toDecimal(){return this.isValid()?W({degrees:t,direction:n}):null}}}const an={degrees:o.is.integer,minutes:e=>o.is.inRangeExclusiveMax(e,0,60),direction:o.optional(R)},on=/^(-?\d{1,3})°(\d{1,2}(?:\.\d+)?)'?$/;function un(){return new RegExp(`^(\\d{1,3})°(\\d{1,2}(?:\\.\\d+)?)'?([${U().join("")}])$`,"i")}function lt(e){let t=null,n=null,r=null;if(o.is.plainObject(e)&&o.conform.schema(e,an))o.is.defined(e.direction)?e.degrees>=0&&(t=e.degrees,n=e.minutes,r=e.direction):(t=e.degrees,n=e.minutes);else if(o.is.string(e)){const i=e.replace(/\s+/g,""),a=i.match(on)??i.match(un());a&&(t=parseFloat(a[1]),n=parseFloat(a[2]),r=a[3]??null)}return{get degrees(){return t},get minutes(){return n},get direction(){return r},get format(){return"DDM"},isValid(){return o.is.integer(t)&&o.is.inRangeExclusiveMax(n,0,60)},toString(i){if(o.assert.that(i,o.is.positiveInteger,"decimalPlaces must be a positive integer"),!this.isValid())return"";let a=`${t}° ${n.toFixed(i)}'`;return r&&(a+=` ${r}`),a},toDecimal(){return this.isValid()?W({degrees:t+n/60,direction:r}):null}}}const ln={degrees:o.is.nonNegativeInteger,minutes:e=>o.is.inRangeExclusiveMax(e,0,60),direction:R};function cn(){return new RegExp(`^(\\d{2})(\\d{3})([${U(O.LATITUDE).join("")}])$`,"i")}function dn(){return new RegExp(`^(\\d{3})(\\d{3})([${U(O.LONGITUDE).join("")}])$`,"i")}function ct(e){let t=null,n=null,r=null;if(o.is.plainObject(e)&&o.conform.schema(e,ln))t=e.degrees,n=e.minutes,r=e.direction;else if(o.is.string(e)){const i=e.trim(),a=i.match(cn())??i.match(dn());a&&(t=parseFloat(a[1]),n=parseFloat(a[2])/10,r=a[3])}return{get degrees(){return t},get minutes(){return n},get direction(){return r},get format(){return"DDM_AERO"},isValid(){return o.is.nonNegativeInteger(t)&&o.is.inRangeExclusiveMax(n,0,60)&&R(r)},toString(){if(!this.isValid())return"";const i=ue(r)||H(r),a=String(t).padStart(i?3:2,"0"),u=Math.floor(n*10).toString().padStart(3,"0");return`${a}${u}${r}`},toDecimal(){return this.isValid()?W({degrees:t+n/60,direction:r}):null}}}const fn={degrees:o.is.integer,minutes:e=>o.is.integer(e)&&o.is.inRange(e,0,59),seconds:e=>o.is.inRangeExclusiveMax(e,0,60),direction:o.optional(R)},mn=/^(-?\d{1,3})°(\d{1,2})'(\d{1,2}(?:\.\d+)?)"?$/;function gn(){return new RegExp(`^(\\d{1,3})°(\\d{1,2})'(\\d{1,2}(?:\\.\\d+)?)"?([${U().join("")}])$`,"i")}function dt(e){let t=null,n=null,r=null,i=null;if(o.is.plainObject(e)&&o.conform.schema(e,fn))o.is.defined(e.direction)?e.degrees>=0&&(t=e.degrees,n=e.minutes,r=e.seconds,i=e.direction):(t=e.degrees,n=e.minutes,r=e.seconds);else if(o.is.string(e)){const a=e.replace(/\s+/g,""),u=a.match(mn)??a.match(gn());u&&(t=parseFloat(u[1]),n=parseFloat(u[2]),r=parseFloat(u[3]),i=u[4]??null)}return{get degrees(){return t},get minutes(){return n},get seconds(){return r},get direction(){return i},get format(){return"DMS"},isValid(){return o.is.integer(t)&&o.is.integer(n)&&o.is.inRange(n,0,59)&&o.is.inRangeExclusiveMax(r,0,60)},toString(a){if(o.assert.that(a,o.is.positiveInteger,"decimalPlaces must be a positive integer"),!this.isValid())return"";let u=`${t}° ${n}' ${r.toFixed(a)}"`;return i&&(u+=` ${i}`),u},toDecimal(){return this.isValid()?W({degrees:t+n/60+r/3600,direction:i}):null}}}function Ke(e){const t=Math.floor(e.degrees),n=(e.degrees-t)*60;return{degrees:t,minutes:n,direction:e.direction}}function In(e){const t=Math.floor(e.degrees),n=(e.degrees-t)*60,r=Math.floor(n),i=(n-r)*60;return{degrees:t,minutes:r,seconds:i,direction:e.direction}}const Ze={DD:e=>(o.assert.that(e,t=>t.isValid(),"dd must be a valid coordinate"),e),DDM:e=>{o.assert.that(e,i=>i.isValid(),"dd must be a valid coordinate");const{degrees:t,minutes:n,direction:r}=Ke(e);return lt(r?{degrees:t,minutes:n,direction:r}:{degrees:t,minutes:n})},DMS:e=>{o.assert.that(e,a=>a.isValid(),"dd must be a valid coordinate");const{degrees:t,minutes:n,seconds:r,direction:i}=In(e);return dt(i?{degrees:t,minutes:n,seconds:r,direction:i}:{degrees:t,minutes:n,seconds:r})},DDM_AERO:e=>{o.assert.that(e,i=>i.isValid(),"dd must be a valid coordinate");const{degrees:t,minutes:n,direction:r}=Ke(e);return ct({degrees:t,minutes:n,direction:r})}},J={DD:"DD",DDM:"DDM",DDM_AERO:"DDM_AERO",DMS:"DMS"},ft={DD:W,DDM:lt,DDM_AERO:ct,DMS:dt},p=7,_=8,mt=Array.from({length:_+1},(e,t)=>10**t);function Oe(e,t){if(l.that(e,s.number,"coord must be a number"),s.defined(t))return l.that(t,R,"dir must be a direction"),ut(t);if(Math.abs(e)>90)return O.LONGITUDE}function Ne(e){l.that(e,s.number,"coord must be a number");const t=e.toExponential(),[n,r]=t.split("e").map(Number),i=(n.toString().split(".")[1]||"").length;return Math.max(0,i-r)}function Re(e,t=p){l.all([{value:e,validator:s.number,message:"coord must be a number"},{value:t,validator:r=>s.inRange(r,0,_),message:`precision must be in range [0, ${_}]`}]);const n=mt[t];return Math.round(e*n)/n}function En(e,t){if(l.all([{value:e,validator:s.number,message:"coord must be a number"},{value:t,validator:r=>se(r)||x(r),message:"axis must be either a longitude or latitude"}]),x(t))return Math.max(-90,Math.min(90,e));let n=((e+180)%360+360)%360-180;return n===-180&&(n=180),Object.is(n,-0)&&(n=0),n}function On(e,t){l.all([{value:e,validator:r=>s.defined(r)&&r.isValid(),message:"from must be a valid coordinate"},{value:t,validator:r=>D.key(Ze,r),message:`unknown format: ${t}`}]);const n=e.format===J.DD?e:e.toDecimal();return n.isValid()?t===J.DD?n:Ze[t](n):null}function gt(e){l.that(e,s.nonEmptyString,"pattern must be a non empty string");for(const t of Object.keys(J)){const n=ft[t](e);if(n.isValid())return n}return null}typeof process<"u"&&process.versions?.node!=null,typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope,typeof ServiceWorkerGlobalScope<"u"&&self instanceof ServiceWorkerGlobalScope,typeof process<"u"&&process.env.NODE_ENV,typeof process<"u"&&process.env.NODE_ENV,typeof process<"u"&&process.env.NODE_ENV;const S={clamp(e,t,n){return l.all([{value:e,validator:s.number,message:"value must be a number"},{value:t,validator:s.number,message:"min must be a number"},{value:n,validator:s.number,message:"max must be a number"}]),Math.min(Math.max(e,t),n)},round(e,t=2){l.all([{value:e,validator:s.number,message:"value must be a number"},{value:t,validator:s.nonNegativeInteger,message:"precision must be a non-negative integer"}]);const n=10**t;return Math.round(e*n)/n},sign(e,t=0){return l.all([{value:e,validator:s.number,message:"value must be a number"},{value:t,validator:s.nonNegative,message:"epsilon must be a non-negative number"}]),e>t?1:e<-t?-1:0},percentage(e,t){return l.all([{value:e,validator:s.number,message:"value must be a number"},{value:t,validator:s.number,message:"total must be a number"}]),S.round(e/t*100,2)},exponential(e,t=2){if(l.all([{value:e,validator:s.number,message:"value must be a number"},{value:t,validator:s.nonNegativeInteger,message:"decimals must be a non-negative integer"}]),e===0)return`0.${"0".repeat(t)}e+0`;const n=Math.floor(Math.log10(Math.abs(e)));return`${(e/Math.pow(10,n)).toFixed(t)}e${n>=0?"+":""}${n}`},linear(e,t=0,n=1){return l.all([{value:e,validator:r=>s.inRange(r,0,1),message:"t must be in range [0, 1]"},{value:t,validator:s.number,message:"initial must be a number"},{value:n,validator:s.number,message:"final must be a number"}]),t+e*(n-t)},to:{radians(e){return l.that(e,s.number,"degrees must be a number"),e*Math.PI/180},degrees(e){return l.that(e,s.number,"radians must be a number"),e*180/Math.PI}},pow:{square(e){return l.that(e,s.number,"value must be a number"),e*e},cube(e){return l.that(e,s.number,"value must be a number"),S.pow.square(e)*e}},ease:{in(e,t=.5){return l.all([{value:e,validator:n=>s.inRange(n,0,1),message:"t must be in range [0, 1]"},{value:t,validator:s.number,message:"linearity must be a number"}]),Math.pow(e,1/t)},out(e,t=.5){return l.all([{value:e,validator:n=>s.inRange(n,0,1),message:"t must be in range [0, 1]"},{value:t,validator:s.number,message:"linearity must be a number"}]),1-Math.pow(1-e,1/t)},cubicBezier(e,t=.42,n=0,r=.58,i=1){l.that(e,g=>s.inRange(g,0,1),"t must be in range [0, 1]");const a=1-e,u=e*e,c=a*a;return c*a*n+3*c*e*t+3*a*u*r+u*e*i}},stats:{sum(e){return l.that(e,s.array,"values must be an array"),e.reduce((t,n)=>t+n,0)},average(e){return l.that(e,s.nonEmptyArray,"values must be a non-empty array"),S.stats.sum(e)/e.length},median(e){l.that(e,s.nonEmptyArray,"values must be a non-empty array");const t=[...e].sort((r,i)=>r-i),n=Math.floor(t.length/2);return t.length%2===0?S.linear(.5,t[n-1],t[n]):t[n]}}};L(s.boolean),L(s.boolean),L(s.boolean),L(s.string);L(s.boolean),L(s.boolean),L(s.boolean),L(s.string);L(s.array);const ee=S.to.radians(1),Nn=1e-12;function G(e){const t=e[0]*ee,n=e[1]*ee,r=Math.cos(n);return[r*Math.cos(t),r*Math.sin(t),Math.sin(n)]}function pn(e){const t=Math.atan2(e[1],e[0]),n=Math.asin(e[2]);return[t/ee,n/ee]}function w(e,t){return e[0]*t[0]+e[1]*t[1]+e[2]*t[2]}function B(e,t){return[e[1]*t[2]-e[2]*t[1],e[2]*t[0]-e[0]*t[2],e[0]*t[1]-e[1]*t[0]]}function It(e,t){return[e[0]+t[0],e[1]+t[1],e[2]+t[2]]}function te(e,t){return[e[0]*t,e[1]*t,e[2]*t]}function ne(e){return Math.sqrt(e[0]*e[0]+e[1]*e[1]+e[2]*e[2])}function Ln(e){const t=ne(e);return[e[0]/t,e[1]/t,e[2]/t]}function Tn(e,t){return Math.atan2(ne(B(e,t)),w(e,t))}function vn(e){return B(e,Et(e))}function Et(e){return Ln(B([0,0,1],e))}function Sn(e,t){const n=vn(e),r=Et(e);return It(te(n,Math.cos(t)),te(r,Math.sin(t)))}function _n(e,t,n){const r=Sn(e,t);return It(te(e,Math.cos(n)),te(r,Math.sin(n)))}function Ot(e,t,n,r,i=Nn){const a=B(e,t),u=B(n,r),c=ne(a),g=ne(u);if(c<=i||g<=i)return!1;const E=S.sign(w(a,n)/c,i),m=S.sign(w(a,r)/c,i);if(E*m!==-1)return!1;const I=S.sign(w(u,e)/g,i),b=S.sign(w(u,t)/g,i);return I*b===-1}const Ae="WGS84",C="+proj=longlat +datum=WGS84 +no_defs",hn={WGS84:C,"CRS:84":C,CRS84:C,"urn:ogc:def:crs:OGC:1.3:CRS84":C,"urn:ogc:def:crs:OGC:2:84":C,"urn:ogc:def:crs:EPSG::4326":C,"EPSG:2154":"+proj=lcc +lat_1=49 +lat_2=44 +lat_0=46.5 +lon_0=3 +x_0=700000 +y_0=6600000 +ellps=GRS80 +units=m +no_defs"};for(const[e,t]of Object.entries(hn))h.defs(e)||h.defs(e,t);const Rn=/^urn:ogc:def:crs:EPSG::(\d+)$/i;function be(e){l.that(e,s.nonEmptyString,"name must be a non empty string");const t=e.match(Rn);return t?`EPSG:${t[1]}`:e}function An(){return Object.keys(h.defs)}function bn(e,t){l.all([{value:e,validator:s.nonEmptyString,message:"name must be a non empty string"},{value:t,validator:n=>s.nonEmptyString(n)||s.nonEmptyObject(n),message:"definition must be a non empty string or a non empty object"}]),h.defs(e,t)}function M(e){return l.that(e,s.nonEmptyString,"name must be a non empty string"),s.defined(h.defs(e))}function Dn(e){return l.that(e,s.nonEmptyString,"name must be a non empty string"),h.defs(e)}function De(e){l.that(e,s.nonEmptyString,"name must be a non empty string");const t=h.defs(e);if(!t)return!1;const n=h.defs("EPSG:4326");return t.projName===n.projName&&t.datumCode===n.datumCode}const X={precision:L(s.number),consider3D:L(s.boolean)},ye=63710088e-1;function yn(e){l.that(e,E=>s.nonEmptyString(E),"pattern must be a non-empty string");const t=e.split(/[,;|]/);if(t.length!==2)return null;const[n,r]=t.map(gt);if(!n||!r)return null;const i=n.toDecimal(),a=r.toDecimal(),u=Oe(i.degrees,i.direction),c=Oe(a.degrees,a.direction),g=E=>{const{degrees:m,direction:I}=E;return I&&(H(I)||he(I))?-m:m};return u===O.LONGITUDE&&c===O.LATITUDE?[g(i),g(a)]:c===O.LONGITUDE&&u===O.LATITUDE?[g(a),g(i)]:u===O.LONGITUDE&&!c?[g(i),g(a)]:u===O.LATITUDE&&!c?[g(a),g(i)]:c===O.LONGITUDE&&!u?[g(a),g(i)]:c===O.LATITUDE&&!u?[g(i),g(a)]:!u&&!c?[[g(i),g(a)],[g(a),g(i)]]:null}function T(e){return s.arrayOfLengthBetween(e,2,3)?e.every(s.number):!1}function Nt(e){return l.that(e,T,"position must be a valid position"),s.arrayOfLength(e,3)}function le(e,t,n={}){l.all([{value:e,validator:T,message:"position1 must be a valid position"},{value:t,validator:T,message:"position2 must be a valid position"},{value:n,validator:u=>y.schema(u,X),message:"options must be a valid options object"}]);const{precision:r=p,consider3D:i=!1}=n,a=i?Math.max(e.length,t.length):2;return Array.from({length:a},(u,c)=>(e[c]??0).toFixed(r)===(t[c]??0).toFixed(r)).every(Boolean)}function Ce(e,t=p){l.all([{value:e,validator:T,message:"position must be a position"},{value:t,validator:n=>s.inRange(n,0,_),message:`precision must be in range [0, ${_}]`}]);for(let n=0;n<e.length;n++)e[n]=Re(e[n],t);return e}function Pe(e,t,n){return l.all([{value:e,validator:T,message:"position must be a valid position"},{value:t,validator:M,message:`unknown source projection: ${t}`},{value:n,validator:M,message:`unknown target projection: ${n}`}]),h(t,n,e)}function Cn(e,t,n){l.all([{value:e,validator:T,message:"position must be a valid position"},{value:t,validator:s.number,message:"bearing must be a number"},{value:n,validator:s.number,message:"distance must be a number"}]);const r=_n(G(e),S.to.radians(t),n/ye);return pn(r)}function pt(e,t){return l.all([{value:e,validator:T,message:"position1 must be a valid position"},{value:t,validator:T,message:"position2 must be a valid position"}]),Tn(G(e),G(t))*ye}function k(e){if(!s.arrayOfLength(e,4)&&!s.arrayOfLength(e,6))return!1;const t=e.length===4,n=t?[e[0],e[1]]:[e[0],e[1],e[2]],r=t?[e[2],e[3]]:[e[3],e[4],e[5]];if(!T(n)||!T(r))return!1;const[,i]=n,[,a]=r;return!(i>a||!t&&e[2]>e[5])}function pe(e){return l.that(e,k,"bbox must be a valid bounding-box"),s.arrayOfLength(e,6)}function Pn(e,t){return l.all([{value:e,validator:k,message:"bbox1 must be a valid bounding-box"},{value:t,validator:k,message:"bbox2 must be a valid bounding-box"}]),pe(e)&&pe(t)?[Math.min(e[0],t[0]),Math.min(e[1],t[1]),Math.min(e[2],t[2]),Math.max(e[3],t[3]),Math.max(e[4],t[4]),Math.max(e[5],t[5])]:[Math.min(e[0],t[0]),Math.min(e[1],t[1]),Math.max(e[2],t[2]),Math.max(e[3],t[3])]}const Gn={ignore3D:L(s.boolean)};function K(e,t={}){l.all([{value:e,validator:s.nonEmptyArray,message:"positions must be a non-empty array"},{value:e,validator:i=>i.every(T),message:"positions must be an array of valid positions"},{value:t,validator:i=>y.schema(i,Gn),message:"options must be a valid options object"}]);const{ignore3D:n=!1}=t;return!n&&e.some(Nt)?e.reduce((i,a)=>[Math.min(i[0],a[0]),Math.min(i[1],a[1]),Math.min(i[2],a[2]??0),Math.max(i[3],a[0]),Math.max(i[4],a[1]),Math.max(i[5],a[2]??0)],[1/0,1/0,1/0,-1/0,-1/0,-1/0]):e.reduce((i,a)=>[Math.min(i[0],a[0]),Math.min(i[1],a[1]),Math.max(i[2],a[0]),Math.max(i[3],a[1])],[1/0,1/0,-1/0,-1/0])}function Ge(e,t=p){l.all([{value:e,validator:k,message:"bbox must be a valid bounding box"},{value:t,validator:n=>s.inRange(n,0,_),message:`precision must be in range [0, ${_}]`}]);for(let n=0;n<e.length;n++)e[n]=Re(e[n],t);return e}const Lt={...X,deduplicate:L(s.boolean)};function ce(e){return s.array(e)&&e.every(T)}function Me(e,t={}){l.that(t,a=>y.schema(a,X),"options must be a valid options object");const{precision:n=p,consider3D:r=!1}=t,i=[];for(const a of e){const u=i[i.length-1];(!u||!le(a,u,{precision:n,consider3D:r}))&&i.push(a)}return i}function re(e,t={}){l.all([{value:e,validator:s.array,message:"positions must be an array"},{value:t,validator:u=>y.schema(u,Lt),message:"options must be a valid options object"}]);const{precision:n=p,deduplicate:r=!1,consider3D:i=!1}=t,a=e.map(u=>Ce(u,n));return r?Me(a,{precision:n,consider3D:i}):a}function Z(e,t,n){return l.that(e,s.array,"positions must be an array"),e.map(r=>Pe(r,t,n))}function Mn(e){return s.arrayOfLengthAtLeast(e,2)&&ce(e)}function Un(e){l.that(e,ce,"line must be a valid array of positions");let t=0;for(let n=0;n<e.length-1;n++)t+=pt(e[n],e[n+1]);return t}function F(e,t={}){return!s.arrayOfLengthAtLeast(e,4)||!ce(e)?!1:de(e,t)}function de(e,t={}){if(l.that(t,i=>y.schema(i,X),"options must be a valid options object"),!s.arrayOfLengthAtLeast(e,1))return!1;const n=e[0],r=e[e.length-1];return le(n,r,t)}function Tt(e,t={}){return!s.nonEmptyArray(e)||de(e,t)?e:[...e,[...e[0]]]}function Le(e,t={}){const n=re(e,{deduplicate:!0,...t});return Tt(n,t)}function vt(e){l.that(e,F,"ring must be a valid closed ring of at least 4 positions");let t=0;for(let n=0;n<e.length-1;n++){const[r,i]=e[n],[a,u]=e[n+1];t+=S.to.radians(a-r)*(2+Math.sin(S.to.radians(i))+Math.sin(S.to.radians(u)))}return-t/2}function Ue(e){return vt(e)<0}function Ve(e,t){l.all([{value:e,validator:F,message:"ring1 must be a valid closed ring"},{value:t,validator:F,message:"ring2 must be a valid closed ring"}]);const n=e.map(G),r=t.map(G);for(let i=0;i<n.length-1;i++)for(let a=0;a<r.length-1;a++)if(Ot(n[i],n[i+1],r[a],r[a+1]))return!0;return!1}function we(e){l.that(e,F,"ring must be a valid closed ring");const t=e.map(G),n=[],r=t.length-1;for(let i=0;i<r;i++)for(let a=i+1;a<r;a++)a!==i+1&&(i===0&&a===r-1||Ot(t[i],t[i+1],t[a],t[a+1])&&n.push([i,a]));return n}const $={NAME:"name",LINK:"link"},f={POINT:"Point",MULTI_POINT:"MultiPoint",LINESTRING:"LineString",MULTI_LINESTRING:"MultiLineString",POLYGON:"Polygon",MULTI_POLYGON:"MultiPolygon",GEOMETRY_COLLECTION:"GeometryCollection"},N={FEATURE:"Feature",FEATURE_COLLECTION:"FeatureCollection"};function Vn(e){return s.plainObject(e)?e.type===$.NAME?s.nonEmptyString(e.properties?.name):e.type===$.LINK?s.nonEmptyString(e.properties?.href):!1:!1}function wn(e){return T(e)}function jn(e){return!s.arrayOfLength(e,4)&&!s.arrayOfLength(e,6)?!1:e.every(s.number)}function St(e){return!s.plainObject(e)||!s.oneOf(e.type,Object.values(f))?!1:e.type===f.GEOMETRY_COLLECTION?s.array(e.geometries):s.array(e.coordinates)}function _t(e){return s.plainObject(e)&&e.type===N.FEATURE}function ht(e){return s.plainObject(e)&&e.type===N.FEATURE_COLLECTION&&s.array(e.features)}function Rt(e){return _t(e)||ht(e)}function A(e){return Rt(e)||St(e)}const xn={ignore3D:L(s.boolean)};function Bn(e,t={}){if(l.all([{value:e,validator:A,message:"geoJson must be a GeoJson object"},{value:t,validator:n=>y.schema(n,xn),message:"options must be a valid options object"}]),e.type===N.FEATURE)return e.geometry?K(q.coordAll(e.geometry),t):null;if(e.type===N.FEATURE_COLLECTION){const n=q.coordAll(e);return n.length?K(n,t):null}return K(q.coordAll(e),t)}function kn(e){if(e.length===0)return null;if(e.length===1)return{type:"Point",coordinates:e[0]};if(e.length===2)return{type:"LineString",coordinates:[e[0],e[1]]};const t=jt.convex(Xe.featureCollection(e.map(n=>Xe.feature({type:"Point",coordinates:n}))));return t?t.geometry:{type:"LineString",coordinates:[e[0],e[e.length-1]]}}function At(e){if(l.that(e,A,"geoJson must be a GeoJson object"),e.type===N.FEATURE)return e.geometry?At(e.geometry):null;const t=q.coordAll(e).map(n=>[n[0],n[1]]);return kn(t)}function je(e,t){return o.assert.that(e,A,"geoJson must be a GeoJson object"),o.object.lookup(e,t)}function Fn(e){return je(e,"bbox")}function bt(e){const t=je(e,"crs");if(!o.is.defined(t))return Ae;const n=t.properties?.name;return o.is.nonEmptyString(n)?be(n):n}const d=Object.freeze(Object.fromEntries(Object.keys(st.VALIDATION).map(e=>[e,e]))),$n=[f.POLYGON,f.MULTI_POLYGON],Yn=[f.LINESTRING,f.MULTI_LINESTRING,f.POLYGON,f.MULTI_POLYGON],Te=[d.INVALID_WINDING_ORDER,d.SELF_INTERSECTION,d.HOLE_INTERSECTS_SHELL,d.DUPLICATE_POSITION],Hn={validation:o.is.nonEmptyObject,windingOrder:o.optional(o.is.boolean),selfIntersection:o.optional(o.is.boolean),holeIntersectsShell:o.optional(o.is.boolean),duplicatePosition:o.optional(o.is.boolean),precision:o.optional(o.is.number)};function Qe(e,t){return Ue(e)!==t?(e.reverse(),!0):!1}function Je(e){let t=!1;Qe(e[0],!1)&&(t=!0);for(let n=1;n<e.length;n++)Qe(e[n],!0)&&(t=!0);return t}function Wn(e){if(e.type===f.POLYGON)return Je(e.coordinates);let t=!1;for(const n of e.coordinates)Je(n)&&(t=!0);return t}function Xn(e){return e.type===f.POLYGON?e.coordinates:e.coordinates.flat(1)}function zn(e){return e.type===f.POLYGON?[e.coordinates]:e.coordinates}function et(e){return Xn(e).some(t=>we(t).length>0)}function tt(e){return zn(e).some(t=>{const n=t[0];for(let r=1;r<t.length;r++)if(Ve(n,t[r]))return!0;return!1})}function qn(e){const n=xt({type:"Feature",properties:{},geometry:e},0);return n?{type:n.geometry.type,coordinates:n.geometry.coordinates}:null}function Kn(e,t){let n=!1;const r=i=>{const a=i.length,u=Me(i,{precision:t});return u.length!==a&&(n=!0),u};switch(e.type){case f.LINESTRING:e.coordinates=r(e.coordinates);break;case f.MULTI_LINESTRING:e.coordinates=e.coordinates.map(r);break;case f.POLYGON:e.coordinates=e.coordinates.map(r);break;case f.MULTI_POLYGON:e.coordinates=e.coordinates.map(i=>i.map(r));break}return n}function Zn(e,t){const n=t.selfIntersection,r=t.holeIntersectsShell;if(!n&&!r)return[];const i=n&&et(e),a=r&&tt(e),u=[];if(n&&!i&&u.push(d.SELF_INTERSECTION),r&&!a&&u.push(d.HOLE_INTERSECTS_SHELL),!i&&!a)return u;const c=qn(e);return!c||i&&et(c)||a&&tt(c)||(e.type=c.type,e.coordinates=c.coordinates,i&&u.push(d.SELF_INTERSECTION),a&&u.push(d.HOLE_INTERSECTS_SHELL)),u}function Qn(e,t){const n=[],r=t.precision??p;if(t.duplicatePosition&&Yn.includes(e.type)&&Kn(e,r)&&n.push({code:d.DUPLICATE_POSITION}),!$n.includes(e.type))return{fixed:e,corrections:n};t.windingOrder&&Wn(e)&&n.push({code:d.INVALID_WINDING_ORDER});for(const i of Zn(e,t))n.push({code:i});return{fixed:e,corrections:n}}function ge(e,t){return e.filter(n=>n.path===t||n.path?.startsWith(`${t}/`))}function Ie(e,t,n,r){const i={windingOrder:r.windingOrder!==!1&&t.some(E=>E.code===d.INVALID_WINDING_ORDER),selfIntersection:r.selfIntersection!==!1&&t.some(E=>E.code===d.SELF_INTERSECTION),holeIntersectsShell:r.holeIntersectsShell!==!1&&t.some(E=>E.code===d.HOLE_INTERSECTS_SHELL),duplicatePosition:r.duplicatePosition!==!1&&t.some(E=>E.code===d.DUPLICATE_POSITION),precision:r.precision},a=i.windingOrder||i.selfIntersection||i.holeIntersectsShell||i.duplicatePosition?Qn(e,i):{corrections:[]},u=new Set(a.corrections.map(E=>E.code)),c=a.corrections.map(E=>({...E,path:n})),g=t.filter(E=>!u.has(E.code));return{corrections:c,unfixed:g}}function Jn(e,t){o.assert.all([{value:e,validator:A,message:"geoJson must be a GeoJson object"},{value:t,validator:c=>o.conform.schema(c,Hn),message:"options must be a valid options object, with a mandatory validation result"}]);const n=[...t.validation.errors,...t.validation.warnings],r=n.filter(c=>Te.includes(c.code)),i=n.filter(c=>!Te.includes(c.code));if(r.length===0)return{fixed:e,corrections:[],unfixed:i};if(e.type===N.FEATURE_COLLECTION){const c=[];return e.features.forEach((g,E)=>{const m=`/features/${E}/geometry`,I=ge(r,m);if(I.length===0)return;const b=Ie(g.geometry,I,m,t);c.push(...b.corrections),i.push(...b.unfixed)}),{fixed:e,corrections:c,unfixed:i}}if(e.type===N.FEATURE){const c=ge(r,"/geometry"),g=Ie(e.geometry,c,"/geometry",t);return{fixed:e,corrections:g.corrections,unfixed:[...i,...g.unfixed]}}const a=ge(r,""),u=Ie(e,a,"",t);return{fixed:e,corrections:u.corrections,unfixed:[...i,...u.unfixed]}}function er(e){return o.assert.all([{value:e,validator:o.is.nonEmptyObject,message:"validation must be a non-empty object"},{value:e?.errors,validator:o.is.array,message:"validation.errors must be an array"}]),e.errors.length===0?!1:e.errors.every(t=>Te.includes(t.code))}function tr(e){const t=e.match(/^EPSG:(\d+)$/i);return t?`urn:ogc:def:crs:EPSG::${t[1]}`:e}function xe(e,t,n){switch(e.type){case f.POINT:e.coordinates=Pe(e.coordinates,t,n);break;case f.MULTI_POINT:case f.LINESTRING:e.coordinates=Z(e.coordinates,t,n);break;case f.MULTI_LINESTRING:case f.POLYGON:e.coordinates=e.coordinates.map(r=>Z(r,t,n));break;case f.MULTI_POLYGON:e.coordinates=e.coordinates.map(r=>r.map(i=>Z(i,t,n)));break;case f.GEOMETRY_COLLECTION:for(const r of e.geometries)xe(r,t,n);break}return delete e.bbox,delete e.crs,e}function Dt(e,t,n){if(e.type===N.FEATURE)e.geometry&&xe(e.geometry,t,n);else for(const r of e.features)Dt(r,t,n);return delete e.bbox,delete e.crs,e}function nr(e,t){l.that(e,A,"geoJson must be a GeoJson object");const n=bt(e);return l.all([{value:n,validator:M,message:`unknown source projection: ${n}`},{value:t,validator:M,message:`unknown target projection: ${t}`}]),s.oneOf(e.type,Object.values(f))?xe(e,n,t):Dt(e,n,t),De(t)?delete e.crs:e.crs={type:"name",properties:{name:tr(t)}},e}const rr={tolerance:o.optional(o.is.number),getWeight:o.optional(o.is.function)};function ir(e,t,n){return Math.abs((e[0]*(t[1]-n[1])+t[0]*(n[1]-e[1])+n[0]*(e[1]-t[1]))/2)}function Ee(e,{tolerance:t=0,getWeight:n=()=>1}={}){if(e.length<=2)return e;const r=e.map((m,I)=>({coord:m,i:I,area:1/0,removed:!1,prev:null,next:null}));for(let m=0;m<r.length;m++)m>0&&(r[m].prev=r[m-1]),m<r.length-1&&(r[m].next=r[m+1]);const i=m=>!m.prev||!m.next?1/0:ir(m.prev.coord,m.coord,m.next.coord)*n(m.coord,m.i),a=new Bt.Heap((m,I)=>m.area-I.area),u=m=>{m.area=i(m),a.push({node:m,area:m.area})};for(let m=1;m<r.length-1;m++)u(r[m]);let c=0;for(;a.size()>0;){const m=a.pop(),I=m.node;if(!I.removed&&m.area===I.area){if(I.area<c?I.area=c:c=I.area,I.area>=t)break;I.removed=!0,I.prev&&(I.prev.next=I.next),I.next&&(I.next.prev=I.prev),I.prev?.prev&&u(I.prev),I.next?.next&&u(I.next)}}const g=[];let E=r[0];for(;E;)E.removed||g.push(E.coord),E=E.next;return g}function Q(e,t={}){if(o.assert.all([{value:e,validator:A,message:"geoJson must be a GeoJson object"},{value:t,validator:n=>o.conform.schema(n,rr),message:"options must be a valid options object"}]),e.type===N.FEATURE)return e.geometry&&Q(e.geometry,t),e;if(e.type===N.FEATURE_COLLECTION){for(const n of e.features)Q(n,t);return e}switch(e.type){case f.LINESTRING:e.coordinates=Ee(e.coordinates,t);break;case f.POLYGON:case f.MULTI_LINESTRING:e.coordinates=e.coordinates.map(n=>Ee(n,t));break;case f.MULTI_POLYGON:e.coordinates=e.coordinates.map(n=>n.map(r=>Ee(r,t)));break;case f.GEOMETRY_COLLECTION:e.geometries.forEach(n=>Q(n,t));break}return e}function Be(e,t,n){switch(e.type){case f.POINT:Ce(e.coordinates,t);break;case f.MULTI_POINT:case f.LINESTRING:re(e.coordinates,{precision:t});break;case f.MULTI_LINESTRING:for(const r of e.coordinates)re(r,{precision:t});break;case f.POLYGON:e.coordinates=e.coordinates.map(r=>Le(r,{precision:t,consider3D:n}));break;case f.MULTI_POLYGON:e.coordinates=e.coordinates.map(r=>r.map(i=>Le(i,{precision:t,consider3D:n})));break;case f.GEOMETRY_COLLECTION:for(const r of e.geometries)Be(r,t,n);break}return e.bbox&&Ge(e.bbox,t),e}function yt(e,t,n){if(e.type===N.FEATURE)e.geometry&&Be(e.geometry,t,n);else for(const r of e.features)yt(r,t,n);return e.bbox&&Ge(e.bbox,t),e}function sr(e,t={}){const{precision:n=p,consider3D:r=!1}=t;return l.all([{value:e,validator:A,message:"geoJson must be a valid GeoJson"},{value:n,validator:i=>s.inRange(i,0,_),message:`precision must be in range [0, ${_}]`}]),s.oneOf(e.type,Object.values(f))?Be(e,n,r):yt(e,n,r)}const nt="/crs";function Ct(e,t="",n={}){if(!o.is.defined(e))return t===nt?(n.geodesic=!0,{crs:Ae,valid:!0}):{valid:!0};if(t!==nt)return{valid:!1,errors:[{code:d.UNSUPPORTED_NESTED_CRS,path:t}],warnings:[]};if(!o.is.plainObject(e))return{valid:!1,errors:[{code:d.INVALID_CRS_OBJECT,path:t}],warnings:[]};switch(e.type){case $.NAME:{if(!o.is.nonEmptyString(e.properties?.name))return{valid:!1,errors:[{code:d.INVALID_CRS_NAME,path:t}],warnings:[]};const r=be(e.properties.name);return M(r)?(n.geodesic=De(r),{crs:r,valid:!0,errors:[],warnings:[]}):{valid:!1,errors:[{code:d.UNSUPPORTED_CRS,path:t,params:{name:e.properties.name}}],warnings:[]}}case $.LINK:return o.is.nonEmptyString(e.properties?.href)?{valid:!1,errors:[{code:d.UNSUPPORTED_LINK_CRS,path:t}],warnings:[]}:{valid:!1,errors:[{code:d.INVALID_CRS_LINK,path:t}],warnings:[]};default:return{valid:!1,errors:[{code:d.INVALID_CRS_TYPE,path:t,params:{type:e.type}}],warnings:[]}}}function ie(e,t="",n={}){const r=n.geodesic;if(!o.is.arrayOfLengthBetween(e,2,3))return{valid:!1,errors:[{code:d.INVALID_POSITION_LENGTH,path:t}],warnings:[]};if(!o.is.number(e[0])||!o.is.number(e[1]))return{valid:!1,errors:[{code:d.INVALID_POSITION_COORDINATES,path:t}],warnings:[]};if(r){if(!o.is.inRange(e[0],-180,180))return{valid:!1,errors:[{code:d.INVALID_LONGITUDE_RANGE,path:t,params:{value:e[0]}}],warnings:[]};if(!o.is.inRange(e[1],-90,90))return{valid:!1,errors:[{code:d.INVALID_LATITUDE_RANGE,path:t,params:{value:e[1]}}],warnings:[]}}if(e.length===3&&!o.is.number(e[2]))return{valid:!1,errors:[{code:d.INVALID_ALTITUDE,path:t}],warnings:[]};const i={valid:!0,errors:[],warnings:[]};if(r){const a=n.precision??p,u=Ne(e[0]);u>a&&i.warnings.push({code:d.EXCESSIVE_LONGITUDE_PRECISION,path:t,params:{precision:u,max:a}});const c=Ne(e[1]);c>a&&i.warnings.push({code:d.EXCESSIVE_LATITUDE_PRECISION,path:t,params:{precision:c,max:a}})}return i}function Pt(e,t="",n={}){const r=n?.geodesic;if(!o.is.defined(e))return{valid:!0};if(!o.is.arrayOfLength(e,4)&&!o.is.arrayOfLength(e,6))return{valid:!1,errors:[{code:d.INVALID_BBOX_LENGTH,path:t}],warnings:[]};const i=e.length===4,a=i?[e[0],e[1]]:[e[0],e[1],e[2]],u=i?[e[2],e[3]]:[e[3],e[4],e[5]],c=ie(a,`${t}/min`,n);if(!c.valid)return{valid:!1,errors:c.errors,warnings:[]};const g=ie(u,`${t}/max`,n);if(!g.valid)return{valid:!1,errors:g.errors,warnings:[]};const[E,m]=a,[I,b]=u;if(m>b)return{valid:!1,errors:[{code:d.INVALID_BBOX_LATITUDE_ORDER,path:t,params:{south:m,north:b}}],warnings:[]};if(!r&&E>I)return{valid:!1,errors:[{code:d.INVALID_BBOX_LONGITUDE_ORDER,path:t,params:{west:E,east:I}}],warnings:[]};if(!i){const He=e[2],We=e[5];if(He>We)return{valid:!1,errors:[{code:d.INVALID_BBOX_ALTITUDE_ORDER,path:t,params:{minAlt:He,maxAlt:We}}],warnings:[]}}const z={valid:!0,errors:[],warnings:[]};return r&&E>I&&z.warnings.push({code:d.BBOX_ANTIMERIDIAN_CROSSING,path:t,params:{west:E,east:I}}),z.warnings.push(...c.warnings),z.warnings.push(...g.warnings),z}function ke(){return{Feature:0,FeatureCollection:0,geometries:{}}}function Fe(){return{crs:void 0,valid:!0,errors:[],warnings:[],statistics:ke()}}function Gt(...e){const t=ke();for(const n of e){const r=n.statistics;if(r){t.Feature+=r.Feature??0,t.FeatureCollection+=r.FeatureCollection??0;for(const[i,a]of Object.entries(r.geometries??{}))t.geometries[i]=(t.geometries[i]??0)+a}}return t}function v(e,...t){for(const n of t)e.valid=e.valid&&(n.valid??!0),n.errors&&e.errors.push(...n.errors),n.warnings&&e.warnings.push(...n.warnings),n.crs!==void 0&&(e.crs=n.crs);return e.statistics=Gt(e,...t),e}function V(e,t,n=""){const r={valid:!0,errors:[],warnings:[],statistics:ke()};for(let i=0;i<e.length;i++){const a=`${n}/${i}`,u=t(e[i],a,i);u.statistics&&(r.statistics=Gt(r,u)),u.valid||(r.valid=!1,r.errors=r.errors.concat(u.errors.map(c=>({...c,path:c.path||a,index:i})))),o.is.empty(u.warnings)||(r.warnings=r.warnings.concat(u.warnings.map(c=>({...c,path:c.path||a,index:i}))))}return r}function rt(e,t=0,n=p){for(let r=t;r<e.length-1;r++)if(le(e[r],e[r+1],{precision:n}))return r;return-1}function Mt(e,t,n,r=p){let i=rt(e,0,r);for(;i!==-1;)n.push({code:d.DUPLICATE_POSITION,path:`${t}/${i}`}),i=rt(e,i+1,r)}function $e(e,t=0,n="",r={}){return o.is.arrayOfLengthAtLeast(e,t)?V(e,(i,a)=>ie(i,a,r),n):{valid:!1,errors:[{code:d.INVALID_COORDINATES_LENGTH,path:n,params:{minimumLength:t}}],warnings:[]}}function Ut(e,t="",n={}){const r=$e(e,2,t,n);if(!r.valid)return r;if(Mt(e,t,r.warnings,n.precision??p),n.geodesic??!0)for(let i=0;i<e.length-1;i++){const a=e[i][0],u=e[i+1][0];Math.abs(u-a)>180&&r.warnings.push({code:d.ANTIMERIDIAN_CROSSING,path:`${t}/${i}`})}return r}function ar(e,t="",n={}){return o.is.nonEmptyArray(e)?V(e,(r,i)=>Ut(r,i,n),t):{valid:!1,errors:[{code:d.INVALID_MULTI_LINESTRING_COORDINATES,path:t}],warnings:[]}}function or(e,t,n="",r={}){const i=r.precision??p,a=r.geodesic??!0,u=$e(e,4,n,r);if(!u.valid)return u;if(!de(e,{precision:i}))return u.valid=!1,u.errors.push({code:d.RING_NOT_CLOSED,path:n}),u;if(Mt(e,n,u.warnings,i),a){const c=Ue(e)?"clockwise":"counter-clockwise";c!==t&&(u.valid=!1,u.errors.push({code:d.INVALID_WINDING_ORDER,path:n,params:{expected:t,actual:c}}));const g=we(e);g.length>0&&(u.valid=!1,u.errors.push({code:d.SELF_INTERSECTION,path:n,params:{count:g.length}}))}return u}function Vt(e,t="",n={}){if(!o.is.nonEmptyArray(e))return{valid:!1,errors:[{code:d.INVALID_POLYGON_COORDINATES,path:t}],warnings:[]};const r=V(e,(i,a,u)=>or(i,u===0?"counter-clockwise":"clockwise",a,n),t);if((n.geodesic??!0)&&r.valid&&e.length>1){const i=e[0];for(let a=1;a<e.length;a++)Ve(i,e[a])&&(r.valid=!1,r.errors.push({code:d.HOLE_INTERSECTS_SHELL,path:`${t}/${a}`}))}return r}function ur(e,t="",n={}){return o.is.nonEmptyArray(e)?V(e,(r,i)=>Vt(r,i,n),t):{valid:!1,errors:[{code:d.INVALID_MULTIPOLYGON_COORDINATES,path:t}],warnings:[]}}function lr(e,t="",n={}){return o.is.nonEmptyArray(e)?V(e,(r,i)=>Ye(r,i,n),t):{valid:!1,errors:[{code:d.INVALID_GEOMETRYCOLLECTION_GEOMETRIES,path:t}],warnings:[]}}function Ye(e,t="",n={}){let r=Fe();if(!o.is.nonEmptyObject(e))return r.valid=!1,r.errors.push({code:d.INVALID_GEOMETRY,path:t}),r;r=v(r,Ct(e.crs,`${t}/crs`,n)),r=v(r,Pt(e.bbox,`${t}/bbox`,n));const i=`${t}/coordinates`;switch(e.type){case f.POINT:r=v(r,ie(e.coordinates,i,n));break;case f.MULTI_POINT:r=v(r,$e(e.coordinates,0,i,n));break;case f.LINESTRING:r=v(r,Ut(e.coordinates,i,n));break;case f.MULTI_LINESTRING:r=v(r,ar(e.coordinates,i,n));break;case f.POLYGON:r=v(r,Vt(e.coordinates,i,n));break;case f.MULTI_POLYGON:r=v(r,ur(e.coordinates,i,n));break;case f.GEOMETRY_COLLECTION:r=v(r,lr(e.geometries,`${t}/geometries`,n));break;default:return r.valid=!1,r.errors.push({code:d.INVALID_GEOMETRY_TYPE,path:t,params:{type:e.type}}),r}return r.statistics={Feature:0,FeatureCollection:0,geometries:{[e.type]:1}},r}function wt(e,t,n){let r=Fe();return o.is.nonEmptyObject(e)?(r=v(r,Ct(e.crs,`${t}/crs`,n)),r=v(r,Pt(e.bbox,`${t}/bbox`,n)),e.type===N.FEATURE?(r.statistics.Feature++,o.is.nonEmptyObject(e.geometry)?r=v(r,Ye(e.geometry,`${t}/geometry`,n)):r.warnings.push({code:d.MISSING_GEOMETRY,path:t}),r):(r.statistics.FeatureCollection++,o.is.nonEmptyArray(e.features)?r=v(r,V(e.features,(i,a)=>wt(i,a,n),`${t}/features`)):o.is.array(e.features)||(r.valid=!1,r.errors.push({code:d.INVALID_FEATURES_ARRAY,path:t})),r)):(r.valid=!1,r.errors.push({code:d.EMPTY_OBJECT,path:t}),r)}function cr(e,t={}){o.assert.that(e,o.is.nonEmptyObject,"geojson must be a non empty object");const{precision:n=p}=t;return e.type===N.FEATURE||e.type===N.FEATURE_COLLECTION?wt(e,"",{precision:n}):o.is.oneOf(e.type,Object.values(f))?Ye(e,"",{precision:n}):{...Fe(),valid:!1,errors:[{code:d.UNKNOWN_TYPE,path:"",params:{type:e.type}}]}}exports.AXES=O;exports.COORDINATE_FORMATS=J;exports.COORDINATE_MODELS=ft;exports.COORDINATE_TRUNCATION_FACTORS=mt;exports.CRS_TYPES=$;exports.DEFAULT_COORDINATE_PRECISION=p;exports.EARTH_RADIUS=ye;exports.FEATURE_TYPES=N;exports.GEOMETRY_TYPES=f;exports.IS_SAME_POSITION_OPTIONS_SCHEMA=X;exports.MAX_COORDINATE_PRECISION=_;exports.TRUNCATE_POSITIONS_OPTIONS_SCHEMA=Lt;exports.VALIDATION_CODES=d;exports.WGS84=Ae;exports.closeRing=Tt;exports.computeBBox=K;exports.computeGeoJsonBoundingBox=Bn;exports.computeGeoJsonConvexHull=At;exports.convertCoordinate=On;exports.deduplicatePositions=Me;exports.defineProjection=bn;exports.destinationFromPosition=Cn;exports.distanceBetweenPositions=pt;exports.extractGeoJsonBBox=Fn;exports.extractGeoJsonCRS=bt;exports.extractGeoJsonNode=je;exports.fixGeoJson=Jn;exports.getActiveLocales=_e;exports.getCoordinatePrecision=Ne;exports.getDirectionAxis=ut;exports.getDirectionSymbols=U;exports.getDirections=Zt;exports.getEast=en;exports.getLocale=at;exports.getMessages=ae;exports.getNorth=Qt;exports.getProjection=Dn;exports.getSouth=Jt;exports.getWest=tn;exports.guessCoordinateAxis=Oe;exports.hasProjection=M;exports.is3DBBox=pe;exports.is3DPosition=Nt;exports.isAltitude=kt;exports.isClockwiseRing=Ue;exports.isClosedRing=de;exports.isEast=ue;exports.isGeoJsonFixable=er;exports.isLatitude=x;exports.isLikeBBox=jn;exports.isLikeCRS=Vn;exports.isLikeFeature=_t;exports.isLikeFeatureCollection=ht;exports.isLikeFeatureOrFeatureCollection=Rt;exports.isLikeGeoJson=A;exports.isLikeGeometry=St;exports.isLikePosition=wn;exports.isLongitude=se;exports.isNorth=ot;exports.isSamePosition=le;exports.isSouth=he;exports.isValidAxis=Se;exports.isValidBBox=k;exports.isValidDirection=R;exports.isValidLine=Mn;exports.isValidPosition=T;exports.isValidPositions=ce;exports.isValidRing=F;exports.isWGS84Projection=De;exports.isWest=H;exports.lineLength=Un;exports.listLocales=zt;exports.listProjections=An;exports.mergeBBox=Pn;exports.normalizeCoordinate=En;exports.normalizeCrsName=be;exports.parseCoordinate=gt;exports.parsePosition=yn;exports.registerMessages=Kt;exports.reprojectGeoJson=nr;exports.reprojectPosition=Pe;exports.reprojectPositions=Z;exports.ringSelfIntersections=we;exports.ringsIntersect=Ve;exports.setLocale=qt;exports.simplifyGeoJson=Q;exports.sphericalRingArea=vt;exports.truncateBBox=Ge;exports.truncateCoordinate=Re;exports.truncateGeoJson=sr;exports.truncatePosition=Ce;exports.truncatePositions=re;exports.truncateRing=Le;exports.validateGeoJson=cr;
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./ring-CnFBeolv.cjs"),t=require("./line-Doxbvzns.cjs"),i=require("./geojson-QgqoCFjn.cjs"),o=require("./truncate-Cb17e4VI.cjs");exports.AXES=e.AXES;exports.COORDINATE_FORMATS=e.COORDINATE_FORMATS;exports.COORDINATE_MODELS=e.COORDINATE_MODELS;exports.COORDINATE_TRUNCATION_FACTORS=e.COORDINATE_TRUNCATION_FACTORS;exports.DEFAULT_COORDINATE_PRECISION=e.DEFAULT_COORDINATE_PRECISION;exports.EARTH_RADIUS=e.EARTH_RADIUS;exports.IS_SAME_POSITION_OPTIONS_SCHEMA=e.IS_SAME_POSITION_OPTIONS_SCHEMA;exports.MAX_COORDINATE_PRECISION=e.MAX_COORDINATE_PRECISION;exports.TRUNCATE_POSITIONS_OPTIONS_SCHEMA=e.TRUNCATE_POSITIONS_OPTIONS_SCHEMA;exports.WGS84=e.WGS84;exports.closeRing=e.closeRing;exports.computeBBox=e.computeBBox;exports.convertCoordinate=e.convertCoordinate;exports.deduplicatePositions=e.deduplicatePositions;exports.defineProjection=e.defineProjection;exports.denormalizeCrsName=e.denormalizeCrsName;exports.destinationFromPosition=e.destinationFromPosition;exports.distanceBetweenPositions=e.distanceBetweenPositions;exports.getActiveLocales=e.getActiveLocales;exports.getCoordinatePrecision=e.getCoordinatePrecision;exports.getDirectionAxis=e.getDirectionAxis;exports.getDirectionSymbols=e.getDirectionSymbols;exports.getDirections=e.getDirections;exports.getEast=e.getEast;exports.getLocale=e.getLocale;exports.getMessages=e.getMessages;exports.getNorth=e.getNorth;exports.getProjection=e.getProjection;exports.getSouth=e.getSouth;exports.getWest=e.getWest;exports.guessCoordinateAxis=e.guessCoordinateAxis;exports.hasProjection=e.hasProjection;exports.is3DBBox=e.is3DBBox;exports.is3DPosition=e.is3DPosition;exports.isAltitude=e.isAltitude;exports.isClockwiseRing=e.isClockwiseRing;exports.isClosedRing=e.isClosedRing;exports.isEast=e.isEast;exports.isLatitude=e.isLatitude;exports.isLongitude=e.isLongitude;exports.isNorth=e.isNorth;exports.isSamePosition=e.isSamePosition;exports.isSouth=e.isSouth;exports.isValidAxis=e.isValidAxis;exports.isValidBBox=e.isValidBBox;exports.isValidDirection=e.isValidDirection;exports.isValidPosition=e.isValidPosition;exports.isValidPositions=e.isValidPositions;exports.isValidRing=e.isValidRing;exports.isWGS84Projection=e.isWGS84Projection;exports.isWest=e.isWest;exports.listLocales=e.listLocales;exports.listProjections=e.listProjections;exports.mergeBBox=e.mergeBBox;exports.normalizeCoordinate=e.normalizeCoordinate;exports.normalizeCrsName=e.normalizeCrsName;exports.parseCoordinate=e.parseCoordinate;exports.parsePosition=e.parsePosition;exports.registerMessages=e.registerMessages;exports.reprojectPosition=e.reprojectPosition;exports.reprojectPositions=e.reprojectPositions;exports.ringSelfIntersections=e.ringSelfIntersections;exports.ringsIntersect=e.ringsIntersect;exports.setLocale=e.setLocale;exports.sphericalRingArea=e.sphericalRingArea;exports.truncateBBox=e.truncateBBox;exports.truncateCoordinate=e.truncateCoordinate;exports.truncatePosition=e.truncatePosition;exports.truncatePositions=e.truncatePositions;exports.truncateRing=e.truncateRing;exports.isValidLine=t.isValidLine;exports.lineLength=t.lineLength;exports.CRS_TYPES=i.CRS_TYPES;exports.FEATURE_TYPES=i.FEATURE_TYPES;exports.GEOMETRY_TYPES=i.GEOMETRY_TYPES;exports.VALIDATION_CODES=i.VALIDATION_CODES;exports.computeGeoJsonBoundingBox=i.computeGeoJsonBoundingBox;exports.fixGeoJson=i.fixGeoJson;exports.isGeoJsonFixable=i.isGeoJsonFixable;exports.isLikeBBox=i.isLikeBBox;exports.isLikeCRS=i.isLikeCRS;exports.isLikeFeature=i.isLikeFeature;exports.isLikeFeatureCollection=i.isLikeFeatureCollection;exports.isLikeFeatureOrFeatureCollection=i.isLikeFeatureOrFeatureCollection;exports.isLikeGeoJson=i.isLikeGeoJson;exports.isLikeGeometry=i.isLikeGeometry;exports.isLikePosition=i.isLikePosition;exports.simplifyGeoJson=i.simplifyGeoJson;exports.validateGeoJson=i.validateGeoJson;exports.computeGeoJsonConvexHull=o.computeGeoJsonConvexHull;exports.extractGeoJsonBBox=o.extractGeoJsonBBox;exports.extractGeoJsonCRS=o.extractGeoJsonCRS;exports.extractGeoJsonNode=o.extractGeoJsonNode;exports.reprojectGeoJson=o.reprojectGeoJson;exports.truncateGeoJson=o.truncateGeoJson;
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|