UNPKG

flatgeobuf

Version:

A performant binary encoding for geographic data

2 lines 4.3 kB
import*as e from"flatbuffers";import t from"slice-source";import{ArrayReader as r}from"../array-reader.js";import{magicbytes as a,SIZE_PREFIX_LEN as n}from"../constants.js";import{Column as o}from"../flat-geobuf/column.js";import{ColumnType as i}from"../flat-geobuf/column-type.js";import{Crs as l}from"../flat-geobuf/crs.js";import{Feature as f}from"../flat-geobuf/feature.js";import{Header as u}from"../flat-geobuf/header.js";import{fromByteBuffer as s}from"../header-meta.js";import{HttpRangeClient as d,HttpReader as m}from"../http-reader.js";import{calcTreeSize as y}from"../packedrtree.js";import{buildFeature as p}from"./feature.js";import{parseGeometry as g}from"./geometry.js";import{inferGeometryType as c}from"./header.js";export function serialize(e){var t;let r,n,o,i=(n=(r=(t=e)[0]).getProperties?r.getProperties():{},o=null,n&&(o=Object.keys(n).filter(e=>"geometry"!==e).map(e=>mapColumn(n,e))),{geometryType:c(t),columns:o,envelope:null,featuresCount:t.length,indexNodeSize:0,crs:null,title:null,description:null,metadata:null}),l=buildHeader(i),f=e.map(e=>{if(!e.getGeometry)throw Error("Missing getGeometry implementation");if(!e.getProperties)throw Error("Missing getProperties implementation");return p(g(e.getGeometry(),i.geometryType),e.getProperties(),i)}),u=f.map(e=>e.length).reduce((e,t)=>e+t),s=new Uint8Array(a.length+l.length+u);s.set(l,a.length);let d=a.length+l.length;for(let e of f)s.set(e,d),d+=e.length;return s.set(a),s}export async function*deserialize(t,o,i,l){if(!t.subarray(0,3).every((e,t)=>a[t]===e))throw Error("Not a FlatGeobuf file");if(i){let e=r.open(t);for await(let t of e.selectBbox(i))yield o(t.id,t.feature,e.header);return}let u=new e.ByteBuffer(t),d=u.readUint32(a.length);u.setPosition(a.length);let m=s(u);l&&l(m);let p=a.length+n+d,{indexNodeSize:g,featuresCount:c}=m;g>0&&(p+=y(c,g));let w=0;for(;p<u.capacity();){let e=u.readUint32(p);u.setPosition(p);let t=f.getSizePrefixedRootAsFeature(u);yield o(w++,t,m),p+=n+e}}export async function*deserializeStream(r,n,o){let i,l=t(r),f=async e=>await l.slice(e),u=new Uint8Array(await f(8,"magic bytes"));if(!u.subarray(0,3).every((e,t)=>a[t]===e))throw Error("Not a FlatGeobuf file");let d=new Uint8Array(await f(4,"header length")),m=new e.ByteBuffer(d),p=m.readUint32(0),g=new Uint8Array(await f(p,"header data"));(u=new Uint8Array(d.length+g.length)).set(d),u.set(g,d.length);let c=s(m=new e.ByteBuffer(u));o&&o(c);let{indexNodeSize:h,featuresCount:b}=c;if(h>0){let e=y(b,h);await f(e,"entire index, w/o rect")}let B=0;for(;i=await w(f,c,n,B++);)yield i}export async function*deserializeFiltered(e,t,r,a,n=!1,o={}){let i=await m.open(e,n,o);for await(let e of(a&&a(i.header),i.selectBbox(t)))yield r(e.id,e.feature,i.header)}async function w(t,r,a,n){let o=new Uint8Array(await t(4,"feature length"));if(0===o.byteLength)return;let i=new e.ByteBuffer(o),l=i.readUint32(0);o=new Uint8Array(await t(l,"feature data"));let u=new Uint8Array(l+4);return u.set(o,4),i=new e.ByteBuffer(u),a(n,f.getSizePrefixedRootAsFeature(i),r)}export function buildHeader(t,r=0){let a,n=new e.Builder,i=0;t.columns&&(i=u.createColumnsVector(n,t.columns.map(e=>{let t;return t=n.createString(e.name),o.startColumn(n),o.addName(n,t),o.addType(n,e.type),o.endColumn(n)})));let f=n.createString("L1");r&&(l.startCrs(n),l.addCode(n,r),a=l.endCrs(n)),u.startHeader(n),a&&u.addCrs(n,a),u.addFeaturesCount(n,BigInt(t.featuresCount)),u.addGeometryType(n,t.geometryType),u.addIndexNodeSize(n,0),i&&u.addColumns(n,i),u.addName(n,f);let s=u.endHeader(n);return n.finishSizePrefixed(s),n.asUint8Array()}export async function readMetadata(t,r=!1,n={}){let o=new d(t,r,n),i=new Uint8Array(await o.getRange(0,2024,"read metadata"));if(!i.subarray(0,3).every((e,t)=>a[t]===e))throw Error("Not a FlatGeobuf file");let l=new e.ByteBuffer(i);return l.setPosition(a.length),s(l)}export function mapColumn(e,t){return{name:t,type:function(e){if("boolean"==typeof e)return i.Bool;if("number"==typeof e)return i.Double;if("string"==typeof e||null===e)return i.String;if(e instanceof Uint8Array)return i.Binary;if("object"==typeof e)return i.Json;throw Error(`Unknown type (value '${e}')`)}(e[t]),title:null,description:null,width:-1,precision:-1,scale:-1,nullable:!0,unique:!1,primary_key:!1}} //# sourceMappingURL=featurecollection.js.map