@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.
- package/dist/flatgeobuf-loader.d.ts +3 -2
- package/dist/flatgeobuf-loader.d.ts.map +1 -1
- package/dist/flatgeobuf-loader.js +11 -1
- package/dist/flatgeobuf-loader.js.map +1 -1
- package/dist/index.cjs +111 -45
- package/dist/index.d.ts +2 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -10
- package/dist/index.js.map +1 -1
- package/dist/lib/get-schema-from-fgb-header.d.ts +16 -0
- package/dist/lib/get-schema-from-fgb-header.d.ts.map +1 -0
- package/dist/lib/get-schema-from-fgb-header.js +90 -0
- package/dist/lib/get-schema-from-fgb-header.js.map +1 -0
- package/dist/lib/parse-flatgeobuf.d.ts +2 -1
- package/dist/lib/parse-flatgeobuf.d.ts.map +1 -1
- package/dist/lib/parse-flatgeobuf.js +26 -20
- package/dist/lib/parse-flatgeobuf.js.map +1 -1
- package/dist/workers/flatgeobuf-worker.js.map +1 -1
- package/package.json +9 -6
- package/src/flatgeobuf-loader.ts +19 -2
- package/src/index.ts +4 -14
- package/src/lib/get-schema-from-fgb-header.ts +121 -0
- package/src/lib/parse-flatgeobuf.ts +30 -23
- package/src/workers/flatgeobuf-worker.ts +3 -0
|
@@ -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
|
|
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":"
|
|
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
|
-
|
|
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__","
|
|
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: () =>
|
|
34
|
-
FlatGeobufWorkerLoader: () =>
|
|
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
|
-
|
|
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
|
|
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
|
|
220
|
-
|
|
221
|
-
|
|
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 =
|
|
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
|
-
|
|
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
|
|
255
|
-
const iterator = deserializeGeoJson(stream, void 0, (
|
|
256
|
-
|
|
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 =
|
|
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/
|
|
277
|
-
var
|
|
278
|
-
|
|
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
|
-
|
|
2
|
-
|
|
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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
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
|
-
|
|
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"
|
|
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<
|
|
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,
|
|
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
|
-
|
|
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
|
|
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
|
|
58
|
-
|
|
56
|
+
let fgbHeader;
|
|
57
|
+
let schema;
|
|
58
|
+
let {
|
|
59
59
|
features
|
|
60
|
-
} = deserializeGeoJson(arr, undefined,
|
|
61
|
-
|
|
60
|
+
} = deserializeGeoJson(arr, undefined, headerMeta => {
|
|
61
|
+
fgbHeader = headerMeta;
|
|
62
|
+
schema = getSchemaFromFGBHeader(fgbHeader);
|
|
62
63
|
});
|
|
63
|
-
const 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
|
-
|
|
75
|
+
features = transformGeoJsonCoords(features, coords => projection.project(coords));
|
|
75
76
|
}
|
|
76
|
-
return
|
|
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
|
|
100
|
-
const iterator = deserializeGeoJson(stream, undefined,
|
|
101
|
-
|
|
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 =
|
|
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":["
|
|
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.
|
|
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
|
-
"
|
|
19
|
-
"
|
|
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.
|
|
44
|
-
"@loaders.gl/loader-utils": "4.0.
|
|
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": "
|
|
51
|
+
"gitHead": "6a4d3da93d45115ad99861474a43c3f4a0b280a7"
|
|
49
52
|
}
|
package/src/flatgeobuf-loader.ts
CHANGED
|
@@ -1,9 +1,16 @@
|
|
|
1
|
-
|
|
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
|
|
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
|
-
|
|
2
|
-
|
|
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 {
|
|
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,
|
|
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
|
|
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:
|
|
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
|
-
|
|
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
|
|
79
|
+
function parseFlatGeobufToGeoJSONTable(
|
|
83
80
|
arrayBuffer: ArrayBuffer,
|
|
84
81
|
options: FlatGeobufLoaderOptions = {}
|
|
85
|
-
):
|
|
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
|
|
91
|
+
let fgbHeader;
|
|
92
|
+
let schema: Schema | undefined;
|
|
93
|
+
|
|
95
94
|
// @ts-expect-error this looks wrong
|
|
96
|
-
|
|
97
|
-
|
|
95
|
+
let {features} = deserializeGeoJson(arr, undefined, (headerMeta) => {
|
|
96
|
+
fgbHeader = headerMeta;
|
|
97
|
+
schema = getSchemaFromFGBHeader(fgbHeader);
|
|
98
98
|
});
|
|
99
99
|
|
|
100
|
-
const 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
|
-
|
|
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
|
|
151
|
-
|
|
152
|
-
|
|
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 =
|
|
167
|
+
const crs = fgbHeader && fgbHeader.crs;
|
|
161
168
|
if (reproject && crs) {
|
|
162
169
|
projection = new Proj4Projection({from: crs.wkt, to: _targetCrs});
|
|
163
170
|
}
|