@kalisio/common-geospatial 0.7.0 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("@kalisio/common-core"),Z=require("@logtape/logtape"),Te=require("heap-js"),Le=require("@turf/truncate"),Se=require("@turf/boolean-clockwise"),Ie=require("@turf/kinks"),m={LATITUDE:"LAT",LONGITUDE:"LON",ALTITUDE:"ALT"};function ee(e){return r.assert.that(e,r.is.string,"axis must be a string"),Object.values(m).includes(e)}function R(e){return r.assert.that(e,r.is.string,"axis must be a string"),e===m.LATITUDE}function P(e){return r.assert.that(e,r.is.string,"axis must be a string"),e===m.LONGITUDE}function Re(e){return r.assert.that(e,r.is.string,"axis must be a string"),e===m.ALTITUDE}const De={NORTH:{label:"Nord",symbol:"N"},SOUTH:{label:"Sud",symbol:"S"},EAST:{label:"Est",symbol:"E"},WEST:{label:"Ouest",symbol:"O"}},Ae={DIRECTIONS:De},Ce={NORTH:{label:"North",symbol:"N"},SOUTH:{label:"South",symbol:"S"},EAST:{label:"East",symbol:"E"},WEST:{label:"West",symbol:"W"}},Ne={DIRECTIONS:Ce},we={DIRECTIONS:{NORTH:{label:r.is.string,symbol:r.is.char},SOUTH:{label:r.is.string,symbol:r.is.char},EAST:{label:r.is.string,symbol:r.is.char},WEST:{label:r.is.string,symbol:r.is.char}}},b={en:Ne,fr:Ae};let h="en";const K="en";function Me(){return Object.keys(b)}function xe(e,t){r.assert.all([{value:e,validator:r.is.string,message:"code must be a string"},{value:e,validator:s=>!r.has.key(b,s),message:"locale already registered"},{value:t,validator:r.is.plainObject,message:"content must be an object"},{value:t,validator:s=>r.conform.schema(s,we),message:"content does not conform to schema"}]),b[e]=t}function $e(e){r.assert.all([{value:e,validator:r.is.string,message:"code must be a string"},{value:e,validator:t=>r.has.key(b,t),message:"code is unknown"}]),h=e}function te(){return h}function C(e){return r.assert.all([{value:e,validator:r.is.string,message:"code must be a string"},{value:e,validator:t=>r.has.key(b,t),message:"code is unknown"}]),b[e]}function H(){return h===K?[h]:[h,K]}function B(e){const t=new Set;for(const s of H()){const{DIRECTIONS:n}=C(s);for(const i of e)t.add(n[i].symbol)}return[...t]}function ne(){return B(["NORTH","SOUTH"])}function re(){return B(["EAST","WEST"])}function N(){return B(["NORTH","SOUTH","EAST","WEST"])}function L(){return C(te()).DIRECTIONS}function w(e,t){const s=t.toUpperCase();return H().some(n=>{const{label:i,symbol:o}=C(n).DIRECTIONS[e];return s===i.toUpperCase()||s===o.toUpperCase()})}function _e(e=null){const t=L();return r.is.defined(e)?(r.assert.that(e,ee,"axis must be a valid axis"),R(e)?[t.SOUTH,t.NORTH]:P(e)?[t.EAST,t.WEST]:[]):[t.SOUTH,t.NORTH,t.EAST,t.WEST]}function Fe(){return L().NORTH}function Ge(){return L().SOUTH}function ke(){return L().EAST}function Ue(){return L().WEST}function v(e){return r.assert.that(e,r.is.string,"dir must be a string"),se(e)||j(e)||M(e)||S(e)}function se(e){return r.assert.that(e,r.is.string,"dir must be a string"),w("NORTH",e)}function j(e){return r.assert.that(e,r.is.string,"dir must be a string"),w("SOUTH",e)}function M(e){return r.assert.that(e,r.is.string,"dir must be a string"),w("EAST",e)}function S(e){return r.assert.that(e,r.is.string,"dir must be a string"),w("WEST",e)}function ie(e){return r.assert.that(e,v,"dir must be a direction"),S(e)||M(e)?m.LONGITUDE:m.LATITUDE}const Pe={degrees:r.is.number,direction:r.optional(v)},He=/^(-?\d{1,3}(?:\.\d+)?)°?$/;function Be(){return new RegExp(`^(\\d{1,3}(?:\\.\\d+)?)°?([${N()}])$`,"i")}function I(e){let t=null,s=null;if(r.is.plainObject(e)&&r.conform.schema(e,Pe))r.is.defined(e.direction)?e.degrees>=0&&(t=e.degrees,s=e.direction):t=e.degrees;else if(r.is.string(e)){const n=e.replace(/\s+/g,""),i=n.match(He)??n.match(Be());i&&(t=parseFloat(i[1]),s=i[2]??null)}return{get degrees(){return t},get direction(){return s},get format(){return"DD"},isValid(){return r.is.number(t)},toString(n){if(r.assert.that(n,r.is.positiveInteger,"decimalPlaces must be a positive integer"),!this.isValid())return"";let i=`${t.toFixed(n)}°`;return s&&(i+=` ${s}`),i},toDecimal(){return this.isValid()?I({degrees:t,direction:s}):null}}}const je={degrees:r.is.integer,minutes:e=>r.is.inRangeExclusiveMax(e,0,60),direction:r.optional(v)},Ve=/^(-?\d{1,3})°(\d{1,2}(?:\.\d+)?)'?$/;function Ye(){return new RegExp(`^(\\d{1,3})°(\\d{1,2}(?:\\.\\d+)?)'?([${N().join("")}])$`,"i")}function ae(e){let t=null,s=null,n=null;if(r.is.plainObject(e)&&r.conform.schema(e,je))r.is.defined(e.direction)?e.degrees>=0&&(t=e.degrees,s=e.minutes,n=e.direction):(t=e.degrees,s=e.minutes);else if(r.is.string(e)){const i=e.replace(/\s+/g,""),o=i.match(Ve)??i.match(Ye());o&&(t=parseFloat(o[1]),s=parseFloat(o[2]),n=o[3]??null)}return{get degrees(){return t},get minutes(){return s},get direction(){return n},get format(){return"DDM"},isValid(){return r.is.integer(t)&&r.is.inRangeExclusiveMax(s,0,60)},toString(i){if(r.assert.that(i,r.is.positiveInteger,"decimalPlaces must be a positive integer"),!this.isValid())return"";let o=`${t}° ${s.toFixed(i)}'`;return n&&(o+=` ${n}`),o},toDecimal(){return this.isValid()?I({degrees:t+s/60,direction:n}):null}}}const We={degrees:r.is.nonNegativeInteger,minutes:e=>r.is.inRangeExclusiveMax(e,0,60),direction:v};function qe(){return new RegExp(`^(\\d{2})(\\d{3})([${ne().join("")}])$`,"i")}function Xe(){return new RegExp(`^(\\d{3})(\\d{3})([${re().join("")}])$`,"i")}function oe(e){let t=null,s=null,n=null;if(r.is.plainObject(e)&&r.conform.schema(e,We))t=e.degrees,s=e.minutes,n=e.direction;else if(r.is.string(e)){const i=e.trim(),o=i.match(qe())??i.match(Xe());o&&(t=parseFloat(o[1]),s=parseFloat(o[2])/10,n=o[3])}return{get degrees(){return t},get minutes(){return s},get direction(){return n},get format(){return"DDM_AERO"},isValid(){return r.is.nonNegativeInteger(t)&&r.is.inRangeExclusiveMax(s,0,60)&&v(n)},toString(){if(!this.isValid())return"";const i=M(n)||S(n),o=String(t).padStart(i?3:2,"0"),l=Math.floor(s*10).toString().padStart(3,"0");return`${o}${l}${n}`},toDecimal(){return this.isValid()?I({degrees:t+s/60,direction:n}):null}}}const Ke={degrees:r.is.integer,minutes:e=>r.is.integer(e)&&r.is.inRange(e,0,59),seconds:e=>r.is.inRangeExclusiveMax(e,0,60),direction:r.optional(v)},ze=/^(-?\d{1,3})°(\d{1,2})'(\d{1,2}(?:\.\d+)?)"?$/;function Je(){return new RegExp(`^(\\d{1,3})°(\\d{1,2})'(\\d{1,2}(?:\\.\\d+)?)"?([${N().join("")}])$`,"i")}function le(e){let t=null,s=null,n=null,i=null;if(r.is.plainObject(e)&&r.conform.schema(e,Ke))r.is.defined(e.direction)?e.degrees>=0&&(t=e.degrees,s=e.minutes,n=e.seconds,i=e.direction):(t=e.degrees,s=e.minutes,n=e.seconds);else if(r.is.string(e)){const o=e.replace(/\s+/g,""),l=o.match(ze)??o.match(Je());l&&(t=parseFloat(l[1]),s=parseFloat(l[2]),n=parseFloat(l[3]),i=l[4]??null)}return{get degrees(){return t},get minutes(){return s},get seconds(){return n},get direction(){return i},get format(){return"DMS"},isValid(){return r.is.integer(t)&&r.is.integer(s)&&r.is.inRange(s,0,59)&&r.is.inRangeExclusiveMax(n,0,60)},toString(o){if(r.assert.that(o,r.is.positiveInteger,"decimalPlaces must be a positive integer"),!this.isValid())return"";let l=`${t}° ${s}' ${n.toFixed(o)}"`;return i&&(l+=` ${i}`),l},toDecimal(){return this.isValid()?I({degrees:t+s/60+n/3600,direction:i}):null}}}function z(e){const t=Math.floor(e.degrees),s=(e.degrees-t)*60;return{degrees:t,minutes:s,direction:e.direction}}function Qe(e){const t=Math.floor(e.degrees),s=(e.degrees-t)*60,n=Math.floor(s),i=(s-n)*60;return{degrees:t,minutes:n,seconds:i,direction:e.direction}}const J={DD:e=>(r.assert.that(e,t=>t.isValid(),"dd must be a valid coordinate"),e),DDM:e=>{r.assert.that(e,i=>i.isValid(),"dd must be a valid coordinate");const{degrees:t,minutes:s,direction:n}=z(e);return ae(n?{degrees:t,minutes:s,direction:n}:{degrees:t,minutes:s})},DMS:e=>{r.assert.that(e,o=>o.isValid(),"dd must be a valid coordinate");const{degrees:t,minutes:s,seconds:n,direction:i}=Qe(e);return le(i?{degrees:t,minutes:s,seconds:n,direction:i}:{degrees:t,minutes:s,seconds:n})},DDM_AERO:e=>{r.assert.that(e,i=>i.isValid(),"dd must be a valid coordinate");const{degrees:t,minutes:s,direction:n}=z(e);return oe({degrees:t,minutes:s,direction:n})}},D={DD:"DD",DDM:"DDM",DDM_AERO:"DDM_AERO",DMS:"DMS"},ue={DD:I,DDM:ae,DDM_AERO:oe,DMS:le},x=Array.from({length:9},(e,t)=>10**t);function k(e,t){if(r.assert.that(e,r.is.number,"coord must be a number"),r.is.defined(t))return r.assert.that(t,v,"dir must be a direction"),ie(t);if(Math.abs(e)>90)return m.LONGITUDE}function U(e){r.assert.that(e,r.is.number,"coord must be a number");const t=e.toExponential(),[s,n]=t.split("e").map(Number),i=(s.toString().split(".")[1]||"").length;return Math.max(0,i-n)}function Ze(e,t=7){r.assert.all([{value:e,validator:r.is.number,message:"coord must be a number"},{value:t,validator:n=>r.is.inRange(n,0,8),message:"precision must be in range [0, 8]"}]);const s=x[t];return Math.round(e*s)/s}function et(e,t){if(r.assert.all([{value:e,validator:r.is.number,message:"coord must be a number"},{value:t,validator:n=>P(n)||R(n),message:"axis must be either a longitude or latitude"}]),R(t))return Math.max(-90,Math.min(90,e));let s=((e+180)%360+360)%360-180;return s===-180&&(s=180),Object.is(s,-0)&&(s=0),s}function tt(e,t){r.assert.all([{value:e,validator:n=>r.is.defined(n)&&n.isValid(),message:"from must be a valid coordinate"},{value:t,validator:n=>r.has.key(J,n),message:`unknown format: ${t}`}]);const s=e.format===D.DD?e:e.toDecimal();return s.isValid()?t===D.DD?s:J[t](s):null}function ce(e){r.assert.that(e,r.is.nonEmptyString,"pattern must be a non empty string");for(const t of Object.keys(D)){const s=ue[t](e);if(s.isValid())return s}return null}function nt(e){r.assert.that(e,a=>r.is.nonEmptyString(a),"pattern must be a non-empty string");const t=e.split(/[,;|]/);if(t.length!==2)return null;const[s,n]=t.map(ce);if(!s||!n)return null;const i=s.toDecimal(),o=n.toDecimal(),l=k(i.degrees,i.direction),c=k(o.degrees,o.direction),u=a=>{const{degrees:d,direction:g}=a;return g&&(S(g)||j(g))?-d:d};if(l===m.LONGITUDE&&c===m.LATITUDE)return[u(i),u(o)];if(c===m.LONGITUDE&&l===m.LATITUDE)return[u(o),u(i)];if(l===m.LONGITUDE&&!c)return[u(i),o];if(l===m.LATITUDE&&!c)return[u(o),u(i)];if(c===m.LONGITUDE&&!l)return[u(o),u(i)];if(c===m.LATITUDE&&!l)return[u(i),u(o)];if(!l&&!c)return[[u(i),u(o)],[u(o),u(i)]]}function ge(e){return!r.is.arrayOfLength(e,4)&&!r.is.arrayOfLength(e,6)?!1:e.every(r.is.number)}const O={NAME:"name",LINK:"link"};function rt(e){return r.is.plainObject(e)?e.type===O.NAME?r.is.nonEmptyString(e.properties?.name):e.type===O.LINK?r.is.nonEmptyString(e.properties?.href):!1:!1}const f={POINT:"Point",MULTI_POINT:"MultiPoint",LINESTRING:"LineString",MULTI_LINESTRING:"MultiLineString",POLYGON:"Polygon",MULTI_POLYGON:"MultiPolygon",GEOMETRY_COLLECTION:"GeometryCollection"};function $(e){return!r.is.plainObject(e)||!r.is.oneOf(e.type,Object.values(f))?!1:e.type===f.GEOMETRY_COLLECTION?r.is.array(e.geometries):r.is.array(e.coordinates)}const p={FEATURE:"Feature",FEATURE_COLLECTION:"FeatureCollection"};function fe(e){return r.is.plainObject(e)?p.FEATURE===e.type:!1}function me(e){return!r.is.plainObject(e)||e.type!==p.FEATURE_COLLECTION?!1:r.is.array(e.features)}function V(e){return r.is.plainObject(e)?$(e)||fe(e)?!0:me(e):!1}function de(e){return r.is.arrayOfLengthBetween(e,2,3)?e.every(r.is.number):!1}function st(e,t,s){return Math.abs((e[0]*(t[1]-s[1])+t[0]*(s[1]-e[1])+s[0]*(e[1]-t[1]))/2)}function G(e,{tolerance:t=0,getWeight:s=()=>1}={}){if(e.length<=2)return e;const n=e.map((a,d)=>({coord:a,i:d,area:1/0,removed:!1,prev:null,next:null}));for(let a=0;a<n.length;a++)a>0&&(n[a].prev=n[a-1]),a<n.length-1&&(n[a].next=n[a+1]);const i=a=>!a.prev||!a.next?1/0:st(a.prev.coord,a.coord,a.next.coord)*s(a.coord,a.i),o=new Te.Heap((a,d)=>a.area-d.area);for(let a=1;a<n.length-1;a++)n[a].area=i(n[a]),n[a]._currentArea=n[a].area,o.push(n[a]);let l=0;for(;o.size()>0;){const a=o.pop();if(!a.removed&&a.area===a._currentArea){if(a.area<l?a.area=l:l=a.area,a.area>=t)break;a.removed=!0,a.prev&&(a.prev.next=a.next),a.next&&(a.next.prev=a.prev),a.prev?.prev&&(a.prev.area=i(a.prev),a.prev._currentArea=a.prev.area,o.push(a.prev)),a.next?.next&&(a.next.area=i(a.next),a.next._currentArea=a.next.area,o.push(a.next))}}const c=[];let u=n[0];for(;u;)u.removed||c.push(u.coord),u=u.next;return c}function _(e,t){switch(r.assert.all([{value:e,validator:$,message:"geometry must be a GeoJson geometry"}]),e.type){case f.LINESTRING:e.coordinates=G(e.coordinates,t);break;case f.POLYGON:case f.MULTI_LINESTRING:e.coordinates=e.coordinates.map(s=>G(s,t));break;case f.MULTI_POLYGON:e.coordinates=e.coordinates.map(s=>s.map(n=>G(n,t)));break;case f.GEOMETRY_COLLECTION:e.geometries.forEach(s=>_(s,t));break}return e}const it=Z.getLogger(["common-ekosystem","simplify","geojson"]);function pe(e,t){if(e.type===p.FEATURE)e.geometry&&_(e.geometry,t);else if(e.type===p.FEATURE_COLLECTION)for(const s of e.features)pe(s,t);else it.warn('Unknown feature type "{type}", skipping.',{type:e.type});return e}function at(e,t){return r.assert.all([{value:e,validator:V,message:"geoJson must be a GeoJson object"}]),r.is.oneOf(e.type,Object.values(f))?_(e,t):pe(e,t)}function Y(e,t=7){r.assert.all([{value:e,validator:ge,message:"bbox must be bounding box"},{value:t,validator:n=>r.is.inRange(n,0,8),message:"precision must be in range [0, 8]"}]);const s=x[t];for(let n=0;n<e.length;n++)e[n]=Math.round(e[n]*s)/s;return e}function W(e,t=7){r.assert.all([{value:e,validator:$,message:"geometry must be a GeoJson geometry"},{value:t,validator:n=>r.is.inRange(n,0,8),message:"precision must be in range [0, 8]"}]);const s=Le(e,{precision:t,mutate:!0});return s.bbox&&Y(s.bbox,t),s}const ot=Z.getLogger(["common-ekosystem","truncate","geojson"]);function ve(e,t){if(e.type===p.FEATURE)e.geometry&&W(e.geometry,t);else if(e.type===p.FEATURE_COLLECTION)for(const s of e.features)ve(s,t);else ot.warn('Unknown feature type "{type}", skipping.',{type:e.type});return e.bbox&&Y(e.bbox,t),e}function lt(e,t=7){return r.assert.all([{value:e,validator:V,message:"geoJson must be a valid GeoJson"},{value:t,validator:s=>r.is.inRange(s,0,8),message:"precision must be in range [0, 8]"}]),r.is.oneOf(e.type,Object.values(f))?W(e,t):ve(e,t)}function ut(e,t=7){r.assert.all([{value:e,validator:de,message:"position must be a position"},{value:t,validator:n=>r.is.inRange(n,0,8),message:"precision must be in range [0, 8]"}]);const s=x[t];for(let n=0;n<e.length;n++)e[n]=Math.round(e[n]*s)/s;return e}function T(e){if(!r.is.arrayOfLengthBetween(e,2,3))return{valid:!1,errors:[{message:"Invalid coordinates: must be an array of 2 or 3 coordinates"}],warnings:[]};if(!r.is.number(e[0])||!r.is.number(e[1]))return{valid:!1,errors:[{message:"Invalid coordinates: longitude and latitude must be numbers"}],warnings:[]};if(!r.is.inRange(e[0],-180,180))return{valid:!1,errors:[{message:"Invalid coordinates: longitude must be in the range -180 to 180"}],warnings:[]};if(!r.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&&!r.is.number(e[2]))return{valid:!1,errors:[{message:"Invalid coordinates: altitude must be a number"}],warnings:[]};const t={valid:!0,errors:[],warnings:[]},s=U(e[0]);s>6&&t.warnings.push({message:`longitude precision is high (${s} decimals, max recommended: 6)`});const n=U(e[1]);return n>6&&t.warnings.push({message:`latitude precision is high (${n} decimals, max recommended: 6)`}),t}function Ee(e){if(!r.is.arrayOfLength(e,4)&&!r.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,s=t?[e[0],e[1]]:[e[0],e[1],e[2]],n=t?[e[2],e[3]]:[e[3],e[4],e[5]],i=T(s);if(!i.valid)return{valid:!1,errors:i.errors.map(g=>({...g,message:`Invalid bbox south-west: ${g.message}`})),warnings:[]};const o=T(n);if(!o.valid)return{valid:!1,errors:o.errors.map(g=>({...g,message:`Invalid bbox north-east: ${g.message}`})),warnings:[]};const[l,c]=s,[u,a]=n;if(c>a)return{valid:!1,errors:[{message:`Invalid bbox: south (${c}) must be <= north (${a})`}],warnings:[]};if(!t){const g=e[2],X=e[5];if(g>X)return{valid:!1,errors:[{message:`Invalid bbox: min altitude (${g}) must be <= max altitude (${X})`}],warnings:[]}}const d={valid:!0,errors:[],warnings:[]};return l>u&&d.warnings.push({message:`bbox crosses the antimeridian (west: ${l} > east: ${u})`}),d.warnings.push(...i.warnings.map(g=>({...g,message:`south-west: ${g.message}`}))),d.warnings.push(...o.warnings.map(g=>({...g,message:`north-east: ${g.message}`}))),d}function be(e){if(!r.is.plainObject(e))return{valid:!1,errors:[{message:"Invalid crs: must be an object"}],warnings:[]};switch(e.type){case O.NAME:return r.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 r.is.nonEmptyString(e.properties?.href)?{valid:!0,errors:[],warnings:[]}:{valid:!1,errors:[{message:"Invalid crs: linked crs must have a non-empty properties.href string"}],warnings:[]};default:return{valid:!1,errors:[{message:`Invalid crs: unknown type: ${e.type}`}],warnings:[]}}}function E(){return{Feature:0,FeatureCollection:0,geometries:{}}}function ct(...e){const t=E();for(const s of e){const n=s.statistics;if(n){t.Feature+=n.Feature??0,t.FeatureCollection+=n.FeatureCollection??0;for(const[i,o]of Object.entries(n.geometries??{}))t.geometries[i]=(t.geometries[i]??0)+o}}return t}function y(e,t,s=""){const n={valid:!0,errors:[],warnings:[],statistics:E()};for(let i=0;i<e.length;i++){const o=`${s}/${i}`,l=t(e[i],o,i);if(l.statistics&&(n.statistics=ct(n,l)),!l.valid){n.valid=!1,n.errors=n.errors.concat(l.errors.map(c=>({...c,path:c.path||o,index:i})));continue}r.is.empty(l.warnings)||(n.warnings=n.warnings.concat(l.warnings.map(c=>({...c,path:c.path||o,index:i}))))}return n}function Q(e,t){if(!r.is.defined(e.crs))return t;const s=be(e.crs);return s.valid||(t.valid=!1,t.errors.push(...s.errors.map(n=>({...n,path:"/crs"})))),t.warnings.push(...s.warnings.map(n=>({...n,path:"/crs"}))),t}function A(e,t,s=""){if(!r.is.defined(e.bbox))return t;const n=Ee(e.bbox);return n.valid||(t.valid=!1,t.errors.push(...n.errors.map(i=>({...i,path:`${s}/bbox`})))),t.warnings.push(...n.warnings.map(i=>({...i,path:`${s}/bbox`}))),t}function q(e,t=0,s=""){return r.is.arrayOfLengthAtLeast(e,t)?y(e,T,s):{valid:!1,errors:[{message:`Invalid coordinates: must have at least ${t} positions`,path:s}],warnings:[]}}function ye(e,t=""){const s=q(e,2,t);if(!s.valid)return s;for(let n=0;n<e.length-1;n++){const i=e[n][0],o=e[n+1][0];Math.abs(o-i)>180&&s.warnings.push({message:`LineString crosses the antimeridian between positions ${n} and ${n+1}, consider using MultiLineString`,path:`${t}/${n}`})}return s}function gt(e,t=""){return r.is.nonEmptyArray(e)?y(e,ye,t):{valid:!1,errors:[{message:"Invalid MultiLineString: coordinates must be a non empty array",path:t}],warnings:[]}}function ft(e,t,s=""){const n=q(e,4,s);if(!n.valid)return n;const i=e[0],o=e[e.length-1];if(i[0]!==o[0]||i[1]!==o[1])return n.valid=!1,n.errors.push({message:"Invalid LinearRing: first and last position must be identical",path:s}),n;const c=Se(e)?"clockwise":"counter-clockwise";c!==t&&n.warnings.push({message:`Ring must be ${t} but is ${c}`,path:s});const u=Ie({type:"Polygon",coordinates:[e]});return u.features.length>0&&(n.valid=!1,n.errors.push({message:`Invalid LinearRing: ${u.features.length} self-intersection(s) detected`,path:s})),n}function he(e,t=""){return r.is.nonEmptyArray(e)?y(e,(s,n,i)=>ft(s,i===0?"counter-clockwise":"clockwise",n),t):{valid:!1,errors:[{message:"Invalid Polygon: coordinates must be a non empty array",path:t}],warnings:[]}}function mt(e,t=""){return r.is.nonEmptyArray(e)?y(e,(s,n)=>he(s,n),t):{valid:!1,errors:[{message:"Invalid MultiPolygon: coordinates must be a non empty array",path:t}],warnings:[]}}function dt(e,t=""){return r.is.nonEmptyArray(e)?y(e,(s,n)=>F(s,n),t):{valid:!1,errors:[{message:"Invalid geometries: geometries must be a non empty array",path:t}],warnings:[]}}function F(e,t=""){if(!r.is.nonEmptyObject(e))return{valid:!1,errors:[{message:"Invalid geometry: geometry must be a non empty object",path:t}],warnings:[]};const s=`${t}/coordinates`;let n;switch(e.type){case f.POINT:{const i=T(e.coordinates);n={valid:i.valid,errors:i.errors.map(o=>({...o,path:s})),warnings:i.warnings.map(o=>({...o,path:s}))};break}case f.MULTI_POINT:{n=q(e.coordinates,0,s);break}case f.LINESTRING:{n=ye(e.coordinates,s);break}case f.MULTI_LINESTRING:{n=gt(e.coordinates,s);break}case f.POLYGON:{n=he(e.coordinates,s);break}case f.MULTI_POLYGON:{n=mt(e.coordinates,s);break}case f.GEOMETRY_COLLECTION:{n=dt(e.geometries,`${t}/geometries`);break}default:return{valid:!1,errors:[{message:`Invalid geometry type: ${e.type}`,path:t}],warnings:[]}}return n=A(e,n,t),n.statistics={geometries:{[e.type]:1}},n}function Oe(e,t=""){if(!r.is.nonEmptyObject(e))return{valid:!1,errors:[{message:"Invalid feature: must be a non empty object",path:t}],warnings:[],statistics:E()};if(e.type===p.FEATURE){if(r.is.nonEmptyObject(e.geometry)){const s=F(e.geometry,`${t}/geometry`);return{...A(e,s,t),statistics:{Feature:1,FeatureCollection:0,geometries:{...s.statistics.geometries}}}}return{valid:!0,errors:[],warnings:[{message:"Feature has no geometry",path:t}],statistics:{Feature:1,FeatureCollection:0,geometries:{}}}}if(e.type===p.FEATURE_COLLECTION){if(r.is.nonEmptyArray(e.features)){const s=y(e.features,Oe,`${t}/features`);return{...A(e,s,t),statistics:{...s.statistics,FeatureCollection:s.statistics.FeatureCollection+1}}}return{valid:!1,errors:[{message:"Invalid FeatureCollection: features must be a non empty array",path:t}],warnings:[],statistics:E()}}return{valid:!1,errors:[{message:`Invalid feature: unknown type: ${e.type}`,path:t}],warnings:[],statistics:E()}}function pt(e){if(r.assert.that(e,r.is.nonEmptyObject,"geojson must be a non empty object"),r.is.oneOf(e.type,Object.values(f))){const t=F(e,""),s=A(e,t,"");return{...Q(e,s),statistics:{Feature:0,FeatureCollection:0,geometries:{...t.statistics.geometries}}}}if(e.type===p.FEATURE||e.type===p.FEATURE_COLLECTION){const t=Oe(e,"");return Q(e,t)}return{valid:!1,errors:[{message:"Invalid GeoJson: type must be either a Geometry, a Feature or a FeatureCollection",path:""}],warnings:[],statistics:E()}}exports.AXES=m;exports.COORDINATE_FORMATS=D;exports.COORDINATE_MODELS=ue;exports.COORDINATE_TRUNCATION_FACTORS=x;exports.CRS_TYPES=O;exports.FEATURE_TYPES=p;exports.GEOMETRY_TYPES=f;exports.convertCoordinate=tt;exports.getActiveLocales=H;exports.getAllDirectionSymbols=N;exports.getCoordinatePrecision=U;exports.getDirectionAxis=ie;exports.getDirections=_e;exports.getEast=ke;exports.getLatitudeSymbols=ne;exports.getLocale=te;exports.getLocaleByCode=C;exports.getLongitudeSymbols=re;exports.getNorth=Fe;exports.getSouth=Ge;exports.getWest=Ue;exports.guessCoordinateAxis=k;exports.isAltitude=Re;exports.isAxis=ee;exports.isDirection=v;exports.isEast=M;exports.isLatitude=R;exports.isLikeBBox=ge;exports.isLikeCRS=rt;exports.isLikeFeature=fe;exports.isLikeFeatureCollection=me;exports.isLikeGeoJson=V;exports.isLikeGeometry=$;exports.isLikePosition=de;exports.isLongitude=P;exports.isNorth=se;exports.isSouth=j;exports.isWest=S;exports.listLocales=Me;exports.normalizeCoordinate=et;exports.parseCoordinate=ce;exports.parsePosition=nt;exports.registerLocale=xe;exports.setLocale=$e;exports.simplifyGeoJson=at;exports.simplifyGeometry=_;exports.truncateBBox=Y;exports.truncateCoordinate=Ze;exports.truncateGeoJson=lt;exports.truncateGeometry=W;exports.truncatePosition=ut;exports.validateBBox=Ee;exports.validateCRS=be;exports.validateGeoJson=pt;exports.validateGeometry=F;exports.validatePosition=T;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=require("@kalisio/common-core"),h=require("proj4"),q=require("@turf/meta"),jt=require("@turf/convex"),Xe=require("@turf/helpers"),xt=require("@turf/buffer"),Bt=require("heap-js"),fe=typeof process>"u"||process.env?.NODE_ENV!=="production";class ve extends Error{constructor(t){super(t),this.name="AssertionError"}}function ze(e,t,n){if(!t(e))throw new ve(n)}const l={that(e,t,n){fe&&ze(e,t,n)},all(e){if(fe)for(const{value:t,validator:n,message:r}of e)ze(t,n,r)},any(e){if(!(!fe||e.length===0)&&!e.some(({value:t,validator:n})=>n(t)))throw new ve(e.map(({message:t})=>t).join(" or "))}},s={defined(e){return e!=null},nil(e){return!s.defined(e)},plainObject(e){return s.defined(e)&&typeof e=="object"&&!Array.isArray(e)&&e.constructor===Object},emptyObject(e){return s.plainObject(e)&&Object.keys(e).length===0},nonEmptyObject(e){return s.plainObject(e)&&Object.keys(e).length>0},boolean(e){return typeof e=="boolean"},booleanTrue(e){return e===!0},booleanFalse(e){return e===!1},string(e){return typeof e=="string"},emptyString(e){return s.string(e)&&e.trim().length===0},nonEmptyString(e){return s.string(e)&&e.trim().length>0},char(e){return s.string(e)&&/^.$/u.test(e)},hex(e){return s.nonEmptyString(e)&&e.length%2===0&&/^[0-9a-fA-F]*$/.test(e)},dataUri(e){return s.string(e)?e.startsWith("data:")&&e.includes(";base64,"):!1},url(e){if(typeof e!="string")return!1;const t=/^([a-z][a-z0-9+.-]*:\/\/)([^/?#]+)(\/[^?#]*)?(\?[^#]*)?(#.*)?$/i.exec(e);if(!t?.[2].includes(","))return URL.canParse(e);const[,n,r,i="",a="",u=""]=t;return r.split(",").every((c,g)=>(c=c.trim(),!c||g>0&&c.includes("@")?!1:URL.canParse(`${n}${c}${i}${a}${u}`)))},email(e){if(!s.string(e))return!1;const t=/^[-!#$%&'*+/0-9=?A-Z^_a-z`{|}~](\.?[-!#$%&'*+/0-9=?A-Z^_a-z`{|}~])*@[a-zA-Z0-9](-?\.?[a-zA-Z0-9])*\.[a-zA-Z](-?[a-zA-Z0-9])+$/,[n,r]=e.split("@");return!n||!r||n.length>64||r.length>255||r.split(".").some(i=>i.length>63)?!1:t.test(e)},regularExpression(e){return s.defined(e)&&e instanceof RegExp},number(e){return typeof e=="number"&&!isNaN(e)&&isFinite(e)},positive(e){return s.number(e)&&e>0},nonPositive(e){return s.number(e)&&e<=0},negative(e){return s.number(e)&&e<0},nonNegative(e){return s.number(e)&&e>=0},inRange(e,t,n){return l.that(n,r=>r>=t,"max must be greater than or equal to min"),s.number(e)&&e>=t&&e<=n},inRangeExclusive(e,t,n){return l.that(n,r=>r>t,"max must be greater than min"),s.number(e)&&e>t&&e<n},inRangeExclusiveMin(e,t,n){return l.that(n,r=>r>t,"max must be greater than min"),s.number(e)&&e>t&&e<=n},inRangeExclusiveMax(e,t,n){return l.that(n,r=>r>=t,"max must be greater than or equal to min"),s.number(e)&&e>=t&&e<n},integer(e){return s.number(e)&&Number.isInteger(e)},positiveInteger(e){return s.integer(e)&&s.positive(e)},nonPositiveInteger(e){return s.integer(e)&&s.nonPositive(e)},negativeInteger(e){return s.integer(e)&&s.negative(e)},nonNegativeInteger(e){return s.integer(e)&&s.nonNegative(e)},array(e){return Array.isArray(e)},emptyArray(e){return s.array(e)&&e.length===0},nonEmptyArray(e){return s.array(e)&&e.length>0},arrayOfLength(e,t){return l.that(t,s.nonNegativeInteger,"length must be a non negative integer"),s.array(e)&&e.length===t},arrayOfLengthAtLeast(e,t){return l.that(t,s.nonNegativeInteger,"minLength must be a non negative integer"),s.array(e)&&e.length>=t},arrayOfLengthAtMost(e,t){return l.that(t,s.nonNegativeInteger,"maxLength must be a non negative integer"),s.array(e)&&e.length<=t},arrayOfLengthBetween(e,t,n){return l.all([{value:t,validator:s.nonNegativeInteger,message:"minLength must be a non negative integer"},{value:n,validator:s.nonNegativeInteger,message:"maxLength must be a non negative integer"},{value:t,validator:r=>r<=n,message:"minLength must be less than or equal to maxLength"}]),s.array(e)&&e.length>=t&&e.length<=n},map(e){return s.defined(e)&&e instanceof Map},emptyMap(e){return s.map(e)&&e.size===0},nonEmptyMap(e){return s.map(e)&&e.size>0},set(e){return s.defined(e)&&e instanceof Set},emptySet(e){return s.set(e)&&e.size===0},nonEmptySet(e){return s.set(e)&&e.size>0},function(e){return typeof e=="function"},oneOf(e,t){return l.that(t,s.nonEmptyArray,"allowed values must be a non empty array"),t.includes(e)},empty(e){return s.nil(e)?!0:s.string(e)?s.emptyString(e):s.array(e)?s.emptyArray(e):s.plainObject(e)?s.emptyObject(e):s.map(e)?s.emptyMap(e):s.set(e)?s.emptySet(e):!1}},D={key(e,t){return l.all([{value:e,validator:s.plainObject,message:"obj must be an object"},{value:t,validator:s.nonEmptyString,message:"key must be a non empty string"}]),Object.hasOwn(e,t)},keys(e,t){return l.all([{value:e,validator:s.plainObject,message:"obj must be an object"},{value:t,validator:n=>s.array(n)&&n.length>0&&n.every(s.nonEmptyString),message:"keys must be an array of non empty strings"}]),t.every(n=>D.key(e,n))},keyWithValue(e,t){return D.key(e,t)&&s.defined(e[t])},path(e,t){l.all([{value:e,validator:s.plainObject,message:"obj must be an object"},{value:t,validator:s.nonEmptyString,message:"path must be a non empty string"}]);let n=e;for(const r of t.split(".")){if(!n||!s.plainObject(n)||!(r in n))return!1;n=n[r]}return!0}};function it(e,t,n=""){return Object.entries(t).every(([r,i])=>{const a=n?`${n}.${r}`:r;if(!D.key(e,r))return i._optional===!0;const u=e[r];if(s.plainObject(i))return s.plainObject(u)&&it(u,i,a);if(typeof i=="function")return i(u);throw new ve(`Invalid validator for key "${a}"`)})}const y={schema(e,t){return l.all([{value:e,validator:s.plainObject,message:"obj must be an object"},{value:t,validator:s.plainObject,message:"schema must be an object"}]),it(e,t)}};function L(e){l.that(e,s.function,"validator must be a function");function t(n){return s.nil(n)?!0:e(n)}return t._optional=!0,t}const O={LATITUDE:"LAT",LONGITUDE:"LON",ALTITUDE:"ALT"};function Se(e){return l.that(e,s.string,"axis must be a string"),Object.values(O).includes(e)}function x(e){return l.that(e,s.string,"axis must be a string"),e===O.LATITUDE}function se(e){return l.that(e,s.string,"axis must be a string"),e===O.LONGITUDE}function kt(e){return l.that(e,s.string,"axis must be a string"),e===O.ALTITUDE}const Ft={NORTH:{label:"Nord",symbol:"N"},SOUTH:{label:"Sud",symbol:"S"},EAST:{label:"Est",symbol:"E"},WEST:{label:"Ouest",symbol:"O"}},$t={EMPTY_OBJECT:"L'objet est vide",UNKNOWN_TYPE:"Le type GeoJSON est inconnu",MISSING_GEOMETRY:"La géométrie est manquante",INVALID_FEATURES_ARRAY:"Le tableau de features est invalide",INVALID_GEOMETRY:"La géométrie est invalide",INVALID_GEOMETRY_TYPE:"Le type de géométrie est invalide",INVALID_COORDINATES_LENGTH:"Le nombre de coordonnées est invalide",INVALID_MULTI_LINESTRING_COORDINATES:"Les coordonnées du MultiLineString sont invalides",INVALID_POLYGON_COORDINATES:"Les coordonnées du Polygon sont invalides",INVALID_MULTIPOLYGON_COORDINATES:"Les coordonnées du MultiPolygon sont invalides",INVALID_GEOMETRYCOLLECTION_GEOMETRIES:"Les géométries de la GeometryCollection sont invalides",RING_NOT_CLOSED:"L'anneau n'est pas fermé",INVALID_WINDING_ORDER:"L'ordre d'orientation de l'anneau est invalide",SELF_INTERSECTION:"Une auto-intersection a été détectée",HOLE_INTERSECTS_SHELL:"Un trou intersecte le contour extérieur",ANTIMERIDIAN_CROSSING:"La géométrie traverse l'antiméridien",DUPLICATE_POSITION:"Une position consécutive est dupliquée",INVALID_POSITION_LENGTH:"Le nombre de coordonnées de la position est invalide",INVALID_POSITION_COORDINATES:"Les coordonnées de la position sont invalides",INVALID_LONGITUDE_RANGE:"La longitude est hors limites",INVALID_LATITUDE_RANGE:"La latitude est hors limites",INVALID_ALTITUDE:"L'altitude est invalide",EXCESSIVE_LONGITUDE_PRECISION:"La précision de la longitude est excessive",EXCESSIVE_LATITUDE_PRECISION:"La précision de la latitude est excessive",INVALID_BBOX_LENGTH:"Le nombre de coordonnées de la boîte englobante est invalide",INVALID_BBOX_LATITUDE_ORDER:"L'ordre des latitudes de la boîte englobante est invalide",INVALID_BBOX_LONGITUDE_ORDER:"L'ordre des longitudes de la boîte englobante est invalide",INVALID_BBOX_ALTITUDE_ORDER:"L'ordre des altitudes de la boîte englobante est invalide",BBOX_ANTIMERIDIAN_CROSSING:"La boîte englobante traverse l'antiméridien",INVALID_CRS_OBJECT:"L'objet CRS est invalide",INVALID_CRS_NAME:"Le nom du CRS est invalide",INVALID_CRS_LINK:"Le lien du CRS est invalide",INVALID_CRS_TYPE:"Le type de CRS est invalide",UNSUPPORTED_CRS:"Le CRS n'est pas pris en charge",UNSUPPORTED_LINK_CRS:"Le lien CRS n'est pas pris en charge",UNSUPPORTED_NESTED_CRS:"Le CRS imbriqué n'est pas pris en charge"},Yt={DIRECTIONS:Ft,VALIDATION:$t},Ht={NORTH:{label:"North",symbol:"N"},SOUTH:{label:"South",symbol:"S"},EAST:{label:"East",symbol:"E"},WEST:{label:"West",symbol:"W"}},Wt={EMPTY_OBJECT:"Object is empty",UNKNOWN_TYPE:"Unknown GeoJSON type",MISSING_GEOMETRY:"Geometry is missing",INVALID_FEATURES_ARRAY:"Features array is invalid",INVALID_GEOMETRY:"Geometry is invalid",INVALID_GEOMETRY_TYPE:"Geometry type is invalid",INVALID_COORDINATES_LENGTH:"Coordinates length is invalid",INVALID_MULTI_LINESTRING_COORDINATES:"MultiLineString coordinates are invalid",INVALID_POLYGON_COORDINATES:"Polygon coordinates are invalid",INVALID_MULTIPOLYGON_COORDINATES:"MultiPolygon coordinates are invalid",INVALID_GEOMETRYCOLLECTION_GEOMETRIES:"GeometryCollection geometries are invalid",RING_NOT_CLOSED:"Ring is not closed",INVALID_WINDING_ORDER:"Ring winding order is invalid",SELF_INTERSECTION:"Self-intersection detected",HOLE_INTERSECTS_SHELL:"A hole intersects the exterior ring",ANTIMERIDIAN_CROSSING:"Geometry crosses the antimeridian",DUPLICATE_POSITION:"Consecutive position is duplicated",INVALID_POSITION_LENGTH:"Position length is invalid",INVALID_POSITION_COORDINATES:"Position coordinates are invalid",INVALID_LONGITUDE_RANGE:"Longitude is out of range",INVALID_LATITUDE_RANGE:"Latitude is out of range",INVALID_ALTITUDE:"Altitude is invalid",EXCESSIVE_LONGITUDE_PRECISION:"Longitude precision is excessive",EXCESSIVE_LATITUDE_PRECISION:"Latitude precision is excessive",INVALID_BBOX_LENGTH:"Bounding box length is invalid",INVALID_BBOX_LATITUDE_ORDER:"Bounding box latitude order is invalid",INVALID_BBOX_LONGITUDE_ORDER:"Bounding box longitude order is invalid",INVALID_BBOX_ALTITUDE_ORDER:"Bounding box altitude order is invalid",BBOX_ANTIMERIDIAN_CROSSING:"Bounding box crosses the antimeridian",INVALID_CRS_OBJECT:"CRS object is invalid",INVALID_CRS_NAME:"CRS name is invalid",INVALID_CRS_LINK:"CRS link is invalid",INVALID_CRS_TYPE:"CRS type is invalid",UNSUPPORTED_CRS:"CRS is not supported",UNSUPPORTED_LINK_CRS:"CRS link is not supported",UNSUPPORTED_NESTED_CRS:"Nested CRS is not supported"},st={DIRECTIONS:Ht,VALIDATION:Wt},Xt={DIRECTIONS:{NORTH:{label:s.string,symbol:s.char},SOUTH:{label:s.string,symbol:s.char},EAST:{label:s.string,symbol:s.char},WEST:{label:s.string,symbol:s.char}}},P={en:st,fr:Yt};let j="en";const qe="en";function zt(){return Object.keys(P)}function qt(e){l.all([{value:e,validator:s.string,message:"code must be a string"},{value:e,validator:t=>D.key(P,t),message:"code is unknown"}]),j=e}function at(){return j}function _e(){return j===qe?[j]:[j,qe]}function Kt(e,t){l.all([{value:e,validator:s.string,message:"code must be a string"},{value:e,validator:n=>!D.key(P,n),message:"messages already registered"},{value:t,validator:s.plainObject,message:"messages must be an object"},{value:t,validator:n=>y.schema(n,Xt),message:"messages do not conform to schema"}]),P[e]=t}function ae(e){return l.all([{value:e,validator:s.string,message:"code must be a string"},{value:e,validator:t=>D.key(P,t),message:"code is unknown"}]),P[e]}function Y(){return ae(at()).DIRECTIONS}function me(e){const t=new Set;for(const n of _e()){const{DIRECTIONS:r}=ae(n);for(const i of e)t.add(r[i].symbol)}return[...t]}function oe(e,t){const n=t.toUpperCase();return _e().some(r=>{const{label:i,symbol:a}=ae(r).DIRECTIONS[e];return n===i.toUpperCase()||n===a.toUpperCase()})}function Zt(e=null){const t=Y();return s.defined(e)?(l.that(e,Se,"axis must be a valid axis"),x(e)?[t.SOUTH,t.NORTH]:se(e)?[t.EAST,t.WEST]:[]):[t.SOUTH,t.NORTH,t.EAST,t.WEST]}function U(e=null){return s.defined(e)?(l.that(e,Se,"axis must be a valid axis"),x(e)?me(["NORTH","SOUTH"]):se(e)?me(["EAST","WEST"]):[]):me(["NORTH","SOUTH","EAST","WEST"])}function Qt(){return Y().NORTH}function Jt(){return Y().SOUTH}function en(){return Y().EAST}function tn(){return Y().WEST}function R(e){return l.that(e,s.string,"dir must be a string"),ot(e)||he(e)||ue(e)||H(e)}function ot(e){return l.that(e,s.string,"dir must be a string"),oe("NORTH",e)}function he(e){return l.that(e,s.string,"dir must be a string"),oe("SOUTH",e)}function ue(e){return l.that(e,s.string,"dir must be a string"),oe("EAST",e)}function H(e){return l.that(e,s.string,"dir must be a string"),oe("WEST",e)}function ut(e){return l.that(e,R,"dir must be a direction"),H(e)||ue(e)?O.LONGITUDE:O.LATITUDE}const nn={degrees:o.is.number,direction:o.optional(R)},rn=/^(-?\d{1,3}(?:\.\d+)?)°?$/;function sn(){return new RegExp(`^(\\d{1,3}(?:\\.\\d+)?)°?([${U()}])$`,"i")}function W(e){let t=null,n=null;if(o.is.plainObject(e)&&o.conform.schema(e,nn))o.is.defined(e.direction)?e.degrees>=0&&(t=e.degrees,n=e.direction):t=e.degrees;else if(o.is.string(e)){const r=e.replace(/\s+/g,""),i=r.match(rn)??r.match(sn());i&&(t=parseFloat(i[1]),n=i[2]??null)}return{get degrees(){return t},get direction(){return n},get format(){return"DD"},isValid(){return o.is.number(t)},toString(r){if(o.assert.that(r,o.is.positiveInteger,"decimalPlaces must be a positive integer"),!this.isValid())return"";let i=`${t.toFixed(r)}°`;return n&&(i+=` ${n}`),i},toDecimal(){return this.isValid()?W({degrees:t,direction:n}):null}}}const an={degrees:o.is.integer,minutes:e=>o.is.inRangeExclusiveMax(e,0,60),direction:o.optional(R)},on=/^(-?\d{1,3})°(\d{1,2}(?:\.\d+)?)'?$/;function un(){return new RegExp(`^(\\d{1,3})°(\\d{1,2}(?:\\.\\d+)?)'?([${U().join("")}])$`,"i")}function lt(e){let t=null,n=null,r=null;if(o.is.plainObject(e)&&o.conform.schema(e,an))o.is.defined(e.direction)?e.degrees>=0&&(t=e.degrees,n=e.minutes,r=e.direction):(t=e.degrees,n=e.minutes);else if(o.is.string(e)){const i=e.replace(/\s+/g,""),a=i.match(on)??i.match(un());a&&(t=parseFloat(a[1]),n=parseFloat(a[2]),r=a[3]??null)}return{get degrees(){return t},get minutes(){return n},get direction(){return r},get format(){return"DDM"},isValid(){return o.is.integer(t)&&o.is.inRangeExclusiveMax(n,0,60)},toString(i){if(o.assert.that(i,o.is.positiveInteger,"decimalPlaces must be a positive integer"),!this.isValid())return"";let a=`${t}° ${n.toFixed(i)}'`;return r&&(a+=` ${r}`),a},toDecimal(){return this.isValid()?W({degrees:t+n/60,direction:r}):null}}}const ln={degrees:o.is.nonNegativeInteger,minutes:e=>o.is.inRangeExclusiveMax(e,0,60),direction:R};function cn(){return new RegExp(`^(\\d{2})(\\d{3})([${U(O.LATITUDE).join("")}])$`,"i")}function dn(){return new RegExp(`^(\\d{3})(\\d{3})([${U(O.LONGITUDE).join("")}])$`,"i")}function ct(e){let t=null,n=null,r=null;if(o.is.plainObject(e)&&o.conform.schema(e,ln))t=e.degrees,n=e.minutes,r=e.direction;else if(o.is.string(e)){const i=e.trim(),a=i.match(cn())??i.match(dn());a&&(t=parseFloat(a[1]),n=parseFloat(a[2])/10,r=a[3])}return{get degrees(){return t},get minutes(){return n},get direction(){return r},get format(){return"DDM_AERO"},isValid(){return o.is.nonNegativeInteger(t)&&o.is.inRangeExclusiveMax(n,0,60)&&R(r)},toString(){if(!this.isValid())return"";const i=ue(r)||H(r),a=String(t).padStart(i?3:2,"0"),u=Math.floor(n*10).toString().padStart(3,"0");return`${a}${u}${r}`},toDecimal(){return this.isValid()?W({degrees:t+n/60,direction:r}):null}}}const fn={degrees:o.is.integer,minutes:e=>o.is.integer(e)&&o.is.inRange(e,0,59),seconds:e=>o.is.inRangeExclusiveMax(e,0,60),direction:o.optional(R)},mn=/^(-?\d{1,3})°(\d{1,2})'(\d{1,2}(?:\.\d+)?)"?$/;function gn(){return new RegExp(`^(\\d{1,3})°(\\d{1,2})'(\\d{1,2}(?:\\.\\d+)?)"?([${U().join("")}])$`,"i")}function dt(e){let t=null,n=null,r=null,i=null;if(o.is.plainObject(e)&&o.conform.schema(e,fn))o.is.defined(e.direction)?e.degrees>=0&&(t=e.degrees,n=e.minutes,r=e.seconds,i=e.direction):(t=e.degrees,n=e.minutes,r=e.seconds);else if(o.is.string(e)){const a=e.replace(/\s+/g,""),u=a.match(mn)??a.match(gn());u&&(t=parseFloat(u[1]),n=parseFloat(u[2]),r=parseFloat(u[3]),i=u[4]??null)}return{get degrees(){return t},get minutes(){return n},get seconds(){return r},get direction(){return i},get format(){return"DMS"},isValid(){return o.is.integer(t)&&o.is.integer(n)&&o.is.inRange(n,0,59)&&o.is.inRangeExclusiveMax(r,0,60)},toString(a){if(o.assert.that(a,o.is.positiveInteger,"decimalPlaces must be a positive integer"),!this.isValid())return"";let u=`${t}° ${n}' ${r.toFixed(a)}"`;return i&&(u+=` ${i}`),u},toDecimal(){return this.isValid()?W({degrees:t+n/60+r/3600,direction:i}):null}}}function Ke(e){const t=Math.floor(e.degrees),n=(e.degrees-t)*60;return{degrees:t,minutes:n,direction:e.direction}}function In(e){const t=Math.floor(e.degrees),n=(e.degrees-t)*60,r=Math.floor(n),i=(n-r)*60;return{degrees:t,minutes:r,seconds:i,direction:e.direction}}const Ze={DD:e=>(o.assert.that(e,t=>t.isValid(),"dd must be a valid coordinate"),e),DDM:e=>{o.assert.that(e,i=>i.isValid(),"dd must be a valid coordinate");const{degrees:t,minutes:n,direction:r}=Ke(e);return lt(r?{degrees:t,minutes:n,direction:r}:{degrees:t,minutes:n})},DMS:e=>{o.assert.that(e,a=>a.isValid(),"dd must be a valid coordinate");const{degrees:t,minutes:n,seconds:r,direction:i}=In(e);return dt(i?{degrees:t,minutes:n,seconds:r,direction:i}:{degrees:t,minutes:n,seconds:r})},DDM_AERO:e=>{o.assert.that(e,i=>i.isValid(),"dd must be a valid coordinate");const{degrees:t,minutes:n,direction:r}=Ke(e);return ct({degrees:t,minutes:n,direction:r})}},J={DD:"DD",DDM:"DDM",DDM_AERO:"DDM_AERO",DMS:"DMS"},ft={DD:W,DDM:lt,DDM_AERO:ct,DMS:dt},p=7,_=8,mt=Array.from({length:_+1},(e,t)=>10**t);function Oe(e,t){if(l.that(e,s.number,"coord must be a number"),s.defined(t))return l.that(t,R,"dir must be a direction"),ut(t);if(Math.abs(e)>90)return O.LONGITUDE}function Ne(e){l.that(e,s.number,"coord must be a number");const t=e.toExponential(),[n,r]=t.split("e").map(Number),i=(n.toString().split(".")[1]||"").length;return Math.max(0,i-r)}function Re(e,t=p){l.all([{value:e,validator:s.number,message:"coord must be a number"},{value:t,validator:r=>s.inRange(r,0,_),message:`precision must be in range [0, ${_}]`}]);const n=mt[t];return Math.round(e*n)/n}function En(e,t){if(l.all([{value:e,validator:s.number,message:"coord must be a number"},{value:t,validator:r=>se(r)||x(r),message:"axis must be either a longitude or latitude"}]),x(t))return Math.max(-90,Math.min(90,e));let n=((e+180)%360+360)%360-180;return n===-180&&(n=180),Object.is(n,-0)&&(n=0),n}function On(e,t){l.all([{value:e,validator:r=>s.defined(r)&&r.isValid(),message:"from must be a valid coordinate"},{value:t,validator:r=>D.key(Ze,r),message:`unknown format: ${t}`}]);const n=e.format===J.DD?e:e.toDecimal();return n.isValid()?t===J.DD?n:Ze[t](n):null}function gt(e){l.that(e,s.nonEmptyString,"pattern must be a non empty string");for(const t of Object.keys(J)){const n=ft[t](e);if(n.isValid())return n}return null}typeof process<"u"&&process.versions?.node!=null,typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope,typeof ServiceWorkerGlobalScope<"u"&&self instanceof ServiceWorkerGlobalScope,typeof process<"u"&&process.env.NODE_ENV,typeof process<"u"&&process.env.NODE_ENV,typeof process<"u"&&process.env.NODE_ENV;const S={clamp(e,t,n){return l.all([{value:e,validator:s.number,message:"value must be a number"},{value:t,validator:s.number,message:"min must be a number"},{value:n,validator:s.number,message:"max must be a number"}]),Math.min(Math.max(e,t),n)},round(e,t=2){l.all([{value:e,validator:s.number,message:"value must be a number"},{value:t,validator:s.nonNegativeInteger,message:"precision must be a non-negative integer"}]);const n=10**t;return Math.round(e*n)/n},sign(e,t=0){return l.all([{value:e,validator:s.number,message:"value must be a number"},{value:t,validator:s.nonNegative,message:"epsilon must be a non-negative number"}]),e>t?1:e<-t?-1:0},percentage(e,t){return l.all([{value:e,validator:s.number,message:"value must be a number"},{value:t,validator:s.number,message:"total must be a number"}]),S.round(e/t*100,2)},exponential(e,t=2){if(l.all([{value:e,validator:s.number,message:"value must be a number"},{value:t,validator:s.nonNegativeInteger,message:"decimals must be a non-negative integer"}]),e===0)return`0.${"0".repeat(t)}e+0`;const n=Math.floor(Math.log10(Math.abs(e)));return`${(e/Math.pow(10,n)).toFixed(t)}e${n>=0?"+":""}${n}`},linear(e,t=0,n=1){return l.all([{value:e,validator:r=>s.inRange(r,0,1),message:"t must be in range [0, 1]"},{value:t,validator:s.number,message:"initial must be a number"},{value:n,validator:s.number,message:"final must be a number"}]),t+e*(n-t)},to:{radians(e){return l.that(e,s.number,"degrees must be a number"),e*Math.PI/180},degrees(e){return l.that(e,s.number,"radians must be a number"),e*180/Math.PI}},pow:{square(e){return l.that(e,s.number,"value must be a number"),e*e},cube(e){return l.that(e,s.number,"value must be a number"),S.pow.square(e)*e}},ease:{in(e,t=.5){return l.all([{value:e,validator:n=>s.inRange(n,0,1),message:"t must be in range [0, 1]"},{value:t,validator:s.number,message:"linearity must be a number"}]),Math.pow(e,1/t)},out(e,t=.5){return l.all([{value:e,validator:n=>s.inRange(n,0,1),message:"t must be in range [0, 1]"},{value:t,validator:s.number,message:"linearity must be a number"}]),1-Math.pow(1-e,1/t)},cubicBezier(e,t=.42,n=0,r=.58,i=1){l.that(e,g=>s.inRange(g,0,1),"t must be in range [0, 1]");const a=1-e,u=e*e,c=a*a;return c*a*n+3*c*e*t+3*a*u*r+u*e*i}},stats:{sum(e){return l.that(e,s.array,"values must be an array"),e.reduce((t,n)=>t+n,0)},average(e){return l.that(e,s.nonEmptyArray,"values must be a non-empty array"),S.stats.sum(e)/e.length},median(e){l.that(e,s.nonEmptyArray,"values must be a non-empty array");const t=[...e].sort((r,i)=>r-i),n=Math.floor(t.length/2);return t.length%2===0?S.linear(.5,t[n-1],t[n]):t[n]}}};L(s.boolean),L(s.boolean),L(s.boolean),L(s.string);L(s.boolean),L(s.boolean),L(s.boolean),L(s.string);L(s.array);const ee=S.to.radians(1),Nn=1e-12;function G(e){const t=e[0]*ee,n=e[1]*ee,r=Math.cos(n);return[r*Math.cos(t),r*Math.sin(t),Math.sin(n)]}function pn(e){const t=Math.atan2(e[1],e[0]),n=Math.asin(e[2]);return[t/ee,n/ee]}function w(e,t){return e[0]*t[0]+e[1]*t[1]+e[2]*t[2]}function B(e,t){return[e[1]*t[2]-e[2]*t[1],e[2]*t[0]-e[0]*t[2],e[0]*t[1]-e[1]*t[0]]}function It(e,t){return[e[0]+t[0],e[1]+t[1],e[2]+t[2]]}function te(e,t){return[e[0]*t,e[1]*t,e[2]*t]}function ne(e){return Math.sqrt(e[0]*e[0]+e[1]*e[1]+e[2]*e[2])}function Ln(e){const t=ne(e);return[e[0]/t,e[1]/t,e[2]/t]}function Tn(e,t){return Math.atan2(ne(B(e,t)),w(e,t))}function vn(e){return B(e,Et(e))}function Et(e){return Ln(B([0,0,1],e))}function Sn(e,t){const n=vn(e),r=Et(e);return It(te(n,Math.cos(t)),te(r,Math.sin(t)))}function _n(e,t,n){const r=Sn(e,t);return It(te(e,Math.cos(n)),te(r,Math.sin(n)))}function Ot(e,t,n,r,i=Nn){const a=B(e,t),u=B(n,r),c=ne(a),g=ne(u);if(c<=i||g<=i)return!1;const E=S.sign(w(a,n)/c,i),m=S.sign(w(a,r)/c,i);if(E*m!==-1)return!1;const I=S.sign(w(u,e)/g,i),b=S.sign(w(u,t)/g,i);return I*b===-1}const Ae="WGS84",C="+proj=longlat +datum=WGS84 +no_defs",hn={WGS84:C,"CRS:84":C,CRS84:C,"urn:ogc:def:crs:OGC:1.3:CRS84":C,"urn:ogc:def:crs:OGC:2:84":C,"urn:ogc:def:crs:EPSG::4326":C,"EPSG:2154":"+proj=lcc +lat_1=49 +lat_2=44 +lat_0=46.5 +lon_0=3 +x_0=700000 +y_0=6600000 +ellps=GRS80 +units=m +no_defs"};for(const[e,t]of Object.entries(hn))h.defs(e)||h.defs(e,t);const Rn=/^urn:ogc:def:crs:EPSG::(\d+)$/i;function be(e){l.that(e,s.nonEmptyString,"name must be a non empty string");const t=e.match(Rn);return t?`EPSG:${t[1]}`:e}function An(){return Object.keys(h.defs)}function bn(e,t){l.all([{value:e,validator:s.nonEmptyString,message:"name must be a non empty string"},{value:t,validator:n=>s.nonEmptyString(n)||s.nonEmptyObject(n),message:"definition must be a non empty string or a non empty object"}]),h.defs(e,t)}function M(e){return l.that(e,s.nonEmptyString,"name must be a non empty string"),s.defined(h.defs(e))}function Dn(e){return l.that(e,s.nonEmptyString,"name must be a non empty string"),h.defs(e)}function De(e){l.that(e,s.nonEmptyString,"name must be a non empty string");const t=h.defs(e);if(!t)return!1;const n=h.defs("EPSG:4326");return t.projName===n.projName&&t.datumCode===n.datumCode}const X={precision:L(s.number),consider3D:L(s.boolean)},ye=63710088e-1;function yn(e){l.that(e,E=>s.nonEmptyString(E),"pattern must be a non-empty string");const t=e.split(/[,;|]/);if(t.length!==2)return null;const[n,r]=t.map(gt);if(!n||!r)return null;const i=n.toDecimal(),a=r.toDecimal(),u=Oe(i.degrees,i.direction),c=Oe(a.degrees,a.direction),g=E=>{const{degrees:m,direction:I}=E;return I&&(H(I)||he(I))?-m:m};return u===O.LONGITUDE&&c===O.LATITUDE?[g(i),g(a)]:c===O.LONGITUDE&&u===O.LATITUDE?[g(a),g(i)]:u===O.LONGITUDE&&!c?[g(i),g(a)]:u===O.LATITUDE&&!c?[g(a),g(i)]:c===O.LONGITUDE&&!u?[g(a),g(i)]:c===O.LATITUDE&&!u?[g(i),g(a)]:!u&&!c?[[g(i),g(a)],[g(a),g(i)]]:null}function T(e){return s.arrayOfLengthBetween(e,2,3)?e.every(s.number):!1}function Nt(e){return l.that(e,T,"position must be a valid position"),s.arrayOfLength(e,3)}function le(e,t,n={}){l.all([{value:e,validator:T,message:"position1 must be a valid position"},{value:t,validator:T,message:"position2 must be a valid position"},{value:n,validator:u=>y.schema(u,X),message:"options must be a valid options object"}]);const{precision:r=p,consider3D:i=!1}=n,a=i?Math.max(e.length,t.length):2;return Array.from({length:a},(u,c)=>(e[c]??0).toFixed(r)===(t[c]??0).toFixed(r)).every(Boolean)}function Ce(e,t=p){l.all([{value:e,validator:T,message:"position must be a position"},{value:t,validator:n=>s.inRange(n,0,_),message:`precision must be in range [0, ${_}]`}]);for(let n=0;n<e.length;n++)e[n]=Re(e[n],t);return e}function Pe(e,t,n){return l.all([{value:e,validator:T,message:"position must be a valid position"},{value:t,validator:M,message:`unknown source projection: ${t}`},{value:n,validator:M,message:`unknown target projection: ${n}`}]),h(t,n,e)}function Cn(e,t,n){l.all([{value:e,validator:T,message:"position must be a valid position"},{value:t,validator:s.number,message:"bearing must be a number"},{value:n,validator:s.number,message:"distance must be a number"}]);const r=_n(G(e),S.to.radians(t),n/ye);return pn(r)}function pt(e,t){return l.all([{value:e,validator:T,message:"position1 must be a valid position"},{value:t,validator:T,message:"position2 must be a valid position"}]),Tn(G(e),G(t))*ye}function k(e){if(!s.arrayOfLength(e,4)&&!s.arrayOfLength(e,6))return!1;const t=e.length===4,n=t?[e[0],e[1]]:[e[0],e[1],e[2]],r=t?[e[2],e[3]]:[e[3],e[4],e[5]];if(!T(n)||!T(r))return!1;const[,i]=n,[,a]=r;return!(i>a||!t&&e[2]>e[5])}function pe(e){return l.that(e,k,"bbox must be a valid bounding-box"),s.arrayOfLength(e,6)}function Pn(e,t){return l.all([{value:e,validator:k,message:"bbox1 must be a valid bounding-box"},{value:t,validator:k,message:"bbox2 must be a valid bounding-box"}]),pe(e)&&pe(t)?[Math.min(e[0],t[0]),Math.min(e[1],t[1]),Math.min(e[2],t[2]),Math.max(e[3],t[3]),Math.max(e[4],t[4]),Math.max(e[5],t[5])]:[Math.min(e[0],t[0]),Math.min(e[1],t[1]),Math.max(e[2],t[2]),Math.max(e[3],t[3])]}const Gn={ignore3D:L(s.boolean)};function K(e,t={}){l.all([{value:e,validator:s.nonEmptyArray,message:"positions must be a non-empty array"},{value:e,validator:i=>i.every(T),message:"positions must be an array of valid positions"},{value:t,validator:i=>y.schema(i,Gn),message:"options must be a valid options object"}]);const{ignore3D:n=!1}=t;return!n&&e.some(Nt)?e.reduce((i,a)=>[Math.min(i[0],a[0]),Math.min(i[1],a[1]),Math.min(i[2],a[2]??0),Math.max(i[3],a[0]),Math.max(i[4],a[1]),Math.max(i[5],a[2]??0)],[1/0,1/0,1/0,-1/0,-1/0,-1/0]):e.reduce((i,a)=>[Math.min(i[0],a[0]),Math.min(i[1],a[1]),Math.max(i[2],a[0]),Math.max(i[3],a[1])],[1/0,1/0,-1/0,-1/0])}function Ge(e,t=p){l.all([{value:e,validator:k,message:"bbox must be a valid bounding box"},{value:t,validator:n=>s.inRange(n,0,_),message:`precision must be in range [0, ${_}]`}]);for(let n=0;n<e.length;n++)e[n]=Re(e[n],t);return e}const Lt={...X,deduplicate:L(s.boolean)};function ce(e){return s.array(e)&&e.every(T)}function Me(e,t={}){l.that(t,a=>y.schema(a,X),"options must be a valid options object");const{precision:n=p,consider3D:r=!1}=t,i=[];for(const a of e){const u=i[i.length-1];(!u||!le(a,u,{precision:n,consider3D:r}))&&i.push(a)}return i}function re(e,t={}){l.all([{value:e,validator:s.array,message:"positions must be an array"},{value:t,validator:u=>y.schema(u,Lt),message:"options must be a valid options object"}]);const{precision:n=p,deduplicate:r=!1,consider3D:i=!1}=t,a=e.map(u=>Ce(u,n));return r?Me(a,{precision:n,consider3D:i}):a}function Z(e,t,n){return l.that(e,s.array,"positions must be an array"),e.map(r=>Pe(r,t,n))}function Mn(e){return s.arrayOfLengthAtLeast(e,2)&&ce(e)}function Un(e){l.that(e,ce,"line must be a valid array of positions");let t=0;for(let n=0;n<e.length-1;n++)t+=pt(e[n],e[n+1]);return t}function F(e,t={}){return!s.arrayOfLengthAtLeast(e,4)||!ce(e)?!1:de(e,t)}function de(e,t={}){if(l.that(t,i=>y.schema(i,X),"options must be a valid options object"),!s.arrayOfLengthAtLeast(e,1))return!1;const n=e[0],r=e[e.length-1];return le(n,r,t)}function Tt(e,t={}){return!s.nonEmptyArray(e)||de(e,t)?e:[...e,[...e[0]]]}function Le(e,t={}){const n=re(e,{deduplicate:!0,...t});return Tt(n,t)}function vt(e){l.that(e,F,"ring must be a valid closed ring of at least 4 positions");let t=0;for(let n=0;n<e.length-1;n++){const[r,i]=e[n],[a,u]=e[n+1];t+=S.to.radians(a-r)*(2+Math.sin(S.to.radians(i))+Math.sin(S.to.radians(u)))}return-t/2}function Ue(e){return vt(e)<0}function Ve(e,t){l.all([{value:e,validator:F,message:"ring1 must be a valid closed ring"},{value:t,validator:F,message:"ring2 must be a valid closed ring"}]);const n=e.map(G),r=t.map(G);for(let i=0;i<n.length-1;i++)for(let a=0;a<r.length-1;a++)if(Ot(n[i],n[i+1],r[a],r[a+1]))return!0;return!1}function we(e){l.that(e,F,"ring must be a valid closed ring");const t=e.map(G),n=[],r=t.length-1;for(let i=0;i<r;i++)for(let a=i+1;a<r;a++)a!==i+1&&(i===0&&a===r-1||Ot(t[i],t[i+1],t[a],t[a+1])&&n.push([i,a]));return n}const $={NAME:"name",LINK:"link"},f={POINT:"Point",MULTI_POINT:"MultiPoint",LINESTRING:"LineString",MULTI_LINESTRING:"MultiLineString",POLYGON:"Polygon",MULTI_POLYGON:"MultiPolygon",GEOMETRY_COLLECTION:"GeometryCollection"},N={FEATURE:"Feature",FEATURE_COLLECTION:"FeatureCollection"};function Vn(e){return s.plainObject(e)?e.type===$.NAME?s.nonEmptyString(e.properties?.name):e.type===$.LINK?s.nonEmptyString(e.properties?.href):!1:!1}function wn(e){return T(e)}function jn(e){return!s.arrayOfLength(e,4)&&!s.arrayOfLength(e,6)?!1:e.every(s.number)}function St(e){return!s.plainObject(e)||!s.oneOf(e.type,Object.values(f))?!1:e.type===f.GEOMETRY_COLLECTION?s.array(e.geometries):s.array(e.coordinates)}function _t(e){return s.plainObject(e)&&e.type===N.FEATURE}function ht(e){return s.plainObject(e)&&e.type===N.FEATURE_COLLECTION&&s.array(e.features)}function Rt(e){return _t(e)||ht(e)}function A(e){return Rt(e)||St(e)}const xn={ignore3D:L(s.boolean)};function Bn(e,t={}){if(l.all([{value:e,validator:A,message:"geoJson must be a GeoJson object"},{value:t,validator:n=>y.schema(n,xn),message:"options must be a valid options object"}]),e.type===N.FEATURE)return e.geometry?K(q.coordAll(e.geometry),t):null;if(e.type===N.FEATURE_COLLECTION){const n=q.coordAll(e);return n.length?K(n,t):null}return K(q.coordAll(e),t)}function kn(e){if(e.length===0)return null;if(e.length===1)return{type:"Point",coordinates:e[0]};if(e.length===2)return{type:"LineString",coordinates:[e[0],e[1]]};const t=jt.convex(Xe.featureCollection(e.map(n=>Xe.feature({type:"Point",coordinates:n}))));return t?t.geometry:{type:"LineString",coordinates:[e[0],e[e.length-1]]}}function At(e){if(l.that(e,A,"geoJson must be a GeoJson object"),e.type===N.FEATURE)return e.geometry?At(e.geometry):null;const t=q.coordAll(e).map(n=>[n[0],n[1]]);return kn(t)}function je(e,t){return o.assert.that(e,A,"geoJson must be a GeoJson object"),o.object.lookup(e,t)}function Fn(e){return je(e,"bbox")}function bt(e){const t=je(e,"crs");if(!o.is.defined(t))return Ae;const n=t.properties?.name;return o.is.nonEmptyString(n)?be(n):n}const d=Object.freeze(Object.fromEntries(Object.keys(st.VALIDATION).map(e=>[e,e]))),$n=[f.POLYGON,f.MULTI_POLYGON],Yn=[f.LINESTRING,f.MULTI_LINESTRING,f.POLYGON,f.MULTI_POLYGON],Te=[d.INVALID_WINDING_ORDER,d.SELF_INTERSECTION,d.HOLE_INTERSECTS_SHELL,d.DUPLICATE_POSITION],Hn={validation:o.is.nonEmptyObject,windingOrder:o.optional(o.is.boolean),selfIntersection:o.optional(o.is.boolean),holeIntersectsShell:o.optional(o.is.boolean),duplicatePosition:o.optional(o.is.boolean),precision:o.optional(o.is.number)};function Qe(e,t){return Ue(e)!==t?(e.reverse(),!0):!1}function Je(e){let t=!1;Qe(e[0],!1)&&(t=!0);for(let n=1;n<e.length;n++)Qe(e[n],!0)&&(t=!0);return t}function Wn(e){if(e.type===f.POLYGON)return Je(e.coordinates);let t=!1;for(const n of e.coordinates)Je(n)&&(t=!0);return t}function Xn(e){return e.type===f.POLYGON?e.coordinates:e.coordinates.flat(1)}function zn(e){return e.type===f.POLYGON?[e.coordinates]:e.coordinates}function et(e){return Xn(e).some(t=>we(t).length>0)}function tt(e){return zn(e).some(t=>{const n=t[0];for(let r=1;r<t.length;r++)if(Ve(n,t[r]))return!0;return!1})}function qn(e){const n=xt({type:"Feature",properties:{},geometry:e},0);return n?{type:n.geometry.type,coordinates:n.geometry.coordinates}:null}function Kn(e,t){let n=!1;const r=i=>{const a=i.length,u=Me(i,{precision:t});return u.length!==a&&(n=!0),u};switch(e.type){case f.LINESTRING:e.coordinates=r(e.coordinates);break;case f.MULTI_LINESTRING:e.coordinates=e.coordinates.map(r);break;case f.POLYGON:e.coordinates=e.coordinates.map(r);break;case f.MULTI_POLYGON:e.coordinates=e.coordinates.map(i=>i.map(r));break}return n}function Zn(e,t){const n=t.selfIntersection,r=t.holeIntersectsShell;if(!n&&!r)return[];const i=n&&et(e),a=r&&tt(e),u=[];if(n&&!i&&u.push(d.SELF_INTERSECTION),r&&!a&&u.push(d.HOLE_INTERSECTS_SHELL),!i&&!a)return u;const c=qn(e);return!c||i&&et(c)||a&&tt(c)||(e.type=c.type,e.coordinates=c.coordinates,i&&u.push(d.SELF_INTERSECTION),a&&u.push(d.HOLE_INTERSECTS_SHELL)),u}function Qn(e,t){const n=[],r=t.precision??p;if(t.duplicatePosition&&Yn.includes(e.type)&&Kn(e,r)&&n.push({code:d.DUPLICATE_POSITION}),!$n.includes(e.type))return{fixed:e,corrections:n};t.windingOrder&&Wn(e)&&n.push({code:d.INVALID_WINDING_ORDER});for(const i of Zn(e,t))n.push({code:i});return{fixed:e,corrections:n}}function ge(e,t){return e.filter(n=>n.path===t||n.path?.startsWith(`${t}/`))}function Ie(e,t,n,r){const i={windingOrder:r.windingOrder!==!1&&t.some(E=>E.code===d.INVALID_WINDING_ORDER),selfIntersection:r.selfIntersection!==!1&&t.some(E=>E.code===d.SELF_INTERSECTION),holeIntersectsShell:r.holeIntersectsShell!==!1&&t.some(E=>E.code===d.HOLE_INTERSECTS_SHELL),duplicatePosition:r.duplicatePosition!==!1&&t.some(E=>E.code===d.DUPLICATE_POSITION),precision:r.precision},a=i.windingOrder||i.selfIntersection||i.holeIntersectsShell||i.duplicatePosition?Qn(e,i):{corrections:[]},u=new Set(a.corrections.map(E=>E.code)),c=a.corrections.map(E=>({...E,path:n})),g=t.filter(E=>!u.has(E.code));return{corrections:c,unfixed:g}}function Jn(e,t){o.assert.all([{value:e,validator:A,message:"geoJson must be a GeoJson object"},{value:t,validator:c=>o.conform.schema(c,Hn),message:"options must be a valid options object, with a mandatory validation result"}]);const n=[...t.validation.errors,...t.validation.warnings],r=n.filter(c=>Te.includes(c.code)),i=n.filter(c=>!Te.includes(c.code));if(r.length===0)return{fixed:e,corrections:[],unfixed:i};if(e.type===N.FEATURE_COLLECTION){const c=[];return e.features.forEach((g,E)=>{const m=`/features/${E}/geometry`,I=ge(r,m);if(I.length===0)return;const b=Ie(g.geometry,I,m,t);c.push(...b.corrections),i.push(...b.unfixed)}),{fixed:e,corrections:c,unfixed:i}}if(e.type===N.FEATURE){const c=ge(r,"/geometry"),g=Ie(e.geometry,c,"/geometry",t);return{fixed:e,corrections:g.corrections,unfixed:[...i,...g.unfixed]}}const a=ge(r,""),u=Ie(e,a,"",t);return{fixed:e,corrections:u.corrections,unfixed:[...i,...u.unfixed]}}function er(e){return o.assert.all([{value:e,validator:o.is.nonEmptyObject,message:"validation must be a non-empty object"},{value:e?.errors,validator:o.is.array,message:"validation.errors must be an array"}]),e.errors.length===0?!1:e.errors.every(t=>Te.includes(t.code))}function tr(e){const t=e.match(/^EPSG:(\d+)$/i);return t?`urn:ogc:def:crs:EPSG::${t[1]}`:e}function xe(e,t,n){switch(e.type){case f.POINT:e.coordinates=Pe(e.coordinates,t,n);break;case f.MULTI_POINT:case f.LINESTRING:e.coordinates=Z(e.coordinates,t,n);break;case f.MULTI_LINESTRING:case f.POLYGON:e.coordinates=e.coordinates.map(r=>Z(r,t,n));break;case f.MULTI_POLYGON:e.coordinates=e.coordinates.map(r=>r.map(i=>Z(i,t,n)));break;case f.GEOMETRY_COLLECTION:for(const r of e.geometries)xe(r,t,n);break}return delete e.bbox,delete e.crs,e}function Dt(e,t,n){if(e.type===N.FEATURE)e.geometry&&xe(e.geometry,t,n);else for(const r of e.features)Dt(r,t,n);return delete e.bbox,delete e.crs,e}function nr(e,t){l.that(e,A,"geoJson must be a GeoJson object");const n=bt(e);return l.all([{value:n,validator:M,message:`unknown source projection: ${n}`},{value:t,validator:M,message:`unknown target projection: ${t}`}]),s.oneOf(e.type,Object.values(f))?xe(e,n,t):Dt(e,n,t),De(t)?delete e.crs:e.crs={type:"name",properties:{name:tr(t)}},e}const rr={tolerance:o.optional(o.is.number),getWeight:o.optional(o.is.function)};function ir(e,t,n){return Math.abs((e[0]*(t[1]-n[1])+t[0]*(n[1]-e[1])+n[0]*(e[1]-t[1]))/2)}function Ee(e,{tolerance:t=0,getWeight:n=()=>1}={}){if(e.length<=2)return e;const r=e.map((m,I)=>({coord:m,i:I,area:1/0,removed:!1,prev:null,next:null}));for(let m=0;m<r.length;m++)m>0&&(r[m].prev=r[m-1]),m<r.length-1&&(r[m].next=r[m+1]);const i=m=>!m.prev||!m.next?1/0:ir(m.prev.coord,m.coord,m.next.coord)*n(m.coord,m.i),a=new Bt.Heap((m,I)=>m.area-I.area),u=m=>{m.area=i(m),a.push({node:m,area:m.area})};for(let m=1;m<r.length-1;m++)u(r[m]);let c=0;for(;a.size()>0;){const m=a.pop(),I=m.node;if(!I.removed&&m.area===I.area){if(I.area<c?I.area=c:c=I.area,I.area>=t)break;I.removed=!0,I.prev&&(I.prev.next=I.next),I.next&&(I.next.prev=I.prev),I.prev?.prev&&u(I.prev),I.next?.next&&u(I.next)}}const g=[];let E=r[0];for(;E;)E.removed||g.push(E.coord),E=E.next;return g}function Q(e,t={}){if(o.assert.all([{value:e,validator:A,message:"geoJson must be a GeoJson object"},{value:t,validator:n=>o.conform.schema(n,rr),message:"options must be a valid options object"}]),e.type===N.FEATURE)return e.geometry&&Q(e.geometry,t),e;if(e.type===N.FEATURE_COLLECTION){for(const n of e.features)Q(n,t);return e}switch(e.type){case f.LINESTRING:e.coordinates=Ee(e.coordinates,t);break;case f.POLYGON:case f.MULTI_LINESTRING:e.coordinates=e.coordinates.map(n=>Ee(n,t));break;case f.MULTI_POLYGON:e.coordinates=e.coordinates.map(n=>n.map(r=>Ee(r,t)));break;case f.GEOMETRY_COLLECTION:e.geometries.forEach(n=>Q(n,t));break}return e}function Be(e,t,n){switch(e.type){case f.POINT:Ce(e.coordinates,t);break;case f.MULTI_POINT:case f.LINESTRING:re(e.coordinates,{precision:t});break;case f.MULTI_LINESTRING:for(const r of e.coordinates)re(r,{precision:t});break;case f.POLYGON:e.coordinates=e.coordinates.map(r=>Le(r,{precision:t,consider3D:n}));break;case f.MULTI_POLYGON:e.coordinates=e.coordinates.map(r=>r.map(i=>Le(i,{precision:t,consider3D:n})));break;case f.GEOMETRY_COLLECTION:for(const r of e.geometries)Be(r,t,n);break}return e.bbox&&Ge(e.bbox,t),e}function yt(e,t,n){if(e.type===N.FEATURE)e.geometry&&Be(e.geometry,t,n);else for(const r of e.features)yt(r,t,n);return e.bbox&&Ge(e.bbox,t),e}function sr(e,t={}){const{precision:n=p,consider3D:r=!1}=t;return l.all([{value:e,validator:A,message:"geoJson must be a valid GeoJson"},{value:n,validator:i=>s.inRange(i,0,_),message:`precision must be in range [0, ${_}]`}]),s.oneOf(e.type,Object.values(f))?Be(e,n,r):yt(e,n,r)}const nt="/crs";function Ct(e,t="",n={}){if(!o.is.defined(e))return t===nt?(n.geodesic=!0,{crs:Ae,valid:!0}):{valid:!0};if(t!==nt)return{valid:!1,errors:[{code:d.UNSUPPORTED_NESTED_CRS,path:t}],warnings:[]};if(!o.is.plainObject(e))return{valid:!1,errors:[{code:d.INVALID_CRS_OBJECT,path:t}],warnings:[]};switch(e.type){case $.NAME:{if(!o.is.nonEmptyString(e.properties?.name))return{valid:!1,errors:[{code:d.INVALID_CRS_NAME,path:t}],warnings:[]};const r=be(e.properties.name);return M(r)?(n.geodesic=De(r),{crs:r,valid:!0,errors:[],warnings:[]}):{valid:!1,errors:[{code:d.UNSUPPORTED_CRS,path:t,params:{name:e.properties.name}}],warnings:[]}}case $.LINK:return o.is.nonEmptyString(e.properties?.href)?{valid:!1,errors:[{code:d.UNSUPPORTED_LINK_CRS,path:t}],warnings:[]}:{valid:!1,errors:[{code:d.INVALID_CRS_LINK,path:t}],warnings:[]};default:return{valid:!1,errors:[{code:d.INVALID_CRS_TYPE,path:t,params:{type:e.type}}],warnings:[]}}}function ie(e,t="",n={}){const r=n.geodesic;if(!o.is.arrayOfLengthBetween(e,2,3))return{valid:!1,errors:[{code:d.INVALID_POSITION_LENGTH,path:t}],warnings:[]};if(!o.is.number(e[0])||!o.is.number(e[1]))return{valid:!1,errors:[{code:d.INVALID_POSITION_COORDINATES,path:t}],warnings:[]};if(r){if(!o.is.inRange(e[0],-180,180))return{valid:!1,errors:[{code:d.INVALID_LONGITUDE_RANGE,path:t,params:{value:e[0]}}],warnings:[]};if(!o.is.inRange(e[1],-90,90))return{valid:!1,errors:[{code:d.INVALID_LATITUDE_RANGE,path:t,params:{value:e[1]}}],warnings:[]}}if(e.length===3&&!o.is.number(e[2]))return{valid:!1,errors:[{code:d.INVALID_ALTITUDE,path:t}],warnings:[]};const i={valid:!0,errors:[],warnings:[]};if(r){const a=n.precision??p,u=Ne(e[0]);u>a&&i.warnings.push({code:d.EXCESSIVE_LONGITUDE_PRECISION,path:t,params:{precision:u,max:a}});const c=Ne(e[1]);c>a&&i.warnings.push({code:d.EXCESSIVE_LATITUDE_PRECISION,path:t,params:{precision:c,max:a}})}return i}function Pt(e,t="",n={}){const r=n?.geodesic;if(!o.is.defined(e))return{valid:!0};if(!o.is.arrayOfLength(e,4)&&!o.is.arrayOfLength(e,6))return{valid:!1,errors:[{code:d.INVALID_BBOX_LENGTH,path:t}],warnings:[]};const i=e.length===4,a=i?[e[0],e[1]]:[e[0],e[1],e[2]],u=i?[e[2],e[3]]:[e[3],e[4],e[5]],c=ie(a,`${t}/min`,n);if(!c.valid)return{valid:!1,errors:c.errors,warnings:[]};const g=ie(u,`${t}/max`,n);if(!g.valid)return{valid:!1,errors:g.errors,warnings:[]};const[E,m]=a,[I,b]=u;if(m>b)return{valid:!1,errors:[{code:d.INVALID_BBOX_LATITUDE_ORDER,path:t,params:{south:m,north:b}}],warnings:[]};if(!r&&E>I)return{valid:!1,errors:[{code:d.INVALID_BBOX_LONGITUDE_ORDER,path:t,params:{west:E,east:I}}],warnings:[]};if(!i){const He=e[2],We=e[5];if(He>We)return{valid:!1,errors:[{code:d.INVALID_BBOX_ALTITUDE_ORDER,path:t,params:{minAlt:He,maxAlt:We}}],warnings:[]}}const z={valid:!0,errors:[],warnings:[]};return r&&E>I&&z.warnings.push({code:d.BBOX_ANTIMERIDIAN_CROSSING,path:t,params:{west:E,east:I}}),z.warnings.push(...c.warnings),z.warnings.push(...g.warnings),z}function ke(){return{Feature:0,FeatureCollection:0,geometries:{}}}function Fe(){return{crs:void 0,valid:!0,errors:[],warnings:[],statistics:ke()}}function Gt(...e){const t=ke();for(const n of e){const r=n.statistics;if(r){t.Feature+=r.Feature??0,t.FeatureCollection+=r.FeatureCollection??0;for(const[i,a]of Object.entries(r.geometries??{}))t.geometries[i]=(t.geometries[i]??0)+a}}return t}function v(e,...t){for(const n of t)e.valid=e.valid&&(n.valid??!0),n.errors&&e.errors.push(...n.errors),n.warnings&&e.warnings.push(...n.warnings),n.crs!==void 0&&(e.crs=n.crs);return e.statistics=Gt(e,...t),e}function V(e,t,n=""){const r={valid:!0,errors:[],warnings:[],statistics:ke()};for(let i=0;i<e.length;i++){const a=`${n}/${i}`,u=t(e[i],a,i);u.statistics&&(r.statistics=Gt(r,u)),u.valid||(r.valid=!1,r.errors=r.errors.concat(u.errors.map(c=>({...c,path:c.path||a,index:i})))),o.is.empty(u.warnings)||(r.warnings=r.warnings.concat(u.warnings.map(c=>({...c,path:c.path||a,index:i}))))}return r}function rt(e,t=0,n=p){for(let r=t;r<e.length-1;r++)if(le(e[r],e[r+1],{precision:n}))return r;return-1}function Mt(e,t,n,r=p){let i=rt(e,0,r);for(;i!==-1;)n.push({code:d.DUPLICATE_POSITION,path:`${t}/${i}`}),i=rt(e,i+1,r)}function $e(e,t=0,n="",r={}){return o.is.arrayOfLengthAtLeast(e,t)?V(e,(i,a)=>ie(i,a,r),n):{valid:!1,errors:[{code:d.INVALID_COORDINATES_LENGTH,path:n,params:{minimumLength:t}}],warnings:[]}}function Ut(e,t="",n={}){const r=$e(e,2,t,n);if(!r.valid)return r;if(Mt(e,t,r.warnings,n.precision??p),n.geodesic??!0)for(let i=0;i<e.length-1;i++){const a=e[i][0],u=e[i+1][0];Math.abs(u-a)>180&&r.warnings.push({code:d.ANTIMERIDIAN_CROSSING,path:`${t}/${i}`})}return r}function ar(e,t="",n={}){return o.is.nonEmptyArray(e)?V(e,(r,i)=>Ut(r,i,n),t):{valid:!1,errors:[{code:d.INVALID_MULTI_LINESTRING_COORDINATES,path:t}],warnings:[]}}function or(e,t,n="",r={}){const i=r.precision??p,a=r.geodesic??!0,u=$e(e,4,n,r);if(!u.valid)return u;if(!de(e,{precision:i}))return u.valid=!1,u.errors.push({code:d.RING_NOT_CLOSED,path:n}),u;if(Mt(e,n,u.warnings,i),a){const c=Ue(e)?"clockwise":"counter-clockwise";c!==t&&(u.valid=!1,u.errors.push({code:d.INVALID_WINDING_ORDER,path:n,params:{expected:t,actual:c}}));const g=we(e);g.length>0&&(u.valid=!1,u.errors.push({code:d.SELF_INTERSECTION,path:n,params:{count:g.length}}))}return u}function Vt(e,t="",n={}){if(!o.is.nonEmptyArray(e))return{valid:!1,errors:[{code:d.INVALID_POLYGON_COORDINATES,path:t}],warnings:[]};const r=V(e,(i,a,u)=>or(i,u===0?"counter-clockwise":"clockwise",a,n),t);if((n.geodesic??!0)&&r.valid&&e.length>1){const i=e[0];for(let a=1;a<e.length;a++)Ve(i,e[a])&&(r.valid=!1,r.errors.push({code:d.HOLE_INTERSECTS_SHELL,path:`${t}/${a}`}))}return r}function ur(e,t="",n={}){return o.is.nonEmptyArray(e)?V(e,(r,i)=>Vt(r,i,n),t):{valid:!1,errors:[{code:d.INVALID_MULTIPOLYGON_COORDINATES,path:t}],warnings:[]}}function lr(e,t="",n={}){return o.is.nonEmptyArray(e)?V(e,(r,i)=>Ye(r,i,n),t):{valid:!1,errors:[{code:d.INVALID_GEOMETRYCOLLECTION_GEOMETRIES,path:t}],warnings:[]}}function Ye(e,t="",n={}){let r=Fe();if(!o.is.nonEmptyObject(e))return r.valid=!1,r.errors.push({code:d.INVALID_GEOMETRY,path:t}),r;r=v(r,Ct(e.crs,`${t}/crs`,n)),r=v(r,Pt(e.bbox,`${t}/bbox`,n));const i=`${t}/coordinates`;switch(e.type){case f.POINT:r=v(r,ie(e.coordinates,i,n));break;case f.MULTI_POINT:r=v(r,$e(e.coordinates,0,i,n));break;case f.LINESTRING:r=v(r,Ut(e.coordinates,i,n));break;case f.MULTI_LINESTRING:r=v(r,ar(e.coordinates,i,n));break;case f.POLYGON:r=v(r,Vt(e.coordinates,i,n));break;case f.MULTI_POLYGON:r=v(r,ur(e.coordinates,i,n));break;case f.GEOMETRY_COLLECTION:r=v(r,lr(e.geometries,`${t}/geometries`,n));break;default:return r.valid=!1,r.errors.push({code:d.INVALID_GEOMETRY_TYPE,path:t,params:{type:e.type}}),r}return r.statistics={Feature:0,FeatureCollection:0,geometries:{[e.type]:1}},r}function wt(e,t,n){let r=Fe();return o.is.nonEmptyObject(e)?(r=v(r,Ct(e.crs,`${t}/crs`,n)),r=v(r,Pt(e.bbox,`${t}/bbox`,n)),e.type===N.FEATURE?(r.statistics.Feature++,o.is.nonEmptyObject(e.geometry)?r=v(r,Ye(e.geometry,`${t}/geometry`,n)):r.warnings.push({code:d.MISSING_GEOMETRY,path:t}),r):(r.statistics.FeatureCollection++,o.is.nonEmptyArray(e.features)?r=v(r,V(e.features,(i,a)=>wt(i,a,n),`${t}/features`)):o.is.array(e.features)||(r.valid=!1,r.errors.push({code:d.INVALID_FEATURES_ARRAY,path:t})),r)):(r.valid=!1,r.errors.push({code:d.EMPTY_OBJECT,path:t}),r)}function cr(e,t={}){o.assert.that(e,o.is.nonEmptyObject,"geojson must be a non empty object");const{precision:n=p}=t;return e.type===N.FEATURE||e.type===N.FEATURE_COLLECTION?wt(e,"",{precision:n}):o.is.oneOf(e.type,Object.values(f))?Ye(e,"",{precision:n}):{...Fe(),valid:!1,errors:[{code:d.UNKNOWN_TYPE,path:"",params:{type:e.type}}]}}exports.AXES=O;exports.COORDINATE_FORMATS=J;exports.COORDINATE_MODELS=ft;exports.COORDINATE_TRUNCATION_FACTORS=mt;exports.CRS_TYPES=$;exports.DEFAULT_COORDINATE_PRECISION=p;exports.EARTH_RADIUS=ye;exports.FEATURE_TYPES=N;exports.GEOMETRY_TYPES=f;exports.IS_SAME_POSITION_OPTIONS_SCHEMA=X;exports.MAX_COORDINATE_PRECISION=_;exports.TRUNCATE_POSITIONS_OPTIONS_SCHEMA=Lt;exports.VALIDATION_CODES=d;exports.WGS84=Ae;exports.closeRing=Tt;exports.computeBBox=K;exports.computeGeoJsonBoundingBox=Bn;exports.computeGeoJsonConvexHull=At;exports.convertCoordinate=On;exports.deduplicatePositions=Me;exports.defineProjection=bn;exports.destinationFromPosition=Cn;exports.distanceBetweenPositions=pt;exports.extractGeoJsonBBox=Fn;exports.extractGeoJsonCRS=bt;exports.extractGeoJsonNode=je;exports.fixGeoJson=Jn;exports.getActiveLocales=_e;exports.getCoordinatePrecision=Ne;exports.getDirectionAxis=ut;exports.getDirectionSymbols=U;exports.getDirections=Zt;exports.getEast=en;exports.getLocale=at;exports.getMessages=ae;exports.getNorth=Qt;exports.getProjection=Dn;exports.getSouth=Jt;exports.getWest=tn;exports.guessCoordinateAxis=Oe;exports.hasProjection=M;exports.is3DBBox=pe;exports.is3DPosition=Nt;exports.isAltitude=kt;exports.isClockwiseRing=Ue;exports.isClosedRing=de;exports.isEast=ue;exports.isGeoJsonFixable=er;exports.isLatitude=x;exports.isLikeBBox=jn;exports.isLikeCRS=Vn;exports.isLikeFeature=_t;exports.isLikeFeatureCollection=ht;exports.isLikeFeatureOrFeatureCollection=Rt;exports.isLikeGeoJson=A;exports.isLikeGeometry=St;exports.isLikePosition=wn;exports.isLongitude=se;exports.isNorth=ot;exports.isSamePosition=le;exports.isSouth=he;exports.isValidAxis=Se;exports.isValidBBox=k;exports.isValidDirection=R;exports.isValidLine=Mn;exports.isValidPosition=T;exports.isValidPositions=ce;exports.isValidRing=F;exports.isWGS84Projection=De;exports.isWest=H;exports.lineLength=Un;exports.listLocales=zt;exports.listProjections=An;exports.mergeBBox=Pn;exports.normalizeCoordinate=En;exports.normalizeCrsName=be;exports.parseCoordinate=gt;exports.parsePosition=yn;exports.registerMessages=Kt;exports.reprojectGeoJson=nr;exports.reprojectPosition=Pe;exports.reprojectPositions=Z;exports.ringSelfIntersections=we;exports.ringsIntersect=Ve;exports.setLocale=qt;exports.simplifyGeoJson=Q;exports.sphericalRingArea=vt;exports.truncateBBox=Ge;exports.truncateCoordinate=Re;exports.truncateGeoJson=sr;exports.truncatePosition=Ce;exports.truncatePositions=re;exports.truncateRing=Le;exports.validateGeoJson=cr;
2
2
  //# sourceMappingURL=index.cjs.map