@kalisio/common-geospatial 0.8.0 → 0.9.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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../src/foundation/axes.js","../src/foundation/localization.js","../src/foundation/directions.js","../src/foundation/coordinate-formats/dd.js","../src/foundation/coordinate-formats/ddm.js","../src/foundation/coordinate-formats/ddm-aero.js","../src/foundation/coordinate-formats/dms.js","../src/foundation/coordinate-formats/converter.js","../src/foundation/coordinate-formats/index.js","../src/foundation/coordinate.js","../src/foundation/position.js","../src/foundation/bbox.js","../src/operators/is-like.js","../src/operators/compute/bounding-box.js","../src/operators/compute/convex-hull.js","../src/operators/simplify.js","../src/operators/truncate.js","../src/operators/validate/position.js","../src/operators/validate/bbox.js","../src/operators/validate/crs.js","../src/operators/validate/utils.js","../src/operators/validate/geometry.js","../src/operators/validate/geojson.js"],"sourcesContent":["import { assert, is } from '@kalisio/common-core'\n\nexport const AXES = {\n LATITUDE: 'LAT',\n LONGITUDE: 'LON',\n ALTITUDE: 'ALT'\n}\n\nexport function isAxis (axis) {\n assert.that(axis, is.string, 'axis must be a string')\n return Object.values(AXES).includes(axis)\n}\n\nexport function isLatitude (axis) {\n assert.that(axis, is.string, 'axis must be a string')\n return axis === AXES.LATITUDE\n}\n\nexport function isLongitude (axis) {\n assert.that(axis, is.string, 'axis must be a string')\n return axis === AXES.LONGITUDE\n}\n\nexport function isAltitude (axis) {\n assert.that(axis, is.string, 'axis must be a string')\n return axis === AXES.ALTITUDE\n}\n","import { assert, is, has, conform } from '@kalisio/common-core'\nimport fr from './i18n/fr.json'\nimport en from './i18n/en.json'\n\nconst LOCALE_SCHEMA = {\n DIRECTIONS: {\n NORTH: { label: is.string, symbol: is.char },\n SOUTH: { label: is.string, symbol: is.char },\n EAST: { label: is.string, symbol: is.char },\n WEST: { label: is.string, symbol: is.char }\n }\n}\n\nconst LOCALES = {\n en,\n fr\n}\n\nlet CURRENT_LOCALE = 'en'\nconst FALLBACK_LOCALE = 'en'\n\nexport function listLocales () {\n return Object.keys(LOCALES)\n}\n\nexport function registerLocale (code, content) {\n assert.all([\n { value: code, validator: is.string, message: 'code must be a string' },\n { value: code, validator: (v) => !has.key(LOCALES, v), message: 'locale already registered' },\n { value: content, validator: is.plainObject, message: 'content must be an object' },\n { value: content, validator: (v) => conform.schema(v, LOCALE_SCHEMA), message: 'content does not conform to schema' }\n ])\n LOCALES[code] = content\n}\n\nexport function setLocale (code) {\n assert.all([\n { value: code, validator: is.string, message: 'code must be a string' },\n { value: code, validator: (v) => has.key(LOCALES, v), message: 'code is unknown' }\n ])\n CURRENT_LOCALE = code\n}\n\nexport function getLocale () {\n return CURRENT_LOCALE\n}\n\nexport function getLocaleByCode (code) {\n assert.all([\n { value: code, validator: is.string, message: 'code must be a string' },\n { value: code, validator: (v) => has.key(LOCALES, v), message: 'code is unknown' }\n ])\n return LOCALES[code]\n}\n\nexport function getActiveLocales () {\n return CURRENT_LOCALE === FALLBACK_LOCALE\n ? [CURRENT_LOCALE]\n : [CURRENT_LOCALE, FALLBACK_LOCALE]\n}\n\nfunction collectSymbols (keys) {\n const symbols = new Set()\n for (const code of getActiveLocales()) {\n const { DIRECTIONS } = getLocaleByCode(code)\n for (const key of keys) symbols.add(DIRECTIONS[key].symbol)\n }\n return [...symbols]\n}\n\n// Latitude symbols (NORTH/SOUTH), current locale + fallback.\nexport function getLatitudeSymbols () {\n return collectSymbols(['NORTH', 'SOUTH'])\n}\n\n// Longitude symbols (EAST/WEST), current locale + fallback.\nexport function getLongitudeSymbols () {\n return collectSymbols(['EAST', 'WEST'])\n}\n\n// All direction symbols (both axes), current locale + fallback.\nexport function getAllDirectionSymbols () {\n return collectSymbols(['NORTH', 'SOUTH', 'EAST', 'WEST'])\n}\n","import { assert, is } from '@kalisio/common-core'\nimport { getLocale, getLocaleByCode, getActiveLocales } from './localization.js'\nimport { AXES, isLatitude, isLongitude, isAxis } from './axes.js'\n\nfunction getAll () {\n return getLocaleByCode(getLocale()).DIRECTIONS\n}\n\n// A direction matches a type if it equals its label or its symbol, in any of\n// the active locales (current + fallback), case-insensitively.\nfunction isDirectionOf (type, dir) {\n const value = dir.toUpperCase()\n return getActiveLocales().some((code) => {\n const { label, symbol } = getLocaleByCode(code).DIRECTIONS[type]\n return value === label.toUpperCase() || value === symbol.toUpperCase()\n })\n}\n\nexport function getDirections (axis = null) {\n const directions = getAll()\n if (is.defined(axis)) {\n assert.that(axis, isAxis, 'axis must be a valid axis')\n if (isLatitude(axis)) return [directions.SOUTH, directions.NORTH]\n if (isLongitude(axis)) return [directions.EAST, directions.WEST]\n return []\n }\n return [directions.SOUTH, directions.NORTH, directions.EAST, directions.WEST]\n}\n\nexport function getNorth () { return getAll().NORTH }\nexport function getSouth () { return getAll().SOUTH }\nexport function getEast () { return getAll().EAST }\nexport function getWest () { return getAll().WEST }\n\nexport function isDirection (dir) {\n assert.that(dir, is.string, 'dir must be a string')\n return isNorth(dir) || isSouth(dir) || isEast(dir) || isWest(dir)\n}\n\nexport function isNorth (dir) {\n assert.that(dir, is.string, 'dir must be a string')\n return isDirectionOf('NORTH', dir)\n}\n\nexport function isSouth (dir) {\n assert.that(dir, is.string, 'dir must be a string')\n return isDirectionOf('SOUTH', dir)\n}\n\nexport function isEast (dir) {\n assert.that(dir, is.string, 'dir must be a string')\n return isDirectionOf('EAST', dir)\n}\n\nexport function isWest (dir) {\n assert.that(dir, is.string, 'dir must be a string')\n return isDirectionOf('WEST', dir)\n}\n\nexport function getDirectionAxis (dir) {\n assert.that(dir, isDirection, 'dir must be a direction')\n if (isWest(dir) || isEast(dir)) return AXES.LONGITUDE\n return AXES.LATITUDE\n}\n","import { assert, is, conform, optional } from '@kalisio/common-core'\nimport { getAllDirectionSymbols } from '../localization.js'\nimport { isDirection } from '../directions.js'\n\nconst SCHEMA = {\n degrees: is.number,\n direction: optional(isDirection)\n}\n\nconst REGEX_SIGNED = /^(-?\\d{1,3}(?:\\.\\d+)?)°?$/\n\nfunction dirRegex () {\n return new RegExp(`^(\\\\d{1,3}(?:\\\\.\\\\d+)?)°?([${getAllDirectionSymbols()}])$`, 'i')\n}\n\nexport function DD (dd) {\n let _degrees = null\n let _direction = null\n\n if (is.plainObject(dd) && conform.schema(dd, SCHEMA)) {\n if (is.defined(dd.direction)) {\n if (dd.degrees >= 0) {\n _degrees = dd.degrees\n _direction = dd.direction\n }\n } else {\n _degrees = dd.degrees\n }\n } else if (is.string(dd)) {\n const pattern = dd.replace(/\\s+/g, '')\n const match = pattern.match(REGEX_SIGNED) ?? pattern.match(dirRegex())\n if (match) {\n _degrees = parseFloat(match[1])\n _direction = match[2] ?? null\n }\n }\n\n return {\n get degrees () { return _degrees },\n get direction () { return _direction },\n get format () { return 'DD' },\n\n isValid () {\n return is.number(_degrees)\n },\n\n toString (decimalPlaces) {\n assert.that(decimalPlaces, is.positiveInteger, 'decimalPlaces must be a positive integer')\n if (!this.isValid()) return ''\n let str = `${_degrees.toFixed(decimalPlaces)}°`\n if (_direction) str += ` ${_direction}`\n return str\n },\n\n toDecimal () {\n if (!this.isValid()) return null\n return DD({ degrees: _degrees, direction: _direction })\n }\n }\n}\n","import { assert, is, conform, optional } from '@kalisio/common-core'\nimport { getAllDirectionSymbols } from '../localization.js'\nimport { isDirection } from '../directions.js'\nimport { DD } from './dd.js'\n\nconst SCHEMA = {\n degrees: is.integer,\n minutes: (v) => is.inRangeExclusiveMax(v, 0, 60),\n direction: optional(isDirection)\n}\n\nconst REGEX_SIGNED = /^(-?\\d{1,3})°(\\d{1,2}(?:\\.\\d+)?)'?$/\n\nfunction dirRegex () {\n return new RegExp(`^(\\\\d{1,3})°(\\\\d{1,2}(?:\\\\.\\\\d+)?)'?([${getAllDirectionSymbols().join('')}])$`, 'i')\n}\n\nexport function DDM (ddm) {\n let _degrees = null\n let _minutes = null\n let _direction = null\n\n if (is.plainObject(ddm) && conform.schema(ddm, SCHEMA)) {\n if (is.defined(ddm.direction)) {\n if (ddm.degrees >= 0) {\n _degrees = ddm.degrees\n _minutes = ddm.minutes\n _direction = ddm.direction\n }\n } else {\n _degrees = ddm.degrees\n _minutes = ddm.minutes\n }\n } else if (is.string(ddm)) {\n const pattern = ddm.replace(/\\s+/g, '')\n const match = pattern.match(REGEX_SIGNED) ?? pattern.match(dirRegex())\n if (match) {\n _degrees = parseFloat(match[1])\n _minutes = parseFloat(match[2])\n _direction = match[3] ?? null\n }\n }\n\n return {\n get degrees () { return _degrees },\n get minutes () { return _minutes },\n get direction () { return _direction },\n get format () { return 'DDM' },\n\n isValid () {\n return is.integer(_degrees) && is.inRangeExclusiveMax(_minutes, 0, 60)\n },\n\n toString (decimalPlaces) {\n assert.that(decimalPlaces, is.positiveInteger, 'decimalPlaces must be a positive integer')\n if (!this.isValid()) return ''\n let str = `${_degrees}° ${_minutes.toFixed(decimalPlaces)}'`\n if (_direction) str += ` ${_direction}`\n return str\n },\n\n toDecimal () {\n if (!this.isValid()) return null\n return DD({ degrees: _degrees + _minutes / 60, direction: _direction })\n }\n }\n}\n","import { is, conform } from '@kalisio/common-core'\nimport { getLatitudeSymbols, getLongitudeSymbols } from '../localization.js'\nimport { isDirection, isEast, isWest } from '../directions.js'\nimport { DD } from './dd.js'\n\nconst SCHEMA = {\n degrees: is.nonNegativeInteger,\n minutes: (v) => is.inRangeExclusiveMax(v, 0, 60),\n direction: isDirection\n}\n\nfunction latRegex () {\n return new RegExp(`^(\\\\d{2})(\\\\d{3})([${getLatitudeSymbols().join('')}])$`, 'i')\n}\n\nfunction lonRegex () {\n return new RegExp(`^(\\\\d{3})(\\\\d{3})([${getLongitudeSymbols().join('')}])$`, 'i')\n}\n\nexport function DDMAero (ddm) {\n let _degrees = null\n let _minutes = null\n let _direction = null\n\n if (is.plainObject(ddm) && conform.schema(ddm, SCHEMA)) {\n _degrees = ddm.degrees\n _minutes = ddm.minutes\n _direction = ddm.direction\n } else if (is.string(ddm)) {\n const pattern = ddm.trim()\n const match = pattern.match(latRegex()) ?? pattern.match(lonRegex())\n if (match) {\n _degrees = parseFloat(match[1])\n _minutes = parseFloat(match[2]) / 10\n _direction = match[3]\n }\n }\n\n return {\n get degrees () { return _degrees },\n get minutes () { return _minutes },\n get direction () { return _direction },\n get format () { return 'DDM_AERO' },\n\n isValid () {\n return is.nonNegativeInteger(_degrees) &&\n is.inRangeExclusiveMax(_minutes, 0, 60) &&\n isDirection(_direction)\n },\n\n toString () {\n if (!this.isValid()) return ''\n const isLon = isEast(_direction) || isWest(_direction)\n const deg = String(_degrees).padStart(isLon ? 3 : 2, '0')\n const min = Math.floor(_minutes * 10).toString().padStart(3, '0')\n return `${deg}${min}${_direction}`\n },\n\n toDecimal () {\n if (!this.isValid()) return null\n return DD({ degrees: _degrees + _minutes / 60, direction: _direction })\n }\n }\n}\n","import { assert, is, conform, optional } from '@kalisio/common-core'\nimport { getAllDirectionSymbols } from '../localization.js'\nimport { isDirection } from '../directions.js'\nimport { DD } from './dd.js'\n\nconst SCHEMA = {\n degrees: is.integer,\n minutes: (v) => is.integer(v) && is.inRange(v, 0, 59),\n seconds: (v) => is.inRangeExclusiveMax(v, 0, 60),\n direction: optional(isDirection)\n}\n\nconst REGEX_SIGNED = /^(-?\\d{1,3})°(\\d{1,2})'(\\d{1,2}(?:\\.\\d+)?)\"?$/\n\nfunction dirRegex () {\n return new RegExp(`^(\\\\d{1,3})°(\\\\d{1,2})'(\\\\d{1,2}(?:\\\\.\\\\d+)?)\"?([${getAllDirectionSymbols().join('')}])$`, 'i')\n}\n\nexport function DMS (dms) {\n let _degrees = null\n let _minutes = null\n let _seconds = null\n let _direction = null\n\n if (is.plainObject(dms) && conform.schema(dms, SCHEMA)) {\n if (is.defined(dms.direction)) {\n if (dms.degrees >= 0) {\n _degrees = dms.degrees\n _minutes = dms.minutes\n _seconds = dms.seconds\n _direction = dms.direction\n }\n } else {\n _degrees = dms.degrees\n _minutes = dms.minutes\n _seconds = dms.seconds\n }\n } else if (is.string(dms)) {\n const pattern = dms.replace(/\\s+/g, '')\n const match = pattern.match(REGEX_SIGNED) ?? pattern.match(dirRegex())\n if (match) {\n _degrees = parseFloat(match[1])\n _minutes = parseFloat(match[2])\n _seconds = parseFloat(match[3])\n _direction = match[4] ?? null\n }\n }\n\n return {\n get degrees () { return _degrees },\n get minutes () { return _minutes },\n get seconds () { return _seconds },\n get direction () { return _direction },\n get format () { return 'DMS' },\n\n isValid () {\n return is.integer(_degrees) &&\n is.integer(_minutes) && is.inRange(_minutes, 0, 59) &&\n is.inRangeExclusiveMax(_seconds, 0, 60)\n },\n\n toString (decimalPlaces) {\n assert.that(decimalPlaces, is.positiveInteger, 'decimalPlaces must be a positive integer')\n if (!this.isValid()) return ''\n let str = `${_degrees}° ${_minutes}' ${_seconds.toFixed(decimalPlaces)}\"`\n if (_direction) str += ` ${_direction}`\n return str\n },\n\n toDecimal () {\n if (!this.isValid()) return null\n return DD({ degrees: _degrees + _minutes / 60 + _seconds / 3600, direction: _direction })\n }\n }\n}\n","import { assert } from '@kalisio/common-core'\nimport { DDM } from './ddm.js'\nimport { DDMAero } from './ddm-aero.js'\nimport { DMS } from './dms.js'\n\nfunction decimalToDDM (dd) {\n const degrees = Math.floor(dd.degrees)\n const minutes = (dd.degrees - degrees) * 60\n return { degrees, minutes, direction: dd.direction }\n}\n\nfunction decimalToDMS (dd) {\n const degrees = Math.floor(dd.degrees)\n const minutesDecimal = (dd.degrees - degrees) * 60\n const minutes = Math.floor(minutesDecimal)\n const seconds = (minutesDecimal - minutes) * 60\n return { degrees, minutes, seconds, direction: dd.direction }\n}\n\nexport const converter = {\n DD: (dd) => {\n assert.that(dd, (v) => v.isValid(), 'dd must be a valid coordinate')\n return dd\n },\n\n DDM: (dd) => {\n assert.that(dd, (v) => v.isValid(), 'dd must be a valid coordinate')\n const { degrees, minutes, direction } = decimalToDDM(dd)\n return DDM(direction ? { degrees, minutes, direction } : { degrees, minutes })\n },\n\n DMS: (dd) => {\n assert.that(dd, (v) => v.isValid(), 'dd must be a valid coordinate')\n const { degrees, minutes, seconds, direction } = decimalToDMS(dd)\n return DMS(direction ? { degrees, minutes, seconds, direction } : { degrees, minutes, seconds })\n },\n\n DDM_AERO: (dd) => {\n assert.that(dd, (v) => v.isValid(), 'dd must be a valid coordinate')\n const { degrees, minutes, direction } = decimalToDDM(dd)\n return DDMAero({ degrees, minutes, direction })\n }\n}\n","import { DD } from './dd.js'\nimport { DDM } from './ddm.js'\nimport { DDMAero } from './ddm-aero.js'\nimport { DMS } from './dms.js'\nexport * from './converter.js'\n\nexport const COORDINATE_FORMATS = {\n DD: 'DD',\n DDM: 'DDM',\n DDM_AERO: 'DDM_AERO',\n DMS: 'DMS'\n}\n\nexport const COORDINATE_MODELS = {\n DD,\n DDM,\n DDM_AERO: DDMAero,\n DMS\n}\n","import { assert, is, has } from '@kalisio/common-core'\nimport { AXES, isLatitude, isLongitude } from './axes.js'\nimport { isDirection, getDirectionAxis } from './directions.js'\nimport { COORDINATE_FORMATS, COORDINATE_MODELS, converter } from './coordinate-formats/index.js'\nexport { COORDINATE_FORMATS, COORDINATE_MODELS } from './coordinate-formats/index.js'\n\nexport const COORDINATE_TRUNCATION_FACTORS = Array.from({ length: 9 }, (_, i) => 10 ** i)\n\nexport function guessCoordinateAxis (coord, dir) {\n assert.that(coord, is.number, 'coord must be a number')\n if (is.defined(dir)) {\n assert.that(dir, isDirection, 'dir must be a direction')\n return getDirectionAxis(dir)\n }\n if (Math.abs(coord) > 90) return AXES.LONGITUDE\n return undefined\n}\n\nexport function getCoordinatePrecision (coord) {\n assert.that(coord, is.number, 'coord must be a number')\n const str = coord.toExponential()\n const [base, exp] = str.split('e').map(Number)\n const decimalsInBase = (base.toString().split('.')[1] || '').length\n return Math.max(0, decimalsInBase - exp)\n}\n\nexport function truncateCoordinate (coord, precision = 7) {\n assert.all([\n { value: coord, validator: is.number, message: 'coord must be a number' },\n { value: precision, validator: (v) => is.inRange(v, 0, 8), message: 'precision must be in range [0, 8]' }\n ])\n const factor = COORDINATE_TRUNCATION_FACTORS[precision]\n return Math.round(coord * factor) / factor\n}\n\nexport function normalizeCoordinate (coord, axis) {\n assert.all([\n { value: coord, validator: is.number, message: 'coord must be a number' },\n { value: axis, validator: (v) => isLongitude(v) || isLatitude(v), message: 'axis must be either a longitude or latitude' }\n ])\n if (isLatitude(axis)) {\n return Math.max(-90, Math.min(90, coord))\n }\n let lon = ((coord + 180) % 360 + 360) % 360 - 180\n if (lon === -180) lon = 180\n if (Object.is(lon, -0)) lon = 0\n return lon\n}\n\nexport function convertCoordinate (from, to) {\n assert.all([\n { value: from, validator: (v) => is.defined(v) && v.isValid(), message: 'from must be a valid coordinate' },\n { value: to, validator: (v) => has.key(converter, v), message: `unknown format: ${to}` }\n ])\n const dd = from.format === COORDINATE_FORMATS.DD ? from : from.toDecimal()\n if (!dd.isValid()) return null\n if (to === COORDINATE_FORMATS.DD) {\n return dd\n }\n return converter[to](dd)\n}\n\nexport function parseCoordinate (pattern) {\n assert.that(pattern, is.nonEmptyString, 'pattern must be a non empty string')\n for (const format of Object.keys(COORDINATE_FORMATS)) {\n const coord = COORDINATE_MODELS[format](pattern)\n if (coord.isValid()) return coord\n }\n return null\n}\n","import { assert, is, conform, optional } from '@kalisio/common-core'\nimport { AXES } from './axes.js'\nimport { isWest, isSouth } from './directions.js'\nimport { guessCoordinateAxis, parseCoordinate, COORDINATE_TRUNCATION_FACTORS } from './coordinate.js'\n\nexport function parsePosition (pattern) {\n assert.that(pattern, (v) => is.nonEmptyString(v), 'pattern must be a non-empty string')\n const parts = pattern.split(/[,;|]/)\n if (parts.length !== 2) return null\n const [first, second] = parts.map(parseCoordinate)\n if (!first || !second) return null\n const firstDD = first.toDecimal()\n const secondDD = second.toDecimal()\n const firstAxis = guessCoordinateAxis(firstDD.degrees, firstDD.direction)\n const secondAxis = guessCoordinateAxis(secondDD.degrees, secondDD.direction)\n // Apply signedDegrees based on direction\n const signedDegrees = (dd) => {\n const { degrees, direction } = dd\n if (!direction) return degrees\n return (isWest(direction) || isSouth(direction)) ? -degrees : degrees\n }\n if (firstAxis === AXES.LONGITUDE && secondAxis === AXES.LATITUDE) return [signedDegrees(firstDD), signedDegrees(secondDD)]\n if (secondAxis === AXES.LONGITUDE && firstAxis === AXES.LATITUDE) return [signedDegrees(secondDD), signedDegrees(firstDD)]\n if (firstAxis === AXES.LONGITUDE && !secondAxis) return [signedDegrees(firstDD), secondDD]\n if (firstAxis === AXES.LATITUDE && !secondAxis) return [signedDegrees(secondDD), signedDegrees(firstDD)]\n if (secondAxis === AXES.LONGITUDE && !firstAxis) return [signedDegrees(secondDD), signedDegrees(firstDD)]\n if (secondAxis === AXES.LATITUDE && !firstAxis) return [signedDegrees(firstDD), signedDegrees(secondDD)]\n if (!firstAxis && !secondAxis) {\n return [\n [signedDegrees(firstDD), signedDegrees(secondDD)],\n [signedDegrees(secondDD), signedDegrees(firstDD)]\n ]\n }\n}\n\nexport function isValidPosition (coordinates) {\n if (!is.arrayOfLengthBetween(coordinates, 2, 3)) return false\n if (!is.number(coordinates[0]) || !is.number(coordinates[1])) return false\n if (!is.inRange(coordinates[0], -180, 180)) return false\n if (!is.inRange(coordinates[1], -90, 90)) return false\n if (coordinates.length === 3 && !is.number(coordinates[2])) return false\n return true\n}\n\nexport function is3DPosition (position) {\n assert.that(position, isValidPosition, 'position must be a valid position')\n return is.arrayOfLength(position, 3)\n}\n\nconst IS_SAME_POSITION_OPTIONS = {\n precision: optional(is.number),\n consider3D: optional(is.boolean)\n}\n\nexport function isSamePosition (position1, position2, options = {}) {\n assert.all([\n {\n value: position1,\n validator: isValidPosition,\n message: 'position1 must be a valid position'\n },\n {\n value: position2,\n validator: isValidPosition,\n message: 'position2 must be a valid position'\n },\n {\n value: options,\n validator: (v) => conform.schema(v, IS_SAME_POSITION_OPTIONS),\n message: 'options must be a valid options object'\n }\n ])\n const { precision = 10, consider3D = false } = options\n const length = consider3D ? Math.max(position1.length, position2.length) : 2\n return Array.from({ length }, (_, i) =>\n (position1[i] ?? 0).toFixed(precision) === (position2[i] ?? 0).toFixed(precision)\n ).every(Boolean)\n}\n\nexport function truncatePosition (position, precision = 7) {\n assert.all([\n { value: position, validator: isValidPosition, message: 'position must be a position' },\n { value: precision, validator: (v) => is.inRange(v, 0, 8), message: 'precision must be in range [0, 8]' }\n ])\n const factor = COORDINATE_TRUNCATION_FACTORS[precision]\n for (let i = 0; i < position.length; i++) {\n position[i] = Math.round(position[i] * factor) / factor\n }\n return position\n}\n","import { assert, is, conform, optional } from '@kalisio/common-core'\nimport { COORDINATE_TRUNCATION_FACTORS } from './coordinate.js'\nimport { isValidPosition, is3DPosition } from './position.js'\n\nexport function isValidBBox (bbox) {\n if (!is.arrayOfLength(bbox, 4) && !is.arrayOfLength(bbox, 6)) return false\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 if (!isValidPosition(min)) return false\n if (!isValidPosition(max)) return false\n const [, south] = min\n const [, north] = max\n if (south > north) return false\n if (!is2D && bbox[2] > bbox[5]) return false\n return true\n}\n\nexport function is3DBBox (bbox) {\n assert.that(bbox, isValidBBox, 'bbox must be a valid bounding-box')\n return is.arrayOfLength(bbox, 6)\n}\n\nexport function mergeBBox (bbox1, bbox2) {\n assert.all([\n { value: bbox1, validator: isValidBBox, message: 'bbox1 must be a valid bounding-box' },\n { value: bbox2, validator: isValidBBox, message: 'bbox2 must be a valid bounding-box' }\n ])\n if (is3DBBox(bbox1) && is3DBBox(bbox2)) {\n return [\n Math.min(bbox1[0], bbox2[0]),\n Math.min(bbox1[1], bbox2[1]),\n Math.min(bbox1[2], bbox2[2]),\n Math.max(bbox1[3], bbox2[3]),\n Math.max(bbox1[4], bbox2[4]),\n Math.max(bbox1[5], bbox2[5])\n ]\n }\n return [\n Math.min(bbox1[0], bbox2[0]),\n Math.min(bbox1[1], bbox2[1]),\n Math.max(bbox1[2], bbox2[2]),\n Math.max(bbox1[3], bbox2[3])\n ]\n}\n\nconst COMPUTE_BBOX_OPTIONS_SCHEMA = {\n ignore3D: optional(is.boolean)\n}\n\nexport function computeBBox (positions, options = {}) {\n assert.all([\n {\n value: positions,\n validator: is.nonEmptyArray,\n message: 'positions must be a non-empty array'\n },\n {\n value: positions,\n validator: (v) => v.every(isValidPosition),\n message: 'positions must be an array of valid positions'\n },\n {\n value: options,\n validator: (v) => conform.schema(v, COMPUTE_BBOX_OPTIONS_SCHEMA),\n message: 'options must be a valid options object'\n }\n ])\n const { ignore3D = false } = options\n const has3D = !ignore3D && positions.some(is3DPosition)\n if (has3D) {\n return positions.reduce((acc, pos) => [\n Math.min(acc[0], pos[0]),\n Math.min(acc[1], pos[1]),\n Math.min(acc[2], pos[2] ?? 0),\n Math.max(acc[3], pos[0]),\n Math.max(acc[4], pos[1]),\n Math.max(acc[5], pos[2] ?? 0)\n ], [Infinity, Infinity, Infinity, -Infinity, -Infinity, -Infinity])\n }\n return positions.reduce((acc, pos) => [\n Math.min(acc[0], pos[0]),\n Math.min(acc[1], pos[1]),\n Math.max(acc[2], pos[0]),\n Math.max(acc[3], pos[1])\n ], [Infinity, Infinity, -Infinity, -Infinity])\n}\n\nexport function truncateBBox (bbox, precision = 7) {\n assert.all([\n { value: bbox, validator: isValidBBox, message: 'bbox must be a valid bounding box' },\n { value: precision, validator: (v) => is.inRange(v, 0, 8), message: 'precision must be in range [0, 8]' }\n ])\n const factor = COORDINATE_TRUNCATION_FACTORS[precision]\n for (let i = 0; i < bbox.length; i++) {\n bbox[i] = Math.round(bbox[i] * factor) / factor\n }\n return bbox\n}\n","import { is } from '@kalisio/common-core'\n\nexport const CRS_TYPES = {\n NAME: 'name',\n LINK: 'link'\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 if (!is.arrayOfLengthBetween(object, 2, 3)) return false\n return object.every(is.number)\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 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 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 const FEATURE_TYPES = {\n FEATURE: 'Feature',\n FEATURE_COLLECTION: 'FeatureCollection'\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'\nimport { FEATURE_TYPES, isLikeGeoJson } from '../is-like.js'\nimport { computeBBox } from '../../../src/foundation/index.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 { convex } from '@turf/convex'\nimport { coordAll } from '@turf/meta'\nimport { featureCollection, feature } from '@turf/helpers'\nimport { assert } from '@kalisio/common-core'\nimport { FEATURE_TYPES, isLikeGeoJson } from '../is-like.js'\n\nfunction computeConvexHullFromPositions (positions) {\n if (positions.length === 0) return null\n if (positions.length === 1) return { type: 'Point', coordinates: positions[0] }\n if (positions.length === 2) return { type: 'LineString', coordinates: [positions[0], positions[1]] }\n const result = convex(featureCollection(positions.map(p => feature({ type: 'Point', coordinates: p }))))\n if (!result) return { type: 'LineString', coordinates: [positions[0], positions[positions.length - 1]] }\n return result.geometry\n}\n\nexport function computeGeoJsonConvexHull (geoJson) {\n assert.that(geoJson, isLikeGeoJson, 'geoJson must be a GeoJson object')\n if (geoJson.type === FEATURE_TYPES.FEATURE) {\n if (!geoJson.geometry) return null\n return computeGeoJsonConvexHull(geoJson.geometry)\n }\n const positions = coordAll(geoJson).map(p => [p[0], p[1]])\n return computeConvexHullFromPositions(positions)\n}\n","import { Heap } from 'heap-js'\nimport { assert, is, optional, conform } from '@kalisio/common-core'\nimport { FEATURE_TYPES, GEOMETRY_TYPES, isLikeGeoJson } from './is-like.js'\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\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\n const computeArea = (node) => {\n if (!node.prev || !node.next) return Infinity\n const area = triangleArea(node.prev.coord, node.coord, node.next.coord)\n return area * getWeight(node.coord, node.i)\n }\n\n const heap = new Heap((a, b) => a.area - b.area)\n for (let i = 1; i < pts.length - 1; i++) {\n pts[i].area = computeArea(pts[i])\n pts[i]._currentArea = pts[i].area\n heap.push(pts[i])\n }\n\n let maxArea = 0\n\n while (heap.size() > 0) {\n const node = heap.pop()\n if (node.removed) continue\n if (node.area !== node._currentArea) continue\n if (node.area < maxArea) node.area = maxArea\n else maxArea = node.area\n\n if (node.area >= tolerance) break\n\n node.removed = true\n if (node.prev) node.prev.next = node.next\n if (node.next) node.next.prev = node.prev\n\n if (node.prev?.prev) {\n node.prev.area = computeArea(node.prev)\n node.prev._currentArea = node.prev.area\n heap.push(node.prev)\n }\n if (node.next?.next) {\n node.next.area = computeArea(node.next)\n node.next._currentArea = node.next.area\n heap.push(node.next)\n }\n }\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\nconst SIMPLIFY_OPTIONS_SCHEMA = {\n tolerance: optional(is.number),\n getWeight: optional(is.function)\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 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 truncate from '@turf/truncate'\nimport { assert, is } from '@kalisio/common-core'\nimport { truncateBBox } from '../foundation/index.js'\nimport { FEATURE_TYPES, GEOMETRY_TYPES, isLikeGeoJson } from './is-like.js'\n\nfunction truncateGeometry (geometry, precision = 7) {\n const result = truncate(geometry, { precision, mutate: true })\n if (result.bbox) truncateBBox(result.bbox, precision)\n return result\n}\n\nfunction truncateFeature (feature, precision) {\n if (feature.type === FEATURE_TYPES.FEATURE) {\n if (feature.geometry) truncateGeometry(feature.geometry, precision)\n } else {\n for (const f of feature.features) truncateFeature(f, precision)\n }\n if (feature.bbox) truncateBBox(feature.bbox, precision)\n return feature\n}\n\nexport function truncateGeoJson (geoJson, precision = 7) {\n assert.all([\n { value: geoJson, validator: isLikeGeoJson, message: 'geoJson must be a valid GeoJson' },\n { value: precision, validator: (v) => is.inRange(v, 0, 8), message: 'precision must be in range [0, 8]' }\n ])\n if (is.oneOf(geoJson.type, Object.values(GEOMETRY_TYPES))) return truncateGeometry(geoJson, precision)\n return truncateFeature(geoJson, precision)\n}\n","import { is } from '@kalisio/common-core'\nimport { getCoordinatePrecision } from '../../foundation'\n\nexport function validatePosition (coordinates) {\n if (!is.arrayOfLengthBetween(coordinates, 2, 3)) {\n return {\n valid: false,\n errors: [{ message: 'Invalid coordinates: must be an array of 2 or 3 coordinates' }],\n warnings: []\n }\n }\n if (!is.number(coordinates[0]) || !is.number(coordinates[1])) {\n return {\n valid: false,\n errors: [{ message: 'Invalid coordinates: longitude and latitude must be numbers' }],\n warnings: []\n }\n }\n if (!is.inRange(coordinates[0], -180, 180)) {\n return {\n valid: false,\n errors: [{ message: 'Invalid coordinates: longitude must be in the range -180 to 180' }],\n warnings: []\n }\n }\n if (!is.inRange(coordinates[1], -90, 90)) {\n return {\n valid: false,\n errors: [{ message: 'Invalid coordinates: latitude must be in the range -90 to 90' }],\n warnings: []\n }\n }\n if (coordinates.length === 3 && !is.number(coordinates[2])) {\n return {\n valid: false,\n errors: [{ message: 'Invalid coordinates: altitude must be a number' }],\n warnings: []\n }\n }\n const response = { valid: true, errors: [], warnings: [] }\n const lonPrecision = getCoordinatePrecision(coordinates[0])\n if (lonPrecision > 6) {\n response.warnings.push({ message: `longitude precision is high (${lonPrecision} decimals, max recommended: 6)` })\n }\n const latPrecision = getCoordinatePrecision(coordinates[1])\n if (latPrecision > 6) {\n response.warnings.push({ message: `latitude precision is high (${latPrecision} decimals, max recommended: 6)` })\n }\n return response\n}\n","import { is } from '@kalisio/common-core'\nimport { validatePosition } from './position.js'\n\nexport function validateBBox (bbox) {\n // Must be array of 4 (2D) or 6 (3D) numbers\n if (!is.arrayOfLength(bbox, 4) && !is.arrayOfLength(bbox, 6)) {\n return {\n valid: false,\n errors: [{ message: 'Invalid bbox: must be an array of 4 (2D) or 6 (3D) numbers' }],\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)\n if (!minResult.valid) {\n return {\n valid: false,\n errors: minResult.errors.map(e => ({ ...e, message: `Invalid bbox south-west: ${e.message}` })),\n warnings: []\n }\n }\n const maxResult = validatePosition(max)\n if (!maxResult.valid) {\n return {\n valid: false,\n errors: maxResult.errors.map(e => ({ ...e, message: `Invalid bbox north-east: ${e.message}` })),\n warnings: []\n }\n }\n const [west, south] = min\n const [east, north] = max\n if (south > north) {\n return {\n valid: false,\n errors: [{ message: `Invalid bbox: south (${south}) must be <= north (${north})` }],\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: [{ message: `Invalid bbox: min altitude (${minAlt}) must be <= max altitude (${maxAlt})` }],\n warnings: []\n }\n }\n }\n const response = { valid: true, errors: [], warnings: [] }\n if (west > east) {\n response.warnings.push({ message: `bbox crosses the antimeridian (west: ${west} > east: ${east})` })\n }\n // Retrieve warnings from both points\n response.warnings.push(...minResult.warnings.map(w => ({ ...w, message: `south-west: ${w.message}` })))\n response.warnings.push(...maxResult.warnings.map(w => ({ ...w, message: `north-east: ${w.message}` })))\n return response\n}\n","import { is } from '@kalisio/common-core'\nimport { CRS_TYPES } from '../is-like.js'\n\nexport function validateCRS (crs) {\n if (!is.plainObject(crs)) {\n return {\n valid: false,\n errors: [{ message: 'Invalid crs: must be an object' }],\n warnings: []\n }\n }\n switch (crs.type) {\n case CRS_TYPES.NAME: {\n if (!is.nonEmptyString(crs.properties?.name)) {\n return {\n valid: false,\n errors: [{ message: 'Invalid crs: linked crs must have a non-empty properties.name string' }],\n warnings: []\n }\n }\n return { valid: true, errors: [], warnings: [] }\n }\n case CRS_TYPES.LINK: {\n if (!is.nonEmptyString(crs.properties?.href)) {\n return {\n valid: false,\n errors: [{ message: 'Invalid crs: linked crs must have a non-empty properties.href string' }],\n warnings: []\n }\n }\n return { valid: true, errors: [], warnings: [] }\n }\n default:\n return {\n valid: false,\n errors: [{ message: `Invalid crs: unknown type: ${crs.type}` }],\n warnings: []\n }\n }\n}\n","import { is } from '@kalisio/common-core'\nimport { validateBBox } from './bbox.js'\nimport { validateCRS } from './crs.js'\n\nexport function emptyStatistics () {\n return { Feature: 0, FeatureCollection: 0, geometries: {} }\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 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\n // Merge statistics before the valid/invalid branch, so invalid items are\n // still counted and the continue below cannot skip the merge.\n if (result.statistics) {\n response.statistics = mergeStatistics(response, result)\n }\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 continue\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\nexport function validateOptionalCRS (obj, result) {\n if (!is.defined(obj.crs)) return result\n const crsResult = validateCRS(obj.crs)\n if (!crsResult.valid) {\n result.valid = false\n result.errors.push(...crsResult.errors.map(e => ({ ...e, path: '/crs' })))\n }\n result.warnings.push(...crsResult.warnings.map(w => ({ ...w, path: '/crs' })))\n return result\n}\n\nexport function validateOptionalBBox (obj, result, path = '') {\n if (!is.defined(obj.bbox)) return result\n const bboxResult = validateBBox(obj.bbox)\n if (!bboxResult.valid) {\n result.valid = false\n result.errors.push(...bboxResult.errors.map(e => ({ ...e, path: `${path}/bbox` })))\n }\n result.warnings.push(...bboxResult.warnings.map(w => ({ ...w, path: `${path}/bbox` })))\n return result\n}\n","import booleanClockwise from '@turf/boolean-clockwise'\nimport kinks from '@turf/kinks'\nimport { is } from '@kalisio/common-core'\nimport { GEOMETRY_TYPES } from '../is-like.js'\nimport { validatePosition } from './position.js'\nimport { validateOptionalBBox, validateArray } from './utils.js'\n\nfunction validateCoordinatesArray (coordinates, minimumLength = 0, path = '') {\n if (!is.arrayOfLengthAtLeast(coordinates, minimumLength)) {\n return {\n valid: false,\n errors: [{ message: `Invalid coordinates: must have at least ${minimumLength} positions`, path }],\n warnings: []\n }\n }\n return validateArray(coordinates, validatePosition, path)\n}\n\nfunction validateLineStringCoordinates (coordinates, path = '') {\n const result = validateCoordinatesArray(coordinates, 2, path)\n if (!result.valid) return result\n // Check for antimeridian crossings\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({\n message: `LineString crosses the antimeridian between positions ${i} and ${i + 1}, consider using MultiLineString`,\n path: `${path}/${i}`\n })\n }\n }\n return result\n}\n\nfunction validateMultiLineStringCoordinates (coordinates, path = '') {\n if (!is.nonEmptyArray(coordinates)) {\n return {\n valid: false,\n errors: [{ message: 'Invalid MultiLineString: coordinates must be a non empty array', path }],\n warnings: []\n }\n }\n return validateArray(coordinates, validateLineStringCoordinates, path)\n}\n\nfunction validateLinearRing (coordinates, expectedWindingOrder, path = '') {\n const result = validateCoordinatesArray(coordinates, 4, path)\n if (!result.valid) return result\n // check ring is closed\n const first = coordinates[0]\n const last = coordinates[coordinates.length - 1]\n if (first[0] !== last[0] || first[1] !== last[1]) {\n result.valid = false\n result.errors.push({ message: 'Invalid LinearRing: first and last position must be identical', path })\n return result\n }\n // check winding order\n const isClockwise = booleanClockwise(coordinates)\n const actualWindingOrder = isClockwise ? 'clockwise' : 'counter-clockwise'\n if (actualWindingOrder !== expectedWindingOrder) {\n result.warnings.push({ message: `Ring must be ${expectedWindingOrder} but is ${actualWindingOrder}`, path })\n }\n // check self-intersection\n const intersections = kinks({ type: 'Polygon', coordinates: [coordinates] })\n if (intersections.features.length > 0) {\n result.valid = false\n result.errors.push({ message: `Invalid LinearRing: ${intersections.features.length} self-intersection(s) detected`, path })\n }\n return result\n}\n\nfunction validatePolygonCoordinates (coordinates, path = '') {\n if (!is.nonEmptyArray(coordinates)) {\n return {\n valid: false,\n errors: [{ message: 'Invalid Polygon: coordinates must be a non empty array', path }],\n warnings: []\n }\n }\n return validateArray(coordinates, (ring, p, i) => validateLinearRing(ring, i === 0 ? 'counter-clockwise' : 'clockwise', p), path)\n}\n\nfunction validateMultiPolygonCoordinates (coordinates, path = '') {\n if (!is.nonEmptyArray(coordinates)) {\n return {\n valid: false,\n errors: [{ message: 'Invalid MultiPolygon: coordinates must be a non empty array', path }],\n warnings: []\n }\n }\n return validateArray(coordinates, (c, p) => validatePolygonCoordinates(c, p), path)\n}\n\nfunction validateGeometryCollectionGeometries (geometries, path = '') {\n if (!is.nonEmptyArray(geometries)) {\n return {\n valid: false,\n errors: [{ message: 'Invalid geometries: geometries must be a non empty array', path }],\n warnings: []\n }\n }\n return validateArray(geometries, (g, p) => validateGeometry(g, p), path)\n}\n\nexport function validateGeometry (geometry, path = '') {\n if (!is.nonEmptyObject(geometry)) {\n return {\n valid: false,\n errors: [{ message: 'Invalid geometry: geometry must be a non empty object', path }],\n warnings: []\n }\n }\n const coordsPath = `${path}/coordinates`\n let result\n switch (geometry.type) {\n case GEOMETRY_TYPES.POINT: {\n const positionResult = validatePosition(geometry.coordinates, coordsPath)\n result = {\n valid: positionResult.valid,\n errors: positionResult.errors.map(e => ({ ...e, path: coordsPath })),\n warnings: positionResult.warnings.map(w => ({ ...w, path: coordsPath }))\n }\n break\n }\n case GEOMETRY_TYPES.MULTI_POINT: {\n result = validateCoordinatesArray(geometry.coordinates, 0, coordsPath)\n break\n }\n case GEOMETRY_TYPES.LINESTRING: {\n result = validateLineStringCoordinates(geometry.coordinates, coordsPath)\n break\n }\n case GEOMETRY_TYPES.MULTI_LINESTRING: {\n result = validateMultiLineStringCoordinates(geometry.coordinates, coordsPath)\n break\n }\n case GEOMETRY_TYPES.POLYGON: {\n result = validatePolygonCoordinates(geometry.coordinates, coordsPath)\n break\n }\n case GEOMETRY_TYPES.MULTI_POLYGON: {\n result = validateMultiPolygonCoordinates(geometry.coordinates, coordsPath)\n break\n }\n case GEOMETRY_TYPES.GEOMETRY_COLLECTION: {\n result = validateGeometryCollectionGeometries(geometry.geometries, `${path}/geometries`)\n break\n }\n default:\n return {\n valid: false,\n errors: [{ message: `Invalid geometry type: ${geometry.type}`, path }],\n warnings: []\n }\n }\n result = validateOptionalBBox(geometry, result, path)\n // Count this geometry by its own type. A GeometryCollection counts as one\n // and its members are NOT decomposed, so we overwrite any statistics that\n // bubbled up from the members.\n result.statistics = { geometries: { [geometry.type]: 1 } }\n return result\n}\n","import { assert, is } from '@kalisio/common-core'\nimport { FEATURE_TYPES, GEOMETRY_TYPES } from '../is-like.js'\nimport { emptyStatistics, validateArray, validateOptionalBBox, validateOptionalCRS } from './utils.js'\nimport { validateGeometry } from './geometry.js'\n\nfunction validateFeature (feature, path = '') {\n if (!is.nonEmptyObject(feature)) {\n return {\n valid: false,\n errors: [{ message: 'Invalid feature: must be a non empty object', path }],\n warnings: [],\n statistics: emptyStatistics()\n }\n }\n if (feature.type === FEATURE_TYPES.FEATURE) {\n if (is.nonEmptyObject(feature.geometry)) {\n const result = validateGeometry(feature.geometry, `${path}/geometry`)\n const bboxResult = validateOptionalBBox(feature, result, path)\n return {\n ...bboxResult,\n statistics: {\n Feature: 1,\n FeatureCollection: 0,\n // Geometry counting is owned by validateGeometry.\n geometries: { ...result.statistics.geometries }\n }\n }\n }\n return {\n valid: true,\n errors: [],\n warnings: [{ message: 'Feature has no geometry', path }],\n statistics: { Feature: 1, FeatureCollection: 0, geometries: {} }\n }\n }\n if (feature.type === FEATURE_TYPES.FEATURE_COLLECTION) {\n if (is.nonEmptyArray(feature.features)) {\n const result = validateArray(feature.features, validateFeature, `${path}/features`)\n const bboxResult = validateOptionalBBox(feature, result, path)\n return {\n ...bboxResult,\n statistics: { ...result.statistics, FeatureCollection: result.statistics.FeatureCollection + 1 }\n }\n }\n return {\n valid: false,\n errors: [{ message: 'Invalid FeatureCollection: features must be a non empty array', path }],\n warnings: [],\n statistics: emptyStatistics()\n }\n }\n return {\n valid: false,\n errors: [{ message: `Invalid feature: unknown type: ${feature.type}`, path }],\n warnings: [],\n statistics: emptyStatistics()\n }\n}\n\nexport function validateGeoJson (geoJson) {\n assert.that(geoJson, is.nonEmptyObject, 'geojson must be a non empty object')\n if (is.oneOf(geoJson.type, Object.values(GEOMETRY_TYPES))) {\n const result = validateGeometry(geoJson, '')\n const withBBox = validateOptionalBBox(geoJson, result, '')\n const withCRS = validateOptionalCRS(geoJson, withBBox)\n return {\n ...withCRS,\n // Geometry counting is owned by validateGeometry.\n statistics: { Feature: 0, FeatureCollection: 0, geometries: { ...result.statistics.geometries } }\n }\n }\n if (geoJson.type === FEATURE_TYPES.FEATURE || geoJson.type === FEATURE_TYPES.FEATURE_COLLECTION) {\n const result = validateFeature(geoJson, '')\n return validateOptionalCRS(geoJson, result)\n }\n return {\n valid: false,\n errors: [{ message: 'Invalid GeoJson: type must be either a Geometry, a Feature or a FeatureCollection', path: '' }],\n warnings: [],\n statistics: emptyStatistics()\n }\n}\n"],"names":["AXES","isAxis","axis","assert","is","isLatitude","isLongitude","isAltitude","LOCALE_SCHEMA","LOCALES","en","fr","CURRENT_LOCALE","FALLBACK_LOCALE","listLocales","registerLocale","code","content","v","has","conform","setLocale","getLocale","getLocaleByCode","getActiveLocales","collectSymbols","keys","symbols","DIRECTIONS","key","getLatitudeSymbols","getLongitudeSymbols","getAllDirectionSymbols","getAll","isDirectionOf","type","dir","value","label","symbol","getDirections","directions","getNorth","getSouth","getEast","getWest","isDirection","isNorth","isSouth","isEast","isWest","getDirectionAxis","SCHEMA","optional","REGEX_SIGNED","dirRegex","DD","dd","_degrees","_direction","pattern","match","decimalPlaces","str","DDM","ddm","_minutes","latRegex","lonRegex","DDMAero","isLon","deg","min","DMS","dms","_seconds","decimalToDDM","degrees","minutes","decimalToDMS","minutesDecimal","seconds","converter","direction","COORDINATE_FORMATS","COORDINATE_MODELS","COORDINATE_TRUNCATION_FACTORS","_","i","guessCoordinateAxis","coord","getCoordinatePrecision","base","exp","decimalsInBase","truncateCoordinate","precision","factor","normalizeCoordinate","lon","convertCoordinate","from","to","parseCoordinate","format","parsePosition","parts","first","second","firstDD","secondDD","firstAxis","secondAxis","signedDegrees","isValidPosition","coordinates","is3DPosition","position","IS_SAME_POSITION_OPTIONS","isSamePosition","position1","position2","options","consider3D","length","truncatePosition","isValidBBox","bbox","is2D","max","south","north","is3DBBox","mergeBBox","bbox1","bbox2","COMPUTE_BBOX_OPTIONS_SCHEMA","computeBBox","positions","ignore3D","acc","pos","truncateBBox","CRS_TYPES","isLikeCRS","object","isLikePosition","isLikeBBox","GEOMETRY_TYPES","isLikeGeometry","FEATURE_TYPES","isLikeFeature","isLikeFeatureCollection","isLikeFeatureOrFeatureCollection","isLikeGeoJson","BOUNDING_BOX_OPTIONS_SCHEMA","computeGeoJsonBoundingBox","geoJson","coordAll","computeConvexHullFromPositions","result","convex","featureCollection","p","feature","computeGeoJsonConvexHull","triangleArea","a","b","c","visvalingam","coords","tolerance","getWeight","pts","computeArea","node","heap","Heap","maxArea","cur","SIMPLIFY_OPTIONS_SCHEMA","simplifyGeoJson","ring","poly","g","truncateGeometry","geometry","truncate","truncateFeature","f","truncateGeoJson","validatePosition","response","lonPrecision","latPrecision","validateBBox","minResult","e","maxResult","west","east","minAlt","maxAlt","w","validateCRS","crs","emptyStatistics","mergeStatistics","results","statistics","s","count","validateArray","items","validator","path","itemPath","validateOptionalCRS","obj","crsResult","validateOptionalBBox","bboxResult","validateCoordinatesArray","minimumLength","validateLineStringCoordinates","lon1","lon2","validateMultiLineStringCoordinates","validateLinearRing","expectedWindingOrder","last","actualWindingOrder","booleanClockwise","intersections","kinks","validatePolygonCoordinates","validateMultiPolygonCoordinates","validateGeometryCollectionGeometries","geometries","validateGeometry","coordsPath","positionResult","validateFeature","validateGeoJson","withBBox"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../../common-core/dist/optional-C8lnNAGJ.js","../src/foundation/axes.js","../src/foundation/localization.js","../src/foundation/directions.js","../src/foundation/coordinate-formats/dd.js","../src/foundation/coordinate-formats/ddm.js","../src/foundation/coordinate-formats/ddm-aero.js","../src/foundation/coordinate-formats/dms.js","../src/foundation/coordinate-formats/converter.js","../src/foundation/coordinate-formats/index.js","../src/foundation/coordinate.js","../../common-core/dist/url-CT_AHms1.js","../src/foundation/nvector.js","../src/foundation/projections.js","../src/foundation/position.js","../src/foundation/bbox.js","../src/foundation/positions.js","../src/foundation/line.js","../src/foundation/ring.js","../src/operators/is-like.js","../src/operators/compute/bounding-box.js","../src/operators/compute/convex-hull.js","../src/operators/extract/node.js","../src/operators/extract/bbox.js","../src/operators/extract/crs.js","../src/operators/validate/codes.js","../src/operators/fix.js","../src/operators/reproject.js","../src/operators/simplify.js","../src/operators/truncate.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":["const c = typeof process > \"u\" || process.env?.NODE_ENV !== \"production\";\nclass m extends Error {\n constructor(n) {\n super(n), this.name = \"AssertionError\";\n }\n}\nfunction p(e, n, r) {\n if (!n(e)) throw new m(r);\n}\nconst a = {\n that(e, n, r) {\n c && p(e, n, r);\n },\n all(e) {\n if (c)\n for (const { value: n, validator: r, message: i } of e)\n p(n, r, i);\n },\n any(e) {\n if (!c || e.length === 0) return;\n if (!e.some(({ value: r, validator: i }) => i(r)))\n throw new m(e.map(({ message: r }) => r).join(\" or \"));\n }\n}, t = {\n defined(e) {\n return e != null;\n },\n nil(e) {\n return !t.defined(e);\n },\n plainObject(e) {\n return t.defined(e) && typeof e == \"object\" && !Array.isArray(e) && e.constructor === Object;\n },\n emptyObject(e) {\n return t.plainObject(e) && Object.keys(e).length === 0;\n },\n nonEmptyObject(e) {\n return t.plainObject(e) && Object.keys(e).length > 0;\n },\n boolean(e) {\n return typeof e == \"boolean\";\n },\n booleanTrue(e) {\n return e === !0;\n },\n booleanFalse(e) {\n return e === !1;\n },\n string(e) {\n return typeof e == \"string\";\n },\n emptyString(e) {\n return t.string(e) && e.trim().length === 0;\n },\n nonEmptyString(e) {\n return t.string(e) && e.trim().length > 0;\n },\n char(e) {\n return t.string(e) && /^.$/u.test(e);\n },\n hex(e) {\n return t.nonEmptyString(e) && e.length % 2 === 0 && /^[0-9a-fA-F]*$/.test(e);\n },\n dataUri(e) {\n return t.string(e) ? e.startsWith(\"data:\") && e.includes(\";base64,\") : !1;\n },\n url(e) {\n if (typeof e != \"string\") return !1;\n const r = /^([a-z][a-z0-9+.-]*:\\/\\/)([^/?#]+)(\\/[^?#]*)?(\\?[^#]*)?(#.*)?$/i.exec(e);\n if (!r?.[2].includes(\",\")) return URL.canParse(e);\n const [, i, s, g = \"\", o = \"\", b = \"\"] = r;\n return s.split(\",\").every((u, h) => (u = u.trim(), !u || h > 0 && u.includes(\"@\") ? !1 : URL.canParse(`${i}${u}${g}${o}${b}`)));\n },\n email(e) {\n if (!t.string(e)) return !1;\n const n = /^[-!#$%&'*+/0-9=?A-Z^_a-z`{|}~](\\.?[-!#$%&'*+/0-9=?A-Z^_a-z`{|}~])*@[a-zA-Z0-9](-?\\.?[a-zA-Z0-9])*\\.[a-zA-Z](-?[a-zA-Z0-9])+$/, [r, i] = e.split(\"@\");\n return !r || !i || r.length > 64 || i.length > 255 || i.split(\".\").some((s) => s.length > 63) ? !1 : n.test(e);\n },\n regularExpression(e) {\n return t.defined(e) && e instanceof RegExp;\n },\n number(e) {\n return typeof e == \"number\" && !isNaN(e) && isFinite(e);\n },\n positive(e) {\n return t.number(e) && e > 0;\n },\n nonPositive(e) {\n return t.number(e) && e <= 0;\n },\n negative(e) {\n return t.number(e) && e < 0;\n },\n nonNegative(e) {\n return t.number(e) && e >= 0;\n },\n inRange(e, n, r) {\n return a.that(r, (i) => i >= n, \"max must be greater than or equal to min\"), t.number(e) && e >= n && e <= r;\n },\n inRangeExclusive(e, n, r) {\n return a.that(r, (i) => i > n, \"max must be greater than min\"), t.number(e) && e > n && e < r;\n },\n inRangeExclusiveMin(e, n, r) {\n return a.that(r, (i) => i > n, \"max must be greater than min\"), t.number(e) && e > n && e <= r;\n },\n inRangeExclusiveMax(e, n, r) {\n return a.that(r, (i) => i >= n, \"max must be greater than or equal to min\"), t.number(e) && e >= n && e < r;\n },\n integer(e) {\n return t.number(e) && Number.isInteger(e);\n },\n positiveInteger(e) {\n return t.integer(e) && t.positive(e);\n },\n nonPositiveInteger(e) {\n return t.integer(e) && t.nonPositive(e);\n },\n negativeInteger(e) {\n return t.integer(e) && t.negative(e);\n },\n nonNegativeInteger(e) {\n return t.integer(e) && t.nonNegative(e);\n },\n array(e) {\n return Array.isArray(e);\n },\n emptyArray(e) {\n return t.array(e) && e.length === 0;\n },\n nonEmptyArray(e) {\n return t.array(e) && e.length > 0;\n },\n arrayOfLength(e, n) {\n return a.that(n, t.nonNegativeInteger, \"length must be a non negative integer\"), t.array(e) && e.length === n;\n },\n arrayOfLengthAtLeast(e, n) {\n return a.that(n, t.nonNegativeInteger, \"minLength must be a non negative integer\"), t.array(e) && e.length >= n;\n },\n arrayOfLengthAtMost(e, n) {\n return a.that(n, t.nonNegativeInteger, \"maxLength must be a non negative integer\"), t.array(e) && e.length <= n;\n },\n arrayOfLengthBetween(e, n, r) {\n return a.all([\n { value: n, validator: t.nonNegativeInteger, message: \"minLength must be a non negative integer\" },\n { value: r, validator: t.nonNegativeInteger, message: \"maxLength must be a non negative integer\" },\n { value: n, validator: (i) => i <= r, message: \"minLength must be less than or equal to maxLength\" }\n ]), t.array(e) && e.length >= n && e.length <= r;\n },\n map(e) {\n return t.defined(e) && e instanceof Map;\n },\n emptyMap(e) {\n return t.map(e) && e.size === 0;\n },\n nonEmptyMap(e) {\n return t.map(e) && e.size > 0;\n },\n set(e) {\n return t.defined(e) && e instanceof Set;\n },\n emptySet(e) {\n return t.set(e) && e.size === 0;\n },\n nonEmptySet(e) {\n return t.set(e) && e.size > 0;\n },\n function(e) {\n return typeof e == \"function\";\n },\n oneOf(e, n) {\n return a.that(n, t.nonEmptyArray, \"allowed values must be a non empty array\"), n.includes(e);\n },\n empty(e) {\n return t.nil(e) ? !0 : t.string(e) ? t.emptyString(e) : t.array(e) ? t.emptyArray(e) : t.plainObject(e) ? t.emptyObject(e) : t.map(e) ? t.emptyMap(e) : t.set(e) ? t.emptySet(e) : !1;\n }\n}, f = {\n key(e, n) {\n return a.all([\n { value: e, validator: t.plainObject, message: \"obj must be an object\" },\n { value: n, validator: t.nonEmptyString, message: \"key must be a non empty string\" }\n ]), Object.hasOwn(e, n);\n },\n keys(e, n) {\n return a.all([\n { value: e, validator: t.plainObject, message: \"obj must be an object\" },\n { value: n, validator: (r) => t.array(r) && r.length > 0 && r.every(t.nonEmptyString), message: \"keys must be an array of non empty strings\" }\n ]), n.every((r) => f.key(e, r));\n },\n keyWithValue(e, n) {\n return f.key(e, n) && t.defined(e[n]);\n },\n path(e, n) {\n a.all([\n { value: e, validator: t.plainObject, message: \"obj must be an object\" },\n { value: n, validator: t.nonEmptyString, message: \"path must be a non empty string\" }\n ]);\n let r = e;\n for (const i of n.split(\".\")) {\n if (!r || !t.plainObject(r) || !(i in r)) return !1;\n r = r[i];\n }\n return !0;\n }\n};\nfunction y(e, n, r = \"\") {\n return Object.entries(n).every(([i, s]) => {\n const g = r ? `${r}.${i}` : i;\n if (!f.key(e, i))\n return s._optional === !0;\n const o = e[i];\n if (t.plainObject(s))\n return t.plainObject(o) && y(o, s, g);\n if (typeof s == \"function\")\n return s(o);\n throw new m(`Invalid validator for key \"${g}\"`);\n });\n}\nconst d = {\n schema(e, n) {\n return a.all([\n { value: e, validator: t.plainObject, message: \"obj must be an object\" },\n { value: n, validator: t.plainObject, message: \"schema must be an object\" }\n ]), y(e, n);\n }\n};\nfunction O(e) {\n a.that(e, t.function, \"validator must be a function\");\n function n(r) {\n return t.nil(r) ? !0 : e(r);\n }\n return n._optional = !0, n;\n}\nexport {\n m as A,\n a,\n d as c,\n f as h,\n t as i,\n O as o\n};\n//# sourceMappingURL=optional-C8lnNAGJ.js.map\n","import { assert, is } from '@kalisio/common-core/predicates'\n\nexport const AXES = {\n LATITUDE: 'LAT',\n LONGITUDE: 'LON',\n ALTITUDE: 'ALT'\n}\n\nexport function isValidAxis (axis) {\n assert.that(axis, is.string, 'axis must be a string')\n return Object.values(AXES).includes(axis)\n}\n\nexport function isLatitude (axis) {\n assert.that(axis, is.string, 'axis must be a string')\n return axis === AXES.LATITUDE\n}\n\nexport function isLongitude (axis) {\n assert.that(axis, is.string, 'axis must be a string')\n return axis === AXES.LONGITUDE\n}\n\nexport function isAltitude (axis) {\n assert.that(axis, is.string, 'axis must be a string')\n return axis === AXES.ALTITUDE\n}\n","import { assert, is, has, conform } from '@kalisio/common-core/predicates'\nimport fr from './i18n/fr.json'\nimport en from './i18n/en.json'\n\nconst MESSAGES_SCHEMA = {\n DIRECTIONS: {\n NORTH: { label: is.string, symbol: is.char },\n SOUTH: { label: is.string, symbol: is.char },\n EAST: { label: is.string, symbol: is.char },\n WEST: { label: is.string, symbol: is.char }\n }\n}\n\nconst MESSAGES = {\n en,\n fr\n}\n\nlet CURRENT_LOCALE = 'en'\nconst FALLBACK_LOCALE = 'en'\n\nexport function listLocales () {\n return Object.keys(MESSAGES)\n}\n\nexport function setLocale (code) {\n assert.all([\n { value: code, validator: is.string, message: 'code must be a string' },\n { value: code, validator: (v) => has.key(MESSAGES, v), message: 'code is unknown' }\n ])\n CURRENT_LOCALE = code\n}\n\nexport function getLocale () {\n return CURRENT_LOCALE\n}\n\nexport function getActiveLocales () {\n return CURRENT_LOCALE === FALLBACK_LOCALE\n ? [CURRENT_LOCALE]\n : [CURRENT_LOCALE, FALLBACK_LOCALE]\n}\n\nexport function registerMessages (code, messages) {\n assert.all([\n { value: code, validator: is.string, message: 'code must be a string' },\n { value: code, validator: (v) => !has.key(MESSAGES, v), message: 'messages already registered' },\n { value: messages, validator: is.plainObject, message: 'messages must be an object' },\n { value: messages, validator: (v) => conform.schema(v, MESSAGES_SCHEMA), message: 'messages do not conform to schema' }\n ])\n MESSAGES[code] = messages\n}\n\nexport function getMessages (code) {\n assert.all([\n { value: code, validator: is.string, message: 'code must be a string' },\n { value: code, validator: (v) => has.key(MESSAGES, v), message: 'code is unknown' }\n ])\n return MESSAGES[code]\n}\n","import { assert, is } from '@kalisio/common-core/predicates'\nimport { getLocale, getActiveLocales, getMessages } from './localization.js'\nimport { AXES, isLatitude, isLongitude, isValidAxis } from './axes.js'\n\nfunction getLocalizedDirections () {\n return getMessages(getLocale()).DIRECTIONS\n}\n\nfunction collectLocalizedSymbols (keys) {\n const symbols = new Set()\n for (const code of getActiveLocales()) {\n const { DIRECTIONS } = getMessages(code)\n for (const key of keys) symbols.add(DIRECTIONS[key].symbol)\n }\n return [...symbols]\n}\n\n// A direction matches a type if it equals its label or its symbol, in any of\n// the active locales (current + fallback), case-insensitively.\nfunction isValidDirectionOf (type, dir) {\n const value = dir.toUpperCase()\n return getActiveLocales().some((code) => {\n const { label, symbol } = getMessages(code).DIRECTIONS[type]\n return value === label.toUpperCase() || value === symbol.toUpperCase()\n })\n}\n\nexport function getDirections (axis = null) {\n const directions = getLocalizedDirections()\n if (is.defined(axis)) {\n assert.that(axis, isValidAxis, 'axis must be a valid axis')\n if (isLatitude(axis)) return [directions.SOUTH, directions.NORTH]\n if (isLongitude(axis)) return [directions.EAST, directions.WEST]\n return []\n }\n return [directions.SOUTH, directions.NORTH, directions.EAST, directions.WEST]\n}\n\nexport function getDirectionSymbols (axis = null) {\n if (is.defined(axis)) {\n assert.that(axis, isValidAxis, 'axis must be a valid axis')\n if (isLatitude(axis)) return collectLocalizedSymbols(['NORTH', 'SOUTH'])\n if (isLongitude(axis)) return collectLocalizedSymbols(['EAST', 'WEST'])\n return []\n }\n return collectLocalizedSymbols(['NORTH', 'SOUTH', 'EAST', 'WEST'])\n}\n\nexport function getNorth () { return getLocalizedDirections().NORTH }\nexport function getSouth () { return getLocalizedDirections().SOUTH }\nexport function getEast () { return getLocalizedDirections().EAST }\nexport function getWest () { return getLocalizedDirections().WEST }\n\nexport function isValidDirection (dir) {\n assert.that(dir, is.string, 'dir must be a string')\n return isNorth(dir) || isSouth(dir) || isEast(dir) || isWest(dir)\n}\n\nexport function isNorth (dir) {\n assert.that(dir, is.string, 'dir must be a string')\n return isValidDirectionOf('NORTH', dir)\n}\n\nexport function isSouth (dir) {\n assert.that(dir, is.string, 'dir must be a string')\n return isValidDirectionOf('SOUTH', dir)\n}\n\nexport function isEast (dir) {\n assert.that(dir, is.string, 'dir must be a string')\n return isValidDirectionOf('EAST', dir)\n}\n\nexport function isWest (dir) {\n assert.that(dir, is.string, 'dir must be a string')\n return isValidDirectionOf('WEST', dir)\n}\n\nexport function getDirectionAxis (dir) {\n assert.that(dir, isValidDirection, 'dir must be a direction')\n if (isWest(dir) || isEast(dir)) return AXES.LONGITUDE\n return AXES.LATITUDE\n}\n","import { assert, is, conform, optional } from '@kalisio/common-core'\nimport { isValidDirection, getDirectionSymbols } from '../directions.js'\n\nconst SCHEMA = {\n degrees: is.number,\n direction: optional(isValidDirection)\n}\n\nconst REGEX_SIGNED = /^(-?\\d{1,3}(?:\\.\\d+)?)°?$/\n\nfunction dirRegex () {\n return new RegExp(`^(\\\\d{1,3}(?:\\\\.\\\\d+)?)°?([${getDirectionSymbols()}])$`, 'i')\n}\n\nexport function DD (dd) {\n let _degrees = null\n let _direction = null\n\n if (is.plainObject(dd) && conform.schema(dd, SCHEMA)) {\n if (is.defined(dd.direction)) {\n if (dd.degrees >= 0) {\n _degrees = dd.degrees\n _direction = dd.direction\n }\n } else {\n _degrees = dd.degrees\n }\n } else if (is.string(dd)) {\n const pattern = dd.replace(/\\s+/g, '')\n const match = pattern.match(REGEX_SIGNED) ?? pattern.match(dirRegex())\n if (match) {\n _degrees = parseFloat(match[1])\n _direction = match[2] ?? null\n }\n }\n\n return {\n get degrees () { return _degrees },\n get direction () { return _direction },\n get format () { return 'DD' },\n\n isValid () {\n return is.number(_degrees)\n },\n\n toString (decimalPlaces) {\n assert.that(decimalPlaces, is.positiveInteger, 'decimalPlaces must be a positive integer')\n if (!this.isValid()) return ''\n let str = `${_degrees.toFixed(decimalPlaces)}°`\n if (_direction) str += ` ${_direction}`\n return str\n },\n\n toDecimal () {\n if (!this.isValid()) return null\n return DD({ degrees: _degrees, direction: _direction })\n }\n }\n}\n","import { assert, is, conform, optional } from '@kalisio/common-core'\nimport { isValidDirection, getDirectionSymbols } from '../directions.js'\nimport { DD } from './dd.js'\n\nconst SCHEMA = {\n degrees: is.integer,\n minutes: (v) => is.inRangeExclusiveMax(v, 0, 60),\n direction: optional(isValidDirection)\n}\n\nconst REGEX_SIGNED = /^(-?\\d{1,3})°(\\d{1,2}(?:\\.\\d+)?)'?$/\n\nfunction dirRegex () {\n return new RegExp(`^(\\\\d{1,3})°(\\\\d{1,2}(?:\\\\.\\\\d+)?)'?([${getDirectionSymbols().join('')}])$`, 'i')\n}\n\nexport function DDM (ddm) {\n let _degrees = null\n let _minutes = null\n let _direction = null\n\n if (is.plainObject(ddm) && conform.schema(ddm, SCHEMA)) {\n if (is.defined(ddm.direction)) {\n if (ddm.degrees >= 0) {\n _degrees = ddm.degrees\n _minutes = ddm.minutes\n _direction = ddm.direction\n }\n } else {\n _degrees = ddm.degrees\n _minutes = ddm.minutes\n }\n } else if (is.string(ddm)) {\n const pattern = ddm.replace(/\\s+/g, '')\n const match = pattern.match(REGEX_SIGNED) ?? pattern.match(dirRegex())\n if (match) {\n _degrees = parseFloat(match[1])\n _minutes = parseFloat(match[2])\n _direction = match[3] ?? null\n }\n }\n\n return {\n get degrees () { return _degrees },\n get minutes () { return _minutes },\n get direction () { return _direction },\n get format () { return 'DDM' },\n\n isValid () {\n return is.integer(_degrees) && is.inRangeExclusiveMax(_minutes, 0, 60)\n },\n\n toString (decimalPlaces) {\n assert.that(decimalPlaces, is.positiveInteger, 'decimalPlaces must be a positive integer')\n if (!this.isValid()) return ''\n let str = `${_degrees}° ${_minutes.toFixed(decimalPlaces)}'`\n if (_direction) str += ` ${_direction}`\n return str\n },\n\n toDecimal () {\n if (!this.isValid()) return null\n return DD({ degrees: _degrees + _minutes / 60, direction: _direction })\n }\n }\n}\n","import { is, conform } from '@kalisio/common-core'\nimport { AXES } from '../axes.js'\nimport { isValidDirection, isEast, isWest, getDirectionSymbols } from '../directions.js'\nimport { DD } from './dd.js'\n\nconst SCHEMA = {\n degrees: is.nonNegativeInteger,\n minutes: (v) => is.inRangeExclusiveMax(v, 0, 60),\n direction: isValidDirection\n}\n\nfunction latRegex () {\n return new RegExp(`^(\\\\d{2})(\\\\d{3})([${getDirectionSymbols(AXES.LATITUDE).join('')}])$`, 'i')\n}\n\nfunction lonRegex () {\n return new RegExp(`^(\\\\d{3})(\\\\d{3})([${getDirectionSymbols(AXES.LONGITUDE).join('')}])$`, 'i')\n}\n\nexport function DDMAero (ddm) {\n let _degrees = null\n let _minutes = null\n let _direction = null\n\n if (is.plainObject(ddm) && conform.schema(ddm, SCHEMA)) {\n _degrees = ddm.degrees\n _minutes = ddm.minutes\n _direction = ddm.direction\n } else if (is.string(ddm)) {\n const pattern = ddm.trim()\n const match = pattern.match(latRegex()) ?? pattern.match(lonRegex())\n if (match) {\n _degrees = parseFloat(match[1])\n _minutes = parseFloat(match[2]) / 10\n _direction = match[3]\n }\n }\n\n return {\n get degrees () { return _degrees },\n get minutes () { return _minutes },\n get direction () { return _direction },\n get format () { return 'DDM_AERO' },\n\n isValid () {\n return is.nonNegativeInteger(_degrees) &&\n is.inRangeExclusiveMax(_minutes, 0, 60) &&\n isValidDirection(_direction)\n },\n\n toString () {\n if (!this.isValid()) return ''\n const isLon = isEast(_direction) || isWest(_direction)\n const deg = String(_degrees).padStart(isLon ? 3 : 2, '0')\n const min = Math.floor(_minutes * 10).toString().padStart(3, '0')\n return `${deg}${min}${_direction}`\n },\n\n toDecimal () {\n if (!this.isValid()) return null\n return DD({ degrees: _degrees + _minutes / 60, direction: _direction })\n }\n }\n}\n","import { assert, is, conform, optional } from '@kalisio/common-core'\nimport { isValidDirection, getDirectionSymbols } from '../directions.js'\nimport { DD } from './dd.js'\n\nconst SCHEMA = {\n degrees: is.integer,\n minutes: (v) => is.integer(v) && is.inRange(v, 0, 59),\n seconds: (v) => is.inRangeExclusiveMax(v, 0, 60),\n direction: optional(isValidDirection)\n}\n\nconst REGEX_SIGNED = /^(-?\\d{1,3})°(\\d{1,2})'(\\d{1,2}(?:\\.\\d+)?)\"?$/\n\nfunction dirRegex () {\n return new RegExp(`^(\\\\d{1,3})°(\\\\d{1,2})'(\\\\d{1,2}(?:\\\\.\\\\d+)?)\"?([${getDirectionSymbols().join('')}])$`, 'i')\n}\n\nexport function DMS (dms) {\n let _degrees = null\n let _minutes = null\n let _seconds = null\n let _direction = null\n\n if (is.plainObject(dms) && conform.schema(dms, SCHEMA)) {\n if (is.defined(dms.direction)) {\n if (dms.degrees >= 0) {\n _degrees = dms.degrees\n _minutes = dms.minutes\n _seconds = dms.seconds\n _direction = dms.direction\n }\n } else {\n _degrees = dms.degrees\n _minutes = dms.minutes\n _seconds = dms.seconds\n }\n } else if (is.string(dms)) {\n const pattern = dms.replace(/\\s+/g, '')\n const match = pattern.match(REGEX_SIGNED) ?? pattern.match(dirRegex())\n if (match) {\n _degrees = parseFloat(match[1])\n _minutes = parseFloat(match[2])\n _seconds = parseFloat(match[3])\n _direction = match[4] ?? null\n }\n }\n\n return {\n get degrees () { return _degrees },\n get minutes () { return _minutes },\n get seconds () { return _seconds },\n get direction () { return _direction },\n get format () { return 'DMS' },\n\n isValid () {\n return is.integer(_degrees) &&\n is.integer(_minutes) && is.inRange(_minutes, 0, 59) &&\n is.inRangeExclusiveMax(_seconds, 0, 60)\n },\n\n toString (decimalPlaces) {\n assert.that(decimalPlaces, is.positiveInteger, 'decimalPlaces must be a positive integer')\n if (!this.isValid()) return ''\n let str = `${_degrees}° ${_minutes}' ${_seconds.toFixed(decimalPlaces)}\"`\n if (_direction) str += ` ${_direction}`\n return str\n },\n\n toDecimal () {\n if (!this.isValid()) return null\n return DD({ degrees: _degrees + _minutes / 60 + _seconds / 3600, direction: _direction })\n }\n }\n}\n","import { assert } from '@kalisio/common-core'\nimport { DDM } from './ddm.js'\nimport { DDMAero } from './ddm-aero.js'\nimport { DMS } from './dms.js'\n\nfunction decimalToDDM (dd) {\n const degrees = Math.floor(dd.degrees)\n const minutes = (dd.degrees - degrees) * 60\n return { degrees, minutes, direction: dd.direction }\n}\n\nfunction decimalToDMS (dd) {\n const degrees = Math.floor(dd.degrees)\n const minutesDecimal = (dd.degrees - degrees) * 60\n const minutes = Math.floor(minutesDecimal)\n const seconds = (minutesDecimal - minutes) * 60\n return { degrees, minutes, seconds, direction: dd.direction }\n}\n\nexport const converter = {\n DD: (dd) => {\n assert.that(dd, (v) => v.isValid(), 'dd must be a valid coordinate')\n return dd\n },\n\n DDM: (dd) => {\n assert.that(dd, (v) => v.isValid(), 'dd must be a valid coordinate')\n const { degrees, minutes, direction } = decimalToDDM(dd)\n return DDM(direction ? { degrees, minutes, direction } : { degrees, minutes })\n },\n\n DMS: (dd) => {\n assert.that(dd, (v) => v.isValid(), 'dd must be a valid coordinate')\n const { degrees, minutes, seconds, direction } = decimalToDMS(dd)\n return DMS(direction ? { degrees, minutes, seconds, direction } : { degrees, minutes, seconds })\n },\n\n DDM_AERO: (dd) => {\n assert.that(dd, (v) => v.isValid(), 'dd must be a valid coordinate')\n const { degrees, minutes, direction } = decimalToDDM(dd)\n return DDMAero({ degrees, minutes, direction })\n }\n}\n","import { DD } from './dd.js'\nimport { DDM } from './ddm.js'\nimport { DDMAero } from './ddm-aero.js'\nimport { DMS } from './dms.js'\nexport * from './converter.js'\n\nexport const COORDINATE_FORMATS = {\n DD: 'DD',\n DDM: 'DDM',\n DDM_AERO: 'DDM_AERO',\n DMS: 'DMS'\n}\n\nexport const COORDINATE_MODELS = {\n DD,\n DDM,\n DDM_AERO: DDMAero,\n DMS\n}\n","import { assert, is, has } from '@kalisio/common-core/predicates'\nimport { AXES, isLatitude, isLongitude } from './axes.js'\nimport { isValidDirection, getDirectionAxis } from './directions.js'\nimport { COORDINATE_FORMATS, COORDINATE_MODELS, converter } from './coordinate-formats/index.js'\nexport { COORDINATE_FORMATS, COORDINATE_MODELS } from './coordinate-formats/index.js'\n\nexport const DEFAULT_COORDINATE_PRECISION = 7\nexport const MAX_COORDINATE_PRECISION = 8\nexport const COORDINATE_TRUNCATION_FACTORS = Array.from({ length: MAX_COORDINATE_PRECISION + 1 }, (_, i) => 10 ** i)\n\nexport function guessCoordinateAxis (coord, dir) {\n assert.that(coord, is.number, 'coord must be a number')\n if (is.defined(dir)) {\n assert.that(dir, isValidDirection, 'dir must be a direction')\n return getDirectionAxis(dir)\n }\n if (Math.abs(coord) > 90) return AXES.LONGITUDE\n return undefined\n}\n\nexport function getCoordinatePrecision (coord) {\n assert.that(coord, is.number, 'coord must be a number')\n const str = coord.toExponential()\n const [base, exp] = str.split('e').map(Number)\n const decimalsInBase = (base.toString().split('.')[1] || '').length\n return Math.max(0, decimalsInBase - exp)\n}\n\nexport function truncateCoordinate (coord, precision = DEFAULT_COORDINATE_PRECISION) {\n assert.all([\n {\n value: coord,\n validator: is.number,\n message: 'coord must be a number'\n },\n {\n value: precision,\n validator: (v) => is.inRange(v, 0, MAX_COORDINATE_PRECISION),\n message: `precision must be in range [0, ${MAX_COORDINATE_PRECISION}]`\n }\n ])\n const factor = COORDINATE_TRUNCATION_FACTORS[precision]\n return Math.round(coord * factor) / factor\n}\n\nexport function normalizeCoordinate (coord, axis) {\n assert.all([\n { value: coord, validator: is.number, message: 'coord must be a number' },\n { value: axis, validator: (v) => isLongitude(v) || isLatitude(v), message: 'axis must be either a longitude or latitude' }\n ])\n if (isLatitude(axis)) {\n return Math.max(-90, Math.min(90, coord))\n }\n let lon = ((coord + 180) % 360 + 360) % 360 - 180\n if (lon === -180) lon = 180\n if (Object.is(lon, -0)) lon = 0\n return lon\n}\n\nexport function convertCoordinate (from, to) {\n assert.all([\n { value: from, validator: (v) => is.defined(v) && v.isValid(), message: 'from must be a valid coordinate' },\n { value: to, validator: (v) => has.key(converter, v), message: `unknown format: ${to}` }\n ])\n const dd = from.format === COORDINATE_FORMATS.DD ? from : from.toDecimal()\n if (!dd.isValid()) return null\n if (to === COORDINATE_FORMATS.DD) {\n return dd\n }\n return converter[to](dd)\n}\n\nexport function parseCoordinate (pattern) {\n assert.that(pattern, is.nonEmptyString, 'pattern must be a non empty string')\n for (const format of Object.keys(COORDINATE_FORMATS)) {\n const coord = COORDINATE_MODELS[format](pattern)\n if (coord.isValid()) return coord\n }\n return null\n}\n","import { a as i, i as a, o as c, c as f } from \"./optional-C8lnNAGJ.js\";\nimport { isEmpty as C } from \"lodash-es\";\nconst U = {\n toBase64(e) {\n i.that(\n e,\n (o) => typeof o == \"string\" || o instanceof ArrayBuffer || ArrayBuffer.isView(o),\n \"value must be a string, ArrayBuffer or ArrayBufferView\"\n );\n const t = typeof e == \"string\" ? new TextEncoder().encode(e) : e, r = ArrayBuffer.isView(t) ? new Uint8Array(t.buffer, t.byteOffset, t.byteLength) : new Uint8Array(t), n = 32768, s = [];\n for (let o = 0; o < r.length; o += n)\n s.push(String.fromCharCode.apply(null, r.subarray(o, o + n)));\n return btoa(s.join(\"\"));\n },\n fromBase64Bytes(e) {\n return i.that(e, a.string, \"value must be a string\"), Uint8Array.from(atob(e), (t) => t.charCodeAt(0));\n },\n fromBase64(e) {\n return i.that(e, a.string, \"value must be a string\"), new TextDecoder().decode(U.fromBase64Bytes(e));\n },\n toHex(e) {\n return i.that(\n e,\n (t) => t instanceof ArrayBuffer || ArrayBuffer.isView(t),\n \"value must be an ArrayBuffer or ArrayBufferView\"\n ), Array.from(new Uint8Array(e)).map((t) => t.toString(16).padStart(2, \"0\")).join(\"\");\n },\n fromHex(e) {\n i.that(e, a.hex, \"value must be an hex string\");\n const t = new Uint8Array(e.length / 2);\n for (let r = 0; r < e.length; r += 2)\n t[r / 2] = parseInt(e.slice(r, r + 2), 16);\n return t;\n },\n dataUriToBlob(e) {\n i.that(e, a.dataUri, \"value must be a valid data URI\");\n const [t, r] = e.split(\",\"), n = t.split(\":\")[1].split(\";\")[0], s = atob(r), o = new ArrayBuffer(s.length), u = new Uint8Array(o);\n for (let l = 0; l < s.length; l++)\n u[l] = s.charCodeAt(l);\n return new Blob([o], { type: n });\n }\n}, P = {\n browser: typeof window < \"u\" && typeof window.document < \"u\",\n node: typeof process < \"u\" && process.versions?.node != null,\n worker: typeof WorkerGlobalScope < \"u\" && self instanceof WorkerGlobalScope,\n serviceWorker: typeof ServiceWorkerGlobalScope < \"u\" && self instanceof ServiceWorkerGlobalScope,\n test: typeof process < \"u\" && process.env.NODE_ENV === \"test\",\n dev: typeof process < \"u\" && process.env.NODE_ENV === \"development\",\n prod: typeof process < \"u\" && process.env.NODE_ENV === \"production\"\n}, g = {\n SIZE_UNITS: {\n B: \"B\",\n KB: \"KB\",\n MB: \"MB\",\n GB: \"GB\"\n },\n parse(e) {\n i.that(e, a.string, \"filePath must be a string\");\n const t = e.replace(/\\\\/g, \"/\"), r = t.lastIndexOf(\"/\"), n = r === -1 ? \".\" : t.substring(0, r), s = t.slice(r + 1), o = s.split(\".\"), u = o[0] === \"\" && o.length === 2, l = o.length <= 1 || u ? \"\" : \".\" + o.slice(1).join(\".\"), d = l ? s.slice(0, -l.length) : s;\n return { fileName: s, extension: l, baseName: d, dir: n };\n },\n formatSize(e) {\n i.that(e, a.number, \"bytes must be a number\");\n let t, r;\n return e < 1024 ? (t = e, r = g.SIZE_UNITS.B) : e < 1024 ** 2 ? (t = e / 1024, r = g.SIZE_UNITS.KB) : e < 1024 ** 3 ? (t = e / 1024 ** 2, r = g.SIZE_UNITS.MB) : (t = e / 1024 ** 3, r = g.SIZE_UNITS.GB), {\n value: Number.isInteger(t) ? t : parseFloat(t.toFixed(2)),\n unit: r\n };\n }\n}, T = {\n get() {\n return typeof navigator < \"u\" ? navigator.languages?.[0] ?? navigator.language : Intl.DateTimeFormat().resolvedOptions().locale;\n },\n getCodes() {\n const { language: e, script: t, region: r } = new Intl.Locale(this.get());\n return { language: e, script: t, region: r };\n }\n}, b = {\n clamp(e, t, r) {\n return i.all([\n { value: e, validator: a.number, message: \"value must be a number\" },\n { value: t, validator: a.number, message: \"min must be a number\" },\n { value: r, validator: a.number, message: \"max must be a number\" }\n ]), Math.min(Math.max(e, t), r);\n },\n round(e, t = 2) {\n i.all([\n { value: e, validator: a.number, message: \"value must be a number\" },\n { value: t, validator: a.nonNegativeInteger, message: \"precision must be a non-negative integer\" }\n ]);\n const r = 10 ** t;\n return Math.round(e * r) / r;\n },\n sign(e, t = 0) {\n return i.all([\n { value: e, validator: a.number, message: \"value must be a number\" },\n { value: t, validator: a.nonNegative, message: \"epsilon must be a non-negative number\" }\n ]), e > t ? 1 : e < -t ? -1 : 0;\n },\n percentage(e, t) {\n return i.all([\n { value: e, validator: a.number, message: \"value must be a number\" },\n { value: t, validator: a.number, message: \"total must be a number\" }\n ]), b.round(e / t * 100, 2);\n },\n exponential(e, t = 2) {\n if (i.all([\n { value: e, validator: a.number, message: \"value must be a number\" },\n { value: t, validator: a.nonNegativeInteger, message: \"decimals must be a non-negative integer\" }\n ]), e === 0) return `0.${\"0\".repeat(t)}e+0`;\n const r = Math.floor(Math.log10(Math.abs(e)));\n return `${(e / Math.pow(10, r)).toFixed(t)}e${r >= 0 ? \"+\" : \"\"}${r}`;\n },\n linear(e, t = 0, r = 1) {\n return i.all([\n { value: e, validator: (n) => a.inRange(n, 0, 1), message: \"t must be in range [0, 1]\" },\n { value: t, validator: a.number, message: \"initial must be a number\" },\n { value: r, validator: a.number, message: \"final must be a number\" }\n ]), t + e * (r - t);\n },\n to: {\n radians(e) {\n return i.that(e, a.number, \"degrees must be a number\"), e * Math.PI / 180;\n },\n degrees(e) {\n return i.that(e, a.number, \"radians must be a number\"), e * 180 / Math.PI;\n }\n },\n pow: {\n square(e) {\n return i.that(e, a.number, \"value must be a number\"), e * e;\n },\n cube(e) {\n return i.that(e, a.number, \"value must be a number\"), b.pow.square(e) * e;\n }\n },\n ease: {\n in(e, t = 0.5) {\n return i.all([\n { value: e, validator: (r) => a.inRange(r, 0, 1), message: \"t must be in range [0, 1]\" },\n { value: t, validator: a.number, message: \"linearity must be a number\" }\n ]), Math.pow(e, 1 / t);\n },\n out(e, t = 0.5) {\n return i.all([\n { value: e, validator: (r) => a.inRange(r, 0, 1), message: \"t must be in range [0, 1]\" },\n { value: t, validator: a.number, message: \"linearity must be a number\" }\n ]), 1 - Math.pow(1 - e, 1 / t);\n },\n cubicBezier(e, t = 0.42, r = 0, n = 0.58, s = 1) {\n i.that(e, (d) => a.inRange(d, 0, 1), \"t must be in range [0, 1]\");\n const o = 1 - e, u = e * e, l = o * o;\n return l * o * r + 3 * l * e * t + 3 * o * u * n + u * e * s;\n }\n },\n stats: {\n sum(e) {\n return i.that(e, a.array, \"values must be an array\"), e.reduce((t, r) => t + r, 0);\n },\n average(e) {\n return i.that(e, a.nonEmptyArray, \"values must be a non-empty array\"), b.stats.sum(e) / e.length;\n },\n median(e) {\n i.that(e, a.nonEmptyArray, \"values must be a non-empty array\");\n const t = [...e].sort((n, s) => n - s), r = Math.floor(t.length / 2);\n return t.length % 2 === 0 ? b.linear(0.5, t[r - 1], t[r]) : t[r];\n }\n }\n}, A = {\n ignoreSpaces: c(a.boolean),\n ignoreDiacritics: c(a.boolean),\n ignoreCase: c(a.boolean),\n locale: c(a.string)\n}, N = {\n ...A\n}, m = {\n DIACRITICS: {\n a: \"aáàäâã\",\n e: \"eéëèê\",\n i: \"iíïìî\",\n o: \"oóöòõô\",\n u: \"uüúùû\",\n c: \"cç\"\n },\n normalize(e, t = {}) {\n i.all([\n { value: e, validator: a.string, message: \"str must be a string\" },\n { value: t, validator: (l) => f.schema(l, A) }\n ]);\n const {\n ignoreSpaces: r = !1,\n ignoreDiacritics: n = !1,\n ignoreCase: s = !1,\n locale: o = void 0\n // 'fr-FR'\n } = t;\n let u = e;\n return r && (u = u.replace(/\\s+/g, \" \").trim()), n && (u = u.normalize(\"NFKD\").replace(new RegExp(\"\\\\p{M}\", \"gu\"), \"\")), s && (u = u.toLocaleLowerCase(o)), u;\n },\n compare(e, t, r = {}) {\n i.all([\n { value: e, validator: a.string, message: \"str1 must be a string\" },\n { value: t, validator: a.string, message: \"str2 must be a string\" },\n { value: r, validator: (u) => f.schema(u, N) }\n ]);\n const n = { ignoreDiacritics: !0, ignoreCase: !0, ...r }, s = m.normalize(e, n), o = m.normalize(t, n);\n return s.localeCompare(o, r.locale);\n },\n makeDiacriticPattern(e, t = {}) {\n i.that(e, a.string, \"pattern must be a string\");\n const { reverse: r = !1 } = t ?? {};\n let n = \"\";\n for (const s of e) {\n const o = s.toLowerCase();\n let u = null;\n for (const l of Object.values(this.DIACRITICS))\n if (r && l.includes(o) || !r && l.startsWith(o)) {\n u = l;\n break;\n }\n u ? n += `[${u}]` : n += s;\n }\n return n;\n },\n slugify(e, t = \"-\") {\n return i.all([\n { value: e, validator: a.string, message: \"str must be a string\" },\n { value: t, validator: a.char, message: \"separator must be a char\" }\n ]), m.normalize(e.trim(), { ignoreDiacritics: !0 }).toLowerCase().replace(/[^a-z0-9]+/gi, t).replace(new RegExp(`^${t}|${t}$`, \"g\"), \"\");\n },\n initials(e, t = {}) {\n i.that(e, a.string, \"str must be a string\");\n const { max: r = void 0 } = t, n = e.trim().split(/\\s+/).map((s) => s[0].toUpperCase());\n return (r ? n.slice(0, r) : n).join(\"\");\n }\n}, h = {\n ignoreSpaces: c(a.boolean),\n ignoreDiacritics: c(a.boolean),\n ignoreCase: c(a.boolean),\n locale: c(a.string)\n}, M = {\n ...h,\n ignoredKeys: c(a.array)\n};\nfunction y(e, t = {}) {\n if (!a.defined(e)) return e;\n const r = t?.ignoredKeys ?? [], n = { ignoreDiacritics: !1, ignoreCase: !1, locale: t.locale };\n return a.array(e) ? e.map((s) => y(s, t)).sort(\n (s, o) => m.compare(JSON.stringify(s), JSON.stringify(o), n)\n ) : a.plainObject(e) ? Object.fromEntries(\n Object.entries(e).filter(([s]) => !r.includes(s)).sort(([s], [o]) => m.compare(s, o, n)).map(([s, o]) => [\n s,\n y(o, t)\n ])\n ) : a.string(e) ? m.normalize(e, t) : e;\n}\nconst D = {\n clone(e) {\n return i.that(e, a.defined, \"obj must be defined\"), structuredClone(e);\n },\n normalize(e, t = {}) {\n return i.all([\n { value: e, validator: (r) => a.array(r) || a.plainObject(r), message: \"obj must be an array or a plain object\" },\n { value: t, validator: (r) => f.schema(r, M) }\n ]), y(e, t);\n },\n reorder(e, t, r = {}) {\n i.all([\n { value: e, validator: a.plainObject, message: \"obj must be a plain object\" },\n { value: t, validator: a.string, message: \"property must be a string\" },\n { value: r, validator: (s) => f.schema(s, h) }\n ]);\n const n = (s, o) => m.compare(s[t], o[t], r);\n return Object.fromEntries(\n Object.entries(e).sort(([, s], [, o]) => n(s, o))\n );\n },\n lookup(e, t) {\n return i.all([\n { value: e, validator: a.defined, message: \"obj must be defined\" },\n { value: t, validator: a.nonEmptyString, message: \"path must be a non empty string\" }\n ]), t.split(\".\").reduce((r, n) => r?.[n], e);\n },\n dotify(e) {\n i.that(e, a.plainObject, \"obj must be a plain object\");\n const t = {};\n function r(n, s) {\n for (const [o, u] of Object.entries(n)) {\n const l = s ? `${s}.${o}` : o;\n u && typeof u == \"object\" && !C(u) ? r(u, l) : t[l] = u;\n }\n }\n return r(e), t;\n },\n sort(e, t, r = {}) {\n return i.all([\n { value: e, validator: a.array, message: \"arr must be an array\" },\n { value: t, validator: a.string, message: \"property must be a string\" },\n { value: r, validator: (n) => f.schema(n, h) }\n ]), [...e].sort((n, s) => m.compare(n[t], s[t], r));\n }\n}, I = {\n QUERYABLE_SYMBOL: /* @__PURE__ */ Symbol(\"queryablePromise\"),\n createQueryable(e) {\n i.that(\n e,\n (s) => typeof s == \"function\" || s instanceof Promise,\n \"promiseOrExecutor must be a Promise or an executor function\"\n );\n const t = typeof e == \"function\" ? new Promise(e) : e;\n if (t[I.QUERYABLE_SYMBOL]) return t;\n let r = \"pending\";\n const n = t.then(\n (s) => (r = \"fulfilled\", s),\n (s) => {\n throw r = \"rejected\", s;\n }\n );\n return Object.defineProperty(n, I.QUERYABLE_SYMBOL, {\n value: !0,\n enumerable: !1\n }), n.isPending = () => r === \"pending\", n.isFulfilled = () => r === \"fulfilled\", n.isRejected = () => r === \"rejected\", n.getStatus = () => r, n;\n }\n}, $ = /^([a-z][a-z0-9+.-]*:\\/\\/)([^/?#]+)(\\/[^?#]*)?(\\?[^#]*)?(#.*)?$/i;\nfunction p(e) {\n const t = e.match($);\n if (!t) return null;\n const [, r, n, s = \"\", o = \"\", u = \"\"] = t;\n return { scheme: r, authority: n, path: s || \"/\", query: o, fragment: u };\n}\nfunction B(e) {\n const t = e.split(\",\");\n let r = \"\";\n const n = t[0].lastIndexOf(\"@\");\n return n !== -1 && (r = t[0].slice(0, n), t[0] = t[0].slice(n + 1)), { userinfo: r, hosts: t };\n}\nfunction j(e) {\n const t = e.lastIndexOf(\":\");\n return t === -1 ? { host: e, port: null } : { host: e.slice(0, t), port: e.slice(t + 1) };\n}\nfunction v({ scheme: e, authority: t, path: r, query: n, fragment: s }) {\n return `${e}${t}${r}${n}${s}`;\n}\nfunction w(e) {\n const t = e.startsWith(\"?\") ? e.slice(1) : e;\n return t ? t.split(\"&\").filter(Boolean).map((r) => {\n const n = r.indexOf(\"=\");\n return n === -1 ? [r, \"\"] : [r.slice(0, n), r.slice(n + 1)];\n }) : [];\n}\nconst x = {\n parse(e, t = 80) {\n i.all([\n { value: e, validator: a.url, message: \"url must be an url\" },\n { value: t, validator: a.number, message: \"defaultPort must be a number\" }\n ]);\n const r = p(e), { hosts: n } = B(r.authority), s = {};\n for (const [o, u] of w(r.query))\n s[decodeURIComponent(o)] = decodeURIComponent(u);\n return {\n hosts: n.map((o) => {\n const { host: u, port: l } = j(o);\n return { host: u, port: l ? Number(l) : t };\n }),\n path: r.path,\n query: s\n };\n },\n build(e, t) {\n return i.all([\n { value: e, validator: a.url, message: \"baseUrl must be an url\" },\n { value: t, validator: a.nonEmptyObject, message: \"params must be a non empty object\" }\n ]), x.addQueryParam(e, t);\n },\n addQueryParam(e, t) {\n i.all([\n { value: e, validator: a.url, message: \"url must be an url\" },\n { value: t, validator: a.nonEmptyObject, message: \"params must be a non empty object\" }\n ]);\n const r = p(e), n = w(r.query);\n for (const [u, l] of Object.entries(t)) {\n if (!a.defined(l)) continue;\n const d = encodeURIComponent(u), S = encodeURIComponent(String(l)), O = n.find(([E]) => E === d);\n O ? O[1] = S : n.push([d, S]);\n }\n const s = n.map(([u, l]) => `${u}=${l}`).join(\"&\"), o = n.length ? `?${s}` : \"\";\n return v({ ...r, query: o });\n },\n encode(e) {\n return i.that(e, a.url, \"url must be an url\"), encodeURI(e);\n },\n obfuscate(e, t = \"*****\") {\n i.all([\n { value: e, validator: a.url, message: \"url must be an url\" },\n { value: t, validator: a.string, message: \"mask must be a string\" }\n ]);\n const r = p(e), { userinfo: n, hosts: s } = B(r.authority);\n if (!n) return v(r);\n const l = `${n.indexOf(\":\") === -1 ? t : `${t}:${t}`}@${s.join(\",\")}`;\n return v({ ...r, authority: l });\n }\n};\nexport {\n U as b,\n P as e,\n g as f,\n T as l,\n b as m,\n D as o,\n I as p,\n m as s,\n x as u\n};\n//# sourceMappingURL=url-CT_AHms1.js.map\n","import { math } from '@kalisio/common-core/utilities'\n\nconst DEG_TO_RAD = math.to.radians(1)\n\nconst ANGULAR_TOLERANCE = 1e-12\n\n// ─── Conversion & vector algebra ─────────────────────────────────────────────\n\nexport function positionToNVector (position) {\n const lon = position[0] * DEG_TO_RAD\n const lat = position[1] * DEG_TO_RAD\n const cosLat = Math.cos(lat)\n return [cosLat * Math.cos(lon), cosLat * Math.sin(lon), Math.sin(lat)]\n}\n\nexport function nVectorToPosition (vector) {\n const lon = Math.atan2(vector[1], vector[0])\n const lat = Math.asin(vector[2])\n return [lon / DEG_TO_RAD, lat / DEG_TO_RAD]\n}\n\nexport function dotNVectors (v1, v2) {\n return v1[0] * v2[0] + v1[1] * v2[1] + v1[2] * v2[2]\n}\n\nexport function crossNVectors (v1, v2) {\n return [\n v1[1] * v2[2] - v1[2] * v2[1],\n v1[2] * v2[0] - v1[0] * v2[2],\n v1[0] * v2[1] - v1[1] * v2[0]\n ]\n}\n\nexport function addNVectors (v1, v2) {\n return [v1[0] + v2[0], v1[1] + v2[1], v1[2] + v2[2]]\n}\n\nexport function scaleNVector (vector, scalar) {\n return [vector[0] * scalar, vector[1] * scalar, vector[2] * scalar]\n}\n\nexport function getNVectorNorm (vector) {\n return Math.sqrt(vector[0] * vector[0] + vector[1] * vector[1] + vector[2] * vector[2])\n}\n\nexport function normalizeNVector (vector) {\n const norm = getNVectorNorm(vector)\n return [vector[0] / norm, vector[1] / norm, vector[2] / norm]\n}\n\n// ─── Spherical geometry ──────────────────────────────────────────────────────\n\nexport function angleBetweenNVectors (v1, v2) {\n return Math.atan2(getNVectorNorm(crossNVectors(v1, v2)), dotNVectors(v1, v2))\n}\n\n// Unit vector pointing north in the tangent plane at origin (origin x east).\nexport function northNVector (origin) {\n return crossNVectors(origin, eastNVector(origin))\n}\n\n// Unit vector pointing east in the tangent plane at origin.\nexport function eastNVector (origin) {\n const pole = [0, 0, 1]\n return normalizeNVector(crossNVectors(pole, origin))\n}\n\nexport function southNVector (origin) {\n return scaleNVector(northNVector(origin), -1)\n}\n\nexport function westNVector (origin) {\n return scaleNVector(eastNVector(origin), -1)\n}\n\nexport function bearingNVector (origin, bearing) {\n const north = northNVector(origin)\n const east = eastNVector(origin)\n return addNVectors(\n scaleNVector(north, Math.cos(bearing)),\n scaleNVector(east, Math.sin(bearing))\n )\n}\n\nexport function destinationNVector (origin, bearing, angularDistance) {\n const direction = bearingNVector(origin, bearing)\n return addNVectors(\n scaleNVector(origin, Math.cos(angularDistance)),\n scaleNVector(direction, Math.sin(angularDistance))\n )\n}\n\nexport function crossNVectorArcs (v1, v2, v3, v4, tolerance = ANGULAR_TOLERANCE) {\n const n12 = crossNVectors(v1, v2)\n const n34 = crossNVectors(v3, v4)\n const length12 = getNVectorNorm(n12)\n const length34 = getNVectorNorm(n34)\n if (length12 <= tolerance || length34 <= tolerance) return false\n const s123 = math.sign(dotNVectors(n12, v3) / length12, tolerance)\n const s124 = math.sign(dotNVectors(n12, v4) / length12, tolerance)\n if (s123 * s124 !== -1) return false\n const s341 = math.sign(dotNVectors(n34, v1) / length34, tolerance)\n const s342 = math.sign(dotNVectors(n34, v2) / length34, tolerance)\n return s341 * s342 === -1\n}\n","import proj4 from 'proj4'\nimport { assert, is } from '@kalisio/common-core/predicates'\n\nexport const WGS84 = 'WGS84'\n\nconst WGS84_DEFINITION = '+proj=longlat +datum=WGS84 +no_defs'\n\nconst DEFAULT_PROJECTIONS = {\n WGS84: WGS84_DEFINITION,\n 'CRS:84': WGS84_DEFINITION,\n CRS84: WGS84_DEFINITION,\n 'urn:ogc:def:crs:OGC:1.3:CRS84': WGS84_DEFINITION,\n 'urn:ogc:def:crs:OGC:2:84': WGS84_DEFINITION,\n 'urn:ogc:def:crs:EPSG::4326': WGS84_DEFINITION,\n 'EPSG:2154': '+proj=lcc +lat_1=49 +lat_2=44 +lat_0=46.5 +lon_0=3 +x_0=700000 +y_0=6600000 +ellps=GRS80 +units=m +no_defs'\n}\n\nfor (const [name, definition] of Object.entries(DEFAULT_PROJECTIONS)) {\n if (!proj4.defs(name)) proj4.defs(name, definition)\n}\n\nconst EPSG_URN_REGEXP = /^urn:ogc:def:crs:EPSG::(\\d+)$/i\n\nexport function normalizeCrsName (name) {\n assert.that(name, is.nonEmptyString, 'name must be a non empty string')\n const match = name.match(EPSG_URN_REGEXP)\n return match ? `EPSG:${match[1]}` : name\n}\n\nexport function listProjections () {\n return Object.keys(proj4.defs)\n}\n\nexport function defineProjection (name, definition) {\n assert.all([\n {\n value: name,\n validator: is.nonEmptyString,\n message: 'name must be a non empty string'\n },\n {\n value: definition,\n validator: v => is.nonEmptyString(v) || is.nonEmptyObject(v),\n message: 'definition must be a non empty string or a non empty object'\n }\n ])\n proj4.defs(name, definition)\n}\n\nexport function hasProjection (name) {\n assert.that(name, is.nonEmptyString, 'name must be a non empty string')\n return is.defined(proj4.defs(name))\n}\n\nexport function getProjection (name) {\n assert.that(name, is.nonEmptyString, 'name must be a non empty string')\n return proj4.defs(name)\n}\n\nexport function isWGS84Projection (name) {\n assert.that(name, is.nonEmptyString, 'name must be a non empty string')\n const definition = proj4.defs(name)\n if (!definition) return false\n const wgs84 = proj4.defs('EPSG:4326')\n return definition.projName === wgs84.projName &&\n definition.datumCode === wgs84.datumCode\n}\n","import proj4 from 'proj4'\nimport { assert, is, conform, optional } from '@kalisio/common-core/predicates'\nimport { math } from '@kalisio/common-core/utilities'\nimport { AXES } from './axes.js'\nimport { isWest, isSouth } from './directions.js'\nimport {\n DEFAULT_COORDINATE_PRECISION,\n MAX_COORDINATE_PRECISION,\n guessCoordinateAxis,\n parseCoordinate,\n truncateCoordinate\n} from './coordinate.js'\nimport {\n positionToNVector,\n nVectorToPosition,\n angleBetweenNVectors,\n destinationNVector\n} from './nvector.js'\nimport { hasProjection } from './projections.js'\n\nexport const IS_SAME_POSITION_OPTIONS_SCHEMA = {\n precision: optional(is.number),\n consider3D: optional(is.boolean)\n}\n\nexport const EARTH_RADIUS = 6371008.8\n\nexport function parsePosition (pattern) {\n assert.that(pattern, (v) => is.nonEmptyString(v), 'pattern must be a non-empty string')\n const parts = pattern.split(/[,;|]/)\n if (parts.length !== 2) return null\n const [first, second] = parts.map(parseCoordinate)\n if (!first || !second) return null\n const firstDD = first.toDecimal()\n const secondDD = second.toDecimal()\n const firstAxis = guessCoordinateAxis(firstDD.degrees, firstDD.direction)\n const secondAxis = guessCoordinateAxis(secondDD.degrees, secondDD.direction)\n // Apply signedDegrees based on direction\n const signedDegrees = (dd) => {\n const { degrees, direction } = dd\n if (!direction) return degrees\n return (isWest(direction) || isSouth(direction)) ? -degrees : degrees\n }\n if (firstAxis === AXES.LONGITUDE && secondAxis === AXES.LATITUDE) return [signedDegrees(firstDD), signedDegrees(secondDD)]\n if (secondAxis === AXES.LONGITUDE && firstAxis === AXES.LATITUDE) return [signedDegrees(secondDD), signedDegrees(firstDD)]\n if (firstAxis === AXES.LONGITUDE && !secondAxis) return [signedDegrees(firstDD), signedDegrees(secondDD)]\n if (firstAxis === AXES.LATITUDE && !secondAxis) return [signedDegrees(secondDD), signedDegrees(firstDD)]\n if (secondAxis === AXES.LONGITUDE && !firstAxis) return [signedDegrees(secondDD), signedDegrees(firstDD)]\n if (secondAxis === AXES.LATITUDE && !firstAxis) return [signedDegrees(firstDD), signedDegrees(secondDD)]\n if (!firstAxis && !secondAxis) {\n return [\n [signedDegrees(firstDD), signedDegrees(secondDD)],\n [signedDegrees(secondDD), signedDegrees(firstDD)]\n ]\n }\n return null\n}\n\nexport function isValidPosition (coordinates) {\n if (!is.arrayOfLengthBetween(coordinates, 2, 3)) return false\n return coordinates.every(is.number)\n}\n\nexport function is3DPosition (position) {\n assert.that(position, isValidPosition, 'position must be a valid position')\n return is.arrayOfLength(position, 3)\n}\n\nexport function isSamePosition (position1, position2, options = {}) {\n assert.all([\n {\n value: position1,\n validator: isValidPosition,\n message: 'position1 must be a valid position'\n },\n {\n value: position2,\n validator: isValidPosition,\n message: 'position2 must be a valid position'\n },\n {\n value: options,\n validator: (v) => conform.schema(v, IS_SAME_POSITION_OPTIONS_SCHEMA),\n message: 'options must be a valid options object'\n }\n ])\n const { precision = DEFAULT_COORDINATE_PRECISION, consider3D = false } = options\n const length = consider3D ? Math.max(position1.length, position2.length) : 2\n return Array.from({ length }, (_, i) =>\n (position1[i] ?? 0).toFixed(precision) === (position2[i] ?? 0).toFixed(precision)\n ).every(Boolean)\n}\n\nexport function truncatePosition (position, precision = DEFAULT_COORDINATE_PRECISION) {\n assert.all([\n {\n value: position,\n validator: isValidPosition,\n message: 'position must be a position'\n },\n {\n value: precision,\n validator: (v) => is.inRange(v, 0, MAX_COORDINATE_PRECISION),\n message: `precision must be in range [0, ${MAX_COORDINATE_PRECISION}]`\n }\n ])\n for (let i = 0; i < position.length; i++) {\n position[i] = truncateCoordinate(position[i], precision)\n }\n return position\n}\n\nexport function reprojectPosition (position, source, target) {\n assert.all([\n {\n value: position,\n validator: isValidPosition,\n message: 'position must be a valid position'\n },\n {\n value: source,\n validator: hasProjection,\n message: `unknown source projection: ${source}`\n },\n {\n value: target,\n validator: hasProjection,\n message: `unknown target projection: ${target}`\n }\n ])\n return proj4(source, target, position)\n}\n\nexport function destinationFromPosition (position, bearing, distance) {\n assert.all([\n { value: position, validator: isValidPosition, message: 'position must be a valid position' },\n { value: bearing, validator: is.number, message: 'bearing must be a number' },\n { value: distance, validator: is.number, message: 'distance must be a number' }\n ])\n const destination = destinationNVector(\n positionToNVector(position),\n math.to.radians(bearing),\n distance / EARTH_RADIUS\n )\n return nVectorToPosition(destination)\n}\n\nexport function distanceBetweenPositions (position1, position2) {\n assert.all([\n { value: position1, validator: isValidPosition, message: 'position1 must be a valid position' },\n { value: position2, validator: isValidPosition, message: 'position2 must be a valid position' }\n ])\n return angleBetweenNVectors(positionToNVector(position1), positionToNVector(position2)) * EARTH_RADIUS\n}\n","import { assert, is, conform, optional } from '@kalisio/common-core/predicates'\nimport {\n DEFAULT_COORDINATE_PRECISION,\n MAX_COORDINATE_PRECISION,\n truncateCoordinate\n} from './coordinate.js'\nimport { isValidPosition, is3DPosition } from './position.js'\n\nexport function isValidBBox (bbox) {\n if (!is.arrayOfLength(bbox, 4) && !is.arrayOfLength(bbox, 6)) return false\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 if (!isValidPosition(min)) return false\n if (!isValidPosition(max)) return false\n const [, south] = min\n const [, north] = max\n if (south > north) return false\n if (!is2D && bbox[2] > bbox[5]) return false\n return true\n}\n\nexport function is3DBBox (bbox) {\n assert.that(bbox, isValidBBox, 'bbox must be a valid bounding-box')\n return is.arrayOfLength(bbox, 6)\n}\n\nexport function mergeBBox (bbox1, bbox2) {\n assert.all([\n { value: bbox1, validator: isValidBBox, message: 'bbox1 must be a valid bounding-box' },\n { value: bbox2, validator: isValidBBox, message: 'bbox2 must be a valid bounding-box' }\n ])\n if (is3DBBox(bbox1) && is3DBBox(bbox2)) {\n return [\n Math.min(bbox1[0], bbox2[0]),\n Math.min(bbox1[1], bbox2[1]),\n Math.min(bbox1[2], bbox2[2]),\n Math.max(bbox1[3], bbox2[3]),\n Math.max(bbox1[4], bbox2[4]),\n Math.max(bbox1[5], bbox2[5])\n ]\n }\n return [\n Math.min(bbox1[0], bbox2[0]),\n Math.min(bbox1[1], bbox2[1]),\n Math.max(bbox1[2], bbox2[2]),\n Math.max(bbox1[3], bbox2[3])\n ]\n}\n\nconst COMPUTE_BBOX_OPTIONS_SCHEMA = {\n ignore3D: optional(is.boolean)\n}\n\nexport function computeBBox (positions, options = {}) {\n assert.all([\n {\n value: positions,\n validator: is.nonEmptyArray,\n message: 'positions must be a non-empty array'\n },\n {\n value: positions,\n validator: (v) => v.every(isValidPosition),\n message: 'positions must be an array of valid positions'\n },\n {\n value: options,\n validator: (v) => conform.schema(v, COMPUTE_BBOX_OPTIONS_SCHEMA),\n message: 'options must be a valid options object'\n }\n ])\n const { ignore3D = false } = options\n const has3D = !ignore3D && positions.some(is3DPosition)\n if (has3D) {\n return positions.reduce((acc, pos) => [\n Math.min(acc[0], pos[0]),\n Math.min(acc[1], pos[1]),\n Math.min(acc[2], pos[2] ?? 0),\n Math.max(acc[3], pos[0]),\n Math.max(acc[4], pos[1]),\n Math.max(acc[5], pos[2] ?? 0)\n ], [Infinity, Infinity, Infinity, -Infinity, -Infinity, -Infinity])\n }\n return positions.reduce((acc, pos) => [\n Math.min(acc[0], pos[0]),\n Math.min(acc[1], pos[1]),\n Math.max(acc[2], pos[0]),\n Math.max(acc[3], pos[1])\n ], [Infinity, Infinity, -Infinity, -Infinity])\n}\n\nexport function truncateBBox (bbox, precision = DEFAULT_COORDINATE_PRECISION) {\n assert.all([\n {\n value: bbox,\n validator: isValidBBox,\n message: 'bbox must be a valid bounding box'\n },\n {\n value: precision,\n validator: (v) => is.inRange(v, 0, MAX_COORDINATE_PRECISION),\n message: `precision must be in range [0, ${MAX_COORDINATE_PRECISION}]`\n }\n ])\n for (let i = 0; i < bbox.length; i++) {\n bbox[i] = truncateCoordinate(bbox[i], precision)\n }\n return bbox\n}\n","import { assert, is, conform, optional } from '@kalisio/common-core/predicates'\nimport { DEFAULT_COORDINATE_PRECISION } from './coordinate.js'\nimport {\n isValidPosition,\n isSamePosition,\n IS_SAME_POSITION_OPTIONS_SCHEMA,\n truncatePosition,\n reprojectPosition\n} from './position.js'\n\nexport const TRUNCATE_POSITIONS_OPTIONS_SCHEMA = {\n ...IS_SAME_POSITION_OPTIONS_SCHEMA,\n deduplicate: optional(is.boolean)\n}\n\nexport function isValidPositions (positions) {\n return is.array(positions) && positions.every(isValidPosition)\n}\n\nexport function deduplicatePositions (positions, options = {}) {\n assert.that(options, (v) => conform.schema(v, IS_SAME_POSITION_OPTIONS_SCHEMA), 'options must be a valid options object')\n const { precision = DEFAULT_COORDINATE_PRECISION, consider3D = false } = options\n const result = []\n for (const position of positions) {\n const previous = result[result.length - 1]\n if (!previous || !isSamePosition(position, previous, { precision, consider3D })) {\n result.push(position)\n }\n }\n return result\n}\n\nexport function truncatePositions (positions, options = {}) {\n assert.all([\n {\n value: positions,\n validator: is.array,\n message: 'positions must be an array'\n },\n {\n value: options,\n validator: (v) => conform.schema(v, TRUNCATE_POSITIONS_OPTIONS_SCHEMA),\n message: 'options must be a valid options object'\n }\n ])\n const { precision = DEFAULT_COORDINATE_PRECISION, deduplicate = false, consider3D = false } = options\n const truncated = positions.map((position) => truncatePosition(position, precision))\n return deduplicate ? deduplicatePositions(truncated, { precision, consider3D }) : truncated\n}\n\nexport function reprojectPositions (positions, source, target) {\n assert.that(positions, is.array, 'positions must be an array')\n return positions.map((position) => reprojectPosition(position, source, target))\n}\n","import { assert, is } from '@kalisio/common-core/predicates'\nimport { distanceBetweenPositions } from './position.js'\nimport { isValidPositions } from './positions.js'\n\nexport function isValidLine (line) {\n return is.arrayOfLengthAtLeast(line, 2) && isValidPositions(line)\n}\n\nexport function lineLength (line) {\n assert.that(line, isValidPositions, 'line must be a valid array of positions')\n let total = 0\n for (let i = 0; i < line.length - 1; i++) {\n total += distanceBetweenPositions(line[i], line[i + 1])\n }\n return total\n}\n","import { assert, is, conform } from '@kalisio/common-core/predicates'\nimport { math } from '@kalisio/common-core/utilities'\nimport { isSamePosition, IS_SAME_POSITION_OPTIONS_SCHEMA } from './position.js'\nimport { isValidPositions, truncatePositions } from './positions.js'\nimport { positionToNVector, crossNVectorArcs } from './nvector.js'\n\nexport function isValidRing (ring, options = {}) {\n if (!is.arrayOfLengthAtLeast(ring, 4)) return false\n if (!isValidPositions(ring)) return false\n return isClosedRing(ring, options)\n}\n\nexport function isClosedRing (ring, options = {}) {\n assert.that(options, (v) => conform.schema(v, IS_SAME_POSITION_OPTIONS_SCHEMA), 'options must be a valid options object')\n if (!is.arrayOfLengthAtLeast(ring, 1)) return false\n const first = ring[0]\n const last = ring[ring.length - 1]\n return isSamePosition(first, last, options)\n}\n\nexport function closeRing (ring, options = {}) {\n if (!is.nonEmptyArray(ring) || isClosedRing(ring, options)) return ring\n return [...ring, [...ring[0]]]\n}\n\nexport function truncateRing (ring, options = {}) {\n const truncated = truncatePositions(ring, { deduplicate: true, ...options })\n return closeRing(truncated, options)\n}\n\nexport function sphericalRingArea (ring) {\n assert.that(ring, isValidRing, 'ring must be a valid closed ring of at least 4 positions')\n let sum = 0\n for (let i = 0; i < ring.length - 1; i++) {\n const [lon1, lat1] = ring[i]\n const [lon2, lat2] = ring[i + 1]\n sum += math.to.radians(lon2 - lon1) * (2 + Math.sin(math.to.radians(lat1)) + Math.sin(math.to.radians(lat2)))\n }\n return -sum / 2\n}\n\nexport function isClockwiseRing (ring) {\n return sphericalRingArea(ring) < 0\n}\n\nexport function ringsIntersect (ring1, ring2) {\n assert.all([\n { value: ring1, validator: isValidRing, message: 'ring1 must be a valid closed ring' },\n { value: ring2, validator: isValidRing, message: 'ring2 must be a valid closed ring' }\n ])\n const points1 = ring1.map(positionToNVector)\n const points2 = ring2.map(positionToNVector)\n for (let i = 0; i < points1.length - 1; i++) {\n for (let j = 0; j < points2.length - 1; j++) {\n if (crossNVectorArcs(points1[i], points1[i + 1], points2[j], points2[j + 1])) {\n return true\n }\n }\n }\n return false\n}\n\nexport function ringSelfIntersections (ring) {\n assert.that(ring, isValidRing, 'ring must be a valid closed ring')\n const points = ring.map(positionToNVector)\n const pairs = []\n const edgeCount = points.length - 1\n for (let i = 0; i < edgeCount; i++) {\n for (let j = i + 1; j < edgeCount; j++) {\n // Skip adjacent edges: they share a vertex by construction, including the\n // wrap-around pair (first edge, last edge) meeting at the closing vertex.\n // Any other shared vertex (a duplicate position) is handled by\n // crossNVectorArcs, whose angular tolerance absorbs the floating-point\n // noise at a coincident vertex -- no explicit shared-position guard needed.\n if (j === i + 1) continue\n if (i === 0 && j === edgeCount - 1) continue\n if (crossNVectorArcs(points[i], points[i + 1], points[j], points[j + 1])) {\n pairs.push([i, j])\n }\n }\n }\n return pairs\n}\n","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 { convex } from '@turf/convex'\nimport { coordAll } from '@turf/meta'\nimport { featureCollection, feature } from '@turf/helpers'\nimport { assert } from '@kalisio/common-core/predicates'\nimport { FEATURE_TYPES, isLikeGeoJson } from '../is-like.js'\n\nfunction computeConvexHullFromPositions (positions) {\n if (positions.length === 0) return null\n if (positions.length === 1) return { type: 'Point', coordinates: positions[0] }\n if (positions.length === 2) return { type: 'LineString', coordinates: [positions[0], positions[1]] }\n const result = convex(featureCollection(positions.map(p => feature({ type: 'Point', coordinates: p }))))\n if (!result) return { type: 'LineString', coordinates: [positions[0], positions[positions.length - 1]] }\n return result.geometry\n}\n\nexport function computeGeoJsonConvexHull (geoJson) {\n assert.that(geoJson, isLikeGeoJson, 'geoJson must be a GeoJson object')\n if (geoJson.type === FEATURE_TYPES.FEATURE) {\n if (!geoJson.geometry) return null\n return computeGeoJsonConvexHull(geoJson.geometry)\n }\n const positions = coordAll(geoJson).map(p => [p[0], p[1]])\n return computeConvexHullFromPositions(positions)\n}\n","import { assert, object } from '@kalisio/common-core'\nimport { isLikeGeoJson } from '../is-like.js'\n\nexport function extractGeoJsonNode (geoJson, path) {\n assert.that(geoJson, isLikeGeoJson, 'geoJson must be a GeoJson object')\n return object.lookup(geoJson, path)\n}\n","import { extractGeoJsonNode } from './node.js'\n\nexport function extractGeoJsonBBox (geoJson) {\n return extractGeoJsonNode(geoJson, 'bbox')\n}\n","import { is } from '@kalisio/common-core'\nimport { WGS84, normalizeCrsName } from '../../foundation/index.js'\nimport { extractGeoJsonNode } from './node.js'\n\nexport function extractGeoJsonCRS (geoJson) {\n const crs = extractGeoJsonNode(geoJson, 'crs')\n if (!is.defined(crs)) return WGS84\n const name = crs.properties?.name\n return is.nonEmptyString(name) ? normalizeCrsName(name) : name\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'\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// 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 // Coordinate precision (decimal places) used to decide when two positions are\n // the same during deduplication -- the same notion validate uses, so fix and\n // validate stay in lockstep on duplicates.\n precision: optional(is.number)\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 { value: geoJson, validator: isLikeGeoJson, message: 'geoJson must be a GeoJson object' },\n { value: options, validator: (v) => conform.schema(v, FIX_OPTIONS_SCHEMA), message: 'options must be a valid options object, with a mandatory validation result' }\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 { assert, is } from '@kalisio/common-core/predicates'\nimport {\n hasProjection,\n isWGS84Projection,\n reprojectPosition,\n reprojectPositions\n} from '../foundation/index.js'\nimport {\n FEATURE_TYPES,\n GEOMETRY_TYPES,\n isLikeGeoJson\n} from './is-like.js'\nimport { extractGeoJsonCRS } from './extract/index.js'\n\nfunction crsToUrn (crs) {\n const epsg = crs.match(/^EPSG:(\\d+)$/i)\n return epsg ? `urn:ogc:def:crs:EPSG::${epsg[1]}` : crs\n}\n\nfunction reprojectGeometry (geometry, source, target) {\n switch (geometry.type) {\n case GEOMETRY_TYPES.POINT:\n geometry.coordinates = reprojectPosition(geometry.coordinates, source, target)\n break\n case GEOMETRY_TYPES.MULTI_POINT:\n case GEOMETRY_TYPES.LINESTRING:\n geometry.coordinates = reprojectPositions(geometry.coordinates, source, target)\n break\n case GEOMETRY_TYPES.MULTI_LINESTRING:\n case GEOMETRY_TYPES.POLYGON:\n geometry.coordinates = geometry.coordinates.map(\n positions => reprojectPositions(positions, source, target)\n )\n break\n case GEOMETRY_TYPES.MULTI_POLYGON:\n geometry.coordinates = geometry.coordinates.map(\n polygon => polygon.map(\n ring => reprojectPositions(ring, source, target)\n )\n )\n break\n case GEOMETRY_TYPES.GEOMETRY_COLLECTION:\n for (const g of geometry.geometries) {\n reprojectGeometry(g, source, target)\n }\n break\n }\n delete geometry.bbox\n delete geometry.crs\n return geometry\n}\n\nfunction reprojectFeature (feature, source, target) {\n if (feature.type === FEATURE_TYPES.FEATURE) {\n if (feature.geometry) reprojectGeometry(feature.geometry, source, target)\n } else {\n for (const f of feature.features) {\n reprojectFeature(f, source, target)\n }\n }\n delete feature.bbox\n delete feature.crs\n return feature\n}\n\nexport function reprojectGeoJson (geoJson, target) {\n assert.that(geoJson, isLikeGeoJson, 'geoJson must be a GeoJson object')\n const source = extractGeoJsonCRS(geoJson)\n assert.all([\n { value: source, validator: hasProjection, message: `unknown source projection: ${source}` },\n { value: target, validator: hasProjection, message: `unknown target projection: ${target}` }\n ])\n if (is.oneOf(geoJson.type, Object.values(GEOMETRY_TYPES))) {\n reprojectGeometry(geoJson, source, target)\n } else {\n reprojectFeature(geoJson, source, target)\n }\n if (isWGS84Projection(target)) {\n delete geoJson.crs\n } else {\n geoJson.crs = {\n type: 'name',\n properties: { name: crsToUrn(target) }\n }\n }\n return geoJson\n}\n","import { Heap } from 'heap-js'\nimport { assert, is, optional, conform } from '@kalisio/common-core'\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 { assert, is } from '@kalisio/common-core/predicates'\nimport {\n DEFAULT_COORDINATE_PRECISION,\n MAX_COORDINATE_PRECISION,\n truncateBBox,\n truncatePosition,\n truncatePositions,\n truncateRing\n} from '../foundation/index.js'\nimport {\n FEATURE_TYPES,\n GEOMETRY_TYPES,\n isLikeGeoJson\n} from './is-like.js'\n\nfunction truncateGeometry (geometry, precision, consider3D) {\n switch (geometry.type) {\n case GEOMETRY_TYPES.POINT:\n truncatePosition(geometry.coordinates, precision)\n break\n case GEOMETRY_TYPES.MULTI_POINT:\n case GEOMETRY_TYPES.LINESTRING:\n truncatePositions(geometry.coordinates, { precision })\n break\n case GEOMETRY_TYPES.MULTI_LINESTRING:\n for (const line of geometry.coordinates) truncatePositions(line, { precision })\n break\n case GEOMETRY_TYPES.POLYGON:\n geometry.coordinates = geometry.coordinates.map((ring) => truncateRing(ring, { precision, consider3D }))\n break\n case GEOMETRY_TYPES.MULTI_POLYGON:\n geometry.coordinates = geometry.coordinates.map((polygon) =>\n polygon.map((ring) => truncateRing(ring, { precision, consider3D }))\n )\n break\n case GEOMETRY_TYPES.GEOMETRY_COLLECTION:\n for (const g of geometry.geometries) truncateGeometry(g, precision, consider3D)\n break\n }\n if (geometry.bbox) truncateBBox(geometry.bbox, precision)\n return geometry\n}\n\nfunction truncateFeature (feature, precision, consider3D) {\n if (feature.type === FEATURE_TYPES.FEATURE) {\n if (feature.geometry) truncateGeometry(feature.geometry, precision, consider3D)\n } else {\n for (const f of feature.features) truncateFeature(f, precision, consider3D)\n }\n if (feature.bbox) truncateBBox(feature.bbox, precision)\n return feature\n}\n\nexport function truncateGeoJson (geoJson, options = {}) {\n const { precision = DEFAULT_COORDINATE_PRECISION, consider3D = false } = options\n assert.all([\n {\n value: geoJson,\n validator: isLikeGeoJson,\n message: 'geoJson must be a valid GeoJson'\n },\n {\n value: precision,\n validator: (v) => is.inRange(v, 0, MAX_COORDINATE_PRECISION),\n message: `precision must be in range [0, ${MAX_COORDINATE_PRECISION}]`\n }\n ])\n if (is.oneOf(geoJson.type, Object.values(GEOMETRY_TYPES))) return truncateGeometry(geoJson, precision, consider3D)\n return truncateFeature(geoJson, precision, consider3D)\n}\n","import { is } from '@kalisio/common-core'\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'\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'\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'\n\nexport function 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'\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 } from '@kalisio/common-core'\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\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(geoJson, is.nonEmptyObject, 'geojson must be a non empty object')\n const { precision = DEFAULT_COORDINATE_PRECISION } = options\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":["c","m","n","p","r","a","i","t","s","g","o","b","u","h","f","y","d","O","AXES","isValidAxis","axis","assert","is","isLatitude","isLongitude","isAltitude","MESSAGES_SCHEMA","MESSAGES","en","fr","CURRENT_LOCALE","FALLBACK_LOCALE","listLocales","setLocale","code","v","has","getLocale","getActiveLocales","registerMessages","messages","conform","getMessages","getLocalizedDirections","collectLocalizedSymbols","keys","symbols","DIRECTIONS","key","isValidDirectionOf","type","dir","value","label","symbol","getDirections","directions","getDirectionSymbols","getNorth","getSouth","getEast","getWest","isValidDirection","isNorth","isSouth","isEast","isWest","getDirectionAxis","SCHEMA","optional","REGEX_SIGNED","dirRegex","DD","dd","_degrees","_direction","pattern","match","decimalPlaces","str","DDM","ddm","_minutes","latRegex","lonRegex","DDMAero","isLon","deg","min","DMS","dms","_seconds","decimalToDDM","degrees","minutes","decimalToDMS","minutesDecimal","seconds","converter","direction","COORDINATE_FORMATS","COORDINATE_MODELS","DEFAULT_COORDINATE_PRECISION","MAX_COORDINATE_PRECISION","COORDINATE_TRUNCATION_FACTORS","_","guessCoordinateAxis","coord","getCoordinatePrecision","base","exp","decimalsInBase","truncateCoordinate","precision","factor","normalizeCoordinate","lon","convertCoordinate","from","to","parseCoordinate","format","l","DEG_TO_RAD","math","ANGULAR_TOLERANCE","positionToNVector","position","lat","cosLat","nVectorToPosition","vector","dotNVectors","v1","v2","crossNVectors","addNVectors","scaleNVector","scalar","getNVectorNorm","normalizeNVector","norm","angleBetweenNVectors","northNVector","origin","eastNVector","bearingNVector","bearing","north","east","destinationNVector","angularDistance","crossNVectorArcs","v3","v4","tolerance","n12","n34","length12","length34","s123","s124","s341","s342","WGS84","WGS84_DEFINITION","DEFAULT_PROJECTIONS","name","definition","proj4","EPSG_URN_REGEXP","normalizeCrsName","listProjections","defineProjection","hasProjection","getProjection","isWGS84Projection","wgs84","IS_SAME_POSITION_OPTIONS_SCHEMA","EARTH_RADIUS","parsePosition","parts","first","second","firstDD","secondDD","firstAxis","secondAxis","signedDegrees","isValidPosition","coordinates","is3DPosition","isSamePosition","position1","position2","options","consider3D","length","truncatePosition","reprojectPosition","source","target","destinationFromPosition","distance","destination","distanceBetweenPositions","isValidBBox","bbox","is2D","max","south","is3DBBox","mergeBBox","bbox1","bbox2","COMPUTE_BBOX_OPTIONS_SCHEMA","computeBBox","positions","ignore3D","acc","pos","truncateBBox","TRUNCATE_POSITIONS_OPTIONS_SCHEMA","isValidPositions","deduplicatePositions","result","previous","truncatePositions","deduplicate","truncated","reprojectPositions","isValidLine","line","lineLength","total","isValidRing","ring","isClosedRing","last","closeRing","truncateRing","sphericalRingArea","sum","lon1","lat1","lon2","lat2","isClockwiseRing","ringsIntersect","ring1","ring2","points1","points2","j","ringSelfIntersections","points","pairs","edgeCount","CRS_TYPES","GEOMETRY_TYPES","FEATURE_TYPES","isLikeCRS","object","isLikePosition","isLikeBBox","isLikeGeometry","isLikeFeature","isLikeFeatureCollection","isLikeFeatureOrFeatureCollection","isLikeGeoJson","BOUNDING_BOX_OPTIONS_SCHEMA","computeGeoJsonBoundingBox","geoJson","coordAll","computeConvexHullFromPositions","convex","featureCollection","feature","computeGeoJsonConvexHull","extractGeoJsonNode","path","extractGeoJsonBBox","extractGeoJsonCRS","crs","VALIDATION_CODES","RING_TYPES","DEDUPABLE_TYPES","FIXABLE_CODES","FIX_OPTIONS_SCHEMA","fixRingWindingOrder","shouldBeClockwise","fixPolygonWindingOrder","corrected","fixWindingOrder","geometry","polygonCoordinates","ringsOf","polygonsOf","hasSelfIntersection","hasHoleIntersectingShell","rings","shell","bufferRebuild","repaired","buffer","fixDuplicatePositions","deduped","dedupeAndTrack","before","poly","fixTopology","wantsSelfIntersection","wantsHoleIntersectsShell","selfIntersectionPresent","holeIntersectsShellPresent","candidate","fixGeometry","corrections","issuesAt","issues","issue","fixGeometryIssues","relevantIssues","fixOptions","correctedCodes","unfixed","fixGeoJson","allIssues","fixableIssues","index","featurePath","relevant","isGeoJsonFixable","validation","error","crsToUrn","epsg","reprojectGeometry","polygon","reprojectFeature","reprojectGeoJson","SIMPLIFY_OPTIONS_SCHEMA","triangleArea","visvalingam","coords","getWeight","pts","computeArea","node","heap","Heap","pushNode","maxArea","entry","cur","simplifyGeoJson","truncateGeometry","truncateFeature","truncateGeoJson","ROOT_CRS_PATH","validateOptionalCRS","context","crsName","validatePosition","geodesic","response","lonPrecision","latPrecision","validateOptionalBBox","minResult","maxResult","west","minAlt","maxAlt","emptyStatistics","emptyResult","mergeStatistics","results","statistics","count","mergeResult","others","other","validateArray","items","validator","itemPath","e","w","findConsecutiveDuplicateIndex","startAt","checkDuplicatePositions","warnings","validateCoordinatesArray","minimumLength","validateLineStringCoordinates","validateMultiLineStringCoordinates","validateLinearRing","expectedWindingOrder","actualWindingOrder","selfIntersections","validatePolygonCoordinates","validateMultiPolygonCoordinates","validateGeometryCollectionGeometries","geometries","validateGeometry","coordsPath","validateFeature","validateGeoJson"],"mappings":"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"}