@kalisio/common-geospatial 0.6.0 → 0.8.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.mjs","sources":["../src/foundation/axes.js","../src/foundation/locale.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/operators/is-like/bbox.js","../src/operators/is-like/crs.js","../src/operators/is-like/geometry.js","../src/operators/is-like/geojson.js","../src/operators/is-like/position.js","../src/operators/simplify/visvalingam-whyatt.js","../src/operators/simplify/geometry.js","../src/operators/simplify/geojson.js","../src/operators/truncate/bbox.js","../src/operators/truncate/geometry.js","../src/operators/truncate/geojson.js","../src/operators/truncate/position.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 './locales/fr.json'\nimport en from './locales/en.json'\n\nconst LOCALE_SCHEMA = {\n DIRECTIONS: {\n NORTH: { label: is.string, symbol: is.string },\n SOUTH: { label: is.string, symbol: is.string },\n EAST: { label: is.string, symbol: is.string },\n WEST: { label: is.string, symbol: is.string }\n }\n}\n\nconst LOCALES = {\n en,\n fr\n}\n\nlet CURRENT_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 {\n code: CURRENT_LOCALE,\n content: LOCALES[CURRENT_LOCALE]\n }\n}\n","import { assert, is } from '@kalisio/common-core'\nimport { getLocale } from './locale.js'\nimport { AXES, isLatitude, isLongitude, isAxis } from './axes.js'\n\nfunction getAll () {\n return getLocale().content.DIRECTIONS\n}\n\nfunction isDirectionOf (type, dir) {\n const all = getAll()\n const label = all[type].label.toUpperCase()\n const symbol = all[type].symbol.toUpperCase()\n return dir.toUpperCase() === label || dir.toUpperCase() === symbol\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 { isDirection } from '../directions.js'\n\nconst SCHEMA = {\n degrees: is.number,\n direction: optional(isDirection)\n}\n\nconst REGEX_SIGNED = /^(-?\\d{1,3}(?:\\.\\d+)?)°?$/\nconst REGEX_DIR = /^(\\d{1,3}(?:\\.\\d+)?)°?([NSEW])$/\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(REGEX_DIR)\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 { 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+)?)'?$/\nconst REGEX_DIR = /^(\\d{1,3})°(\\d{1,2}(?:\\.\\d+)?)'?([NSEW])$/\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(REGEX_DIR)\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 { isDirection } 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\nconst REGEX_LAT = /^(\\d{2})(\\d{3})([NS])$/\nconst REGEX_LON = /^(\\d{3})(\\d{3})([EW])$/\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(REGEX_LAT) ?? pattern.match(REGEX_LON)\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 = _direction === 'E' || _direction === 'W'\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 { 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+)?)\"?$/\nconst REGEX_DIR = /^(\\d{1,3})°(\\d{1,2})'(\\d{1,2}(?:\\.\\d+)?)\"?([NSEW])$/\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(REGEX_DIR)\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'\nexport { COORDINATE_FORMATS, COORDINATE_MODELS } from './coordinate-formats'\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 } from '@kalisio/common-core'\nimport { AXES } from './axes.js'\nimport { isWest, isSouth } from './directions.js'\nimport { guessCoordinateAxis, parseCoordinate } 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","import { is } from '@kalisio/common-core'\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","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","import { is } from '@kalisio/common-core'\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","import { is } from '@kalisio/common-core'\nimport { isLikeGeometry } from './geometry.js'\n\nexport const FEATURE_TYPES = {\n FEATURE: 'Feature',\n FEATURE_COLLECTION: 'FeatureCollection'\n}\n\nexport function isLikeFeature (object) {\n if (!is.plainObject(object)) return false\n return FEATURE_TYPES.FEATURE === object.type\n}\n\nexport function isLikeFeatureCollection (object) {\n if (!is.plainObject(object)) return false\n if (object.type !== FEATURE_TYPES.FEATURE_COLLECTION) return false\n return is.array(object.features)\n}\n\nexport function isLikeGeoJson (object) {\n if (!is.plainObject(object)) return false\n if (isLikeGeometry(object)) return true\n if (isLikeFeature(object)) return true\n return isLikeFeatureCollection(object)\n}\n","import { is } from '@kalisio/common-core'\n\nexport function isLikePosition (object) {\n if (!is.arrayOfLengthBetween(object, 2, 3)) return false\n return object.every(is.number)\n}\n","import { Heap } from 'heap-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\nexport function simplify (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","import { assert } from '@kalisio/common-core'\nimport { GEOMETRY_TYPES, isLikeGeometry } from '../is-like'\nimport { simplify } from './visvalingam-whyatt.js'\n\nexport function simplifyGeometry (geometry, options) {\n assert.all([\n { value: geometry, validator: isLikeGeometry, message: 'geometry must be a GeoJson geometry' }\n ])\n switch (geometry.type) {\n case GEOMETRY_TYPES.LINESTRING:\n geometry.coordinates = simplify(geometry.coordinates, options)\n break\n case GEOMETRY_TYPES.POLYGON:\n case GEOMETRY_TYPES.MULTI_LINESTRING:\n geometry.coordinates = geometry.coordinates.map(ring => simplify(ring, options))\n break\n case GEOMETRY_TYPES.MULTI_POLYGON:\n geometry.coordinates = geometry.coordinates.map(poly => poly.map(ring => simplify(ring, options)))\n break\n case GEOMETRY_TYPES.GEOMETRY_COLLECTION:\n geometry.geometries.forEach(g => simplifyGeometry(g, options))\n break\n }\n return geometry\n}\n","import { getLogger } from '@logtape/logtape'\nimport { assert, is } from '@kalisio/common-core'\nimport { FEATURE_TYPES, GEOMETRY_TYPES, isLikeGeoJson } from '../is-like'\nimport { simplifyGeometry } from './geometry.js'\n\nconst logger = getLogger(['common-ekosystem', 'simplify', 'geojson'])\n\nfunction simplifyFeature (feature, options) {\n if (feature.type === FEATURE_TYPES.FEATURE) {\n if (feature.geometry) simplifyGeometry(feature.geometry, options)\n } else if (feature.type === FEATURE_TYPES.FEATURE_COLLECTION) {\n for (const feat of feature.features) simplifyFeature(feat, options)\n } else {\n logger.warn('Unknown feature type \"{type}\", skipping.', { type: feature.type })\n }\n return feature\n}\n\nexport function simplifyGeoJson (geoJson, options) {\n assert.all([\n { value: geoJson, validator: isLikeGeoJson, message: 'geoJson must be a GeoJson object' }\n ])\n if (is.oneOf(geoJson.type, Object.values(GEOMETRY_TYPES))) return simplifyGeometry(geoJson, options)\n return simplifyFeature(geoJson, options)\n}\n","import { assert, is } from '@kalisio/common-core'\nimport { COORDINATE_TRUNCATION_FACTORS } from '../../foundation'\nimport { isLikeBBox } from '../is-like'\n\nexport function truncateBBox (bbox, precision = 7) {\n assert.all([\n { value: bbox, validator: isLikeBBox, message: 'bbox must be 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 truncate from '@turf/truncate'\nimport { assert, is } from '@kalisio/common-core'\nimport { isLikeGeometry } from '../is-like'\nimport { truncateBBox } from './bbox.js'\n\nexport function truncateGeometry (geometry, precision = 7) {\n assert.all([\n { value: geometry, validator: isLikeGeometry, message: 'geometry must be a GeoJson geometry' },\n { value: precision, validator: (v) => is.inRange(v, 0, 8), message: 'precision must be in range [0, 8]' }\n ])\n const result = truncate(geometry, { precision, mutate: true })\n if (result.bbox) truncateBBox(result.bbox, precision)\n return result\n}\n","import { getLogger } from '@logtape/logtape'\nimport { assert, is } from '@kalisio/common-core'\nimport { FEATURE_TYPES, GEOMETRY_TYPES, isLikeGeoJson } from '../is-like'\nimport { truncateBBox } from './bbox.js'\nimport { truncateGeometry } from './geometry.js'\n\nconst logger = getLogger(['common-ekosystem', 'truncate', 'geojson'])\n\nfunction truncateFeature (feature, precision) {\n if (feature.type === FEATURE_TYPES.FEATURE) {\n if (feature.geometry) truncateGeometry(feature.geometry, precision)\n } else if (feature.type === FEATURE_TYPES.FEATURE_COLLECTION) {\n for (const feat of feature.features) truncateFeature(feat, precision)\n } else {\n logger.warn('Unknown feature type \"{type}\", skipping.', { type: feature.type })\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 { assert, is } from '@kalisio/common-core'\nimport { COORDINATE_TRUNCATION_FACTORS } from '../../foundation'\nimport { isLikePosition } from '../is-like'\n\nexport function truncatePosition (position, precision = 7) {\n assert.all([\n { value: position, validator: isLikePosition, 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 { 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.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 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'\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 }\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.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 if (result.statistics) {\n response.statistics = mergeStatistics(response, result)\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/index.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 return validateOptionalBBox(geometry, result, path)\n}\n","import { assert, is } from '@kalisio/common-core'\nimport { FEATURE_TYPES, GEOMETRY_TYPES } from '../is-like/index.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 geometries: { [feature.geometry.type]: 1 }\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 return {\n ...result,\n statistics: { Feature: 0, FeatureCollection: 0, geometries: { [geoJson.type]: 1 } }\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' }],\n warnings: [],\n statistics: emptyStatistics()\n }\n}\n"],"names":["AXES","isAxis","axis","assert","is","isLatitude","isLongitude","isAltitude","LOCALE_SCHEMA","LOCALES","en","fr","CURRENT_LOCALE","listLocales","registerLocale","code","content","v","has","conform","setLocale","getLocale","getAll","isDirectionOf","type","dir","all","label","symbol","getDirections","directions","getNorth","getSouth","getEast","getWest","isDirection","isNorth","isSouth","isEast","isWest","getDirectionAxis","SCHEMA","optional","REGEX_SIGNED","REGEX_DIR","DD","dd","_degrees","_direction","pattern","match","decimalPlaces","str","DDM","ddm","_minutes","REGEX_LAT","REGEX_LON","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","isLikeBBox","object","CRS_TYPES","isLikeCRS","GEOMETRY_TYPES","isLikeGeometry","FEATURE_TYPES","isLikeFeature","isLikeFeatureCollection","isLikeGeoJson","isLikePosition","triangleArea","a","b","c","simplify","coords","tolerance","getWeight","pts","computeArea","node","heap","Heap","maxArea","result","cur","simplifyGeometry","geometry","options","ring","poly","g","logger","getLogger","simplifyFeature","feature","feat","simplifyGeoJson","geoJson","truncateBBox","bbox","truncateGeometry","truncate","truncateFeature","truncateGeoJson","truncatePosition","position","validatePosition","coordinates","response","lonPrecision","latPrecision","validateBBox","is2D","max","minResult","e","maxResult","west","south","east","north","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","p","validateMultiPolygonCoordinates","validateGeometryCollectionGeometries","geometries","validateGeometry","coordsPath","positionResult","validateFeature","validateGeoJson"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","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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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@kalisio/common-geospatial",
3
3
  "description": "Geospatial utilities for the Kalisio ekosystem",
4
- "version": "0.6.0",
4
+ "version": "0.8.0",
5
5
  "type": "module",
6
6
  "private": false,
7
7
  "exports": {
@@ -45,11 +45,14 @@
45
45
  "peerDependencies": {
46
46
  "@logtape/logtape": "~0.7.0",
47
47
  "@turf/boolean-clockwise": "~7.3.5",
48
+ "@turf/convex": "~7.3.5",
49
+ "@turf/helpers": "~7.3.5",
48
50
  "@turf/kinks": "~7.3.5",
51
+ "@turf/meta": "~7.3.5",
49
52
  "@turf/truncate": "~7.3.5",
50
53
  "heap-js": "~2.7.1",
51
54
  "proj4": "~2.20.4",
52
- "@kalisio/common-core": "0.6.0"
55
+ "@kalisio/common-core": "0.8.0"
53
56
  },
54
57
  "devDependencies": {
55
58
  "chroma-js": "~3.2.0"