@kalisio/common-geospatial 0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE.md ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Kalisio
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,17 @@
1
+ # common-geospatial
2
+
3
+ _Geospatial utilities for the Kalisio ekosystem_
4
+
5
+ ---
6
+
7
+ ## Documentation
8
+
9
+ Detailed documentation is available at the following [link](https://kalisio.github.io/common-ekosystem/packages/geokit/).
10
+
11
+ ## License
12
+
13
+ Licensed under the [MIT license](LICENSE).
14
+
15
+ Copyright (c) 2026 [Kalisio](https://kalisio.com)
16
+
17
+ [![Kalisio](https://kalisio.github.io/kalisioscope/kalisio/kalisio-logo-light-256x96.png)](https://kalisio.com)
package/dist/index.cjs ADDED
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n=require("@kalisio/common-core"),g={LATITUDE:"LAT",LONGITUDE:"LON",ALTITUDE:"ALT"};function V(e){return n.assert.that(e,n.is.string,"axis must be a string"),Object.values(g).includes(e)}function D(e){return n.assert.that(e,n.is.string,"axis must be a string"),e===g.LATITUDE}function _(e){return n.assert.that(e,n.is.string,"axis must be a string"),e===g.LONGITUDE}function oe(e){return n.assert.that(e,n.is.string,"axis must be a string"),e===g.ALTITUDE}const ue={NORTH:{label:"Nord",symbol:"N"},SOUTH:{label:"Sud",symbol:"S"},EAST:{label:"Est",symbol:"E"},WEST:{label:"Ouest",symbol:"O"}},le={DIRECTIONS:ue},ce={NORTH:{label:"North",symbol:"N"},SOUTH:{label:"South",symbol:"S"},EAST:{label:"East",symbol:"E"},WEST:{label:"West",symbol:"W"}},ge={DIRECTIONS:ce},fe={DIRECTIONS:{NORTH:{label:n.is.string,symbol:n.is.string},SOUTH:{label:n.is.string,symbol:n.is.string},EAST:{label:n.is.string,symbol:n.is.string},WEST:{label:n.is.string,symbol:n.is.string}}},b={en:ge,fr:le};let C="en";function de(){return Object.keys(b)}function me(e,t){n.assert.all([{value:e,validator:n.is.string,message:"code must be a string"},{value:e,validator:r=>!n.has.key(b,r),message:"locale already registered"},{value:t,validator:n.is.plainObject,message:"content must be an object"},{value:t,validator:r=>n.conform.schema(r,fe),message:"content does not conform to schema"}]),b[e]=t}function Ee(e){n.assert.all([{value:e,validator:n.is.string,message:"code must be a string"},{value:e,validator:t=>n.has.key(b,t),message:"code is unknown"}]),C=e}function W(){return{code:C,content:b[C]}}function h(){return W().content.DIRECTIONS}function S(e,t){const r=h(),s=r[e].label.toUpperCase(),i=r[e].symbol.toUpperCase();return t.toUpperCase()===s||t.toUpperCase()===i}function pe(e=null){const t=h();return n.is.defined(e)?(n.assert.that(e,V,"axis must be a valid axis"),D(e)?[t.SOUTH,t.NORTH]:_(e)?[t.EAST,t.WEST]:[]):[t.SOUTH,t.NORTH,t.EAST,t.WEST]}function ve(){return h().NORTH}function he(){return h().SOUTH}function ye(){return h().EAST}function be(){return h().WEST}function p(e){return n.assert.that(e,n.is.string,"dir must be a string"),B(e)||G(e)||U(e)||R(e)}function B(e){return n.assert.that(e,n.is.string,"dir must be a string"),S("NORTH",e)}function G(e){return n.assert.that(e,n.is.string,"dir must be a string"),S("SOUTH",e)}function U(e){return n.assert.that(e,n.is.string,"dir must be a string"),S("EAST",e)}function R(e){return n.assert.that(e,n.is.string,"dir must be a string"),S("WEST",e)}function j(e){return n.assert.that(e,p,"dir must be a direction"),R(e)||U(e)?g.LONGITUDE:g.LATITUDE}const Oe={degrees:n.is.number,direction:n.optional(p)},Te=/^(-?\d{1,3}(?:\.\d+)?)°?$/,Le=/^(\d{1,3}(?:\.\d+)?)°?([NSEW])$/;function L(e){let t=null,r=null;if(n.is.plainObject(e)&&n.conform.schema(e,Oe))n.is.defined(e.direction)?e.degrees>=0&&(t=e.degrees,r=e.direction):t=e.degrees;else if(n.is.string(e)){const s=e.replace(/\s+/g,""),i=s.match(Te)??s.match(Le);i&&(t=parseFloat(i[1]),r=i[2]??null)}return{get degrees(){return t},get direction(){return r},get format(){return"DD"},isValid(){return n.is.number(t)},toString(s){if(n.assert.that(s,n.is.positiveInteger,"decimalPlaces must be a positive integer"),!this.isValid())return"";let i=`${t.toFixed(s)}°`;return r&&(i+=` ${r}`),i},toDecimal(){return this.isValid()?L({degrees:t,direction:r}):null}}}const De={degrees:n.is.integer,minutes:e=>n.is.inRangeExclusiveMax(e,0,60),direction:n.optional(p)},Ie=/^(-?\d{1,3})°(\d{1,2}(?:\.\d+)?)'?$/,Se=/^(\d{1,3})°(\d{1,2}(?:\.\d+)?)'?([NSEW])$/;function Y(e){let t=null,r=null,s=null;if(n.is.plainObject(e)&&n.conform.schema(e,De))n.is.defined(e.direction)?e.degrees>=0&&(t=e.degrees,r=e.minutes,s=e.direction):(t=e.degrees,r=e.minutes);else if(n.is.string(e)){const i=e.replace(/\s+/g,""),a=i.match(Ie)??i.match(Se);a&&(t=parseFloat(a[1]),r=parseFloat(a[2]),s=a[3]??null)}return{get degrees(){return t},get minutes(){return r},get direction(){return s},get format(){return"DDM"},isValid(){return n.is.integer(t)&&n.is.inRangeExclusiveMax(r,0,60)},toString(i){if(n.assert.that(i,n.is.positiveInteger,"decimalPlaces must be a positive integer"),!this.isValid())return"";let a=`${t}° ${r.toFixed(i)}'`;return s&&(a+=` ${s}`),a},toDecimal(){return this.isValid()?L({degrees:t+r/60,direction:s}):null}}}const Re={degrees:n.is.nonNegativeInteger,minutes:e=>n.is.inRangeExclusiveMax(e,0,60),direction:p},Ae=/^(\d{2})(\d{3})([NS])$/,Ne=/^(\d{3})(\d{3})([EW])$/;function K(e){let t=null,r=null,s=null;if(n.is.plainObject(e)&&n.conform.schema(e,Re))t=e.degrees,r=e.minutes,s=e.direction;else if(n.is.string(e)){const i=e.trim(),a=i.match(Ae)??i.match(Ne);a&&(t=parseFloat(a[1]),r=parseFloat(a[2])/10,s=a[3])}return{get degrees(){return t},get minutes(){return r},get direction(){return s},get format(){return"DDM_AERO"},isValid(){return n.is.nonNegativeInteger(t)&&n.is.inRangeExclusiveMax(r,0,60)&&p(s)},toString(){if(!this.isValid())return"";const i=s==="E"||s==="W",a=String(t).padStart(i?3:2,"0"),o=Math.floor(r*10).toString().padStart(3,"0");return`${a}${o}${s}`},toDecimal(){return this.isValid()?L({degrees:t+r/60,direction:s}):null}}}const Ce={degrees:n.is.integer,minutes:e=>n.is.integer(e)&&n.is.inRange(e,0,59),seconds:e=>n.is.inRangeExclusiveMax(e,0,60),direction:n.optional(p)},we=/^(-?\d{1,3})°(\d{1,2})'(\d{1,2}(?:\.\d+)?)"?$/,Me=/^(\d{1,3})°(\d{1,2})'(\d{1,2}(?:\.\d+)?)"?([NSEW])$/;function q(e){let t=null,r=null,s=null,i=null;if(n.is.plainObject(e)&&n.conform.schema(e,Ce))n.is.defined(e.direction)?e.degrees>=0&&(t=e.degrees,r=e.minutes,s=e.seconds,i=e.direction):(t=e.degrees,r=e.minutes,s=e.seconds);else if(n.is.string(e)){const a=e.replace(/\s+/g,""),o=a.match(we)??a.match(Me);o&&(t=parseFloat(o[1]),r=parseFloat(o[2]),s=parseFloat(o[3]),i=o[4]??null)}return{get degrees(){return t},get minutes(){return r},get seconds(){return s},get direction(){return i},get format(){return"DMS"},isValid(){return n.is.integer(t)&&n.is.integer(r)&&n.is.inRange(r,0,59)&&n.is.inRangeExclusiveMax(s,0,60)},toString(a){if(n.assert.that(a,n.is.positiveInteger,"decimalPlaces must be a positive integer"),!this.isValid())return"";let o=`${t}° ${r}' ${s.toFixed(a)}"`;return i&&(o+=` ${i}`),o},toDecimal(){return this.isValid()?L({degrees:t+r/60+s/3600,direction:i}):null}}}function P(e){const t=Math.floor(e.degrees),r=(e.degrees-t)*60;return{degrees:t,minutes:r,direction:e.direction}}function $e(e){const t=Math.floor(e.degrees),r=(e.degrees-t)*60,s=Math.floor(r),i=(r-s)*60;return{degrees:t,minutes:s,seconds:i,direction:e.direction}}const F={DD:e=>(n.assert.that(e,t=>t.isValid(),"dd must be a valid coordinate"),e),DDM:e=>{n.assert.that(e,i=>i.isValid(),"dd must be a valid coordinate");const{degrees:t,minutes:r,direction:s}=P(e);return Y(s?{degrees:t,minutes:r,direction:s}:{degrees:t,minutes:r})},DMS:e=>{n.assert.that(e,a=>a.isValid(),"dd must be a valid coordinate");const{degrees:t,minutes:r,seconds:s,direction:i}=$e(e);return q(i?{degrees:t,minutes:r,seconds:s,direction:i}:{degrees:t,minutes:r,seconds:s})},DDM_AERO:e=>{n.assert.that(e,i=>i.isValid(),"dd must be a valid coordinate");const{degrees:t,minutes:r,direction:s}=P(e);return K({degrees:t,minutes:r,direction:s})}},I={DD:"DD",DDM:"DDM",DDM_AERO:"DDM_AERO",DMS:"DMS"},z={DD:L,DDM:Y,DDM_AERO:K,DMS:q},A=Array.from({length:9},(e,t)=>10**t);function w(e,t){if(n.assert.that(e,n.is.number,"coord must be a number"),n.is.defined(t))return n.assert.that(t,p,"dir must be a direction"),j(t);if(Math.abs(e)>90)return g.LONGITUDE}function M(e){n.assert.that(e,n.is.number,"coord must be a number");const t=e.toExponential(),[r,s]=t.split("e").map(Number),i=(r.toString().split(".")[1]||"").length;return Math.max(0,i-s)}function _e(e,t=7){n.assert.all([{value:e,validator:n.is.number,message:"coord must be a number"},{value:t,validator:s=>n.is.inRange(s,0,8),message:"precision must be in range [0, 8]"}]);const r=A[t];return Math.round(e*r)/r}function Ge(e,t){if(n.assert.all([{value:e,validator:n.is.number,message:"coord must be a number"},{value:t,validator:s=>_(s)||D(s),message:"axis must be either a longitude or latitude"}]),D(t))return Math.max(-90,Math.min(90,e));let r=((e+180)%360+360)%360-180;return r===-180&&(r=180),Object.is(r,-0)&&(r=0),r}function Ue(e,t){n.assert.all([{value:e,validator:s=>n.is.defined(s)&&s.isValid(),message:"from must be a valid coordinate"},{value:t,validator:s=>n.has.key(F,s),message:`unknown format: ${t}`}]);const r=e.format===I.DD?e:e.toDecimal();return r.isValid()?t===I.DD?r:F[t](r):null}function X(e){n.assert.that(e,n.is.nonEmptyString,"pattern must be a non empty string");for(const t of Object.keys(I)){const r=z[t](e);if(r.isValid())return r}return null}function ke(e){n.assert.that(e,f=>n.is.nonEmptyString(f),"pattern must be a non-empty string");const t=e.split(/[,;|]/);if(t.length!==2)return null;const[r,s]=t.map(X);if(!r||!s)return null;const i=r.toDecimal(),a=s.toDecimal(),o=w(i.degrees,i.direction),u=w(a.degrees,a.direction),l=f=>{const{degrees:d,direction:c}=f;return c&&(R(c)||G(c))?-d:d};if(o===g.LONGITUDE&&u===g.LATITUDE)return[l(i),l(a)];if(u===g.LONGITUDE&&o===g.LATITUDE)return[l(a),l(i)];if(o===g.LONGITUDE&&!u)return[l(i),a];if(o===g.LATITUDE&&!u)return[l(a),l(i)];if(u===g.LONGITUDE&&!o)return[l(a),l(i)];if(u===g.LATITUDE&&!o)return[l(i),l(a)];if(!o&&!u)return[[l(i),l(a)],[l(a),l(i)]]}function J(e){return!n.is.arrayOfLength(e,4)&&!n.is.arrayOfLength(e,6)?!1:e.every(n.is.number)}const O={NAME:"name",LINK:"link"};function xe(e){return n.is.plainObject(e)?e.type===O.NAME?n.is.nonEmptyString(e.properties?.name):e.type===O.LINK?n.is.nonEmptyString(e.properties?.href):!1:!1}const E={POINT:"Point",MULTI_POINT:"MultiPoint",LINESTRING:"LineString",MULTI_LINESTRING:"MultiLineString",POLYGON:"Polygon",MULTI_POLYGON:"MultiPolygon",GEOMETRY_COLLECTION:"GeometryCollection"};function Q(e){return!n.is.plainObject(e)||!n.is.oneOf(e.type,Object.values(E))?!1:e.type===E.GEOMETRY_COLLECTION?n.is.array(e.geometries):n.is.array(e.coordinates)}const v={FEATURE:"Feature",FEATURE_COLLECTION:"FeatureCollection"};function Z(e){return n.is.plainObject(e)?v.FEATURE===e.type:!1}function ee(e){return!n.is.plainObject(e)||e.type!==v.FEATURE_COLLECTION?!1:n.is.array(e.features)}function Pe(e){return n.is.plainObject(e)?Q(e)||Z(e)?!0:ee(e):!1}function te(e){return n.is.arrayOfLengthBetween(e,2,3)?e.every(n.is.number):!1}function Fe(e,t=7){n.assert.all([{value:e,validator:J,message:"bbox must be bounding box"},{value:t,validator:s=>n.is.inRange(s,0,8),message:"precision must be in range [0, 8]"}]);const r=A[t];for(let s=0;s<e.length;s++)e[s]=Math.round(e[s]*r)/r;return e}function He(e,t=7){n.assert.all([{value:e,validator:te,message:"position must be a position"},{value:t,validator:s=>n.is.inRange(s,0,8),message:"precision must be in range [0, 8]"}]);const r=A[t];for(let s=0;s<e.length;s++)e[s]=Math.round(e[s]*r)/r;return e}function T(e){if(!n.is.arrayOfLengthBetween(e,2,3))return{valid:!1,errors:[{message:"Invalid coordinates: must be an array of 2 or 3 coordinates"}],warnings:[]};if(!n.is.inRange(e[0],-180,180))return{valid:!1,errors:[{message:"Invalid coordinates: longitude must be in the range -180 to 180"}],warnings:[]};if(!n.is.inRange(e[1],-90,90))return{valid:!1,errors:[{message:"Invalid coordinates: latitude must be in the range -90 to 90"}],warnings:[]};if(e.length===3&&!n.is.number(e[2]))return{valid:!1,errors:[{message:"Invalid coordinates: altitude must be a number"}],warnings:[]};const t={valid:!0,errors:[],warnings:[]},r=M(e[0]);r>6&&t.warnings.push({message:`longitude precision is high (${r} decimals, max recommended: 6)`});const s=M(e[1]);return s>6&&t.warnings.push({message:`latitude precision is high (${s} decimals, max recommended: 6)`}),t}function re(e){if(!n.is.arrayOfLength(e,4)&&!n.is.arrayOfLength(e,6))return{valid:!1,errors:[{message:"Invalid bbox: must be an array of 4 (2D) or 6 (3D) numbers"}],warnings:[]};const t=e.length===4,r=t?[e[0],e[1]]:[e[0],e[1],e[2]],s=t?[e[2],e[3]]:[e[3],e[4],e[5]],i=T(r);if(!i.valid)return{valid:!1,errors:i.errors.map(c=>({...c,message:`Invalid bbox south-west: ${c.message}`})),warnings:[]};const a=T(s);if(!a.valid)return{valid:!1,errors:a.errors.map(c=>({...c,message:`Invalid bbox north-east: ${c.message}`})),warnings:[]};const[o,u]=r,[l,f]=s;if(u>f)return{valid:!1,errors:[{message:`Invalid bbox: south (${u}) must be <= north (${f})`}],warnings:[]};const d={valid:!0,errors:[],warnings:[]};return o>l&&d.warnings.push({message:`bbox crosses the antimeridian (west: ${o} > east: ${l})`}),d.warnings.push(...i.warnings.map(c=>({...c,message:`south-west: ${c.message}`}))),d.warnings.push(...a.warnings.map(c=>({...c,message:`north-east: ${c.message}`}))),d}function ne(e){if(!n.is.plainObject(e))return{valid:!1,errors:[{message:"Invalid crs: must be an object"}],warnings:[]};switch(e.type){case O.NAME:return n.is.nonEmptyString(e.properties?.name)?{valid:!0,errors:[],warnings:[]}:{valid:!1,errors:[{message:"Invalid crs: linked crs must have a non-empty properties.name string"}],warnings:[]};case O.LINK:return n.is.nonEmptyString(e.properties?.href)?{valid:!0,errors:[],warnings:[]}:{valid:!1,errors:[{message:"Invalid crs: linked crs must have a non-empty properties.href string"}],warnings:[]};default:return{valid:!1,errors:[{message:`Invalid crs: unknown type: ${e.type}`}],warnings:[]}}}function Ve(e,t,r={}){const s={type:"Feature"};return(r.id===0||r.id)&&(s.id=r.id),r.bbox&&(s.bbox=r.bbox),s.properties={},s.geometry=e,s}function We(e,t,r={}){if(!e)throw new Error("coordinates is required");if(!Array.isArray(e))throw new Error("coordinates must be an Array");if(e.length<2)throw new Error("coordinates must be at least 2 numbers long");if(!H(e[0])||!H(e[1]))throw new Error("coordinates must contain numbers");return Ve({type:"Point",coordinates:e},t,r)}function H(e){return!isNaN(e)&&e!==null&&!Array.isArray(e)}function Be(e){if(Array.isArray(e))return e;if(e.type==="Feature"){if(e.geometry!==null)return e.geometry.coordinates}else if(e.coordinates)return e.coordinates;throw new Error("coords must be GeoJSON Feature, Geometry Object or an Array")}function je(e){const t=Be(e);let r=0,s=1,i,a;for(;s<t.length;)i=a||t[0],a=t[s],r+=(a[0]-i[0])*(a[1]+i[1]),s++;return r>0}var Ye=je;function Ke(e){let t,r;const s={type:"FeatureCollection",features:[]};if(e.type==="Feature"?r=e.geometry:r=e,r.type==="LineString")t=[r.coordinates];else if(r.type==="MultiLineString")t=r.coordinates;else if(r.type==="MultiPolygon")t=[].concat(...r.coordinates);else if(r.type==="Polygon")t=r.coordinates;else throw new Error("Input must be a LineString, MultiLineString, Polygon, or MultiPolygon Feature or Geometry");return t.forEach(i=>{t.forEach(a=>{for(let o=0;o<i.length-1;o++)for(let u=o;u<a.length-1;u++){if(i===a&&(Math.abs(o-u)===1||o===0&&u===i.length-2&&i[o][0]===i[i.length-1][0]&&i[o][1]===i[i.length-1][1]))continue;const l=qe(i[o][0],i[o][1],i[o+1][0],i[o+1][1],a[u][0],a[u][1],a[u+1][0],a[u+1][1]);l&&s.features.push(We([l[0],l[1]]))}})}),s}function qe(e,t,r,s,i,a,o,u){let l,f,d,c,x;const m={x:null,y:null,onLine1:!1,onLine2:!1};return l=(u-a)*(r-e)-(o-i)*(s-t),l===0?m.x!==null&&m.y!==null?m:!1:(f=t-a,d=e-i,c=(o-i)*f-(u-a)*d,x=(r-e)*f-(s-t)*d,f=c/l,d=x/l,m.x=e+f*(r-e),m.y=t+f*(s-t),f>=0&&f<=1&&(m.onLine1=!0),d>=0&&d<=1&&(m.onLine2=!0),m.onLine1&&m.onLine2?[m.x,m.y]:!1)}var ze=Ke;function Xe(e,t){if(!n.is.defined(e.crs))return t;const r=ne(e.crs);return r.valid||(t.valid=!1,t.errors.push(...r.errors.map(s=>({...s,path:"/crs"})))),t.warnings.push(...r.warnings.map(s=>({...s,path:"/crs"}))),t}function $(e,t,r=""){if(!n.is.defined(e.bbox))return t;const s=re(e.bbox);return s.valid||(t.valid=!1,t.errors.push(...s.errors.map(i=>({...i,path:`${r}/bbox`})))),t.warnings.push(...s.warnings.map(i=>({...i,path:`${r}/bbox`}))),t}function y(e,t,r=""){const s={valid:!0,errors:[],warnings:[]};for(let i=0;i<e.length;i++){const a=`${r}/${i}`,o=t(e[i],a,i);if(!o.valid){s.valid=!1,s.errors=s.errors.concat(o.errors.map(u=>({...u,path:u.path||a,index:i})));continue}n.is.empty(o.warnings)||(s.warnings=s.warnings.concat(o.warnings.map(u=>({...u,path:u.path||a,index:i}))))}return s}function k(e,t=0,r=""){return n.is.arrayOfLengthAtLeast(e,t)?y(e,T,r):{valid:!1,errors:[{message:`Invalid coordinates: must have at least ${t} positions`,path:r}],warnings:[]}}function se(e,t=""){const r=k(e,2,t);if(!r.valid)return r;for(let s=0;s<e.length-1;s++){const i=e[s][0],a=e[s+1][0];Math.abs(a-i)>180&&r.warnings.push({message:`LineString crosses the antimeridian between positions ${s} and ${s+1}, consider using MultiLineString`,path:`${t}/${s}`})}return r}function Je(e,t=""){return n.is.nonEmptyArray(e)?y(e,se,t):{valid:!1,errors:[{message:"Invalid MultiLineString: coordinates must be a non empty array",path:t}],warnings:[]}}function Qe(e,t,r=""){const s=k(e,4,r);if(!s.valid)return s;const i=e[0],a=e[e.length-1];if(i[0]!==a[0]||i[1]!==a[1])return s.valid=!1,s.errors.push({message:"Invalid LinearRing: first and last position must be identical",path:r}),s;const u=Ye(e)?"clockwise":"counter-clockwise";u!==t&&s.warnings.push({message:`Ring must be ${t} but is ${u}`,path:r});const l=ze({type:"Polygon",coordinates:[e]});return l.features.length>0&&(s.valid=!1,s.errors.push({message:`Invalid LinearRing: ${l.features.length} self-intersection(s) detected`,path:r})),s}function ie(e,t=""){return n.is.nonEmptyArray(e)?y(e,(r,s,i)=>Qe(r,i===0?"counter-clockwise":"clockwise",s),t):{valid:!1,errors:[{message:"Invalid Polygon: coordinates must be a non empty array",path:t}],warnings:[]}}function Ze(e,t=""){return n.is.nonEmptyArray(e)?y(e,(r,s)=>ie(r,s),t):{valid:!1,errors:[{message:"Invalid MultiPolygon: coordinates must be a non empty array",path:t}],warnings:[]}}function et(e,t=""){return n.is.nonEmptyArray(e)?y(e,(r,s)=>N(r,s),t):{valid:!1,errors:[{message:"Invalid geometries: geometries must be a non empty array",path:t}],warnings:[]}}function N(e,t=""){if(!n.is.nonEmptyObject(e))return{valid:!1,errors:[{message:"Invalid geometry: geometry must be a non empty object",path:t}],warnings:[]};const r=`${t}/coordinates`;let s;switch(e.type){case E.POINT:{const i=T(e.coordinates);s={valid:i.valid,errors:i.errors.map(a=>({...a,path:r})),warnings:i.warnings.map(a=>({...a,path:r}))};break}case E.MULTI_POINT:{s=k(e.coordinates,0,r);break}case E.LINESTRING:{s=se(e.coordinates,r);break}case E.MULTI_LINESTRING:{s=Je(e.coordinates,r);break}case E.POLYGON:{s=ie(e.coordinates,r);break}case E.MULTI_POLYGON:{s=Ze(e.coordinates,r);break}case E.GEOMETRY_COLLECTION:{s=et(e.geometries,`${t}/geometries`);break}default:return{valid:!1,errors:[{message:`Invalid geometry type: ${e.type}`,path:t}],warnings:[]}}return $(e,s,t)}function ae(e,t=""){if(!n.is.nonEmptyObject(e))return{valid:!1,errors:[{message:"Invalid feature: must be a non empty object",path:t}],warnings:[]};if(e.type===v.FEATURE){if(n.is.nonEmptyObject(e.geometry)){const r=N(e.geometry,`${t}/geometry`);return $(e,r,t)}return{valid:!0,errors:[],warnings:[{message:"Feature has no geometry",path:t}]}}if(e.type===v.FEATURE_COLLECTION){if(n.is.nonEmptyArray(e.features)){const r=y(e.features,ae,`${t}/features`);return $(e,r,t)}return{valid:!1,errors:[{message:"Invalid FeatureCollection: features must be a non empty array",path:t}],warnings:[]}}return{valid:!1,errors:[{message:`Invalid feature: unknown type: ${e.type}`,path:t}],warnings:[]}}function tt(e){if(n.assert.that(e,n.is.nonEmptyObject,"geojson must be a non empty object"),n.is.oneOf(e.type,Object.values(E)))return N(e,"");if(e.type===v.FEATURE||e.type===v.FEATURE_COLLECTION){const t=ae(e,"");return Xe(e,t)}return{valid:!1,errors:[{message:"Invalid GeoJson: type must be either a Geometry, a Feature or a FeatureCollection"}],warnings:[]}}exports.AXES=g;exports.COORDINATE_FORMATS=I;exports.COORDINATE_MODELS=z;exports.COORDINATE_TRUNCATION_FACTORS=A;exports.CRS_TYPES=O;exports.FEATURE_TYPES=v;exports.GEOMETRY_TYPES=E;exports.convertCoordinate=Ue;exports.getCoordinatePrecision=M;exports.getDirectionAxis=j;exports.getDirections=pe;exports.getEast=ye;exports.getLocale=W;exports.getNorth=ve;exports.getSouth=he;exports.getWest=be;exports.guessCoordinateAxis=w;exports.isAltitude=oe;exports.isAxis=V;exports.isDirection=p;exports.isEast=U;exports.isLatitude=D;exports.isLikeBBox=J;exports.isLikeCRS=xe;exports.isLikeFeature=Z;exports.isLikeFeatureCollection=ee;exports.isLikeGeoJson=Pe;exports.isLikeGeometry=Q;exports.isLikePosition=te;exports.isLongitude=_;exports.isNorth=B;exports.isSouth=G;exports.isWest=R;exports.listLocales=de;exports.normalizeCoordinate=Ge;exports.parseCoordinate=X;exports.parsePosition=ke;exports.registerLocale=me;exports.setLocale=Ee;exports.truncateBBox=Fe;exports.truncateCoordinate=_e;exports.truncatePosition=He;exports.validateBBox=re;exports.validateCRS=ne;exports.validateGeoJson=tt;exports.validateGeometry=N;exports.validatePosition=T;
2
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","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/algorithms/is-like/bbox.js","../src/algorithms/is-like/crs.js","../src/algorithms/is-like/geometry.js","../src/algorithms/is-like/geojson.js","../src/algorithms/is-like/position.js","../src/algorithms/truncate/bbox.js","../src/algorithms/truncate/position.js","../src/algorithms/validate/position.js","../src/algorithms/validate/bbox.js","../src/algorithms/validate/crs.js","../../../node_modules/.pnpm/@turf+helpers@7.3.5/node_modules/@turf/helpers/dist/esm/index.js","../../../node_modules/.pnpm/@turf+invariant@7.3.5/node_modules/@turf/invariant/dist/esm/index.js","../../../node_modules/.pnpm/@turf+boolean-clockwise@7.3.5/node_modules/@turf/boolean-clockwise/dist/esm/index.js","../../../node_modules/.pnpm/@turf+kinks@7.3.5/node_modules/@turf/kinks/dist/esm/index.js","../src/algorithms/validate/utils.js","../src/algorithms/validate/geometry.js","../src/algorithms/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 { 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 { 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","// index.ts\nvar earthRadius = 63710088e-1;\nvar factors = {\n centimeters: earthRadius * 100,\n centimetres: earthRadius * 100,\n degrees: 360 / (2 * Math.PI),\n feet: earthRadius * 3.28084,\n inches: earthRadius * 39.37,\n kilometers: earthRadius / 1e3,\n kilometres: earthRadius / 1e3,\n meters: earthRadius,\n metres: earthRadius,\n miles: earthRadius / 1609.344,\n millimeters: earthRadius * 1e3,\n millimetres: earthRadius * 1e3,\n nauticalmiles: earthRadius / 1852,\n radians: 1,\n yards: earthRadius * 1.0936\n};\nvar areaFactors = {\n acres: 247105e-9,\n centimeters: 1e4,\n centimetres: 1e4,\n feet: 10.763910417,\n hectares: 1e-4,\n inches: 1550.003100006,\n kilometers: 1e-6,\n kilometres: 1e-6,\n meters: 1,\n metres: 1,\n miles: 386e-9,\n nauticalmiles: 29155334959812285e-23,\n millimeters: 1e6,\n millimetres: 1e6,\n yards: 1.195990046\n};\nfunction feature(geom, properties, options = {}) {\n const feat = { type: \"Feature\" };\n if (options.id === 0 || options.id) {\n feat.id = options.id;\n }\n if (options.bbox) {\n feat.bbox = options.bbox;\n }\n feat.properties = properties || {};\n feat.geometry = geom;\n return feat;\n}\nfunction geometry(type, coordinates, _options = {}) {\n switch (type) {\n case \"Point\":\n return point(coordinates).geometry;\n case \"LineString\":\n return lineString(coordinates).geometry;\n case \"Polygon\":\n return polygon(coordinates).geometry;\n case \"MultiPoint\":\n return multiPoint(coordinates).geometry;\n case \"MultiLineString\":\n return multiLineString(coordinates).geometry;\n case \"MultiPolygon\":\n return multiPolygon(coordinates).geometry;\n default:\n throw new Error(type + \" is invalid\");\n }\n}\nfunction point(coordinates, properties, options = {}) {\n if (!coordinates) {\n throw new Error(\"coordinates is required\");\n }\n if (!Array.isArray(coordinates)) {\n throw new Error(\"coordinates must be an Array\");\n }\n if (coordinates.length < 2) {\n throw new Error(\"coordinates must be at least 2 numbers long\");\n }\n if (!isNumber(coordinates[0]) || !isNumber(coordinates[1])) {\n throw new Error(\"coordinates must contain numbers\");\n }\n const geom = {\n type: \"Point\",\n coordinates\n };\n return feature(geom, properties, options);\n}\nfunction points(coordinates, properties, options = {}) {\n return featureCollection(\n coordinates.map((coords) => {\n return point(coords, properties);\n }),\n options\n );\n}\nfunction polygon(coordinates, properties, options = {}) {\n for (const ring of coordinates) {\n if (ring.length < 4) {\n throw new Error(\n \"Each LinearRing of a Polygon must have 4 or more Positions.\"\n );\n }\n if (ring[ring.length - 1].length !== ring[0].length) {\n throw new Error(\"First and last Position are not equivalent.\");\n }\n for (let j = 0; j < ring[ring.length - 1].length; j++) {\n if (ring[ring.length - 1][j] !== ring[0][j]) {\n throw new Error(\"First and last Position are not equivalent.\");\n }\n }\n }\n const geom = {\n type: \"Polygon\",\n coordinates\n };\n return feature(geom, properties, options);\n}\nfunction polygons(coordinates, properties, options = {}) {\n return featureCollection(\n coordinates.map((coords) => {\n return polygon(coords, properties);\n }),\n options\n );\n}\nfunction lineString(coordinates, properties, options = {}) {\n if (coordinates.length < 2) {\n throw new Error(\"coordinates must be an array of two or more positions\");\n }\n const geom = {\n type: \"LineString\",\n coordinates\n };\n return feature(geom, properties, options);\n}\nfunction lineStrings(coordinates, properties, options = {}) {\n return featureCollection(\n coordinates.map((coords) => {\n return lineString(coords, properties);\n }),\n options\n );\n}\nfunction featureCollection(features, options = {}) {\n const fc = { type: \"FeatureCollection\" };\n if (options.id) {\n fc.id = options.id;\n }\n if (options.bbox) {\n fc.bbox = options.bbox;\n }\n fc.features = features;\n return fc;\n}\nfunction multiLineString(coordinates, properties, options = {}) {\n const geom = {\n type: \"MultiLineString\",\n coordinates\n };\n return feature(geom, properties, options);\n}\nfunction multiPoint(coordinates, properties, options = {}) {\n const geom = {\n type: \"MultiPoint\",\n coordinates\n };\n return feature(geom, properties, options);\n}\nfunction multiPolygon(coordinates, properties, options = {}) {\n const geom = {\n type: \"MultiPolygon\",\n coordinates\n };\n return feature(geom, properties, options);\n}\nfunction geometryCollection(geometries, properties, options = {}) {\n const geom = {\n type: \"GeometryCollection\",\n geometries\n };\n return feature(geom, properties, options);\n}\nfunction round(num, precision = 0) {\n if (precision && !(precision >= 0)) {\n throw new Error(\"precision must be a positive number\");\n }\n const multiplier = Math.pow(10, precision || 0);\n return Math.round(num * multiplier) / multiplier;\n}\nfunction radiansToLength(radians, units = \"kilometers\") {\n const factor = factors[units];\n if (!factor) {\n throw new Error(units + \" units is invalid\");\n }\n return radians * factor;\n}\nfunction lengthToRadians(distance, units = \"kilometers\") {\n const factor = factors[units];\n if (!factor) {\n throw new Error(units + \" units is invalid\");\n }\n return distance / factor;\n}\nfunction lengthToDegrees(distance, units) {\n return radiansToDegrees(lengthToRadians(distance, units));\n}\nfunction bearingToAzimuth(bearing) {\n let angle = bearing % 360;\n if (angle < 0) {\n angle += 360;\n }\n return angle;\n}\nfunction azimuthToBearing(angle) {\n angle = angle % 360;\n if (angle > 180) {\n return angle - 360;\n } else if (angle < -180) {\n return angle + 360;\n }\n return angle;\n}\nfunction radiansToDegrees(radians) {\n const normalisedRadians = radians % (2 * Math.PI);\n return normalisedRadians * 180 / Math.PI;\n}\nfunction degreesToRadians(degrees) {\n const normalisedDegrees = degrees % 360;\n return normalisedDegrees * Math.PI / 180;\n}\nfunction convertLength(length, originalUnit = \"kilometers\", finalUnit = \"kilometers\") {\n if (!(length >= 0)) {\n throw new Error(\"length must be a positive number\");\n }\n return radiansToLength(lengthToRadians(length, originalUnit), finalUnit);\n}\nfunction convertArea(area, originalUnit = \"meters\", finalUnit = \"kilometers\") {\n if (!(area >= 0)) {\n throw new Error(\"area must be a positive number\");\n }\n const startFactor = areaFactors[originalUnit];\n if (!startFactor) {\n throw new Error(\"invalid original units\");\n }\n const finalFactor = areaFactors[finalUnit];\n if (!finalFactor) {\n throw new Error(\"invalid final units\");\n }\n return area / startFactor * finalFactor;\n}\nfunction isNumber(num) {\n return !isNaN(num) && num !== null && !Array.isArray(num);\n}\nfunction isObject(input) {\n return input !== null && typeof input === \"object\" && !Array.isArray(input);\n}\nfunction validateBBox(bbox) {\n if (!bbox) {\n throw new Error(\"bbox is required\");\n }\n if (!Array.isArray(bbox)) {\n throw new Error(\"bbox must be an Array\");\n }\n if (bbox.length !== 4 && bbox.length !== 6) {\n throw new Error(\"bbox must be an Array of 4 or 6 numbers\");\n }\n bbox.forEach((num) => {\n if (!isNumber(num)) {\n throw new Error(\"bbox must only contain numbers\");\n }\n });\n}\nfunction validateId(id) {\n if (!id) {\n throw new Error(\"id is required\");\n }\n if ([\"string\", \"number\"].indexOf(typeof id) === -1) {\n throw new Error(\"id must be a number or a string\");\n }\n}\nexport {\n areaFactors,\n azimuthToBearing,\n bearingToAzimuth,\n convertArea,\n convertLength,\n degreesToRadians,\n earthRadius,\n factors,\n feature,\n featureCollection,\n geometry,\n geometryCollection,\n isNumber,\n isObject,\n lengthToDegrees,\n lengthToRadians,\n lineString,\n lineStrings,\n multiLineString,\n multiPoint,\n multiPolygon,\n point,\n points,\n polygon,\n polygons,\n radiansToDegrees,\n radiansToLength,\n round,\n validateBBox,\n validateId\n};\n//# sourceMappingURL=index.js.map","// index.ts\nimport { isNumber } from \"@turf/helpers\";\nfunction getCoord(coord) {\n if (!coord) {\n throw new Error(\"coord is required\");\n }\n if (!Array.isArray(coord)) {\n if (coord.type === \"Feature\" && coord.geometry !== null && coord.geometry.type === \"Point\") {\n return [...coord.geometry.coordinates];\n }\n if (coord.type === \"Point\") {\n return [...coord.coordinates];\n }\n }\n if (Array.isArray(coord) && coord.length >= 2 && !Array.isArray(coord[0]) && !Array.isArray(coord[1])) {\n return [...coord];\n }\n throw new Error(\"coord must be GeoJSON Point or an Array of numbers\");\n}\nfunction getCoords(coords) {\n if (Array.isArray(coords)) {\n return coords;\n }\n if (coords.type === \"Feature\") {\n if (coords.geometry !== null) {\n return coords.geometry.coordinates;\n }\n } else {\n if (coords.coordinates) {\n return coords.coordinates;\n }\n }\n throw new Error(\n \"coords must be GeoJSON Feature, Geometry Object or an Array\"\n );\n}\nfunction containsNumber(coordinates) {\n if (coordinates.length > 1 && isNumber(coordinates[0]) && isNumber(coordinates[1])) {\n return true;\n }\n if (Array.isArray(coordinates[0]) && coordinates[0].length) {\n return containsNumber(coordinates[0]);\n }\n throw new Error(\"coordinates must only contain numbers\");\n}\nfunction geojsonType(value, type, name) {\n if (!type || !name) {\n throw new Error(\"type and name required\");\n }\n if (!value || value.type !== type) {\n throw new Error(\n \"Invalid input to \" + name + \": must be a \" + type + \", given \" + value.type\n );\n }\n}\nfunction featureOf(feature, type, name) {\n if (!feature) {\n throw new Error(\"No feature passed\");\n }\n if (!name) {\n throw new Error(\".featureOf() requires a name\");\n }\n if (!feature || feature.type !== \"Feature\" || !feature.geometry) {\n throw new Error(\n \"Invalid input to \" + name + \", Feature with geometry required\"\n );\n }\n if (!feature.geometry || feature.geometry.type !== type) {\n throw new Error(\n \"Invalid input to \" + name + \": must be a \" + type + \", given \" + feature.geometry.type\n );\n }\n}\nfunction collectionOf(featureCollection, type, name) {\n if (!featureCollection) {\n throw new Error(\"No featureCollection passed\");\n }\n if (!name) {\n throw new Error(\".collectionOf() requires a name\");\n }\n if (!featureCollection || featureCollection.type !== \"FeatureCollection\") {\n throw new Error(\n \"Invalid input to \" + name + \", FeatureCollection required\"\n );\n }\n for (const feature of featureCollection.features) {\n if (!feature || feature.type !== \"Feature\" || !feature.geometry) {\n throw new Error(\n \"Invalid input to \" + name + \", Feature with geometry required\"\n );\n }\n if (!feature.geometry || feature.geometry.type !== type) {\n throw new Error(\n \"Invalid input to \" + name + \": must be a \" + type + \", given \" + feature.geometry.type\n );\n }\n }\n}\nfunction getGeom(geojson) {\n if (geojson.type === \"Feature\") {\n return geojson.geometry;\n }\n return geojson;\n}\nfunction getType(geojson, _name) {\n if (geojson.type === \"FeatureCollection\") {\n return \"FeatureCollection\";\n }\n if (geojson.type === \"GeometryCollection\") {\n return \"GeometryCollection\";\n }\n if (geojson.type === \"Feature\" && geojson.geometry !== null) {\n return geojson.geometry.type;\n }\n return geojson.type;\n}\nexport {\n collectionOf,\n containsNumber,\n featureOf,\n geojsonType,\n getCoord,\n getCoords,\n getGeom,\n getType\n};\n//# sourceMappingURL=index.js.map","// index.ts\nimport { getCoords } from \"@turf/invariant\";\nfunction booleanClockwise(line) {\n const ring = getCoords(line);\n let sum = 0;\n let i = 1;\n let prev;\n let cur;\n while (i < ring.length) {\n prev = cur || ring[0];\n cur = ring[i];\n sum += (cur[0] - prev[0]) * (cur[1] + prev[1]);\n i++;\n }\n return sum > 0;\n}\nvar index_default = booleanClockwise;\nexport {\n booleanClockwise,\n index_default as default\n};\n//# sourceMappingURL=index.js.map","// index.ts\nimport { point } from \"@turf/helpers\";\nfunction kinks(featureIn) {\n let coordinates;\n let feature;\n const results = {\n type: \"FeatureCollection\",\n features: []\n };\n if (featureIn.type === \"Feature\") {\n feature = featureIn.geometry;\n } else {\n feature = featureIn;\n }\n if (feature.type === \"LineString\") {\n coordinates = [feature.coordinates];\n } else if (feature.type === \"MultiLineString\") {\n coordinates = feature.coordinates;\n } else if (feature.type === \"MultiPolygon\") {\n coordinates = [].concat(...feature.coordinates);\n } else if (feature.type === \"Polygon\") {\n coordinates = feature.coordinates;\n } else {\n throw new Error(\n \"Input must be a LineString, MultiLineString, Polygon, or MultiPolygon Feature or Geometry\"\n );\n }\n coordinates.forEach((line1) => {\n coordinates.forEach((line2) => {\n for (let i = 0; i < line1.length - 1; i++) {\n for (let k = i; k < line2.length - 1; k++) {\n if (line1 === line2) {\n if (Math.abs(i - k) === 1) {\n continue;\n }\n if (\n // segments are first and last segment of lineString\n i === 0 && k === line1.length - 2 && // lineString is closed\n line1[i][0] === line1[line1.length - 1][0] && line1[i][1] === line1[line1.length - 1][1]\n ) {\n continue;\n }\n }\n const intersection = lineIntersects(\n line1[i][0],\n line1[i][1],\n line1[i + 1][0],\n line1[i + 1][1],\n line2[k][0],\n line2[k][1],\n line2[k + 1][0],\n line2[k + 1][1]\n );\n if (intersection) {\n results.features.push(point([intersection[0], intersection[1]]));\n }\n }\n }\n });\n });\n return results;\n}\nfunction lineIntersects(line1StartX, line1StartY, line1EndX, line1EndY, line2StartX, line2StartY, line2EndX, line2EndY) {\n let denominator;\n let a;\n let b;\n let numerator1;\n let numerator2;\n const result = {\n x: null,\n y: null,\n onLine1: false,\n onLine2: false\n };\n denominator = (line2EndY - line2StartY) * (line1EndX - line1StartX) - (line2EndX - line2StartX) * (line1EndY - line1StartY);\n if (denominator === 0) {\n if (result.x !== null && result.y !== null) {\n return result;\n } else {\n return false;\n }\n }\n a = line1StartY - line2StartY;\n b = line1StartX - line2StartX;\n numerator1 = (line2EndX - line2StartX) * a - (line2EndY - line2StartY) * b;\n numerator2 = (line1EndX - line1StartX) * a - (line1EndY - line1StartY) * b;\n a = numerator1 / denominator;\n b = numerator2 / denominator;\n result.x = line1StartX + a * (line1EndX - line1StartX);\n result.y = line1StartY + a * (line1EndY - line1StartY);\n if (a >= 0 && a <= 1) {\n result.onLine1 = true;\n }\n if (b >= 0 && b <= 1) {\n result.onLine2 = true;\n }\n if (result.onLine1 && result.onLine2) {\n return [result.x, result.y];\n } else {\n return false;\n }\n}\nvar index_default = kinks;\nexport {\n index_default as default,\n kinks\n};\n//# sourceMappingURL=index.js.map","import { is } from '@kalisio/common-core'\nimport { validateBBox } from './bbox.js'\nimport { validateCRS } from './crs.js'\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\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 }\n return response\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'\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'\nimport { validateOptionalBBox, validateArray, 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 }\n }\n if (feature.type === FEATURE_TYPES.FEATURE) {\n if (is.nonEmptyObject(feature.geometry)) {\n const result = validateGeometry(feature.geometry, `${path}/geometry`)\n return validateOptionalBBox(feature, result, path)\n }\n return {\n valid: true,\n errors: [],\n warnings: [{ message: 'Feature has no geometry', path }]\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 return validateOptionalBBox(feature, result, path)\n }\n return {\n valid: false,\n errors: [{ message: 'Invalid FeatureCollection: features must be a non empty array', path }],\n warnings: []\n }\n }\n return {\n valid: false,\n errors: [{ message: `Invalid feature: unknown type: ${feature.type}`, path }],\n warnings: []\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))) return validateGeometry(geoJson, '')\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 }\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","truncateBBox","bbox","truncatePosition","position","validatePosition","coordinates","response","lonPrecision","latPrecision","validateBBox","is2D","max","minResult","e","maxResult","west","south","east","north","w","validateCRS","crs","feature","geom","properties","options","feat","point","isNumber","num","getCoords","coords","booleanClockwise","line","ring","sum","prev","cur","index_default","kinks","featureIn","results","line1","line2","k","intersection","lineIntersects","line1StartX","line1StartY","line1EndX","line1EndY","line2StartX","line2StartY","line2EndX","line2EndY","denominator","a","b","numerator1","numerator2","result","validateOptionalCRS","obj","crsResult","validateOptionalBBox","path","bboxResult","validateArray","items","validator","itemPath","validateCoordinatesArray","minimumLength","validateLineStringCoordinates","lon1","lon2","validateMultiLineStringCoordinates","validateLinearRing","expectedWindingOrder","last","actualWindingOrder","intersections","validatePolygonCoordinates","p","validateMultiPolygonCoordinates","c","validateGeometryCollectionGeometries","geometries","g","validateGeometry","geometry","coordsPath","positionResult","validateFeature","validateGeoJson","geoJson"],"mappings":"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","x_google_ignoreList":[21,22,23,24]}