@kalisio/common-geospatial 0.8.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 -1056
- 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 +25 -7
|
@@ -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 n=require("@kalisio/common-core"),C=require("@turf/meta"),Re=require("@turf/convex"),Z=require("@turf/helpers"),Ae=require("heap-js"),Ce=require("@turf/truncate"),Me=require("@turf/boolean-clockwise"),Ne=require("@turf/kinks"),g={LATITUDE:"LAT",LONGITUDE:"LON",ALTITUDE:"ALT"};function re(e){return n.assert.that(e,n.is.string,"axis must be a string"),Object.values(g).includes(e)}function w(e){return n.assert.that(e,n.is.string,"axis must be a string"),e===g.LATITUDE}function Y(e){return n.assert.that(e,n.is.string,"axis must be a string"),e===g.LONGITUDE}function we(e){return n.assert.that(e,n.is.string,"axis must be a string"),e===g.ALTITUDE}const _e={NORTH:{label:"Nord",symbol:"N"},SOUTH:{label:"Sud",symbol:"S"},EAST:{label:"Est",symbol:"E"},WEST:{label:"Ouest",symbol:"O"}},xe={DIRECTIONS:_e},Fe={NORTH:{label:"North",symbol:"N"},SOUTH:{label:"South",symbol:"S"},EAST:{label:"East",symbol:"E"},WEST:{label:"West",symbol:"W"}},$e={DIRECTIONS:Fe},Ge={DIRECTIONS:{NORTH:{label:n.is.string,symbol:n.is.char},SOUTH:{label:n.is.string,symbol:n.is.char},EAST:{label:n.is.string,symbol:n.is.char},WEST:{label:n.is.string,symbol:n.is.char}}},y={en:$e,fr:xe};let T="en";const J="en";function Ue(){return Object.keys(y)}function Pe(e,t){n.assert.all([{value:e,validator:n.is.string,message:"code must be a string"},{value:e,validator:r=>!n.has.key(y,r),message:"locale already registered"},{value:t,validator:n.is.plainObject,message:"content must be an object"},{value:t,validator:r=>n.conform.schema(r,Ge),message:"content does not conform to schema"}]),y[e]=t}function ke(e){n.assert.all([{value:e,validator:n.is.string,message:"code must be a string"},{value:e,validator:t=>n.has.key(y,t),message:"code is unknown"}]),T=e}function ie(){return T}function F(e){return n.assert.all([{value:e,validator:n.is.string,message:"code must be a string"},{value:e,validator:t=>n.has.key(y,t),message:"code is unknown"}]),y[e]}function W(){return T===J?[T]:[T,J]}function q(e){const t=new Set;for(const r of W()){const{DIRECTIONS:i}=F(r);for(const s of e)t.add(i[s].symbol)}return[...t]}function se(){return q(["NORTH","SOUTH"])}function ae(){return q(["EAST","WEST"])}function $(){return q(["NORTH","SOUTH","EAST","WEST"])}function D(){return F(ie()).DIRECTIONS}function G(e,t){const r=t.toUpperCase();return W().some(i=>{const{label:s,symbol:a}=F(i).DIRECTIONS[e];return r===s.toUpperCase()||r===a.toUpperCase()})}function Be(e=null){const t=D();return n.is.defined(e)?(n.assert.that(e,re,"axis must be a valid axis"),w(e)?[t.SOUTH,t.NORTH]:Y(e)?[t.EAST,t.WEST]:[]):[t.SOUTH,t.NORTH,t.EAST,t.WEST]}function He(){return D().NORTH}function Ve(){return D().SOUTH}function je(){return D().EAST}function Ye(){return D().WEST}function p(e){return n.assert.that(e,n.is.string,"dir must be a string"),oe(e)||X(e)||U(e)||b(e)}function oe(e){return n.assert.that(e,n.is.string,"dir must be a string"),G("NORTH",e)}function X(e){return n.assert.that(e,n.is.string,"dir must be a string"),G("SOUTH",e)}function U(e){return n.assert.that(e,n.is.string,"dir must be a string"),G("EAST",e)}function b(e){return n.assert.that(e,n.is.string,"dir must be a string"),G("WEST",e)}function ue(e){return n.assert.that(e,p,"dir must be a direction"),b(e)||U(e)?g.LONGITUDE:g.LATITUDE}const We={degrees:n.is.number,direction:n.optional(p)},qe=/^(-?\d{1,3}(?:\.\d+)?)°?$/;function Xe(){return new RegExp(`^(\\d{1,3}(?:\\.\\d+)?)°?([${$()}])$`,"i")}function R(e){let t=null,r=null;if(n.is.plainObject(e)&&n.conform.schema(e,We))n.is.defined(e.direction)?e.degrees>=0&&(t=e.degrees,r=e.direction):t=e.degrees;else if(n.is.string(e)){const i=e.replace(/\s+/g,""),s=i.match(qe)??i.match(Xe());s&&(t=parseFloat(s[1]),r=s[2]??null)}return{get degrees(){return t},get direction(){return r},get format(){return"DD"},isValid(){return n.is.number(t)},toString(i){if(n.assert.that(i,n.is.positiveInteger,"decimalPlaces must be a positive integer"),!this.isValid())return"";let s=`${t.toFixed(i)}°`;return r&&(s+=` ${r}`),s},toDecimal(){return this.isValid()?R({degrees:t,direction:r}):null}}}const Ke={degrees:n.is.integer,minutes:e=>n.is.inRangeExclusiveMax(e,0,60),direction:n.optional(p)},ze=/^(-?\d{1,3})°(\d{1,2}(?:\.\d+)?)'?$/;function Qe(){return new RegExp(`^(\\d{1,3})°(\\d{1,2}(?:\\.\\d+)?)'?([${$().join("")}])$`,"i")}function le(e){let t=null,r=null,i=null;if(n.is.plainObject(e)&&n.conform.schema(e,Ke))n.is.defined(e.direction)?e.degrees>=0&&(t=e.degrees,r=e.minutes,i=e.direction):(t=e.degrees,r=e.minutes);else if(n.is.string(e)){const s=e.replace(/\s+/g,""),a=s.match(ze)??s.match(Qe());a&&(t=parseFloat(a[1]),r=parseFloat(a[2]),i=a[3]??null)}return{get degrees(){return t},get minutes(){return r},get direction(){return i},get format(){return"DDM"},isValid(){return n.is.integer(t)&&n.is.inRangeExclusiveMax(r,0,60)},toString(s){if(n.assert.that(s,n.is.positiveInteger,"decimalPlaces must be a positive integer"),!this.isValid())return"";let a=`${t}° ${r.toFixed(s)}'`;return i&&(a+=` ${i}`),a},toDecimal(){return this.isValid()?R({degrees:t+r/60,direction:i}):null}}}const Ze={degrees:n.is.nonNegativeInteger,minutes:e=>n.is.inRangeExclusiveMax(e,0,60),direction:p};function Je(){return new RegExp(`^(\\d{2})(\\d{3})([${se().join("")}])$`,"i")}function et(){return new RegExp(`^(\\d{3})(\\d{3})([${ae().join("")}])$`,"i")}function ce(e){let t=null,r=null,i=null;if(n.is.plainObject(e)&&n.conform.schema(e,Ze))t=e.degrees,r=e.minutes,i=e.direction;else if(n.is.string(e)){const s=e.trim(),a=s.match(Je())??s.match(et());a&&(t=parseFloat(a[1]),r=parseFloat(a[2])/10,i=a[3])}return{get degrees(){return t},get minutes(){return r},get direction(){return i},get format(){return"DDM_AERO"},isValid(){return n.is.nonNegativeInteger(t)&&n.is.inRangeExclusiveMax(r,0,60)&&p(i)},toString(){if(!this.isValid())return"";const s=U(i)||b(i),a=String(t).padStart(s?3:2,"0"),u=Math.floor(r*10).toString().padStart(3,"0");return`${a}${u}${i}`},toDecimal(){return this.isValid()?R({degrees:t+r/60,direction:i}):null}}}const tt={degrees:n.is.integer,minutes:e=>n.is.integer(e)&&n.is.inRange(e,0,59),seconds:e=>n.is.inRangeExclusiveMax(e,0,60),direction:n.optional(p)},nt=/^(-?\d{1,3})°(\d{1,2})'(\d{1,2}(?:\.\d+)?)"?$/;function rt(){return new RegExp(`^(\\d{1,3})°(\\d{1,2})'(\\d{1,2}(?:\\.\\d+)?)"?([${$().join("")}])$`,"i")}function me(e){let t=null,r=null,i=null,s=null;if(n.is.plainObject(e)&&n.conform.schema(e,tt))n.is.defined(e.direction)?e.degrees>=0&&(t=e.degrees,r=e.minutes,i=e.seconds,s=e.direction):(t=e.degrees,r=e.minutes,i=e.seconds);else if(n.is.string(e)){const a=e.replace(/\s+/g,""),u=a.match(nt)??a.match(rt());u&&(t=parseFloat(u[1]),r=parseFloat(u[2]),i=parseFloat(u[3]),s=u[4]??null)}return{get degrees(){return t},get minutes(){return r},get seconds(){return i},get direction(){return s},get format(){return"DMS"},isValid(){return n.is.integer(t)&&n.is.integer(r)&&n.is.inRange(r,0,59)&&n.is.inRangeExclusiveMax(i,0,60)},toString(a){if(n.assert.that(a,n.is.positiveInteger,"decimalPlaces must be a positive integer"),!this.isValid())return"";let u=`${t}° ${r}' ${i.toFixed(a)}"`;return s&&(u+=` ${s}`),u},toDecimal(){return this.isValid()?R({degrees:t+r/60+i/3600,direction:s}):null}}}function ee(e){const t=Math.floor(e.degrees),r=(e.degrees-t)*60;return{degrees:t,minutes:r,direction:e.direction}}function it(e){const t=Math.floor(e.degrees),r=(e.degrees-t)*60,i=Math.floor(r),s=(r-i)*60;return{degrees:t,minutes:i,seconds:s,direction:e.direction}}const te={DD:e=>(n.assert.that(e,t=>t.isValid(),"dd must be a valid coordinate"),e),DDM:e=>{n.assert.that(e,s=>s.isValid(),"dd must be a valid coordinate");const{degrees:t,minutes:r,direction:i}=ee(e);return le(i?{degrees:t,minutes:r,direction:i}:{degrees:t,minutes:r})},DMS:e=>{n.assert.that(e,a=>a.isValid(),"dd must be a valid coordinate");const{degrees:t,minutes:r,seconds:i,direction:s}=it(e);return me(s?{degrees:t,minutes:r,seconds:i,direction:s}:{degrees:t,minutes:r,seconds:i})},DDM_AERO:e=>{n.assert.that(e,s=>s.isValid(),"dd must be a valid coordinate");const{degrees:t,minutes:r,direction:i}=ee(e);return ce({degrees:t,minutes:r,direction:i})}},_={DD:"DD",DDM:"DDM",DDM_AERO:"DDM_AERO",DMS:"DMS"},fe={DD:R,DDM:le,DDM_AERO:ce,DMS:me},P=Array.from({length:9},(e,t)=>10**t);function H(e,t){if(n.assert.that(e,n.is.number,"coord must be a number"),n.is.defined(t))return n.assert.that(t,p,"dir must be a direction"),ue(t);if(Math.abs(e)>90)return g.LONGITUDE}function V(e){n.assert.that(e,n.is.number,"coord must be a number");const t=e.toExponential(),[r,i]=t.split("e").map(Number),s=(r.toString().split(".")[1]||"").length;return Math.max(0,s-i)}function st(e,t=7){n.assert.all([{value:e,validator:n.is.number,message:"coord must be a number"},{value:t,validator:i=>n.is.inRange(i,0,8),message:"precision must be in range [0, 8]"}]);const r=P[t];return Math.round(e*r)/r}function at(e,t){if(n.assert.all([{value:e,validator:n.is.number,message:"coord must be a number"},{value:t,validator:i=>Y(i)||w(i),message:"axis must be either a longitude or latitude"}]),w(t))return Math.max(-90,Math.min(90,e));let r=((e+180)%360+360)%360-180;return r===-180&&(r=180),Object.is(r,-0)&&(r=0),r}function ot(e,t){n.assert.all([{value:e,validator:i=>n.is.defined(i)&&i.isValid(),message:"from must be a valid coordinate"},{value:t,validator:i=>n.has.key(te,i),message:`unknown format: ${t}`}]);const r=e.format===_.DD?e:e.toDecimal();return r.isValid()?t===_.DD?r:te[t](r):null}function ge(e){n.assert.that(e,n.is.nonEmptyString,"pattern must be a non empty string");for(const t of Object.keys(_)){const r=fe[t](e);if(r.isValid())return r}return null}function ut(e){n.assert.that(e,o=>n.is.nonEmptyString(o),"pattern must be a non-empty string");const t=e.split(/[,;|]/);if(t.length!==2)return null;const[r,i]=t.map(ge);if(!r||!i)return null;const s=r.toDecimal(),a=i.toDecimal(),u=H(s.degrees,s.direction),c=H(a.degrees,a.direction),l=o=>{const{degrees:d,direction:m}=o;return m&&(b(m)||X(m))?-d:d};if(u===g.LONGITUDE&&c===g.LATITUDE)return[l(s),l(a)];if(c===g.LONGITUDE&&u===g.LATITUDE)return[l(a),l(s)];if(u===g.LONGITUDE&&!c)return[l(s),a];if(u===g.LATITUDE&&!c)return[l(a),l(s)];if(c===g.LONGITUDE&&!u)return[l(a),l(s)];if(c===g.LATITUDE&&!u)return[l(s),l(a)];if(!u&&!c)return[[l(s),l(a)],[l(a),l(s)]]}function h(e){return!(!n.is.arrayOfLengthBetween(e,2,3)||!n.is.number(e[0])||!n.is.number(e[1])||!n.is.inRange(e[0],-180,180)||!n.is.inRange(e[1],-90,90)||e.length===3&&!n.is.number(e[2]))}function de(e){return n.assert.that(e,h,"position must be a valid position"),n.is.arrayOfLength(e,3)}const lt={precision:n.optional(n.is.number),consider3D:n.optional(n.is.boolean)};function ct(e,t,r={}){n.assert.all([{value:e,validator:h,message:"position1 must be a valid position"},{value:t,validator:h,message:"position2 must be a valid position"},{value:r,validator:u=>n.conform.schema(u,lt),message:"options must be a valid options object"}]);const{precision:i=10,consider3D:s=!1}=r,a=s?Math.max(e.length,t.length):2;return Array.from({length:a},(u,c)=>(e[c]??0).toFixed(i)===(t[c]??0).toFixed(i)).every(Boolean)}function mt(e,t=7){n.assert.all([{value:e,validator:h,message:"position must be a position"},{value:t,validator:i=>n.is.inRange(i,0,8),message:"precision must be in range [0, 8]"}]);const r=P[t];for(let i=0;i<e.length;i++)e[i]=Math.round(e[i]*r)/r;return e}function L(e){if(!n.is.arrayOfLength(e,4)&&!n.is.arrayOfLength(e,6))return!1;const t=e.length===4,r=t?[e[0],e[1]]:[e[0],e[1],e[2]],i=t?[e[2],e[3]]:[e[3],e[4],e[5]];if(!h(r)||!h(i))return!1;const[,s]=r,[,a]=i;return!(s>a||!t&&e[2]>e[5])}function j(e){return n.assert.that(e,L,"bbox must be a valid bounding-box"),n.is.arrayOfLength(e,6)}function ft(e,t){return n.assert.all([{value:e,validator:L,message:"bbox1 must be a valid bounding-box"},{value:t,validator:L,message:"bbox2 must be a valid bounding-box"}]),j(e)&&j(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 gt={ignore3D:n.optional(n.is.boolean)};function M(e,t={}){n.assert.all([{value:e,validator:n.is.nonEmptyArray,message:"positions must be a non-empty array"},{value:e,validator:s=>s.every(h),message:"positions must be an array of valid positions"},{value:t,validator:s=>n.conform.schema(s,gt),message:"options must be a valid options object"}]);const{ignore3D:r=!1}=t;return!r&&e.some(de)?e.reduce((s,a)=>[Math.min(s[0],a[0]),Math.min(s[1],a[1]),Math.min(s[2],a[2]??0),Math.max(s[3],a[0]),Math.max(s[4],a[1]),Math.max(s[5],a[2]??0)],[1/0,1/0,1/0,-1/0,-1/0,-1/0]):e.reduce((s,a)=>[Math.min(s[0],a[0]),Math.min(s[1],a[1]),Math.max(s[2],a[0]),Math.max(s[3],a[1])],[1/0,1/0,-1/0,-1/0])}function K(e,t=7){n.assert.all([{value:e,validator:L,message:"bbox must be a valid bounding box"},{value:t,validator:i=>n.is.inRange(i,0,8),message:"precision must be in range [0, 8]"}]);const r=P[t];for(let i=0;i<e.length;i++)e[i]=Math.round(e[i]*r)/r;return e}const S={NAME:"name",LINK:"link"};function dt(e){return n.is.plainObject(e)?e.type===S.NAME?n.is.nonEmptyString(e.properties?.name):e.type===S.LINK?n.is.nonEmptyString(e.properties?.href):!1:!1}function vt(e){return n.is.arrayOfLengthBetween(e,2,3)?e.every(n.is.number):!1}function ht(e){return!n.is.arrayOfLength(e,4)&&!n.is.arrayOfLength(e,6)?!1:e.every(n.is.number)}const f={POINT:"Point",MULTI_POINT:"MultiPoint",LINESTRING:"LineString",MULTI_LINESTRING:"MultiLineString",POLYGON:"Polygon",MULTI_POLYGON:"MultiPolygon",GEOMETRY_COLLECTION:"GeometryCollection"};function ve(e){return!n.is.plainObject(e)||!n.is.oneOf(e.type,Object.values(f))?!1:e.type===f.GEOMETRY_COLLECTION?n.is.array(e.geometries):n.is.array(e.coordinates)}const v={FEATURE:"Feature",FEATURE_COLLECTION:"FeatureCollection"};function he(e){return n.is.plainObject(e)&&e.type===v.FEATURE}function pe(e){return n.is.plainObject(e)&&e.type===v.FEATURE_COLLECTION&&n.is.array(e.features)}function Ee(e){return he(e)||pe(e)}function A(e){return Ee(e)||ve(e)}const pt={ignore3D:n.optional(n.is.boolean)};function Et(e,t={}){if(n.assert.all([{value:e,validator:A,message:"geoJson must be a GeoJson object"},{value:t,validator:r=>n.conform.schema(r,pt),message:"options must be a valid options object"}]),e.type===v.FEATURE)return e.geometry?M(C.coordAll(e.geometry),t):null;if(e.type===v.FEATURE_COLLECTION){const r=C.coordAll(e);return r.length?M(r,t):null}return M(C.coordAll(e),t)}function yt(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=Re.convex(Z.featureCollection(e.map(r=>Z.feature({type:"Point",coordinates:r}))));return t?t.geometry:{type:"LineString",coordinates:[e[0],e[e.length-1]]}}function ye(e){if(n.assert.that(e,A,"geoJson must be a GeoJson object"),e.type===v.FEATURE)return e.geometry?ye(e.geometry):null;const t=C.coordAll(e).map(r=>[r[0],r[1]]);return yt(t)}function Ot(e,t,r){return Math.abs((e[0]*(t[1]-r[1])+t[0]*(r[1]-e[1])+r[0]*(e[1]-t[1]))/2)}function B(e,{tolerance:t=0,getWeight:r=()=>1}={}){if(e.length<=2)return e;const i=e.map((o,d)=>({coord:o,i:d,area:1/0,removed:!1,prev:null,next:null}));for(let o=0;o<i.length;o++)o>0&&(i[o].prev=i[o-1]),o<i.length-1&&(i[o].next=i[o+1]);const s=o=>!o.prev||!o.next?1/0:Ot(o.prev.coord,o.coord,o.next.coord)*r(o.coord,o.i),a=new Ae.Heap((o,d)=>o.area-d.area);for(let o=1;o<i.length-1;o++)i[o].area=s(i[o]),i[o]._currentArea=i[o].area,a.push(i[o]);let u=0;for(;a.size()>0;){const o=a.pop();if(!o.removed&&o.area===o._currentArea){if(o.area<u?o.area=u:u=o.area,o.area>=t)break;o.removed=!0,o.prev&&(o.prev.next=o.next),o.next&&(o.next.prev=o.prev),o.prev?.prev&&(o.prev.area=s(o.prev),o.prev._currentArea=o.prev.area,a.push(o.prev)),o.next?.next&&(o.next.area=s(o.next),o.next._currentArea=o.next.area,a.push(o.next))}}const c=[];let l=i[0];for(;l;)l.removed||c.push(l.coord),l=l.next;return c}const Tt={tolerance:n.optional(n.is.number),getWeight:n.optional(n.is.function)};function N(e,t={}){if(n.assert.all([{value:e,validator:A,message:"geoJson must be a GeoJson object"},{value:t,validator:r=>n.conform.schema(r,Tt),message:"options must be a valid options object"}]),e.type===v.FEATURE)return e.geometry&&N(e.geometry,t),e;if(e.type===v.FEATURE_COLLECTION){for(const r of e.features)N(r,t);return e}switch(e.type){case f.LINESTRING:e.coordinates=B(e.coordinates,t);break;case f.POLYGON:case f.MULTI_LINESTRING:e.coordinates=e.coordinates.map(r=>B(r,t));break;case f.MULTI_POLYGON:e.coordinates=e.coordinates.map(r=>r.map(i=>B(i,t)));break;case f.GEOMETRY_COLLECTION:e.geometries.forEach(r=>N(r,t));break}return e}function Oe(e,t=7){const r=Ce(e,{precision:t,mutate:!0});return r.bbox&&K(r.bbox,t),r}function Te(e,t){if(e.type===v.FEATURE)e.geometry&&Oe(e.geometry,t);else for(const r of e.features)Te(r,t);return e.bbox&&K(e.bbox,t),e}function Lt(e,t=7){return n.assert.all([{value:e,validator:A,message:"geoJson must be a valid GeoJson"},{value:t,validator:r=>n.is.inRange(r,0,8),message:"precision must be in range [0, 8]"}]),n.is.oneOf(e.type,Object.values(f))?Oe(e,t):Te(e,t)}function I(e){if(!n.is.arrayOfLengthBetween(e,2,3))return{valid:!1,errors:[{message:"Invalid coordinates: must be an array of 2 or 3 coordinates"}],warnings:[]};if(!n.is.number(e[0])||!n.is.number(e[1]))return{valid:!1,errors:[{message:"Invalid coordinates: longitude and latitude must be numbers"}],warnings:[]};if(!n.is.inRange(e[0],-180,180))return{valid:!1,errors:[{message:"Invalid coordinates: longitude must be in the range -180 to 180"}],warnings:[]};if(!n.is.inRange(e[1],-90,90))return{valid:!1,errors:[{message:"Invalid coordinates: latitude must be in the range -90 to 90"}],warnings:[]};if(e.length===3&&!n.is.number(e[2]))return{valid:!1,errors:[{message:"Invalid coordinates: altitude must be a number"}],warnings:[]};const t={valid:!0,errors:[],warnings:[]},r=V(e[0]);r>6&&t.warnings.push({message:`longitude precision is high (${r} decimals, max recommended: 6)`});const i=V(e[1]);return i>6&&t.warnings.push({message:`latitude precision is high (${i} decimals, max recommended: 6)`}),t}function Le(e){if(!n.is.arrayOfLength(e,4)&&!n.is.arrayOfLength(e,6))return{valid:!1,errors:[{message:"Invalid bbox: must be an array of 4 (2D) or 6 (3D) numbers"}],warnings:[]};const t=e.length===4,r=t?[e[0],e[1]]:[e[0],e[1],e[2]],i=t?[e[2],e[3]]:[e[3],e[4],e[5]],s=I(r);if(!s.valid)return{valid:!1,errors:s.errors.map(m=>({...m,message:`Invalid bbox south-west: ${m.message}`})),warnings:[]};const a=I(i);if(!a.valid)return{valid:!1,errors:a.errors.map(m=>({...m,message:`Invalid bbox north-east: ${m.message}`})),warnings:[]};const[u,c]=r,[l,o]=i;if(c>o)return{valid:!1,errors:[{message:`Invalid bbox: south (${c}) must be <= north (${o})`}],warnings:[]};if(!t){const m=e[2],Q=e[5];if(m>Q)return{valid:!1,errors:[{message:`Invalid bbox: min altitude (${m}) must be <= max altitude (${Q})`}],warnings:[]}}const d={valid:!0,errors:[],warnings:[]};return u>l&&d.warnings.push({message:`bbox crosses the antimeridian (west: ${u} > east: ${l})`}),d.warnings.push(...s.warnings.map(m=>({...m,message:`south-west: ${m.message}`}))),d.warnings.push(...a.warnings.map(m=>({...m,message:`north-east: ${m.message}`}))),d}function Se(e){if(!n.is.plainObject(e))return{valid:!1,errors:[{message:"Invalid crs: must be an object"}],warnings:[]};switch(e.type){case S.NAME:return n.is.nonEmptyString(e.properties?.name)?{valid:!0,errors:[],warnings:[]}:{valid:!1,errors:[{message:"Invalid crs: linked crs must have a non-empty properties.name string"}],warnings:[]};case S.LINK:return n.is.nonEmptyString(e.properties?.href)?{valid:!0,errors:[],warnings:[]}:{valid:!1,errors:[{message:"Invalid crs: linked crs must have a non-empty properties.href string"}],warnings:[]};default:return{valid:!1,errors:[{message:`Invalid crs: unknown type: ${e.type}`}],warnings:[]}}}function E(){return{Feature:0,FeatureCollection:0,geometries:{}}}function St(...e){const t=E();for(const r of e){const i=r.statistics;if(i){t.Feature+=i.Feature??0,t.FeatureCollection+=i.FeatureCollection??0;for(const[s,a]of Object.entries(i.geometries??{}))t.geometries[s]=(t.geometries[s]??0)+a}}return t}function O(e,t,r=""){const i={valid:!0,errors:[],warnings:[],statistics:E()};for(let s=0;s<e.length;s++){const a=`${r}/${s}`,u=t(e[s],a,s);if(u.statistics&&(i.statistics=St(i,u)),!u.valid){i.valid=!1,i.errors=i.errors.concat(u.errors.map(c=>({...c,path:c.path||a,index:s})));continue}n.is.empty(u.warnings)||(i.warnings=i.warnings.concat(u.warnings.map(c=>({...c,path:c.path||a,index:s}))))}return i}function ne(e,t){if(!n.is.defined(e.crs))return t;const r=Se(e.crs);return r.valid||(t.valid=!1,t.errors.push(...r.errors.map(i=>({...i,path:"/crs"})))),t.warnings.push(...r.warnings.map(i=>({...i,path:"/crs"}))),t}function x(e,t,r=""){if(!n.is.defined(e.bbox))return t;const i=Le(e.bbox);return i.valid||(t.valid=!1,t.errors.push(...i.errors.map(s=>({...s,path:`${r}/bbox`})))),t.warnings.push(...i.warnings.map(s=>({...s,path:`${r}/bbox`}))),t}function z(e,t=0,r=""){return n.is.arrayOfLengthAtLeast(e,t)?O(e,I,r):{valid:!1,errors:[{message:`Invalid coordinates: must have at least ${t} positions`,path:r}],warnings:[]}}function Ie(e,t=""){const r=z(e,2,t);if(!r.valid)return r;for(let i=0;i<e.length-1;i++){const s=e[i][0],a=e[i+1][0];Math.abs(a-s)>180&&r.warnings.push({message:`LineString crosses the antimeridian between positions ${i} and ${i+1}, consider using MultiLineString`,path:`${t}/${i}`})}return r}function It(e,t=""){return n.is.nonEmptyArray(e)?O(e,Ie,t):{valid:!1,errors:[{message:"Invalid MultiLineString: coordinates must be a non empty array",path:t}],warnings:[]}}function Dt(e,t,r=""){const i=z(e,4,r);if(!i.valid)return i;const s=e[0],a=e[e.length-1];if(s[0]!==a[0]||s[1]!==a[1])return i.valid=!1,i.errors.push({message:"Invalid LinearRing: first and last position must be identical",path:r}),i;const c=Me(e)?"clockwise":"counter-clockwise";c!==t&&i.warnings.push({message:`Ring must be ${t} but is ${c}`,path:r});const l=Ne({type:"Polygon",coordinates:[e]});return l.features.length>0&&(i.valid=!1,i.errors.push({message:`Invalid LinearRing: ${l.features.length} self-intersection(s) detected`,path:r})),i}function De(e,t=""){return n.is.nonEmptyArray(e)?O(e,(r,i,s)=>Dt(r,s===0?"counter-clockwise":"clockwise",i),t):{valid:!1,errors:[{message:"Invalid Polygon: coordinates must be a non empty array",path:t}],warnings:[]}}function bt(e,t=""){return n.is.nonEmptyArray(e)?O(e,(r,i)=>De(r,i),t):{valid:!1,errors:[{message:"Invalid MultiPolygon: coordinates must be a non empty array",path:t}],warnings:[]}}function Rt(e,t=""){return n.is.nonEmptyArray(e)?O(e,(r,i)=>k(r,i),t):{valid:!1,errors:[{message:"Invalid geometries: geometries must be a non empty array",path:t}],warnings:[]}}function k(e,t=""){if(!n.is.nonEmptyObject(e))return{valid:!1,errors:[{message:"Invalid geometry: geometry must be a non empty object",path:t}],warnings:[]};const r=`${t}/coordinates`;let i;switch(e.type){case f.POINT:{const s=I(e.coordinates);i={valid:s.valid,errors:s.errors.map(a=>({...a,path:r})),warnings:s.warnings.map(a=>({...a,path:r}))};break}case f.MULTI_POINT:{i=z(e.coordinates,0,r);break}case f.LINESTRING:{i=Ie(e.coordinates,r);break}case f.MULTI_LINESTRING:{i=It(e.coordinates,r);break}case f.POLYGON:{i=De(e.coordinates,r);break}case f.MULTI_POLYGON:{i=bt(e.coordinates,r);break}case f.GEOMETRY_COLLECTION:{i=Rt(e.geometries,`${t}/geometries`);break}default:return{valid:!1,errors:[{message:`Invalid geometry type: ${e.type}`,path:t}],warnings:[]}}return i=x(e,i,t),i.statistics={geometries:{[e.type]:1}},i}function be(e,t=""){if(!n.is.nonEmptyObject(e))return{valid:!1,errors:[{message:"Invalid feature: must be a non empty object",path:t}],warnings:[],statistics:E()};if(e.type===v.FEATURE){if(n.is.nonEmptyObject(e.geometry)){const r=k(e.geometry,`${t}/geometry`);return{...x(e,r,t),statistics:{Feature:1,FeatureCollection:0,geometries:{...r.statistics.geometries}}}}return{valid:!0,errors:[],warnings:[{message:"Feature has no geometry",path:t}],statistics:{Feature:1,FeatureCollection:0,geometries:{}}}}if(e.type===v.FEATURE_COLLECTION){if(n.is.nonEmptyArray(e.features)){const r=O(e.features,be,`${t}/features`);return{...x(e,r,t),statistics:{...r.statistics,FeatureCollection:r.statistics.FeatureCollection+1}}}return{valid:!1,errors:[{message:"Invalid FeatureCollection: features must be a non empty array",path:t}],warnings:[],statistics:E()}}return{valid:!1,errors:[{message:`Invalid feature: unknown type: ${e.type}`,path:t}],warnings:[],statistics:E()}}function At(e){if(n.assert.that(e,n.is.nonEmptyObject,"geojson must be a non empty object"),n.is.oneOf(e.type,Object.values(f))){const t=k(e,""),r=x(e,t,"");return{...ne(e,r),statistics:{Feature:0,FeatureCollection:0,geometries:{...t.statistics.geometries}}}}if(e.type===v.FEATURE||e.type===v.FEATURE_COLLECTION){const t=be(e,"");return ne(e,t)}return{valid:!1,errors:[{message:"Invalid GeoJson: type must be either a Geometry, a Feature or a FeatureCollection",path:""}],warnings:[],statistics:E()}}exports.AXES=g;exports.COORDINATE_FORMATS=_;exports.COORDINATE_MODELS=fe;exports.COORDINATE_TRUNCATION_FACTORS=P;exports.CRS_TYPES=S;exports.FEATURE_TYPES=v;exports.GEOMETRY_TYPES=f;exports.computeBBox=M;exports.computeGeoJsonBoundingBox=Et;exports.computeGeoJsonConvexHull=ye;exports.convertCoordinate=ot;exports.getActiveLocales=W;exports.getAllDirectionSymbols=$;exports.getCoordinatePrecision=V;exports.getDirectionAxis=ue;exports.getDirections=Be;exports.getEast=je;exports.getLatitudeSymbols=se;exports.getLocale=ie;exports.getLocaleByCode=F;exports.getLongitudeSymbols=ae;exports.getNorth=He;exports.getSouth=Ve;exports.getWest=Ye;exports.guessCoordinateAxis=H;exports.is3DBBox=j;exports.is3DPosition=de;exports.isAltitude=we;exports.isAxis=re;exports.isDirection=p;exports.isEast=U;exports.isLatitude=w;exports.isLikeBBox=ht;exports.isLikeCRS=dt;exports.isLikeFeature=he;exports.isLikeFeatureCollection=pe;exports.isLikeFeatureOrFeatureCollection=Ee;exports.isLikeGeoJson=A;exports.isLikeGeometry=ve;exports.isLikePosition=vt;exports.isLongitude=Y;exports.isNorth=oe;exports.isSamePosition=ct;exports.isSouth=X;exports.isValidBBox=L;exports.isValidPosition=h;exports.isWest=b;exports.listLocales=Ue;exports.mergeBBox=ft;exports.normalizeCoordinate=at;exports.parseCoordinate=ge;exports.parsePosition=ut;exports.registerLocale=Pe;exports.setLocale=ke;exports.simplifyGeoJson=N;exports.truncateBBox=K;exports.truncateCoordinate=st;exports.truncateGeoJson=Lt;exports.truncatePosition=mt;exports.validateBBox=Le;exports.validateCRS=Se;exports.validateGeoJson=At;exports.validateGeometry=k;exports.validatePosition=I;
|
|
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
|