geojson-to-gml-3
Version:
a package to translate geojson to GML 3.2.1
2 lines (1 loc) • 5.22 kB
JavaScript
;Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const I=/[A-Za-z_:]/,U=/[A-Za-z_:0-9_.-]/,E=new RegExp(`^${I.source}${U.source}*$`),G=t=>E.test(t),q=t=>{if(G(t))return t;throw new Error(`invalid XML name: '${t}'`)},k=(t,e)=>`${t}:${e}`;class x{constructor(e,n){this.name=e,this.uri=n}qualify(e){return k(this.name,e)}attr(){return`xmlns:${this.name}="${this.uri}"`}}const D=(t,e=n=>{throw new Error(`unable to escape ${typeof t}: '${String(t)}'`)})=>{switch(typeof t){case"string":return z(t);case"number":case"bigint":return t.toString();case"boolean":return t?"true":"false";default:return e(t)}},M=t=>D(t),R={"&":"&","<":"<",">":">","'":"'",'"':"""},z=t=>t.replace(/[<>&'"]/g,e=>R[e]??""),Z=(t,e)=>`${t}="${e}"`;function u(t){return Object.entries(t).map(([e,n])=>n==null?null:Z(q(e),M(n))).filter(e=>e!==null)}const X="",B=(...t)=>t.join(X),F=t=>(e,...n)=>s(t,e,...n),s=(t,e,...n)=>r=>{let i=e.sort().join(" ");i&&(i=" "+i);const o=B(...n.map(l=>typeof l=="function"?l(r):l));return o.length?`<${t}${i}>${o}</${t}>`:`<${t}${i}/>`};class d{constructor(e){this.uriToName={},this.nameToUri={},this.nameToCache={},e&&this.bulkUpdate(e)}set(e,n){const r=new x(e,n);return this.uriToName[r.uri]=r.name,this.nameToUri[r.name]=r.uri,this.nameToCache[r.name]=r,r}get(e){let n=this.getName(e);return n?this.nameToCache[n]??null:null}getName(e){return this.uriToName[e]||null}clone(){let e=new d;return Object.assign(e.uriToName,this.uriToName),Object.assign(e.nameToUri,this.nameToUri),e}getOrInsert(e,n){return this.get(n)??this.set(e,n)}bulkUpdate(e){for(let[n,r]of Object.entries(e)){let i=q(n),o=M(r);switch(this.nameToUri[i]){case o:continue;case void 0:this.set(i,o);continue;default:throw new Error(`namespace ${i} already registered`)}}return this}extend(e){return this.clone().bulkUpdate(e)}xmlnsAttrs(){return Object.values(this.nameToCache).map(e=>e.attr()).sort()}}const h=t=>{switch(t){case a.LON_LAT:return([e,n,...r])=>[e,n,...r];case a.LAT_LON:return([e,n,...r])=>[n,e,...r];default:throw new Error("invalid order: "+t)}},c=t=>(e,n={})=>r=>{r=r??new d;const{ns:i="gml"}=n,o=r.getOrInsert(i,N);return t(o,e,n)(r)},L=t=>(e,n,r)=>t(e,n.coordinates,r),p=(t,e,n={})=>{let{order:r=a.LON_LAT,srsName:i=null,srsDimension:o=null,gmlId:l=null}=n;return s(t.qualify("Point"),u({srsName:i,srsDimension:o,[t.qualify("id")]:l}),s(t.qualify("pos"),u({srsDimension:o}),h(r)(e).join(" ")))},O=(t,e,n={})=>{switch(e.type){case"Point":return p(t,e.coordinates,n);case"LineString":return w(t,e.coordinates,n);case"Polygon":return T(t,e.coordinates,n);case"MultiPoint":return P(t,e,n);case"MultiLineString":return S(t,e,n);case"MultiPolygon":return _(t,e,n);case"GeometryCollection":return b(t,e,n);default:throw new Error(`unknown geometry type: ${e==null?void 0:e.type}`)}},b=f("MultiGeometry","geometryMembers","geometries",O),w=(t,e,n={})=>{let{srsName:r=null,srsDimension:i=null,gmlId:o=null,order:l=a.LON_LAT}=n;return s(t.qualify("LineString"),u({srsName:r,[t.qualify("id")]:o}),s(t.qualify("posList"),u({srsDimension:i}),H(e,l)))},H=(t,e=a.LON_LAT)=>{let n="";const r=h(e);for(let i of t)for(let o of r(i))n+=`${o} `;return n.trim()},$=(t,e,n={})=>{let{srsName:r=null,srsDimension:i=null,gmlId:o=null,order:l=a.LON_LAT}=n;const m=h(l);return s(t.qualify("LinearRing"),u({srsName:r,[t.qualify("id")]:o}),s(t.qualify("posList"),u({srsDimension:i}),e.map(y=>m(y).join(" ")).join(" ")))},T=(t,e,n={})=>{let{srsName:r=null,gmlId:i=null,...o}=n,[l,...m]=e;const y=F(t.qualify("interior"));return s(t.qualify("Polygon"),u({srsName:r,[t.qualify("id")]:i}),s(t.qualify("exterior"),[],$(t,l,o)),...m.map(g=>y([],$(t,g,o))))},P=f("MultiPoint","pointMembers","coordinates",p),S=f("MultiCurve","curveMembers","coordinates",w),_=f("MultiSurface","surfaceMembers","coordinates",T);function f(t,e,n,r){return(i,o,l={})=>{let{srsName:m=null,gmlId:y=null,gmlIds:g=[],...C}=l;return s(i.qualify(t),u({srsName:m,[i.qualify("id")]:y}),s(i.qualify(e),[],...o[n].map((A,v)=>r(i,A,{gmlId:g[v]??null,...C}))))}}const N="http://www.opengis.net/gml/3.2",J=(t,e)=>n=>{n=n??new d;const{ns:r="gml",srsDimension:i,srsName:o}=e,l=n.getOrInsert(r,N);return s(l.qualify("Envelope"),u({srsDimension:i,srsName:o}),s(l.qualify("lowerCorner"),[],t.slice(0,t.length/2).join(" ")),s(l.qualify("upperCorner"),[],t.slice(t.length/2).join(" ")))(n)};var a=(t=>(t.LON_LAT="lon,lat",t.LAT_LON="lat,lon",t))(a||{});/*!! use-example file://./../tests/point.example.ts */const K=c(L(p));/*!! use-example file://./../tests/lineString.example.ts */const Q=c(L(w));/*!! use-example file://./../tests/polygon.example.ts */const V=c(L(T));/*!! use-example file://./../tests/multiPoint.example.ts */const W=c(P);/*!! use-example file://./../tests/multiLineString.example.ts */const Y=c(S);/*!! use-example file://./../tests/multiPolygon.example.ts */const tt=c(_),j=c(O);/*!! use-example file://./../tests/geometryCollection.example.ts */const et=c(b);exports.CoordinateOrder=a;exports.GML=N;exports.bbox=J;exports.default=j;exports.geometry=j;exports.geometryCollection=et;exports.lineString=Q;exports.multiLineString=Y;exports.multiPoint=W;exports.multiPolygon=tt;exports.point=K;exports.polygon=V;