@loaders.gl/flatgeobuf 4.0.3 → 4.1.0-alpha.1

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.
@@ -1,4 +1,4 @@
1
- import type { Loader, LoaderOptions } from '@loaders.gl/loader-utils';
1
+ import type { Loader, LoaderWithParser, LoaderOptions } from '@loaders.gl/loader-utils';
2
2
  export type FlatGeobufLoaderOptions = LoaderOptions & {
3
3
  flatgeobuf?: {
4
4
  shape?: 'geojson-table' | 'columnar-table' | 'binary';
@@ -8,5 +8,6 @@ export type FlatGeobufLoaderOptions = LoaderOptions & {
8
8
  _targetCrs?: string;
9
9
  };
10
10
  };
11
- export declare const FlatGeobufLoader: Loader<any, any, FlatGeobufLoaderOptions>;
11
+ export declare const FlatGeobufWorkerLoader: Loader<any, any, FlatGeobufLoaderOptions>;
12
+ export declare const FlatGeobufLoader: LoaderWithParser<any, any, FlatGeobufLoaderOptions>;
12
13
  //# sourceMappingURL=flatgeobuf-loader.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"flatgeobuf-loader.d.ts","sourceRoot":"","sources":["../src/flatgeobuf-loader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,MAAM,EAAE,aAAa,EAAC,MAAM,0BAA0B,CAAC;AAMpE,MAAM,MAAM,uBAAuB,GAAG,aAAa,GAAG;IACpD,UAAU,CAAC,EAAE;QACX,KAAK,CAAC,EAAE,eAAe,GAAG,gBAAgB,GAAG,QAAQ,CAAC;KACvD,CAAC;IACF,GAAG,CAAC,EAAE;QACJ,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;CACH,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,uBAAuB,CAiBtE,CAAC"}
1
+ {"version":3,"file":"flatgeobuf-loader.d.ts","sourceRoot":"","sources":["../src/flatgeobuf-loader.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAC,MAAM,EAAE,gBAAgB,EAAE,aAAa,EAAC,MAAM,0BAA0B,CAAC;AAUtF,MAAM,MAAM,uBAAuB,GAAG,aAAa,GAAG;IACpD,UAAU,CAAC,EAAE;QACX,KAAK,CAAC,EAAE,eAAe,GAAG,gBAAgB,GAAG,QAAQ,CAAC;KACvD,CAAC;IACF,GAAG,CAAC,EAAE;QACJ,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;CACH,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,uBAAuB,CAkB5E,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,gBAAgB,CAAC,GAAG,EAAE,GAAG,EAAE,uBAAuB,CAOhF,CAAC"}
@@ -1,5 +1,7 @@
1
+ import { parseFlatGeobuf, parseFlatGeobufInBatches } from "./lib/parse-flatgeobuf.js";
1
2
  const VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'latest';
2
- export const FlatGeobufLoader = {
3
+ const FGB_MAGIC_NUMBER = [0x66, 0x67, 0x62, 0x03, 0x66, 0x67, 0x62, 0x01];
4
+ export const FlatGeobufWorkerLoader = {
3
5
  id: 'flatgeobuf',
4
6
  name: 'FlatGeobuf',
5
7
  module: 'flatgeobuf',
@@ -8,6 +10,7 @@ export const FlatGeobufLoader = {
8
10
  extensions: ['fgb'],
9
11
  mimeTypes: ['application/octet-stream'],
10
12
  category: 'geometry',
13
+ tests: [new Uint8Array(FGB_MAGIC_NUMBER).buffer],
11
14
  options: {
12
15
  flatgeobuf: {
13
16
  shape: 'geojson-table'
@@ -17,4 +20,11 @@ export const FlatGeobufLoader = {
17
20
  }
18
21
  }
19
22
  };
23
+ export const FlatGeobufLoader = {
24
+ ...FlatGeobufWorkerLoader,
25
+ parse: async (arrayBuffer, options) => parseFlatGeobuf(arrayBuffer, options),
26
+ parseSync: parseFlatGeobuf,
27
+ parseInBatchesFromStream: parseFlatGeobufInBatches,
28
+ binary: true
29
+ };
20
30
  //# sourceMappingURL=flatgeobuf-loader.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"flatgeobuf-loader.js","names":["VERSION","__VERSION__","FlatGeobufLoader","id","name","module","version","worker","extensions","mimeTypes","category","options","flatgeobuf","shape","gis","reproject"],"sources":["../src/flatgeobuf-loader.ts"],"sourcesContent":["import type {Loader, LoaderOptions} from '@loaders.gl/loader-utils';\n\n// __VERSION__ is injected by babel-plugin-version-inline\n// @ts-ignore TS2304: Cannot find name '__VERSION__'.\nconst VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'latest';\n\nexport type FlatGeobufLoaderOptions = LoaderOptions & {\n flatgeobuf?: {\n shape?: 'geojson-table' | 'columnar-table' | 'binary';\n };\n gis?: {\n reproject?: boolean;\n _targetCrs?: string;\n };\n};\n\nexport const FlatGeobufLoader: Loader<any, any, FlatGeobufLoaderOptions> = {\n id: 'flatgeobuf',\n name: 'FlatGeobuf',\n module: 'flatgeobuf',\n version: VERSION,\n worker: true,\n extensions: ['fgb'],\n mimeTypes: ['application/octet-stream'],\n category: 'geometry',\n options: {\n flatgeobuf: {\n shape: 'geojson-table'\n },\n gis: {\n reproject: false\n }\n }\n};\n"],"mappings":"AAIA,MAAMA,OAAO,GAAG,OAAOC,WAAW,KAAK,WAAW,GAAGA,WAAW,GAAG,QAAQ;AAY3E,OAAO,MAAMC,gBAA2D,GAAG;EACzEC,EAAE,EAAE,YAAY;EAChBC,IAAI,EAAE,YAAY;EAClBC,MAAM,EAAE,YAAY;EACpBC,OAAO,EAAEN,OAAO;EAChBO,MAAM,EAAE,IAAI;EACZC,UAAU,EAAE,CAAC,KAAK,CAAC;EACnBC,SAAS,EAAE,CAAC,0BAA0B,CAAC;EACvCC,QAAQ,EAAE,UAAU;EACpBC,OAAO,EAAE;IACPC,UAAU,EAAE;MACVC,KAAK,EAAE;IACT,CAAC;IACDC,GAAG,EAAE;MACHC,SAAS,EAAE;IACb;EACF;AACF,CAAC"}
1
+ {"version":3,"file":"flatgeobuf-loader.js","names":["parseFlatGeobuf","parseFlatGeobufInBatches","VERSION","__VERSION__","FGB_MAGIC_NUMBER","FlatGeobufWorkerLoader","id","name","module","version","worker","extensions","mimeTypes","category","tests","Uint8Array","buffer","options","flatgeobuf","shape","gis","reproject","FlatGeobufLoader","parse","arrayBuffer","parseSync","parseInBatchesFromStream","binary"],"sources":["../src/flatgeobuf-loader.ts"],"sourcesContent":["// loaders.gl, MIT license\n// Copyright (c) vis.gl contributors\n\nimport type {Loader, LoaderWithParser, LoaderOptions} from '@loaders.gl/loader-utils';\nimport {parseFlatGeobuf, parseFlatGeobufInBatches} from './lib/parse-flatgeobuf';\n\n// __VERSION__ is injected by babel-plugin-version-inline\n// @ts-ignore TS2304: Cannot find name '__VERSION__'.\nconst VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'latest';\n\n// FGB\\3FGB\\1\nconst FGB_MAGIC_NUMBER = [0x66, 0x67, 0x62, 0x03, 0x66, 0x67, 0x62, 0x01];\n\nexport type FlatGeobufLoaderOptions = LoaderOptions & {\n flatgeobuf?: {\n shape?: 'geojson-table' | 'columnar-table' | 'binary';\n };\n gis?: {\n reproject?: boolean;\n _targetCrs?: string;\n };\n};\n\nexport const FlatGeobufWorkerLoader: Loader<any, any, FlatGeobufLoaderOptions> = {\n id: 'flatgeobuf',\n name: 'FlatGeobuf',\n module: 'flatgeobuf',\n version: VERSION,\n worker: true,\n extensions: ['fgb'],\n mimeTypes: ['application/octet-stream'],\n category: 'geometry',\n tests: [new Uint8Array(FGB_MAGIC_NUMBER).buffer],\n options: {\n flatgeobuf: {\n shape: 'geojson-table'\n },\n gis: {\n reproject: false\n }\n }\n};\n\nexport const FlatGeobufLoader: LoaderWithParser<any, any, FlatGeobufLoaderOptions> = {\n ...FlatGeobufWorkerLoader,\n parse: async (arrayBuffer, options) => parseFlatGeobuf(arrayBuffer, options),\n parseSync: parseFlatGeobuf,\n // @ts-expect-error this is a stream parser not an async iterator parser\n parseInBatchesFromStream: parseFlatGeobufInBatches,\n binary: true\n};\n"],"mappings":"SAIQA,eAAe,EAAEC,wBAAwB;AAIjD,MAAMC,OAAO,GAAG,OAAOC,WAAW,KAAK,WAAW,GAAGA,WAAW,GAAG,QAAQ;AAG3E,MAAMC,gBAAgB,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;AAYzE,OAAO,MAAMC,sBAAiE,GAAG;EAC/EC,EAAE,EAAE,YAAY;EAChBC,IAAI,EAAE,YAAY;EAClBC,MAAM,EAAE,YAAY;EACpBC,OAAO,EAAEP,OAAO;EAChBQ,MAAM,EAAE,IAAI;EACZC,UAAU,EAAE,CAAC,KAAK,CAAC;EACnBC,SAAS,EAAE,CAAC,0BAA0B,CAAC;EACvCC,QAAQ,EAAE,UAAU;EACpBC,KAAK,EAAE,CAAC,IAAIC,UAAU,CAACX,gBAAgB,CAAC,CAACY,MAAM,CAAC;EAChDC,OAAO,EAAE;IACPC,UAAU,EAAE;MACVC,KAAK,EAAE;IACT,CAAC;IACDC,GAAG,EAAE;MACHC,SAAS,EAAE;IACb;EACF;AACF,CAAC;AAED,OAAO,MAAMC,gBAAqE,GAAG;EACnF,GAAGjB,sBAAsB;EACzBkB,KAAK,EAAE,MAAAA,CAAOC,WAAW,EAAEP,OAAO,KAAKjB,eAAe,CAACwB,WAAW,EAAEP,OAAO,CAAC;EAC5EQ,SAAS,EAAEzB,eAAe;EAE1B0B,wBAAwB,EAAEzB,wBAAwB;EAClD0B,MAAM,EAAE;AACV,CAAC"}
package/dist/index.cjs CHANGED
@@ -30,32 +30,11 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
30
30
  // src/index.ts
31
31
  var src_exports = {};
32
32
  __export(src_exports, {
33
- FlatGeobufLoader: () => FlatGeobufLoader2,
34
- FlatGeobufWorkerLoader: () => FlatGeobufLoader
33
+ FlatGeobufLoader: () => FlatGeobufLoader,
34
+ FlatGeobufWorkerLoader: () => FlatGeobufWorkerLoader
35
35
  });
36
36
  module.exports = __toCommonJS(src_exports);
37
37
 
38
- // src/flatgeobuf-loader.ts
39
- var VERSION = typeof __VERSION__ !== "undefined" ? __VERSION__ : "latest";
40
- var FlatGeobufLoader = {
41
- id: "flatgeobuf",
42
- name: "FlatGeobuf",
43
- module: "flatgeobuf",
44
- version: VERSION,
45
- worker: true,
46
- extensions: ["fgb"],
47
- mimeTypes: ["application/octet-stream"],
48
- category: "geometry",
49
- options: {
50
- flatgeobuf: {
51
- shape: "geojson-table"
52
- },
53
- gis: {
54
- reproject: false
55
- }
56
- }
57
- };
58
-
59
38
  // src/lib/parse-flatgeobuf.ts
60
39
  var import_proj4 = require("@math.gl/proj4");
61
40
  var import_gis = require("@loaders.gl/gis");
@@ -171,6 +150,76 @@ function blitArrays(xy, z) {
171
150
  return { value: xyz, size: 3 };
172
151
  }
173
152
 
153
+ // src/lib/get-schema-from-fgb-header.ts
154
+ function getSchemaFromFGBHeader(fgbHeader) {
155
+ var _a, _b;
156
+ const metadata = {
157
+ title: fgbHeader.title || "",
158
+ description: fgbHeader.description || "",
159
+ crs: JSON.stringify(fgbHeader.crs) || "",
160
+ metadata: fgbHeader.metadata || "",
161
+ geometryType: String(fgbHeader.geometryType),
162
+ indexNodeSize: String(fgbHeader.indexNodeSize),
163
+ featureCount: String(fgbHeader.featuresCount),
164
+ bounds: ((_a = fgbHeader.envelope) == null ? void 0 : _a.join(",")) || ""
165
+ };
166
+ const fields = ((_b = fgbHeader.columns) == null ? void 0 : _b.map((column) => getFieldFromFGBColumn(column))) || [];
167
+ return { metadata, fields };
168
+ }
169
+ function getFieldFromFGBColumn(fgbColumn) {
170
+ const metadata = {
171
+ title: fgbColumn.title || "",
172
+ description: fgbColumn.description || "",
173
+ width: String(fgbColumn.width),
174
+ precision: String(fgbColumn.precision),
175
+ scale: String(fgbColumn.scale),
176
+ unique: String(fgbColumn.unique),
177
+ primary_key: String(fgbColumn.primary_key)
178
+ };
179
+ return {
180
+ name: fgbColumn.name,
181
+ type: getTypeFromFGBType(fgbColumn.type),
182
+ nullable: fgbColumn.nullable,
183
+ metadata
184
+ };
185
+ }
186
+ function getTypeFromFGBType(fgbType) {
187
+ switch (fgbType) {
188
+ case 0 /* Byte */:
189
+ return "int8";
190
+ case 1 /* UByte */:
191
+ return "uint8";
192
+ case 2 /* Bool */:
193
+ return "bool";
194
+ case 3 /* Short */:
195
+ return "int16";
196
+ case 4 /* UShort */:
197
+ return "uint16";
198
+ case 5 /* Int */:
199
+ return "int32";
200
+ case 6 /* UInt */:
201
+ return "uint32";
202
+ case 7 /* Long */:
203
+ return "int64";
204
+ case 8 /* ULong */:
205
+ return "uint64";
206
+ case 9 /* Float */:
207
+ return "float32";
208
+ case 10 /* Double */:
209
+ return "float64";
210
+ case 11 /* String */:
211
+ return "utf8";
212
+ case 12 /* Json */:
213
+ return "null";
214
+ case 13 /* DateTime */:
215
+ return "date-millisecond";
216
+ case 14 /* Binary */:
217
+ return "binary";
218
+ default:
219
+ return "null";
220
+ }
221
+ }
222
+
174
223
  // src/lib/parse-flatgeobuf.ts
175
224
  var geojson = __toESM(require("flatgeobuf/lib/mjs/geojson.js"), 1);
176
225
  var generic = __toESM(require("flatgeobuf/lib/mjs/generic.js"), 1);
@@ -189,13 +238,7 @@ function parseFlatGeobuf(arrayBuffer, options) {
189
238
  const shape = (_a = options == null ? void 0 : options.flatgeobuf) == null ? void 0 : _a.shape;
190
239
  switch (shape) {
191
240
  case "geojson-table": {
192
- const features = parseFlatGeobufToGeoJSON(arrayBuffer, options);
193
- const table = {
194
- shape: "geojson-table",
195
- type: "FeatureCollection",
196
- features
197
- };
198
- return table;
241
+ return parseFlatGeobufToGeoJSONTable(arrayBuffer, options);
199
242
  }
200
243
  case "columnar-table":
201
244
  const binary = parseFlatGeobufToBinary(arrayBuffer, options);
@@ -210,17 +253,19 @@ function parseFlatGeobufToBinary(arrayBuffer, options = {}) {
210
253
  const array = new Uint8Array(arrayBuffer);
211
254
  return deserializeGeneric(array, fgbToBinaryGeometry);
212
255
  }
213
- function parseFlatGeobufToGeoJSON(arrayBuffer, options = {}) {
256
+ function parseFlatGeobufToGeoJSONTable(arrayBuffer, options = {}) {
214
257
  if (arrayBuffer.byteLength === 0) {
215
- return [];
258
+ return { shape: "geojson-table", type: "FeatureCollection", features: [] };
216
259
  }
217
260
  const { reproject = false, _targetCrs = "WGS84" } = options && options.gis || {};
218
261
  const arr = new Uint8Array(arrayBuffer);
219
- let headerMeta;
220
- const { features } = deserializeGeoJson(arr, void 0, (header) => {
221
- headerMeta = header;
262
+ let fgbHeader;
263
+ let schema;
264
+ let { features } = deserializeGeoJson(arr, void 0, (headerMeta) => {
265
+ fgbHeader = headerMeta;
266
+ schema = getSchemaFromFGBHeader(fgbHeader);
222
267
  });
223
- const crs = headerMeta && headerMeta.crs;
268
+ const crs = fgbHeader && fgbHeader.crs;
224
269
  let projection;
225
270
  if (reproject && crs) {
226
271
  try {
@@ -229,9 +274,9 @@ function parseFlatGeobufToGeoJSON(arrayBuffer, options = {}) {
229
274
  }
230
275
  }
231
276
  if (projection) {
232
- return (0, import_gis.transformGeoJsonCoords)(features, (coords) => projection.project(coords));
277
+ features = (0, import_gis.transformGeoJsonCoords)(features, (coords) => projection.project(coords));
233
278
  }
234
- return features;
279
+ return { shape: "geojson-table", schema, type: "FeatureCollection", features };
235
280
  }
236
281
  function parseFlatGeobufInBatches(stream, options) {
237
282
  var _a;
@@ -251,15 +296,15 @@ function parseFlatGeobufInBatchesToBinary(stream, options) {
251
296
  }
252
297
  async function* parseFlatGeobufInBatchesToGeoJSON(stream, options) {
253
298
  const { reproject = false, _targetCrs = "WGS84" } = options && options.gis || {};
254
- let headerMeta;
255
- const iterator = deserializeGeoJson(stream, void 0, (header) => {
256
- headerMeta = header;
299
+ let fgbHeader;
300
+ const iterator = deserializeGeoJson(stream, void 0, (headerMeta) => {
301
+ fgbHeader = headerMeta;
257
302
  });
258
303
  let projection;
259
304
  let firstRecord = true;
260
305
  for await (const feature of iterator) {
261
306
  if (firstRecord) {
262
- const crs = headerMeta && headerMeta.crs;
307
+ const crs = fgbHeader && fgbHeader.crs;
263
308
  if (reproject && crs) {
264
309
  projection = new import_proj4.Proj4Projection({ from: crs.wkt, to: _targetCrs });
265
310
  }
@@ -273,9 +318,30 @@ async function* parseFlatGeobufInBatchesToGeoJSON(stream, options) {
273
318
  }
274
319
  }
275
320
 
276
- // src/index.ts
277
- var FlatGeobufLoader2 = {
278
- ...FlatGeobufLoader,
321
+ // src/flatgeobuf-loader.ts
322
+ var VERSION = typeof __VERSION__ !== "undefined" ? __VERSION__ : "latest";
323
+ var FGB_MAGIC_NUMBER = [102, 103, 98, 3, 102, 103, 98, 1];
324
+ var FlatGeobufWorkerLoader = {
325
+ id: "flatgeobuf",
326
+ name: "FlatGeobuf",
327
+ module: "flatgeobuf",
328
+ version: VERSION,
329
+ worker: true,
330
+ extensions: ["fgb"],
331
+ mimeTypes: ["application/octet-stream"],
332
+ category: "geometry",
333
+ tests: [new Uint8Array(FGB_MAGIC_NUMBER).buffer],
334
+ options: {
335
+ flatgeobuf: {
336
+ shape: "geojson-table"
337
+ },
338
+ gis: {
339
+ reproject: false
340
+ }
341
+ }
342
+ };
343
+ var FlatGeobufLoader = {
344
+ ...FlatGeobufWorkerLoader,
279
345
  parse: async (arrayBuffer, options) => parseFlatGeobuf(arrayBuffer, options),
280
346
  parseSync: parseFlatGeobuf,
281
347
  // @ts-expect-error this is a stream parser not an async iterator parser
package/dist/index.d.ts CHANGED
@@ -1,6 +1,3 @@
1
- import type { LoaderWithParser } from '@loaders.gl/loader-utils';
2
- import type { FlatGeobufLoaderOptions } from './flatgeobuf-loader';
3
- import { FlatGeobufLoader as FlatGeobufWorkerLoader } from './flatgeobuf-loader';
4
- export { FlatGeobufWorkerLoader };
5
- export declare const FlatGeobufLoader: LoaderWithParser<any, any, FlatGeobufLoaderOptions>;
1
+ export type { FlatGeobufLoaderOptions } from './flatgeobuf-loader';
2
+ export { FlatGeobufLoader, FlatGeobufWorkerLoader } from './flatgeobuf-loader';
6
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,gBAAgB,EAAC,MAAM,0BAA0B,CAAC;AAC/D,OAAO,KAAK,EAAC,uBAAuB,EAAC,MAAM,qBAAqB,CAAC;AACjE,OAAO,EAAC,gBAAgB,IAAI,sBAAsB,EAAC,MAAM,qBAAqB,CAAC;AAG/E,OAAO,EAAC,sBAAsB,EAAC,CAAC;AAEhC,eAAO,MAAM,gBAAgB,EAAE,gBAAgB,CAAC,GAAG,EAAE,GAAG,EAAE,uBAAuB,CAOhF,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,YAAY,EAAC,uBAAuB,EAAC,MAAM,qBAAqB,CAAC;AACjE,OAAO,EAAC,gBAAgB,EAAE,sBAAsB,EAAC,MAAM,qBAAqB,CAAC"}
package/dist/index.js CHANGED
@@ -1,11 +1,2 @@
1
- import { FlatGeobufLoader as FlatGeobufWorkerLoader } from "./flatgeobuf-loader.js";
2
- import { parseFlatGeobuf, parseFlatGeobufInBatches } from "./lib/parse-flatgeobuf.js";
3
- export { FlatGeobufWorkerLoader };
4
- export const FlatGeobufLoader = {
5
- ...FlatGeobufWorkerLoader,
6
- parse: async (arrayBuffer, options) => parseFlatGeobuf(arrayBuffer, options),
7
- parseSync: parseFlatGeobuf,
8
- parseInBatchesFromStream: parseFlatGeobufInBatches,
9
- binary: true
10
- };
1
+ export { FlatGeobufLoader, FlatGeobufWorkerLoader } from "./flatgeobuf-loader.js";
11
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["FlatGeobufLoader","FlatGeobufWorkerLoader","parseFlatGeobuf","parseFlatGeobufInBatches","parse","arrayBuffer","options","parseSync","parseInBatchesFromStream","binary"],"sources":["../src/index.ts"],"sourcesContent":["import type {LoaderWithParser} from '@loaders.gl/loader-utils';\nimport type {FlatGeobufLoaderOptions} from './flatgeobuf-loader';\nimport {FlatGeobufLoader as FlatGeobufWorkerLoader} from './flatgeobuf-loader';\nimport {parseFlatGeobuf, parseFlatGeobufInBatches} from './lib/parse-flatgeobuf';\n\nexport {FlatGeobufWorkerLoader};\n\nexport const FlatGeobufLoader: LoaderWithParser<any, any, FlatGeobufLoaderOptions> = {\n ...FlatGeobufWorkerLoader,\n parse: async (arrayBuffer, options) => parseFlatGeobuf(arrayBuffer, options),\n parseSync: parseFlatGeobuf,\n // @ts-expect-error this is a stream parser not an async iterator parser\n parseInBatchesFromStream: parseFlatGeobufInBatches,\n binary: true\n};\n"],"mappings":"SAEQA,gBAAgB,IAAIC,sBAAsB;AAAA,SAC1CC,eAAe,EAAEC,wBAAwB;AAEjD,SAAQF,sBAAsB;AAE9B,OAAO,MAAMD,gBAAqE,GAAG;EACnF,GAAGC,sBAAsB;EACzBG,KAAK,EAAE,MAAAA,CAAOC,WAAW,EAAEC,OAAO,KAAKJ,eAAe,CAACG,WAAW,EAAEC,OAAO,CAAC;EAC5EC,SAAS,EAAEL,eAAe;EAE1BM,wBAAwB,EAAEL,wBAAwB;EAClDM,MAAM,EAAE;AACV,CAAC"}
1
+ {"version":3,"file":"index.js","names":["FlatGeobufLoader","FlatGeobufWorkerLoader"],"sources":["../src/index.ts"],"sourcesContent":["// loaders.gl, MIT license\n// Copyright (c) vis.gl contributors\n\nexport type {FlatGeobufLoaderOptions} from './flatgeobuf-loader';\nexport {FlatGeobufLoader, FlatGeobufWorkerLoader} from './flatgeobuf-loader';\n"],"mappings":"SAIQA,gBAAgB,EAAEC,sBAAsB"}
@@ -0,0 +1,16 @@
1
+ import type { Schema } from '@loaders.gl/schema';
2
+ import * as fgb from 'flatgeobuf';
3
+ /**
4
+ * @param fgbHeader
5
+ * geometryType: GeometryType;
6
+ * columns: ColumnMeta[] | null;
7
+ * envelope: Float64Array | null;
8
+ * featuresCount: number;
9
+ * indexNodeSize: number;
10
+ * crs: CrsMeta | null;
11
+ * title: string | null;
12
+ * description: string | null;
13
+ * metadata: string | null;
14
+ */
15
+ export declare function getSchemaFromFGBHeader(fgbHeader: fgb.HeaderMeta): Schema;
16
+ //# sourceMappingURL=get-schema-from-fgb-header.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-schema-from-fgb-header.d.ts","sourceRoot":"","sources":["../../src/lib/get-schema-from-fgb-header.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAC,MAAM,EAAkB,MAAM,oBAAoB,CAAC;AAChE,OAAO,KAAK,GAAG,MAAM,YAAY,CAAC;AAElC;;;;;;;;;;;GAWG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,GAAG,CAAC,UAAU,GAAG,MAAM,CAcxE"}
@@ -0,0 +1,90 @@
1
+ export function getSchemaFromFGBHeader(fgbHeader) {
2
+ var _fgbHeader$envelope, _fgbHeader$columns;
3
+ const metadata = {
4
+ title: fgbHeader.title || '',
5
+ description: fgbHeader.description || '',
6
+ crs: JSON.stringify(fgbHeader.crs) || '',
7
+ metadata: fgbHeader.metadata || '',
8
+ geometryType: String(fgbHeader.geometryType),
9
+ indexNodeSize: String(fgbHeader.indexNodeSize),
10
+ featureCount: String(fgbHeader.featuresCount),
11
+ bounds: ((_fgbHeader$envelope = fgbHeader.envelope) === null || _fgbHeader$envelope === void 0 ? void 0 : _fgbHeader$envelope.join(',')) || ''
12
+ };
13
+ const fields = ((_fgbHeader$columns = fgbHeader.columns) === null || _fgbHeader$columns === void 0 ? void 0 : _fgbHeader$columns.map(column => getFieldFromFGBColumn(column))) || [];
14
+ return {
15
+ metadata,
16
+ fields
17
+ };
18
+ }
19
+ function getFieldFromFGBColumn(fgbColumn) {
20
+ const metadata = {
21
+ title: fgbColumn.title || '',
22
+ description: fgbColumn.description || '',
23
+ width: String(fgbColumn.width),
24
+ precision: String(fgbColumn.precision),
25
+ scale: String(fgbColumn.scale),
26
+ unique: String(fgbColumn.unique),
27
+ primary_key: String(fgbColumn.primary_key)
28
+ };
29
+ return {
30
+ name: fgbColumn.name,
31
+ type: getTypeFromFGBType(fgbColumn.type),
32
+ nullable: fgbColumn.nullable,
33
+ metadata
34
+ };
35
+ }
36
+ var fgbColumnType = function (fgbColumnType) {
37
+ fgbColumnType[fgbColumnType["Byte"] = 0] = "Byte";
38
+ fgbColumnType[fgbColumnType["UByte"] = 1] = "UByte";
39
+ fgbColumnType[fgbColumnType["Bool"] = 2] = "Bool";
40
+ fgbColumnType[fgbColumnType["Short"] = 3] = "Short";
41
+ fgbColumnType[fgbColumnType["UShort"] = 4] = "UShort";
42
+ fgbColumnType[fgbColumnType["Int"] = 5] = "Int";
43
+ fgbColumnType[fgbColumnType["UInt"] = 6] = "UInt";
44
+ fgbColumnType[fgbColumnType["Long"] = 7] = "Long";
45
+ fgbColumnType[fgbColumnType["ULong"] = 8] = "ULong";
46
+ fgbColumnType[fgbColumnType["Float"] = 9] = "Float";
47
+ fgbColumnType[fgbColumnType["Double"] = 10] = "Double";
48
+ fgbColumnType[fgbColumnType["String"] = 11] = "String";
49
+ fgbColumnType[fgbColumnType["Json"] = 12] = "Json";
50
+ fgbColumnType[fgbColumnType["DateTime"] = 13] = "DateTime";
51
+ fgbColumnType[fgbColumnType["Binary"] = 14] = "Binary";
52
+ return fgbColumnType;
53
+ }(fgbColumnType || {});
54
+ function getTypeFromFGBType(fgbType) {
55
+ switch (fgbType) {
56
+ case fgbColumnType.Byte:
57
+ return 'int8';
58
+ case fgbColumnType.UByte:
59
+ return 'uint8';
60
+ case fgbColumnType.Bool:
61
+ return 'bool';
62
+ case fgbColumnType.Short:
63
+ return 'int16';
64
+ case fgbColumnType.UShort:
65
+ return 'uint16';
66
+ case fgbColumnType.Int:
67
+ return 'int32';
68
+ case fgbColumnType.UInt:
69
+ return 'uint32';
70
+ case fgbColumnType.Long:
71
+ return 'int64';
72
+ case fgbColumnType.ULong:
73
+ return 'uint64';
74
+ case fgbColumnType.Float:
75
+ return 'float32';
76
+ case fgbColumnType.Double:
77
+ return 'float64';
78
+ case fgbColumnType.String:
79
+ return 'utf8';
80
+ case fgbColumnType.Json:
81
+ return 'null';
82
+ case fgbColumnType.DateTime:
83
+ return 'date-millisecond';
84
+ case fgbColumnType.Binary:
85
+ return 'binary';
86
+ default:
87
+ return 'null';
88
+ }
89
+ }
90
+ //# sourceMappingURL=get-schema-from-fgb-header.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-schema-from-fgb-header.js","names":["getSchemaFromFGBHeader","fgbHeader","_fgbHeader$envelope","_fgbHeader$columns","metadata","title","description","crs","JSON","stringify","geometryType","String","indexNodeSize","featureCount","featuresCount","bounds","envelope","join","fields","columns","map","column","getFieldFromFGBColumn","fgbColumn","width","precision","scale","unique","primary_key","name","type","getTypeFromFGBType","nullable","fgbColumnType","fgbType","Byte","UByte","Bool","Short","UShort","Int","UInt","Long","ULong","Float","Double","Json","DateTime","Binary"],"sources":["../../src/lib/get-schema-from-fgb-header.ts"],"sourcesContent":["// loaders.gl, MIT license\n// Copyright (c) vis.gl contributors\n\nimport type {Schema, Field, DataType} from '@loaders.gl/schema';\nimport * as fgb from 'flatgeobuf';\n\n/**\n * @param fgbHeader\n * geometryType: GeometryType;\n * columns: ColumnMeta[] | null;\n * envelope: Float64Array | null;\n * featuresCount: number;\n * indexNodeSize: number;\n * crs: CrsMeta | null;\n * title: string | null;\n * description: string | null;\n * metadata: string | null;\n */\nexport function getSchemaFromFGBHeader(fgbHeader: fgb.HeaderMeta): Schema {\n const metadata: Record<string, string> = {\n title: fgbHeader.title || '',\n description: fgbHeader.description || '',\n crs: JSON.stringify(fgbHeader.crs) || '',\n metadata: fgbHeader.metadata || '',\n geometryType: String(fgbHeader.geometryType),\n indexNodeSize: String(fgbHeader.indexNodeSize),\n featureCount: String(fgbHeader.featuresCount),\n bounds: fgbHeader.envelope?.join(',') || ''\n };\n\n const fields: Field[] = fgbHeader.columns?.map((column) => getFieldFromFGBColumn(column)) || [];\n return {metadata, fields};\n}\n\n/**\n * name: string;\n * type: ColumnType;\n * title: string | null;\n * description: string | null;\n * width: number;\n * precision: number;\n * scale: number;\n * nullable: boolean;\n * unique: boolean;\n * primary_key: boolean;\n */\nfunction getFieldFromFGBColumn(fgbColumn: fgb.ColumnMeta): Field {\n const metadata: Record<string, string> = {\n title: fgbColumn.title || '',\n description: fgbColumn.description || '',\n width: String(fgbColumn.width),\n precision: String(fgbColumn.precision),\n scale: String(fgbColumn.scale),\n unique: String(fgbColumn.unique),\n primary_key: String(fgbColumn.primary_key)\n };\n\n return {\n name: fgbColumn.name,\n type: getTypeFromFGBType(fgbColumn.type as unknown as fgbColumnType),\n nullable: fgbColumn.nullable,\n metadata\n };\n}\n\n/** Note: fgb.ColumType does not appear to be exported */\nenum fgbColumnType {\n Byte = 0,\n UByte = 1,\n Bool = 2,\n Short = 3,\n UShort = 4,\n Int = 5,\n UInt = 6,\n Long = 7,\n ULong = 8,\n Float = 9,\n Double = 10,\n String = 11,\n Json = 12,\n DateTime = 13,\n Binary = 14\n}\n\n/** Convert FGB types to arrow like types */\nfunction getTypeFromFGBType(fgbType: fgbColumnType /* fgb.ColumnMeta['type'] */): DataType {\n switch (fgbType) {\n case fgbColumnType.Byte:\n return 'int8';\n case fgbColumnType.UByte:\n return 'uint8';\n case fgbColumnType.Bool:\n return 'bool';\n case fgbColumnType.Short:\n return 'int16';\n case fgbColumnType.UShort:\n return 'uint16';\n case fgbColumnType.Int:\n return 'int32';\n case fgbColumnType.UInt:\n return 'uint32';\n case fgbColumnType.Long:\n return 'int64';\n case fgbColumnType.ULong:\n return 'uint64';\n case fgbColumnType.Float:\n return 'float32';\n case fgbColumnType.Double:\n return 'float64';\n case fgbColumnType.String:\n return 'utf8';\n case fgbColumnType.Json:\n return 'null';\n case fgbColumnType.DateTime:\n return 'date-millisecond';\n case fgbColumnType.Binary:\n return 'binary';\n default:\n return 'null';\n }\n}\n"],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import type { FlatGeobufLoaderOptions } from '../flatgeobuf-loader';
2
2
  import type { Table } from '@loaders.gl/schema';
3
+ import * as fgb from 'flatgeobuf';
3
4
  export declare function parseFlatGeobuf(arrayBuffer: ArrayBuffer, options?: FlatGeobufLoaderOptions): Table;
4
- export declare function parseFlatGeobufInBatches(stream: any, options: FlatGeobufLoaderOptions): any[] | AsyncGenerator<import("flatgeobuf").IFeature, any, unknown> | AsyncGenerator<any, void, unknown>;
5
+ export declare function parseFlatGeobufInBatches(stream: any, options: FlatGeobufLoaderOptions): any[] | AsyncGenerator<fgb.IFeature, any, unknown> | AsyncGenerator<any, void, unknown>;
5
6
  //# sourceMappingURL=parse-flatgeobuf.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"parse-flatgeobuf.d.ts","sourceRoot":"","sources":["../../src/lib/parse-flatgeobuf.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAC,uBAAuB,EAAC,MAAM,sBAAsB,CAAC;AAClE,OAAO,KAAK,EAAwB,KAAK,EAAC,MAAM,oBAAoB,CAAC;AAkCrE,wBAAgB,eAAe,CAC7B,WAAW,EAAE,WAAW,EACxB,OAAO,CAAC,EAAE,uBAAuB,GAChC,KAAK,CA0BP;AAsDD,wBAAgB,wBAAwB,CAAC,MAAM,KAAA,EAAE,OAAO,EAAE,uBAAuB,4GAUhF"}
1
+ {"version":3,"file":"parse-flatgeobuf.d.ts","sourceRoot":"","sources":["../../src/lib/parse-flatgeobuf.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAC,uBAAuB,EAAC,MAAM,sBAAsB,CAAC;AAClE,OAAO,KAAK,EAAe,KAAK,EAAS,MAAM,oBAAoB,CAAC;AAKpE,OAAO,KAAK,GAAG,MAAM,YAAY,CAAC;AAgClC,wBAAgB,eAAe,CAC7B,WAAW,EAAE,WAAW,EACxB,OAAO,CAAC,EAAE,uBAAuB,GAChC,KAAK,CAoBP;AAyDD,wBAAgB,wBAAwB,CAAC,MAAM,KAAA,EAAE,OAAO,EAAE,uBAAuB,2FAUhF"}
@@ -1,6 +1,7 @@
1
1
  import { Proj4Projection } from '@math.gl/proj4';
2
2
  import { transformGeoJsonCoords } from '@loaders.gl/gis';
3
3
  import { fgbToBinaryGeometry } from "./binary-geometries.js";
4
+ import { getSchemaFromFGBHeader } from "./get-schema-from-fgb-header.js";
4
5
  import * as geojson from 'flatgeobuf/lib/mjs/geojson.js';
5
6
  import * as generic from 'flatgeobuf/lib/mjs/generic.js';
6
7
  import { parseProperties as parsePropertiesBinary } from 'flatgeobuf/lib/mjs/generic/feature';
@@ -19,13 +20,7 @@ export function parseFlatGeobuf(arrayBuffer, options) {
19
20
  switch (shape) {
20
21
  case 'geojson-table':
21
22
  {
22
- const features = parseFlatGeobufToGeoJSON(arrayBuffer, options);
23
- const table = {
24
- shape: 'geojson-table',
25
- type: 'FeatureCollection',
26
- features
27
- };
28
- return table;
23
+ return parseFlatGeobufToGeoJSONTable(arrayBuffer, options);
29
24
  }
30
25
  case 'columnar-table':
31
26
  const binary = parseFlatGeobufToBinary(arrayBuffer, options);
@@ -44,23 +39,29 @@ function parseFlatGeobufToBinary(arrayBuffer) {
44
39
  const array = new Uint8Array(arrayBuffer);
45
40
  return deserializeGeneric(array, fgbToBinaryGeometry);
46
41
  }
47
- function parseFlatGeobufToGeoJSON(arrayBuffer) {
42
+ function parseFlatGeobufToGeoJSONTable(arrayBuffer) {
48
43
  let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
49
44
  if (arrayBuffer.byteLength === 0) {
50
- return [];
45
+ return {
46
+ shape: 'geojson-table',
47
+ type: 'FeatureCollection',
48
+ features: []
49
+ };
51
50
  }
52
51
  const {
53
52
  reproject = false,
54
53
  _targetCrs = 'WGS84'
55
54
  } = options && options.gis || {};
56
55
  const arr = new Uint8Array(arrayBuffer);
57
- let headerMeta;
58
- const {
56
+ let fgbHeader;
57
+ let schema;
58
+ let {
59
59
  features
60
- } = deserializeGeoJson(arr, undefined, header => {
61
- headerMeta = header;
60
+ } = deserializeGeoJson(arr, undefined, headerMeta => {
61
+ fgbHeader = headerMeta;
62
+ schema = getSchemaFromFGBHeader(fgbHeader);
62
63
  });
63
- const crs = headerMeta && headerMeta.crs;
64
+ const crs = fgbHeader && fgbHeader.crs;
64
65
  let projection;
65
66
  if (reproject && crs) {
66
67
  try {
@@ -71,9 +72,14 @@ function parseFlatGeobufToGeoJSON(arrayBuffer) {
71
72
  } catch (e) {}
72
73
  }
73
74
  if (projection) {
74
- return transformGeoJsonCoords(features, coords => projection.project(coords));
75
+ features = transformGeoJsonCoords(features, coords => projection.project(coords));
75
76
  }
76
- return features;
77
+ return {
78
+ shape: 'geojson-table',
79
+ schema,
80
+ type: 'FeatureCollection',
81
+ features
82
+ };
77
83
  }
78
84
  export function parseFlatGeobufInBatches(stream, options) {
79
85
  var _options$flatgeobuf2;
@@ -96,15 +102,15 @@ async function* parseFlatGeobufInBatchesToGeoJSON(stream, options) {
96
102
  reproject = false,
97
103
  _targetCrs = 'WGS84'
98
104
  } = options && options.gis || {};
99
- let headerMeta;
100
- const iterator = deserializeGeoJson(stream, undefined, header => {
101
- headerMeta = header;
105
+ let fgbHeader;
106
+ const iterator = deserializeGeoJson(stream, undefined, headerMeta => {
107
+ fgbHeader = headerMeta;
102
108
  });
103
109
  let projection;
104
110
  let firstRecord = true;
105
111
  for await (const feature of iterator) {
106
112
  if (firstRecord) {
107
- const crs = headerMeta && headerMeta.crs;
113
+ const crs = fgbHeader && fgbHeader.crs;
108
114
  if (reproject && crs) {
109
115
  projection = new Proj4Projection({
110
116
  from: crs.wkt,
@@ -1 +1 @@
1
- {"version":3,"file":"parse-flatgeobuf.js","names":["Proj4Projection","transformGeoJsonCoords","fgbToBinaryGeometry","geojson","generic","parseProperties","parsePropertiesBinary","deserializeGeoJson","deserialize","deserializeGeneric","binaryFromFeature","feature","header","geometry","geometryType","type","parsedGeometry","properties","columns","parseFlatGeobuf","arrayBuffer","options","_options$flatgeobuf","shape","flatgeobuf","features","parseFlatGeobufToGeoJSON","table","binary","parseFlatGeobufToBinary","data","Error","arguments","length","undefined","array","Uint8Array","byteLength","reproject","_targetCrs","gis","arr","headerMeta","crs","projection","from","wkt","to","e","coords","project","parseFlatGeobufInBatches","stream","_options$flatgeobuf2","parseFlatGeobufInBatchesToBinary","parseFlatGeobufInBatchesToGeoJSON","iterator","firstRecord"],"sources":["../../src/lib/parse-flatgeobuf.ts"],"sourcesContent":["// loaders.gl, MIT license\n// Copyright (c) vis.gl contributors\n\nimport {Proj4Projection} from '@math.gl/proj4';\nimport {transformGeoJsonCoords} from '@loaders.gl/gis';\n\nimport type {FlatGeobufLoaderOptions} from '../flatgeobuf-loader';\nimport type {GeoJSONTable, Feature, Table} from '@loaders.gl/schema';\nimport {fgbToBinaryGeometry} from './binary-geometries';\n\nimport {Feature as FBGFeature, HeaderMeta as FGBHeader} from 'flatgeobuf';\nimport * as geojson from 'flatgeobuf/lib/mjs/geojson.js';\nimport * as generic from 'flatgeobuf/lib/mjs/generic.js';\nimport {parseProperties as parsePropertiesBinary} from 'flatgeobuf/lib/mjs/generic/feature';\nconst deserializeGeoJson = geojson.deserialize;\nconst deserializeGeneric = generic.deserialize;\n// const parsePropertiesBinary = FlatgeobufFeature.parseProperties;\n\n// TODO: reproject binary features\nfunction binaryFromFeature(feature: FBGFeature, header: FGBHeader) {\n const geometry = feature.geometry();\n\n // FlatGeobuf files can only hold a single geometry type per file, otherwise\n // GeometryType is GeometryCollection\n // I believe geometry.type() is null (0) except when the geometry type isn't\n // known in the header?\n const geometryType = header.geometryType || geometry?.type();\n const parsedGeometry = fgbToBinaryGeometry(geometry, geometryType!);\n // @ts-expect-error this looks wrong\n parsedGeometry.properties = parsePropertiesBinary(feature, header.columns);\n\n // TODO: wrap binary data either in points, lines, or polygons key\n return parsedGeometry;\n}\n\n/*\n * Parse FlatGeobuf arrayBuffer and return GeoJSON.\n *\n * @param arrayBuffer A FlatGeobuf arrayBuffer\n * @return A GeoJSON geometry object\n */\nexport function parseFlatGeobuf(\n arrayBuffer: ArrayBuffer,\n options?: FlatGeobufLoaderOptions\n): Table {\n const shape = options?.flatgeobuf?.shape;\n\n switch (shape) {\n case 'geojson-table': {\n const features = parseFlatGeobufToGeoJSON(arrayBuffer, options);\n const table: GeoJSONTable = {\n shape: 'geojson-table',\n type: 'FeatureCollection',\n features\n };\n return table;\n }\n\n case 'columnar-table': // binary + some JS arrays\n const binary = parseFlatGeobufToBinary(arrayBuffer, options);\n // @ts-expect-error\n return {shape: 'columnar-table', data: binary};\n\n case 'binary':\n // @ts-expect-error\n return parseFlatGeobufToBinary(arrayBuffer, options);\n\n default:\n throw new Error(shape);\n }\n}\n\nfunction parseFlatGeobufToBinary(arrayBuffer: ArrayBuffer, options: FlatGeobufLoaderOptions = {}) {\n // TODO: reproject binary features\n // const {reproject = false, _targetCrs = 'WGS84'} = (options && options.gis) || {};\n\n const array = new Uint8Array(arrayBuffer);\n // @ts-expect-error\n return deserializeGeneric(array, fgbToBinaryGeometry);\n}\n\nfunction parseFlatGeobufToGeoJSON(\n arrayBuffer: ArrayBuffer,\n options: FlatGeobufLoaderOptions = {}\n): Feature[] {\n if (arrayBuffer.byteLength === 0) {\n return [];\n }\n\n const {reproject = false, _targetCrs = 'WGS84'} = (options && options.gis) || {};\n\n const arr = new Uint8Array(arrayBuffer);\n\n let headerMeta;\n // @ts-expect-error this looks wrong\n const {features} = deserializeGeoJson(arr, undefined, (header) => {\n headerMeta = header;\n });\n\n const crs = headerMeta && headerMeta.crs;\n let projection;\n if (reproject && crs) {\n // Constructing the projection may fail for some invalid WKT strings\n try {\n projection = new Proj4Projection({from: crs.wkt, to: _targetCrs});\n } catch (e) {\n // no op\n }\n }\n\n if (projection) {\n return transformGeoJsonCoords(features, (coords) => projection.project(coords));\n }\n\n return features;\n}\n\n/*\n * Parse FlatGeobuf arrayBuffer and return GeoJSON.\n *\n * @param {ReadableStream} _ A FlatGeobuf arrayBuffer\n * @return A GeoJSON geometry object iterator\n */\n// eslint-disable-next-line complexity\nexport function parseFlatGeobufInBatches(stream, options: FlatGeobufLoaderOptions) {\n const shape = options.flatgeobuf?.shape;\n switch (shape) {\n case 'binary':\n return parseFlatGeobufInBatchesToBinary(stream, options);\n case 'geojson-table':\n return parseFlatGeobufInBatchesToGeoJSON(stream, options);\n default:\n throw new Error(shape);\n }\n}\n\nfunction parseFlatGeobufInBatchesToBinary(stream, options: FlatGeobufLoaderOptions) {\n // TODO: reproject binary streaming features\n // const {reproject = false, _targetCrs = 'WGS84'} = (options && options.gis) || {};\n\n // @ts-expect-error\n const iterator = deserializeGeneric(stream, binaryFromFeature);\n return iterator;\n}\n\n// eslint-disable-next-line complexity\nasync function* parseFlatGeobufInBatchesToGeoJSON(stream, options: FlatGeobufLoaderOptions) {\n const {reproject = false, _targetCrs = 'WGS84'} = (options && options.gis) || {};\n\n let headerMeta;\n const iterator = deserializeGeoJson(stream, undefined, (header) => {\n headerMeta = header;\n });\n\n let projection;\n let firstRecord = true;\n // @ts-expect-error this looks wrong\n for await (const feature of iterator) {\n if (firstRecord) {\n const crs = headerMeta && headerMeta.crs;\n if (reproject && crs) {\n projection = new Proj4Projection({from: crs.wkt, to: _targetCrs});\n }\n\n firstRecord = false;\n }\n\n if (reproject && projection) {\n // eslint-disable-next-line\n yield transformGeoJsonCoords([feature], (coords) => projection.project(coords));\n } else {\n yield feature;\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"parse-flatgeobuf.js","names":["Proj4Projection","transformGeoJsonCoords","fgbToBinaryGeometry","getSchemaFromFGBHeader","geojson","generic","parseProperties","parsePropertiesBinary","deserializeGeoJson","deserialize","deserializeGeneric","binaryFromFeature","feature","header","geometry","geometryType","type","parsedGeometry","properties","columns","parseFlatGeobuf","arrayBuffer","options","_options$flatgeobuf","shape","flatgeobuf","parseFlatGeobufToGeoJSONTable","binary","parseFlatGeobufToBinary","data","Error","arguments","length","undefined","array","Uint8Array","byteLength","features","reproject","_targetCrs","gis","arr","fgbHeader","schema","headerMeta","crs","projection","from","wkt","to","e","coords","project","parseFlatGeobufInBatches","stream","_options$flatgeobuf2","parseFlatGeobufInBatchesToBinary","parseFlatGeobufInBatchesToGeoJSON","iterator","firstRecord"],"sources":["../../src/lib/parse-flatgeobuf.ts"],"sourcesContent":["// loaders.gl, MIT license\n// Copyright (c) vis.gl contributors\n\nimport {Proj4Projection} from '@math.gl/proj4';\nimport {transformGeoJsonCoords} from '@loaders.gl/gis';\n\nimport type {FlatGeobufLoaderOptions} from '../flatgeobuf-loader';\nimport type {GeoJSONTable, Table, Schema} from '@loaders.gl/schema';\n\nimport {fgbToBinaryGeometry} from './binary-geometries';\nimport {getSchemaFromFGBHeader} from './get-schema-from-fgb-header';\n\nimport * as fgb from 'flatgeobuf';\nimport * as geojson from 'flatgeobuf/lib/mjs/geojson.js';\nimport * as generic from 'flatgeobuf/lib/mjs/generic.js';\nimport {parseProperties as parsePropertiesBinary} from 'flatgeobuf/lib/mjs/generic/feature';\n\nconst deserializeGeoJson = geojson.deserialize;\nconst deserializeGeneric = generic.deserialize;\n// const parsePropertiesBinary = FlatgeobufFeature.parseProperties;\n\n// TODO: reproject binary features\nfunction binaryFromFeature(feature: fgb.Feature, header: fgb.HeaderMeta) {\n const geometry = feature.geometry();\n\n // FlatGeobuf files can only hold a single geometry type per file, otherwise\n // GeometryType is GeometryCollection\n // I believe geometry.type() is null (0) except when the geometry type isn't\n // known in the header?\n const geometryType = header.geometryType || geometry?.type();\n const parsedGeometry = fgbToBinaryGeometry(geometry, geometryType!);\n // @ts-expect-error this looks wrong\n parsedGeometry.properties = parsePropertiesBinary(feature, header.columns);\n\n // TODO: wrap binary data either in points, lines, or polygons key\n return parsedGeometry;\n}\n\n/*\n * Parse FlatGeobuf arrayBuffer and return GeoJSON.\n *\n * @param arrayBuffer A FlatGeobuf arrayBuffer\n * @return A GeoJSON geometry object\n */\nexport function parseFlatGeobuf(\n arrayBuffer: ArrayBuffer,\n options?: FlatGeobufLoaderOptions\n): Table {\n const shape = options?.flatgeobuf?.shape;\n\n switch (shape) {\n case 'geojson-table': {\n return parseFlatGeobufToGeoJSONTable(arrayBuffer, options);\n }\n\n case 'columnar-table': // binary + some JS arrays\n const binary = parseFlatGeobufToBinary(arrayBuffer, options);\n // @ts-expect-error\n return {shape: 'columnar-table', data: binary};\n\n case 'binary':\n // @ts-expect-error\n return parseFlatGeobufToBinary(arrayBuffer, options);\n\n default:\n throw new Error(shape);\n }\n}\n\nfunction parseFlatGeobufToBinary(arrayBuffer: ArrayBuffer, options: FlatGeobufLoaderOptions = {}) {\n // TODO: reproject binary features\n // const {reproject = false, _targetCrs = 'WGS84'} = (options && options.gis) || {};\n\n const array = new Uint8Array(arrayBuffer);\n // @ts-expect-error\n return deserializeGeneric(array, fgbToBinaryGeometry);\n}\n\nfunction parseFlatGeobufToGeoJSONTable(\n arrayBuffer: ArrayBuffer,\n options: FlatGeobufLoaderOptions = {}\n): GeoJSONTable {\n if (arrayBuffer.byteLength === 0) {\n return {shape: 'geojson-table', type: 'FeatureCollection', features: []};\n }\n\n const {reproject = false, _targetCrs = 'WGS84'} = (options && options.gis) || {};\n\n const arr = new Uint8Array(arrayBuffer);\n\n let fgbHeader;\n let schema: Schema | undefined;\n\n // @ts-expect-error this looks wrong\n let {features} = deserializeGeoJson(arr, undefined, (headerMeta) => {\n fgbHeader = headerMeta;\n schema = getSchemaFromFGBHeader(fgbHeader);\n });\n\n const crs = fgbHeader && fgbHeader.crs;\n let projection;\n if (reproject && crs) {\n // Constructing the projection may fail for some invalid WKT strings\n try {\n projection = new Proj4Projection({from: crs.wkt, to: _targetCrs});\n } catch (e) {\n // no op\n }\n }\n\n if (projection) {\n features = transformGeoJsonCoords(features, (coords) => projection.project(coords));\n }\n\n return {shape: 'geojson-table', schema, type: 'FeatureCollection', features};\n}\n\n/*\n * Parse FlatGeobuf arrayBuffer and return GeoJSON.\n *\n * @param {ReadableStream} _ A FlatGeobuf arrayBuffer\n * @return A GeoJSON geometry object iterator\n */\n// eslint-disable-next-line complexity\nexport function parseFlatGeobufInBatches(stream, options: FlatGeobufLoaderOptions) {\n const shape = options.flatgeobuf?.shape;\n switch (shape) {\n case 'binary':\n return parseFlatGeobufInBatchesToBinary(stream, options);\n case 'geojson-table':\n return parseFlatGeobufInBatchesToGeoJSON(stream, options);\n default:\n throw new Error(shape);\n }\n}\n\nfunction parseFlatGeobufInBatchesToBinary(stream, options: FlatGeobufLoaderOptions) {\n // TODO: reproject binary streaming features\n // const {reproject = false, _targetCrs = 'WGS84'} = (options && options.gis) || {};\n\n // @ts-expect-error\n const iterator = deserializeGeneric(stream, binaryFromFeature);\n return iterator;\n}\n\n/**\n * @todo this does not return proper GeoJSONTable batches\n * @param stream\n * @param options\n */\n// eslint-disable-next-line complexity\nasync function* parseFlatGeobufInBatchesToGeoJSON(stream, options: FlatGeobufLoaderOptions) {\n const {reproject = false, _targetCrs = 'WGS84'} = (options && options.gis) || {};\n\n let fgbHeader;\n // let schema: Schema | undefined;\n const iterator = deserializeGeoJson(stream, undefined, (headerMeta) => {\n fgbHeader = headerMeta;\n // schema = getSchemaFromFGBHeader(fgbHeader);\n });\n\n let projection;\n let firstRecord = true;\n // @ts-expect-error this looks wrong\n for await (const feature of iterator) {\n if (firstRecord) {\n const crs = fgbHeader && fgbHeader.crs;\n if (reproject && crs) {\n projection = new Proj4Projection({from: crs.wkt, to: _targetCrs});\n }\n\n firstRecord = false;\n }\n\n if (reproject && projection) {\n // eslint-disable-next-line\n yield transformGeoJsonCoords([feature], (coords) => projection.project(coords));\n } else {\n yield feature;\n }\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"flatgeobuf-worker.js","names":["createLoaderWorker","FlatGeobufLoader"],"sources":["../../src/workers/flatgeobuf-worker.ts"],"sourcesContent":["import {createLoaderWorker} from '@loaders.gl/loader-utils';\nimport {FlatGeobufLoader} from '../index';\n\ncreateLoaderWorker(FlatGeobufLoader);\n"],"mappings":"AAAA,SAAQA,kBAAkB,QAAO,0BAA0B;AAAC,SACpDC,gBAAgB;AAExBD,kBAAkB,CAACC,gBAAgB,CAAC"}
1
+ {"version":3,"file":"flatgeobuf-worker.js","names":["createLoaderWorker","FlatGeobufLoader"],"sources":["../../src/workers/flatgeobuf-worker.ts"],"sourcesContent":["// loaders.gl, MIT license\n// Copyright (c) vis.gl contributors\n\nimport {createLoaderWorker} from '@loaders.gl/loader-utils';\nimport {FlatGeobufLoader} from '../index';\n\ncreateLoaderWorker(FlatGeobufLoader);\n"],"mappings":"AAGA,SAAQA,kBAAkB,QAAO,0BAA0B;AAAC,SACpDC,gBAAgB;AAExBD,kBAAkB,CAACC,gBAAgB,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@loaders.gl/flatgeobuf",
3
3
  "description": "Loader for FlatGeobuf",
4
- "version": "4.0.3",
4
+ "version": "4.1.0-alpha.1",
5
5
  "license": "MIT",
6
6
  "type": "module",
7
7
  "publishConfig": {
@@ -15,8 +15,11 @@
15
15
  "geometry",
16
16
  "loader",
17
17
  "parser",
18
- "MVT",
19
- "Mapbox Vector Tiles"
18
+ "FGB",
19
+ "flatgeobuf",
20
+ "cloud optimized",
21
+ "geospatial",
22
+ "table"
20
23
  ],
21
24
  "types": "dist/index.d.ts",
22
25
  "main": "dist/index.cjs",
@@ -40,10 +43,10 @@
40
43
  "build-worker": "# esbuild src/workers/flatgeobuf-worker.ts --bundle --outfile=dist/flatgeobuf-worker.js --define:__VERSION__=\\\"$npm_package_version\\\""
41
44
  },
42
45
  "dependencies": {
43
- "@loaders.gl/gis": "4.0.3",
44
- "@loaders.gl/loader-utils": "4.0.3",
46
+ "@loaders.gl/gis": "4.1.0-alpha.1",
47
+ "@loaders.gl/loader-utils": "4.1.0-alpha.1",
45
48
  "@math.gl/proj4": "^4.0.0",
46
49
  "flatgeobuf": "3.27.0"
47
50
  },
48
- "gitHead": "03c871839b36c997249dabae1844df53a35d3760"
51
+ "gitHead": "6a4d3da93d45115ad99861474a43c3f4a0b280a7"
49
52
  }
@@ -1,9 +1,16 @@
1
- import type {Loader, LoaderOptions} from '@loaders.gl/loader-utils';
1
+ // loaders.gl, MIT license
2
+ // Copyright (c) vis.gl contributors
3
+
4
+ import type {Loader, LoaderWithParser, LoaderOptions} from '@loaders.gl/loader-utils';
5
+ import {parseFlatGeobuf, parseFlatGeobufInBatches} from './lib/parse-flatgeobuf';
2
6
 
3
7
  // __VERSION__ is injected by babel-plugin-version-inline
4
8
  // @ts-ignore TS2304: Cannot find name '__VERSION__'.
5
9
  const VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'latest';
6
10
 
11
+ // FGB\3FGB\1
12
+ const FGB_MAGIC_NUMBER = [0x66, 0x67, 0x62, 0x03, 0x66, 0x67, 0x62, 0x01];
13
+
7
14
  export type FlatGeobufLoaderOptions = LoaderOptions & {
8
15
  flatgeobuf?: {
9
16
  shape?: 'geojson-table' | 'columnar-table' | 'binary';
@@ -14,7 +21,7 @@ export type FlatGeobufLoaderOptions = LoaderOptions & {
14
21
  };
15
22
  };
16
23
 
17
- export const FlatGeobufLoader: Loader<any, any, FlatGeobufLoaderOptions> = {
24
+ export const FlatGeobufWorkerLoader: Loader<any, any, FlatGeobufLoaderOptions> = {
18
25
  id: 'flatgeobuf',
19
26
  name: 'FlatGeobuf',
20
27
  module: 'flatgeobuf',
@@ -23,6 +30,7 @@ export const FlatGeobufLoader: Loader<any, any, FlatGeobufLoaderOptions> = {
23
30
  extensions: ['fgb'],
24
31
  mimeTypes: ['application/octet-stream'],
25
32
  category: 'geometry',
33
+ tests: [new Uint8Array(FGB_MAGIC_NUMBER).buffer],
26
34
  options: {
27
35
  flatgeobuf: {
28
36
  shape: 'geojson-table'
@@ -32,3 +40,12 @@ export const FlatGeobufLoader: Loader<any, any, FlatGeobufLoaderOptions> = {
32
40
  }
33
41
  }
34
42
  };
43
+
44
+ export const FlatGeobufLoader: LoaderWithParser<any, any, FlatGeobufLoaderOptions> = {
45
+ ...FlatGeobufWorkerLoader,
46
+ parse: async (arrayBuffer, options) => parseFlatGeobuf(arrayBuffer, options),
47
+ parseSync: parseFlatGeobuf,
48
+ // @ts-expect-error this is a stream parser not an async iterator parser
49
+ parseInBatchesFromStream: parseFlatGeobufInBatches,
50
+ binary: true
51
+ };
package/src/index.ts CHANGED
@@ -1,15 +1,5 @@
1
- import type {LoaderWithParser} from '@loaders.gl/loader-utils';
2
- import type {FlatGeobufLoaderOptions} from './flatgeobuf-loader';
3
- import {FlatGeobufLoader as FlatGeobufWorkerLoader} from './flatgeobuf-loader';
4
- import {parseFlatGeobuf, parseFlatGeobufInBatches} from './lib/parse-flatgeobuf';
1
+ // loaders.gl, MIT license
2
+ // Copyright (c) vis.gl contributors
5
3
 
6
- export {FlatGeobufWorkerLoader};
7
-
8
- export const FlatGeobufLoader: LoaderWithParser<any, any, FlatGeobufLoaderOptions> = {
9
- ...FlatGeobufWorkerLoader,
10
- parse: async (arrayBuffer, options) => parseFlatGeobuf(arrayBuffer, options),
11
- parseSync: parseFlatGeobuf,
12
- // @ts-expect-error this is a stream parser not an async iterator parser
13
- parseInBatchesFromStream: parseFlatGeobufInBatches,
14
- binary: true
15
- };
4
+ export type {FlatGeobufLoaderOptions} from './flatgeobuf-loader';
5
+ export {FlatGeobufLoader, FlatGeobufWorkerLoader} from './flatgeobuf-loader';
@@ -0,0 +1,121 @@
1
+ // loaders.gl, MIT license
2
+ // Copyright (c) vis.gl contributors
3
+
4
+ import type {Schema, Field, DataType} from '@loaders.gl/schema';
5
+ import * as fgb from 'flatgeobuf';
6
+
7
+ /**
8
+ * @param fgbHeader
9
+ * geometryType: GeometryType;
10
+ * columns: ColumnMeta[] | null;
11
+ * envelope: Float64Array | null;
12
+ * featuresCount: number;
13
+ * indexNodeSize: number;
14
+ * crs: CrsMeta | null;
15
+ * title: string | null;
16
+ * description: string | null;
17
+ * metadata: string | null;
18
+ */
19
+ export function getSchemaFromFGBHeader(fgbHeader: fgb.HeaderMeta): Schema {
20
+ const metadata: Record<string, string> = {
21
+ title: fgbHeader.title || '',
22
+ description: fgbHeader.description || '',
23
+ crs: JSON.stringify(fgbHeader.crs) || '',
24
+ metadata: fgbHeader.metadata || '',
25
+ geometryType: String(fgbHeader.geometryType),
26
+ indexNodeSize: String(fgbHeader.indexNodeSize),
27
+ featureCount: String(fgbHeader.featuresCount),
28
+ bounds: fgbHeader.envelope?.join(',') || ''
29
+ };
30
+
31
+ const fields: Field[] = fgbHeader.columns?.map((column) => getFieldFromFGBColumn(column)) || [];
32
+ return {metadata, fields};
33
+ }
34
+
35
+ /**
36
+ * name: string;
37
+ * type: ColumnType;
38
+ * title: string | null;
39
+ * description: string | null;
40
+ * width: number;
41
+ * precision: number;
42
+ * scale: number;
43
+ * nullable: boolean;
44
+ * unique: boolean;
45
+ * primary_key: boolean;
46
+ */
47
+ function getFieldFromFGBColumn(fgbColumn: fgb.ColumnMeta): Field {
48
+ const metadata: Record<string, string> = {
49
+ title: fgbColumn.title || '',
50
+ description: fgbColumn.description || '',
51
+ width: String(fgbColumn.width),
52
+ precision: String(fgbColumn.precision),
53
+ scale: String(fgbColumn.scale),
54
+ unique: String(fgbColumn.unique),
55
+ primary_key: String(fgbColumn.primary_key)
56
+ };
57
+
58
+ return {
59
+ name: fgbColumn.name,
60
+ type: getTypeFromFGBType(fgbColumn.type as unknown as fgbColumnType),
61
+ nullable: fgbColumn.nullable,
62
+ metadata
63
+ };
64
+ }
65
+
66
+ /** Note: fgb.ColumType does not appear to be exported */
67
+ enum fgbColumnType {
68
+ Byte = 0,
69
+ UByte = 1,
70
+ Bool = 2,
71
+ Short = 3,
72
+ UShort = 4,
73
+ Int = 5,
74
+ UInt = 6,
75
+ Long = 7,
76
+ ULong = 8,
77
+ Float = 9,
78
+ Double = 10,
79
+ String = 11,
80
+ Json = 12,
81
+ DateTime = 13,
82
+ Binary = 14
83
+ }
84
+
85
+ /** Convert FGB types to arrow like types */
86
+ function getTypeFromFGBType(fgbType: fgbColumnType /* fgb.ColumnMeta['type'] */): DataType {
87
+ switch (fgbType) {
88
+ case fgbColumnType.Byte:
89
+ return 'int8';
90
+ case fgbColumnType.UByte:
91
+ return 'uint8';
92
+ case fgbColumnType.Bool:
93
+ return 'bool';
94
+ case fgbColumnType.Short:
95
+ return 'int16';
96
+ case fgbColumnType.UShort:
97
+ return 'uint16';
98
+ case fgbColumnType.Int:
99
+ return 'int32';
100
+ case fgbColumnType.UInt:
101
+ return 'uint32';
102
+ case fgbColumnType.Long:
103
+ return 'int64';
104
+ case fgbColumnType.ULong:
105
+ return 'uint64';
106
+ case fgbColumnType.Float:
107
+ return 'float32';
108
+ case fgbColumnType.Double:
109
+ return 'float64';
110
+ case fgbColumnType.String:
111
+ return 'utf8';
112
+ case fgbColumnType.Json:
113
+ return 'null';
114
+ case fgbColumnType.DateTime:
115
+ return 'date-millisecond';
116
+ case fgbColumnType.Binary:
117
+ return 'binary';
118
+ default:
119
+ return 'null';
120
+ }
121
+ }
@@ -5,19 +5,22 @@ import {Proj4Projection} from '@math.gl/proj4';
5
5
  import {transformGeoJsonCoords} from '@loaders.gl/gis';
6
6
 
7
7
  import type {FlatGeobufLoaderOptions} from '../flatgeobuf-loader';
8
- import type {GeoJSONTable, Feature, Table} from '@loaders.gl/schema';
8
+ import type {GeoJSONTable, Table, Schema} from '@loaders.gl/schema';
9
+
9
10
  import {fgbToBinaryGeometry} from './binary-geometries';
11
+ import {getSchemaFromFGBHeader} from './get-schema-from-fgb-header';
10
12
 
11
- import {Feature as FBGFeature, HeaderMeta as FGBHeader} from 'flatgeobuf';
13
+ import * as fgb from 'flatgeobuf';
12
14
  import * as geojson from 'flatgeobuf/lib/mjs/geojson.js';
13
15
  import * as generic from 'flatgeobuf/lib/mjs/generic.js';
14
16
  import {parseProperties as parsePropertiesBinary} from 'flatgeobuf/lib/mjs/generic/feature';
17
+
15
18
  const deserializeGeoJson = geojson.deserialize;
16
19
  const deserializeGeneric = generic.deserialize;
17
20
  // const parsePropertiesBinary = FlatgeobufFeature.parseProperties;
18
21
 
19
22
  // TODO: reproject binary features
20
- function binaryFromFeature(feature: FBGFeature, header: FGBHeader) {
23
+ function binaryFromFeature(feature: fgb.Feature, header: fgb.HeaderMeta) {
21
24
  const geometry = feature.geometry();
22
25
 
23
26
  // FlatGeobuf files can only hold a single geometry type per file, otherwise
@@ -47,13 +50,7 @@ export function parseFlatGeobuf(
47
50
 
48
51
  switch (shape) {
49
52
  case 'geojson-table': {
50
- const features = parseFlatGeobufToGeoJSON(arrayBuffer, options);
51
- const table: GeoJSONTable = {
52
- shape: 'geojson-table',
53
- type: 'FeatureCollection',
54
- features
55
- };
56
- return table;
53
+ return parseFlatGeobufToGeoJSONTable(arrayBuffer, options);
57
54
  }
58
55
 
59
56
  case 'columnar-table': // binary + some JS arrays
@@ -79,25 +76,28 @@ function parseFlatGeobufToBinary(arrayBuffer: ArrayBuffer, options: FlatGeobufLo
79
76
  return deserializeGeneric(array, fgbToBinaryGeometry);
80
77
  }
81
78
 
82
- function parseFlatGeobufToGeoJSON(
79
+ function parseFlatGeobufToGeoJSONTable(
83
80
  arrayBuffer: ArrayBuffer,
84
81
  options: FlatGeobufLoaderOptions = {}
85
- ): Feature[] {
82
+ ): GeoJSONTable {
86
83
  if (arrayBuffer.byteLength === 0) {
87
- return [];
84
+ return {shape: 'geojson-table', type: 'FeatureCollection', features: []};
88
85
  }
89
86
 
90
87
  const {reproject = false, _targetCrs = 'WGS84'} = (options && options.gis) || {};
91
88
 
92
89
  const arr = new Uint8Array(arrayBuffer);
93
90
 
94
- let headerMeta;
91
+ let fgbHeader;
92
+ let schema: Schema | undefined;
93
+
95
94
  // @ts-expect-error this looks wrong
96
- const {features} = deserializeGeoJson(arr, undefined, (header) => {
97
- headerMeta = header;
95
+ let {features} = deserializeGeoJson(arr, undefined, (headerMeta) => {
96
+ fgbHeader = headerMeta;
97
+ schema = getSchemaFromFGBHeader(fgbHeader);
98
98
  });
99
99
 
100
- const crs = headerMeta && headerMeta.crs;
100
+ const crs = fgbHeader && fgbHeader.crs;
101
101
  let projection;
102
102
  if (reproject && crs) {
103
103
  // Constructing the projection may fail for some invalid WKT strings
@@ -109,10 +109,10 @@ function parseFlatGeobufToGeoJSON(
109
109
  }
110
110
 
111
111
  if (projection) {
112
- return transformGeoJsonCoords(features, (coords) => projection.project(coords));
112
+ features = transformGeoJsonCoords(features, (coords) => projection.project(coords));
113
113
  }
114
114
 
115
- return features;
115
+ return {shape: 'geojson-table', schema, type: 'FeatureCollection', features};
116
116
  }
117
117
 
118
118
  /*
@@ -143,13 +143,20 @@ function parseFlatGeobufInBatchesToBinary(stream, options: FlatGeobufLoaderOptio
143
143
  return iterator;
144
144
  }
145
145
 
146
+ /**
147
+ * @todo this does not return proper GeoJSONTable batches
148
+ * @param stream
149
+ * @param options
150
+ */
146
151
  // eslint-disable-next-line complexity
147
152
  async function* parseFlatGeobufInBatchesToGeoJSON(stream, options: FlatGeobufLoaderOptions) {
148
153
  const {reproject = false, _targetCrs = 'WGS84'} = (options && options.gis) || {};
149
154
 
150
- let headerMeta;
151
- const iterator = deserializeGeoJson(stream, undefined, (header) => {
152
- headerMeta = header;
155
+ let fgbHeader;
156
+ // let schema: Schema | undefined;
157
+ const iterator = deserializeGeoJson(stream, undefined, (headerMeta) => {
158
+ fgbHeader = headerMeta;
159
+ // schema = getSchemaFromFGBHeader(fgbHeader);
153
160
  });
154
161
 
155
162
  let projection;
@@ -157,7 +164,7 @@ async function* parseFlatGeobufInBatchesToGeoJSON(stream, options: FlatGeobufLoa
157
164
  // @ts-expect-error this looks wrong
158
165
  for await (const feature of iterator) {
159
166
  if (firstRecord) {
160
- const crs = headerMeta && headerMeta.crs;
167
+ const crs = fgbHeader && fgbHeader.crs;
161
168
  if (reproject && crs) {
162
169
  projection = new Proj4Projection({from: crs.wkt, to: _targetCrs});
163
170
  }
@@ -1,3 +1,6 @@
1
+ // loaders.gl, MIT license
2
+ // Copyright (c) vis.gl contributors
3
+
1
4
  import {createLoaderWorker} from '@loaders.gl/loader-utils';
2
5
  import {FlatGeobufLoader} from '../index';
3
6