flatgeobuf
Version:
A performant binary encoding for geographic data
2 lines • 2.84 kB
JavaScript
import*as e from"flatbuffers";import{ColumnType as t}from"../flat-geobuf/column-type.js";import{Feature as r}from"../flat-geobuf/feature.js";import{buildGeometry as a}from"./geometry.js";let n=new TextEncoder,s=new TextDecoder;export function fromFeature(e,t,r,a,n){let s=r.columns;return n(e,a(t.geometry(),r.geometryType),parseProperties(t,s))}export function buildFeature(s,o,i){let l=i.columns,c=new e.Builder,g=0,b=1024,f=new Uint8Array(1024),u=new DataView(f.buffer),k=e=>{if(g+e<b)return;let t=new Uint8Array(b=Math.max(b+e,2*b));t.set(f),u=new DataView((f=t).buffer)};if(l)for(let e=0;e<l.length;e++){let r=l[e],a=o[r.name];if(null!==a)switch(k(2),u.setUint16(g,e,!0),g+=2,r.type){case t.Bool:k(1),u.setUint8(g,a),g+=1;break;case t.Short:k(2),u.setInt16(g,a,!0),g+=2;break;case t.UShort:k(2),u.setUint16(g,a,!0),g+=2;break;case t.Int:k(4),u.setInt32(g,a,!0),g+=4;break;case t.UInt:k(4),u.setUint32(g,a,!0),g+=4;break;case t.Long:k(8),u.setBigInt64(g,BigInt(a),!0),g+=8;break;case t.Float:k(4),u.setFloat32(g,a,!0),g+=4;break;case t.Double:k(8),u.setFloat64(g,a,!0),g+=8;break;case t.DateTime:case t.String:{let e=n.encode(a);k(4),u.setUint32(g,e.length,!0),g+=4,k(e.length),f.set(e,g),g+=e.length;break}case t.Json:{let e=n.encode(JSON.stringify(a));k(4),u.setUint32(g,e.length,!0),g+=4,k(e.length),f.set(e,g),g+=e.length;break}case t.Binary:k(4),u.setUint32(g,a.length,!0),g+=4,k(a.length),f.set(a,g),g+=a.length;break;default:throw Error(`Unknown type ${r.type}`)}}let U=0;g>0&&(U=r.createPropertiesVector(c,f.slice(0,g)));let p=a(c,s);r.startFeature(c),r.addGeometry(c,p),U&&r.addProperties(c,U);let y=r.endFeature(c);return c.finishSizePrefixed(y),c.asUint8Array()}export function parseProperties(e,r){let a={};if(!r||0===r.length)return a;let n=e.propertiesArray();if(!n)return a;let o=new DataView(n.buffer,n.byteOffset),i=e.propertiesLength(),l=0;for(;l<i;){let e=o.getUint16(l,!0);l+=2;let i=r[e],c=i.name;switch(i.type){case t.Bool:a[c]=!!o.getUint8(l),l+=1;break;case t.Byte:a[c]=o.getInt8(l),l+=1;break;case t.UByte:a[c]=o.getUint8(l),l+=1;break;case t.Short:a[c]=o.getInt16(l,!0),l+=2;break;case t.UShort:a[c]=o.getUint16(l,!0),l+=2;break;case t.Int:a[c]=o.getInt32(l,!0),l+=4;break;case t.UInt:a[c]=o.getUint32(l,!0),l+=4;break;case t.Long:a[c]=Number(o.getBigInt64(l,!0)),l+=8;break;case t.ULong:a[c]=Number(o.getBigUint64(l,!0)),l+=8;break;case t.Float:a[c]=o.getFloat32(l,!0),l+=4;break;case t.Double:a[c]=o.getFloat64(l,!0),l+=8;break;case t.DateTime:case t.String:{let e=o.getUint32(l,!0);l+=4,a[c]=s.decode(n.subarray(l,l+e)),l+=e;break}case t.Json:{let e=o.getUint32(l,!0);l+=4;let t=s.decode(n.subarray(l,l+e));a[c]=JSON.parse(t),l+=e;break}case t.Binary:{let e=o.getUint32(l,!0);l+=4,a[c]=n.subarray(l,l+e),l+=e;break}default:throw Error(`Unknown type ${i.type}`)}}return a}
//# sourceMappingURL=feature.js.map