@loaders.gl/flatgeobuf 4.0.0-beta.6 → 4.0.0-beta.7
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/index.cjs +40 -26
- package/dist/lib/binary-geometries.d.ts +43 -3
- package/dist/lib/binary-geometries.d.ts.map +1 -1
- package/dist/lib/binary-geometries.js +23 -17
- package/dist/lib/binary-geometries.js.map +1 -1
- package/dist/lib/parse-flatgeobuf.d.ts +1 -1
- package/dist/lib/parse-flatgeobuf.d.ts.map +1 -1
- package/dist/lib/parse-flatgeobuf.js +9 -7
- package/dist/lib/parse-flatgeobuf.js.map +1 -1
- package/package.json +7 -7
- package/src/lib/binary-geometries.ts +62 -25
- package/src/lib/parse-flatgeobuf.ts +16 -11
- package/dist/dist.dev.js +0 -8939
- package/dist/flatgeobuf-worker.js +0 -9086
package/dist/index.cjs
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
2
3
|
var __defProp = Object.defineProperty;
|
|
3
4
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
5
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
5
7
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
8
|
var __export = (target, all) => {
|
|
7
9
|
for (var name in all)
|
|
@@ -15,6 +17,14 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
15
17
|
}
|
|
16
18
|
return to;
|
|
17
19
|
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
18
28
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
29
|
|
|
20
30
|
// src/index.ts
|
|
@@ -49,12 +59,27 @@ var FlatGeobufLoader = {
|
|
|
49
59
|
// src/lib/parse-flatgeobuf.ts
|
|
50
60
|
var import_proj4 = require("@math.gl/proj4");
|
|
51
61
|
var import_gis = require("@loaders.gl/gis");
|
|
52
|
-
var import_geojson = require("flatgeobuf/lib/cjs/geojson");
|
|
53
|
-
var import_generic = require("flatgeobuf/lib/cjs/generic");
|
|
54
|
-
var import_feature = require("flatgeobuf/lib/cjs/generic/feature");
|
|
55
62
|
|
|
56
63
|
// src/lib/binary-geometries.ts
|
|
57
|
-
|
|
64
|
+
function fgbToBinaryGeometry(geometry, type) {
|
|
65
|
+
if (geometry === null) {
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
switch (type) {
|
|
69
|
+
case GeometryType.Point:
|
|
70
|
+
case GeometryType.MultiPoint:
|
|
71
|
+
return parsePoint(geometry);
|
|
72
|
+
case GeometryType.LineString:
|
|
73
|
+
case GeometryType.MultiLineString:
|
|
74
|
+
return parseLines(geometry);
|
|
75
|
+
case GeometryType.Polygon:
|
|
76
|
+
return parsePolygons(geometry);
|
|
77
|
+
case GeometryType.MultiPolygon:
|
|
78
|
+
return parseMultiPolygons(geometry);
|
|
79
|
+
default:
|
|
80
|
+
throw new Error(`Unimplemented geometry type: ${type}`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
58
83
|
function parsePoint(geometry) {
|
|
59
84
|
const xy = geometry.xyArray();
|
|
60
85
|
const z = geometry.zArray();
|
|
@@ -145,28 +170,17 @@ function blitArrays(xy, z) {
|
|
|
145
170
|
}
|
|
146
171
|
return { value: xyz, size: 3 };
|
|
147
172
|
}
|
|
148
|
-
function fromGeometry(geometry, type) {
|
|
149
|
-
switch (type) {
|
|
150
|
-
case import_header_generated.GeometryType.Point:
|
|
151
|
-
case import_header_generated.GeometryType.MultiPoint:
|
|
152
|
-
return parsePoint(geometry);
|
|
153
|
-
case import_header_generated.GeometryType.LineString:
|
|
154
|
-
case import_header_generated.GeometryType.MultiLineString:
|
|
155
|
-
return parseLines(geometry);
|
|
156
|
-
case import_header_generated.GeometryType.Polygon:
|
|
157
|
-
return parsePolygons(geometry);
|
|
158
|
-
case import_header_generated.GeometryType.MultiPolygon:
|
|
159
|
-
return parseMultiPolygons(geometry);
|
|
160
|
-
default:
|
|
161
|
-
throw new Error(`Unimplemented geometry type: ${type}`);
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
173
|
|
|
165
174
|
// src/lib/parse-flatgeobuf.ts
|
|
175
|
+
var geojson = __toESM(require("flatgeobuf/lib/mjs/geojson.js"), 1);
|
|
176
|
+
var generic = __toESM(require("flatgeobuf/lib/mjs/generic.js"), 1);
|
|
177
|
+
var import_feature = require("flatgeobuf/lib/mjs/generic/feature");
|
|
178
|
+
var deserializeGeoJson = geojson.deserialize;
|
|
179
|
+
var deserializeGeneric = generic.deserialize;
|
|
166
180
|
function binaryFromFeature(feature, header) {
|
|
167
181
|
const geometry = feature.geometry();
|
|
168
|
-
const geometryType = header.geometryType || geometry.type();
|
|
169
|
-
const parsedGeometry =
|
|
182
|
+
const geometryType = header.geometryType || (geometry == null ? void 0 : geometry.type());
|
|
183
|
+
const parsedGeometry = fgbToBinaryGeometry(geometry, geometryType);
|
|
170
184
|
parsedGeometry.properties = (0, import_feature.parseProperties)(feature, header.columns);
|
|
171
185
|
return parsedGeometry;
|
|
172
186
|
}
|
|
@@ -194,7 +208,7 @@ function parseFlatGeobuf(arrayBuffer, options) {
|
|
|
194
208
|
}
|
|
195
209
|
function parseFlatGeobufToBinary(arrayBuffer, options = {}) {
|
|
196
210
|
const array = new Uint8Array(arrayBuffer);
|
|
197
|
-
return (
|
|
211
|
+
return deserializeGeneric(array, fgbToBinaryGeometry);
|
|
198
212
|
}
|
|
199
213
|
function parseFlatGeobufToGeoJSON(arrayBuffer, options = {}) {
|
|
200
214
|
if (arrayBuffer.byteLength === 0) {
|
|
@@ -203,7 +217,7 @@ function parseFlatGeobufToGeoJSON(arrayBuffer, options = {}) {
|
|
|
203
217
|
const { reproject = false, _targetCrs = "WGS84" } = options && options.gis || {};
|
|
204
218
|
const arr = new Uint8Array(arrayBuffer);
|
|
205
219
|
let headerMeta;
|
|
206
|
-
const { features } = (
|
|
220
|
+
const { features } = deserializeGeoJson(arr, void 0, (header) => {
|
|
207
221
|
headerMeta = header;
|
|
208
222
|
});
|
|
209
223
|
const crs = headerMeta && headerMeta.crs;
|
|
@@ -232,13 +246,13 @@ function parseFlatGeobufInBatches(stream, options) {
|
|
|
232
246
|
}
|
|
233
247
|
}
|
|
234
248
|
function parseFlatGeobufInBatchesToBinary(stream, options) {
|
|
235
|
-
const iterator = (
|
|
249
|
+
const iterator = deserializeGeneric(stream, binaryFromFeature);
|
|
236
250
|
return iterator;
|
|
237
251
|
}
|
|
238
252
|
async function* parseFlatGeobufInBatchesToGeoJSON(stream, options) {
|
|
239
253
|
const { reproject = false, _targetCrs = "WGS84" } = options && options.gis || {};
|
|
240
254
|
let headerMeta;
|
|
241
|
-
const iterator = (
|
|
255
|
+
const iterator = deserializeGeoJson(stream, void 0, (header) => {
|
|
242
256
|
headerMeta = header;
|
|
243
257
|
});
|
|
244
258
|
let projection;
|
|
@@ -1,6 +1,46 @@
|
|
|
1
|
-
|
|
1
|
+
import { Geometry as FGBGeometry, Feature as FGBFeature } from 'flatgeobuf';
|
|
2
|
+
export declare enum GeometryType {
|
|
3
|
+
Unknown = 0,
|
|
4
|
+
Point = 1,
|
|
5
|
+
LineString = 2,
|
|
6
|
+
Polygon = 3,
|
|
7
|
+
MultiPoint = 4,
|
|
8
|
+
MultiLineString = 5,
|
|
9
|
+
MultiPolygon = 6,
|
|
10
|
+
GeometryCollection = 7,
|
|
11
|
+
CircularString = 8,
|
|
12
|
+
CompoundCurve = 9,
|
|
13
|
+
CurvePolygon = 10,
|
|
14
|
+
MultiCurve = 11,
|
|
15
|
+
MultiSurface = 12,
|
|
16
|
+
Curve = 13,
|
|
17
|
+
Surface = 14,
|
|
18
|
+
PolyhedralSurface = 15,
|
|
19
|
+
TIN = 16,
|
|
20
|
+
Triangle = 17
|
|
21
|
+
}
|
|
22
|
+
export declare function fgbToBinaryFeature(geometry: FGBFeature | null, type: GeometryType): {
|
|
2
23
|
positions: {
|
|
3
|
-
value:
|
|
24
|
+
value: Float64Array;
|
|
25
|
+
size: number;
|
|
26
|
+
};
|
|
27
|
+
} | {
|
|
28
|
+
positions: {
|
|
29
|
+
value: Float64Array;
|
|
30
|
+
size: any;
|
|
31
|
+
};
|
|
32
|
+
primitivePolygonIndices: {
|
|
33
|
+
value: Uint32Array;
|
|
34
|
+
size: number;
|
|
35
|
+
};
|
|
36
|
+
polygonIndices: {
|
|
37
|
+
value: Uint32Array;
|
|
38
|
+
size: number;
|
|
39
|
+
};
|
|
40
|
+
} | null;
|
|
41
|
+
export declare function fgbToBinaryGeometry(geometry: FGBGeometry | null, type: GeometryType): {
|
|
42
|
+
positions: {
|
|
43
|
+
value: Float64Array;
|
|
4
44
|
size: number;
|
|
5
45
|
};
|
|
6
46
|
} | {
|
|
@@ -16,5 +56,5 @@ export declare function fromGeometry(geometry: any, type: any): {
|
|
|
16
56
|
value: Uint32Array;
|
|
17
57
|
size: number;
|
|
18
58
|
};
|
|
19
|
-
};
|
|
59
|
+
} | null;
|
|
20
60
|
//# sourceMappingURL=binary-geometries.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"binary-geometries.d.ts","sourceRoot":"","sources":["../../src/lib/binary-geometries.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"binary-geometries.d.ts","sourceRoot":"","sources":["../../src/lib/binary-geometries.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,QAAQ,IAAI,WAAW,EAAE,OAAO,IAAI,UAAU,EAAC,MAAM,YAAY,CAAC;AAG1E,MAAM,CAAC,OAAO,MAAM,YAAY;IAC9B,OAAO,IAAI;IACX,KAAK,IAAI;IACT,UAAU,IAAI;IACd,OAAO,IAAI;IACX,UAAU,IAAI;IACd,eAAe,IAAI;IACnB,YAAY,IAAI;IAChB,kBAAkB,IAAI;IACtB,cAAc,IAAI;IAClB,aAAa,IAAI;IACjB,YAAY,KAAK;IACjB,UAAU,KAAK;IACf,YAAY,KAAK;IACjB,KAAK,KAAK;IACV,OAAO,KAAK;IACZ,iBAAiB,KAAK;IACtB,GAAG,KAAK;IACR,QAAQ,KAAK;CACd;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,UAAU,GAAG,IAAI,EAAE,IAAI,EAAE,YAAY;;;;;;;;;;;;;;;;;;SAGjF;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,WAAW,GAAG,IAAI,EAAE,IAAI,EAAE,YAAY;;;;;;;;;;;;;;;;;;SAkBnF"}
|
|
@@ -1,4 +1,26 @@
|
|
|
1
|
-
|
|
1
|
+
export function fgbToBinaryFeature(geometry, type) {
|
|
2
|
+
const fgbGeometry = (geometry === null || geometry === void 0 ? void 0 : geometry.geometry()) || null;
|
|
3
|
+
return fgbToBinaryGeometry(fgbGeometry, type);
|
|
4
|
+
}
|
|
5
|
+
export function fgbToBinaryGeometry(geometry, type) {
|
|
6
|
+
if (geometry === null) {
|
|
7
|
+
return null;
|
|
8
|
+
}
|
|
9
|
+
switch (type) {
|
|
10
|
+
case GeometryType.Point:
|
|
11
|
+
case GeometryType.MultiPoint:
|
|
12
|
+
return parsePoint(geometry);
|
|
13
|
+
case GeometryType.LineString:
|
|
14
|
+
case GeometryType.MultiLineString:
|
|
15
|
+
return parseLines(geometry);
|
|
16
|
+
case GeometryType.Polygon:
|
|
17
|
+
return parsePolygons(geometry);
|
|
18
|
+
case GeometryType.MultiPolygon:
|
|
19
|
+
return parseMultiPolygons(geometry);
|
|
20
|
+
default:
|
|
21
|
+
throw new Error(`Unimplemented geometry type: ${type}`);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
2
24
|
function parsePoint(geometry) {
|
|
3
25
|
const xy = geometry.xyArray();
|
|
4
26
|
const z = geometry.zArray();
|
|
@@ -107,20 +129,4 @@ function blitArrays(xy, z) {
|
|
|
107
129
|
size: 3
|
|
108
130
|
};
|
|
109
131
|
}
|
|
110
|
-
export function fromGeometry(geometry, type) {
|
|
111
|
-
switch (type) {
|
|
112
|
-
case GeometryType.Point:
|
|
113
|
-
case GeometryType.MultiPoint:
|
|
114
|
-
return parsePoint(geometry);
|
|
115
|
-
case GeometryType.LineString:
|
|
116
|
-
case GeometryType.MultiLineString:
|
|
117
|
-
return parseLines(geometry);
|
|
118
|
-
case GeometryType.Polygon:
|
|
119
|
-
return parsePolygons(geometry);
|
|
120
|
-
case GeometryType.MultiPolygon:
|
|
121
|
-
return parseMultiPolygons(geometry);
|
|
122
|
-
default:
|
|
123
|
-
throw new Error(`Unimplemented geometry type: ${type}`);
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
132
|
//# sourceMappingURL=binary-geometries.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"binary-geometries.js","names":["GeometryType","parsePoint","geometry","xy","xyArray","z","zArray","positions","blitArrays","parseLines","ends","endsArray","Array","from","length","unshift","pathIndices","value","Uint16Array","size","parsePolygons","primitivePolygonIndices","polygonIndices","parseMultiPolygons","parsedParts","nPositions","nPrimitivePolygonIndices","nPolygonIndices","i","partsLength","part","parts","polygon","push","concatPositions","Float64Array","concatPrimitivePolygonIndices","Uint32Array","concatPolygonIndices","positionCounter","primitivePolygonIndicesCounter","polygonIndicesCounter","positionSize","parsedPart","set","subarray","map","x","Error","totalLength","xyz","fromGeometry","type","Point","MultiPoint","LineString","MultiLineString","Polygon","MultiPolygon"],"sources":["../../src/lib/binary-geometries.ts"],"sourcesContent":["import {GeometryType} from 'flatgeobuf/lib/cjs/header_generated';\n\n// Parse Point to flat array\nfunction parsePoint(geometry) {\n const xy = geometry.xyArray();\n const z = geometry.zArray();\n const positions = blitArrays(xy, z);\n return {positions};\n}\n\nfunction parseLines(geometry) {\n const xy = geometry.xyArray();\n const z = geometry.zArray();\n const positions = blitArrays(xy, z);\n\n // If endsArray is null, a single LineString. Otherwise, contains the end\n // indices of each part of the MultiLineString. geometry.endsArray() omits the\n // initial 0 that we have in our internal format.\n const ends = (geometry.endsArray() && Array.from(geometry.endsArray())) || [xy.length / 2];\n ends.unshift(0);\n\n const pathIndices = {value: new Uint16Array(ends), size: 1};\n\n return {\n positions,\n pathIndices\n };\n}\n\nfunction parsePolygons(geometry) {\n const xy = geometry.xyArray();\n const z = geometry.zArray();\n const positions = blitArrays(xy, z);\n\n // If endsArray is null, a simple Polygon with no inner rings. Otherwise,\n // contains the end indices of each ring of the Polygon. geometry.endsArray()\n // omits the initial 0 that we have in our internal format.\n const ends = (geometry.endsArray() && Array.from(geometry.endsArray())) || [xy.length / 2];\n ends.unshift(0);\n\n const primitivePolygonIndices = {value: new Uint16Array(ends), size: 1};\n const polygonIndices = {value: new Uint16Array([0, xy.length / 2]), size: 1};\n\n return {\n positions,\n primitivePolygonIndices,\n polygonIndices\n };\n}\n\n// eslint-disable-next-line max-statements\nfunction parseMultiPolygons(geometry) {\n // Create arrays for each geometry part, then concatenate\n const parsedParts: any[] = [];\n let nPositions = 0;\n let nPrimitivePolygonIndices = 1;\n let nPolygonIndices = 1;\n\n for (let i = 0; i < geometry.partsLength(); i++) {\n const part = geometry.parts(i);\n const polygon = parsePolygons(part);\n\n nPositions += polygon.positions.value.length;\n nPrimitivePolygonIndices += polygon.primitivePolygonIndices.value.length - 1;\n nPolygonIndices += polygon.polygonIndices.value.length - 1;\n\n parsedParts.push(polygon);\n }\n\n const concatPositions = new Float64Array(nPositions);\n const concatPrimitivePolygonIndices = new Uint32Array(nPrimitivePolygonIndices);\n const concatPolygonIndices = new Uint32Array(nPolygonIndices);\n\n let positionCounter = 0;\n let primitivePolygonIndicesCounter = 1;\n let polygonIndicesCounter = 1;\n\n // Assumes all parts of the multipolygon have the same size\n const positionSize = parsedParts[0].positions.size;\n\n for (const parsedPart of parsedParts) {\n concatPositions.set(parsedPart.positions.value, positionCounter * positionSize);\n\n // For indices, need to add positionCounter so that position indices are\n // correct in the concatenated positions\n concatPrimitivePolygonIndices.set(\n // eslint-disable-next-line\n parsedPart.primitivePolygonIndices.value.subarray(1).map((x) => x + positionCounter),\n primitivePolygonIndicesCounter\n );\n concatPolygonIndices.set(\n // eslint-disable-next-line\n parsedPart.polygonIndices.value.subarray(1).map((x) => x + positionCounter),\n polygonIndicesCounter\n );\n\n positionCounter += parsedPart.positions.value.length / positionSize;\n primitivePolygonIndicesCounter += parsedPart.primitivePolygonIndices.value.length - 1;\n polygonIndicesCounter += parsedPart.polygonIndices.value.length - 1;\n }\n\n return {\n positions: {value: concatPositions, size: positionSize},\n primitivePolygonIndices: {value: concatPrimitivePolygonIndices, size: 1},\n polygonIndices: {value: concatPolygonIndices, size: 1}\n };\n}\n\n// Combine xy and z arrays\nfunction blitArrays(xy, z) {\n if (!z) {\n return {value: xy, size: 2};\n }\n\n if (z.length * 2 !== xy.length) {\n throw new Error('Z array must be half XY array\\'s length');\n }\n const totalLength = xy.length + z.length;\n\n const xyz = new Float64Array(totalLength);\n for (let i = 0; i < xy.length / 2; i++) {\n xyz[i * 3 + 0] = xy[i * 2 + 0];\n xyz[i * 3 + 1] = xy[i * 2 + 1];\n xyz[i * 3 + 2] = z[i];\n }\n return {value: xyz, size: 3};\n}\n\nexport function fromGeometry(geometry, type) {\n switch (type) {\n case GeometryType.Point:\n case GeometryType.MultiPoint:\n return parsePoint(geometry);\n case GeometryType.LineString:\n case GeometryType.MultiLineString:\n return parseLines(geometry);\n case GeometryType.Polygon:\n return parsePolygons(geometry);\n case GeometryType.MultiPolygon:\n return parseMultiPolygons(geometry);\n default:\n throw new Error(`Unimplemented geometry type: ${type}`);\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"binary-geometries.js","names":["fgbToBinaryFeature","geometry","type","fgbGeometry","fgbToBinaryGeometry","GeometryType","Point","MultiPoint","parsePoint","LineString","MultiLineString","parseLines","Polygon","parsePolygons","MultiPolygon","parseMultiPolygons","Error","xy","xyArray","z","zArray","positions","blitArrays","ends","endsArray","Array","from","length","unshift","pathIndices","value","Uint16Array","size","primitivePolygonIndices","polygonIndices","parsedParts","nPositions","nPrimitivePolygonIndices","nPolygonIndices","i","partsLength","part","parts","polygon","push","concatPositions","Float64Array","concatPrimitivePolygonIndices","Uint32Array","concatPolygonIndices","positionCounter","primitivePolygonIndicesCounter","polygonIndicesCounter","positionSize","parsedPart","set","subarray","map","x","totalLength","xyz"],"sources":["../../src/lib/binary-geometries.ts"],"sourcesContent":["// loaders.gl, MIT license\n\nimport {Geometry as FGBGeometry, Feature as FGBFeature} from 'flatgeobuf';\n// import {GeometryType} from 'flatgeobuf/generic';\n// Copy geometry type as it is hard to access the export\nexport declare enum GeometryType {\n Unknown = 0,\n Point = 1,\n LineString = 2,\n Polygon = 3,\n MultiPoint = 4,\n MultiLineString = 5,\n MultiPolygon = 6,\n GeometryCollection = 7,\n CircularString = 8,\n CompoundCurve = 9,\n CurvePolygon = 10,\n MultiCurve = 11,\n MultiSurface = 12,\n Curve = 13,\n Surface = 14,\n PolyhedralSurface = 15,\n TIN = 16,\n Triangle = 17\n}\n\nexport function fgbToBinaryFeature(geometry: FGBFeature | null, type: GeometryType) {\n const fgbGeometry: FGBGeometry | null = geometry?.geometry() || null;\n return fgbToBinaryGeometry(fgbGeometry, type);\n}\n\nexport function fgbToBinaryGeometry(geometry: FGBGeometry | null, type: GeometryType) {\n if (geometry === null) {\n return null;\n }\n switch (type) {\n case GeometryType.Point:\n case GeometryType.MultiPoint:\n return parsePoint(geometry);\n case GeometryType.LineString:\n case GeometryType.MultiLineString:\n return parseLines(geometry);\n case GeometryType.Polygon:\n return parsePolygons(geometry);\n case GeometryType.MultiPolygon:\n return parseMultiPolygons(geometry);\n default:\n throw new Error(`Unimplemented geometry type: ${type}`);\n }\n}\n\n// Parse Point to flat array\nfunction parsePoint(geometry: FGBGeometry) {\n const xy = geometry.xyArray();\n const z = geometry.zArray();\n // @ts-expect-error TODO handle null geometries\n const positions = blitArrays(xy, z);\n return {positions};\n}\n\nfunction parseLines(geometry: FGBGeometry) {\n const xy = geometry.xyArray();\n const z = geometry.zArray();\n const positions = blitArrays(xy!, z!);\n\n // If endsArray is null, a single LineString. Otherwise, contains the end\n // indices of each part of the MultiLineString. geometry.endsArray() omits the\n // initial 0 that we have in our internal format.\n // @ts-expect-error TODO handle null geometries\n const ends = (geometry.endsArray() && Array.from(geometry.endsArray())) || [xy.length / 2];\n ends.unshift(0);\n\n const pathIndices = {value: new Uint16Array(ends), size: 1};\n\n return {\n positions,\n pathIndices\n };\n}\n\nfunction parsePolygons(geometry: FGBGeometry) {\n const xy = geometry.xyArray();\n const z = geometry.zArray();\n // @ts-expect-error TODO handle null geometries\n const positions = blitArrays(xy, z);\n\n // If endsArray is null, a simple Polygon with no inner rings. Otherwise,\n // contains the end indices of each ring of the Polygon. geometry.endsArray()\n // omits the initial 0 that we have in our internal format.\n // @ts-expect-error TODO handle null geometries\n const ends = (geometry.endsArray() && Array.from(geometry.endsArray())) || [xy.length / 2];\n ends.unshift(0);\n\n const primitivePolygonIndices = {value: new Uint16Array(ends), size: 1};\n const polygonIndices = {value: new Uint16Array([0, xy!.length / 2]), size: 1};\n\n return {\n positions,\n primitivePolygonIndices,\n polygonIndices\n };\n}\n\n// eslint-disable-next-line max-statements\nfunction parseMultiPolygons(geometry: FGBGeometry) {\n // Create arrays for each geometry part, then concatenate\n const parsedParts: any[] = [];\n let nPositions = 0;\n let nPrimitivePolygonIndices = 1;\n let nPolygonIndices = 1;\n\n for (let i = 0; i < geometry.partsLength(); i++) {\n const part = geometry.parts(i);\n // @ts-expect-error TODO handle null geometries\n const polygon = parsePolygons(part);\n\n nPositions += polygon.positions.value.length;\n nPrimitivePolygonIndices += polygon.primitivePolygonIndices.value.length - 1;\n nPolygonIndices += polygon.polygonIndices.value.length - 1;\n\n parsedParts.push(polygon);\n }\n\n const concatPositions = new Float64Array(nPositions);\n const concatPrimitivePolygonIndices = new Uint32Array(nPrimitivePolygonIndices);\n const concatPolygonIndices = new Uint32Array(nPolygonIndices);\n\n let positionCounter = 0;\n let primitivePolygonIndicesCounter = 1;\n let polygonIndicesCounter = 1;\n\n // Assumes all parts of the multipolygon have the same size\n const positionSize = parsedParts[0].positions.size;\n\n for (const parsedPart of parsedParts) {\n concatPositions.set(parsedPart.positions.value, positionCounter * positionSize);\n\n // For indices, need to add positionCounter so that position indices are\n // correct in the concatenated positions\n concatPrimitivePolygonIndices.set(\n // eslint-disable-next-line\n parsedPart.primitivePolygonIndices.value.subarray(1).map((x) => x + positionCounter),\n primitivePolygonIndicesCounter\n );\n concatPolygonIndices.set(\n // eslint-disable-next-line\n parsedPart.polygonIndices.value.subarray(1).map((x) => x + positionCounter),\n polygonIndicesCounter\n );\n\n positionCounter += parsedPart.positions.value.length / positionSize;\n primitivePolygonIndicesCounter += parsedPart.primitivePolygonIndices.value.length - 1;\n polygonIndicesCounter += parsedPart.polygonIndices.value.length - 1;\n }\n\n return {\n positions: {value: concatPositions, size: positionSize},\n primitivePolygonIndices: {value: concatPrimitivePolygonIndices, size: 1},\n polygonIndices: {value: concatPolygonIndices, size: 1}\n };\n}\n\n// Combine xy and z arrays\nfunction blitArrays(xy: Float64Array, z: Float64Array): {value: Float64Array; size: number} {\n if (!z) {\n return {value: xy, size: 2};\n }\n\n if (z.length * 2 !== xy.length) {\n throw new Error('Z array must be half XY array\\'s length');\n }\n const totalLength = xy.length + z.length;\n\n const xyz = new Float64Array(totalLength);\n for (let i = 0; i < xy.length / 2; i++) {\n xyz[i * 3 + 0] = xy[i * 2 + 0];\n xyz[i * 3 + 1] = xy[i * 2 + 1];\n xyz[i * 3 + 2] = z[i];\n }\n return {value: xyz, size: 3};\n}\n"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { FlatGeobufLoaderOptions } from '../flatgeobuf-loader';
|
|
2
2
|
import type { Table } from '@loaders.gl/schema';
|
|
3
3
|
export declare function parseFlatGeobuf(arrayBuffer: ArrayBuffer, options?: FlatGeobufLoaderOptions): Table;
|
|
4
|
-
export declare function parseFlatGeobufInBatches(stream: any, options: FlatGeobufLoaderOptions): any[] | AsyncGenerator<import("flatgeobuf
|
|
4
|
+
export declare function parseFlatGeobufInBatches(stream: any, options: FlatGeobufLoaderOptions): any[] | AsyncGenerator<import("flatgeobuf").IFeature, any, unknown> | AsyncGenerator<any, void, unknown>;
|
|
5
5
|
//# 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":"
|
|
1
|
+
{"version":3,"file":"parse-flatgeobuf.d.ts","sourceRoot":"","sources":["../../src/lib/parse-flatgeobuf.ts"],"names":[],"mappings":"AAKA,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,13 +1,15 @@
|
|
|
1
1
|
import { Proj4Projection } from '@math.gl/proj4';
|
|
2
2
|
import { transformGeoJsonCoords } from '@loaders.gl/gis';
|
|
3
|
-
import {
|
|
4
|
-
import
|
|
5
|
-
import
|
|
6
|
-
import {
|
|
3
|
+
import { fgbToBinaryGeometry } from "./binary-geometries.js";
|
|
4
|
+
import * as geojson from 'flatgeobuf/lib/mjs/geojson.js';
|
|
5
|
+
import * as generic from 'flatgeobuf/lib/mjs/generic.js';
|
|
6
|
+
import { parseProperties as parsePropertiesBinary } from 'flatgeobuf/lib/mjs/generic/feature';
|
|
7
|
+
const deserializeGeoJson = geojson.deserialize;
|
|
8
|
+
const deserializeGeneric = generic.deserialize;
|
|
7
9
|
function binaryFromFeature(feature, header) {
|
|
8
10
|
const geometry = feature.geometry();
|
|
9
|
-
const geometryType = header.geometryType || geometry.type();
|
|
10
|
-
const parsedGeometry =
|
|
11
|
+
const geometryType = header.geometryType || (geometry === null || geometry === void 0 ? void 0 : geometry.type());
|
|
12
|
+
const parsedGeometry = fgbToBinaryGeometry(geometry, geometryType);
|
|
11
13
|
parsedGeometry.properties = parsePropertiesBinary(feature, header.columns);
|
|
12
14
|
return parsedGeometry;
|
|
13
15
|
}
|
|
@@ -40,7 +42,7 @@ export function parseFlatGeobuf(arrayBuffer, options) {
|
|
|
40
42
|
function parseFlatGeobufToBinary(arrayBuffer) {
|
|
41
43
|
let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
42
44
|
const array = new Uint8Array(arrayBuffer);
|
|
43
|
-
return deserializeGeneric(array,
|
|
45
|
+
return deserializeGeneric(array, fgbToBinaryGeometry);
|
|
44
46
|
}
|
|
45
47
|
function parseFlatGeobufToGeoJSON(arrayBuffer) {
|
|
46
48
|
let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse-flatgeobuf.js","names":["Proj4Projection","transformGeoJsonCoords","deserialize","deserializeGeoJson","deserializeGeneric","parseProperties","parsePropertiesBinary","fromGeometry","binaryFromGeometry","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":["import {Proj4Projection} from '@math.gl/proj4';\nimport {transformGeoJsonCoords} from '@loaders.gl/gis';\n\nimport {deserialize as deserializeGeoJson} from 'flatgeobuf/lib/cjs/geojson';\nimport {deserialize as deserializeGeneric} from 'flatgeobuf/lib/cjs/generic';\nimport {parseProperties as parsePropertiesBinary} from 'flatgeobuf/lib/cjs/generic/feature';\n\nimport type {FlatGeobufLoaderOptions} from '../flatgeobuf-loader';\nimport type {GeoJSONTable, Feature, Table} from '@loaders.gl/schema';\nimport {fromGeometry as binaryFromGeometry} from './binary-geometries';\n// import {Feature} from 'flatgeobuf/lib/cjs/feature_generated';\n\n// TODO: reproject binary features\nfunction binaryFromFeature(feature, header) {\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 = binaryFromGeometry(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 this looks wrong\n return deserializeGeneric(array, binaryFromFeature);\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":"AAAA,SAAQA,eAAe,QAAO,gBAAgB;AAC9C,SAAQC,sBAAsB,QAAO,iBAAiB;AAEtD,SAAQC,WAAW,IAAIC,kBAAkB,QAAO,4BAA4B;AAC5E,SAAQD,WAAW,IAAIE,kBAAkB,QAAO,4BAA4B;AAC5E,SAAQC,eAAe,IAAIC,qBAAqB,QAAO,oCAAoC;AAAC,SAIpFC,YAAY,IAAIC,kBAAkB;AAI1C,SAASC,iBAAiBA,CAACC,OAAO,EAAEC,MAAM,EAAE;EAC1C,MAAMC,QAAQ,GAAGF,OAAO,CAACE,QAAQ,CAAC,CAAC;EAMnC,MAAMC,YAAY,GAAGF,MAAM,CAACE,YAAY,IAAID,QAAQ,CAACE,IAAI,CAAC,CAAC;EAC3D,MAAMC,cAAc,GAAGP,kBAAkB,CAACI,QAAQ,EAAEC,YAAY,CAAC;EAEjEE,cAAc,CAACC,UAAU,GAAGV,qBAAqB,CAACI,OAAO,EAAEC,MAAM,CAACM,OAAO,CAAC;EAG1E,OAAOF,cAAc;AACvB;AAQA,OAAO,SAASG,eAAeA,CAC7BC,WAAwB,EACxBC,OAAiC,EAC1B;EAAA,IAAAC,mBAAA;EACP,MAAMC,KAAK,GAAGF,OAAO,aAAPA,OAAO,wBAAAC,mBAAA,GAAPD,OAAO,CAAEG,UAAU,cAAAF,mBAAA,uBAAnBA,mBAAA,CAAqBC,KAAK;EAExC,QAAQA,KAAK;IACX,KAAK,eAAe;MAAE;QACpB,MAAME,QAAQ,GAAGC,wBAAwB,CAACN,WAAW,EAAEC,OAAO,CAAC;QAC/D,MAAMM,KAAmB,GAAG;UAC1BJ,KAAK,EAAE,eAAe;UACtBR,IAAI,EAAE,mBAAmB;UACzBU;QACF,CAAC;QACD,OAAOE,KAAK;MACd;IAEA,KAAK,gBAAgB;MACnB,MAAMC,MAAM,GAAGC,uBAAuB,CAACT,WAAW,EAAEC,OAAO,CAAC;MAE5D,OAAO;QAACE,KAAK,EAAE,gBAAgB;QAAEO,IAAI,EAAEF;MAAM,CAAC;IAEhD,KAAK,QAAQ;MAEX,OAAOC,uBAAuB,CAACT,WAAW,EAAEC,OAAO,CAAC;IAEtD;MACE,MAAM,IAAIU,KAAK,CAACR,KAAK,CAAC;EAC1B;AACF;AAEA,SAASM,uBAAuBA,CAACT,WAAwB,EAAyC;EAAA,IAAvCC,OAAgC,GAAAW,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAG,CAAC,CAAC;EAI9F,MAAMG,KAAK,GAAG,IAAIC,UAAU,CAAChB,WAAW,CAAC;EAEzC,OAAOf,kBAAkB,CAAC8B,KAAK,EAAEzB,iBAAiB,CAAC;AACrD;AAEA,SAASgB,wBAAwBA,CAC/BN,WAAwB,EAEb;EAAA,IADXC,OAAgC,GAAAW,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAG,CAAC,CAAC;EAErC,IAAIZ,WAAW,CAACiB,UAAU,KAAK,CAAC,EAAE;IAChC,OAAO,EAAE;EACX;EAEA,MAAM;IAACC,SAAS,GAAG,KAAK;IAAEC,UAAU,GAAG;EAAO,CAAC,GAAIlB,OAAO,IAAIA,OAAO,CAACmB,GAAG,IAAK,CAAC,CAAC;EAEhF,MAAMC,GAAG,GAAG,IAAIL,UAAU,CAAChB,WAAW,CAAC;EAEvC,IAAIsB,UAAU;EAEd,MAAM;IAACjB;EAAQ,CAAC,GAAGrB,kBAAkB,CAACqC,GAAG,EAAEP,SAAS,EAAGtB,MAAM,IAAK;IAChE8B,UAAU,GAAG9B,MAAM;EACrB,CAAC,CAAC;EAEF,MAAM+B,GAAG,GAAGD,UAAU,IAAIA,UAAU,CAACC,GAAG;EACxC,IAAIC,UAAU;EACd,IAAIN,SAAS,IAAIK,GAAG,EAAE;IAEpB,IAAI;MACFC,UAAU,GAAG,IAAI3C,eAAe,CAAC;QAAC4C,IAAI,EAAEF,GAAG,CAACG,GAAG;QAAEC,EAAE,EAAER;MAAU,CAAC,CAAC;IACnE,CAAC,CAAC,OAAOS,CAAC,EAAE,CAEZ;EACF;EAEA,IAAIJ,UAAU,EAAE;IACd,OAAO1C,sBAAsB,CAACuB,QAAQ,EAAGwB,MAAM,IAAKL,UAAU,CAACM,OAAO,CAACD,MAAM,CAAC,CAAC;EACjF;EAEA,OAAOxB,QAAQ;AACjB;AASA,OAAO,SAAS0B,wBAAwBA,CAACC,MAAM,EAAE/B,OAAgC,EAAE;EAAA,IAAAgC,oBAAA;EACjF,MAAM9B,KAAK,IAAA8B,oBAAA,GAAGhC,OAAO,CAACG,UAAU,cAAA6B,oBAAA,uBAAlBA,oBAAA,CAAoB9B,KAAK;EACvC,QAAQA,KAAK;IACX,KAAK,QAAQ;MACX,OAAO+B,gCAAgC,CAACF,MAAM,EAAE/B,OAAO,CAAC;IAC1D,KAAK,eAAe;MAClB,OAAOkC,iCAAiC,CAACH,MAAM,EAAE/B,OAAO,CAAC;IAC3D;MACE,MAAM,IAAIU,KAAK,CAACR,KAAK,CAAC;EAC1B;AACF;AAEA,SAAS+B,gCAAgCA,CAACF,MAAM,EAAE/B,OAAgC,EAAE;EAKlF,MAAMmC,QAAQ,GAAGnD,kBAAkB,CAAC+C,MAAM,EAAE1C,iBAAiB,CAAC;EAC9D,OAAO8C,QAAQ;AACjB;AAGA,gBAAgBD,iCAAiCA,CAACH,MAAM,EAAE/B,OAAgC,EAAE;EAC1F,MAAM;IAACiB,SAAS,GAAG,KAAK;IAAEC,UAAU,GAAG;EAAO,CAAC,GAAIlB,OAAO,IAAIA,OAAO,CAACmB,GAAG,IAAK,CAAC,CAAC;EAEhF,IAAIE,UAAU;EACd,MAAMc,QAAQ,GAAGpD,kBAAkB,CAACgD,MAAM,EAAElB,SAAS,EAAGtB,MAAM,IAAK;IACjE8B,UAAU,GAAG9B,MAAM;EACrB,CAAC,CAAC;EAEF,IAAIgC,UAAU;EACd,IAAIa,WAAW,GAAG,IAAI;EAEtB,WAAW,MAAM9C,OAAO,IAAI6C,QAAQ,EAAE;IACpC,IAAIC,WAAW,EAAE;MACf,MAAMd,GAAG,GAAGD,UAAU,IAAIA,UAAU,CAACC,GAAG;MACxC,IAAIL,SAAS,IAAIK,GAAG,EAAE;QACpBC,UAAU,GAAG,IAAI3C,eAAe,CAAC;UAAC4C,IAAI,EAAEF,GAAG,CAACG,GAAG;UAAEC,EAAE,EAAER;QAAU,CAAC,CAAC;MACnE;MAEAkB,WAAW,GAAG,KAAK;IACrB;IAEA,IAAInB,SAAS,IAAIM,UAAU,EAAE;MAE3B,MAAM1C,sBAAsB,CAAC,CAACS,OAAO,CAAC,EAAGsC,MAAM,IAAKL,UAAU,CAACM,OAAO,CAACD,MAAM,CAAC,CAAC;IACjF,CAAC,MAAM;MACL,MAAMtC,OAAO;IACf;EACF;AACF"}
|
|
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\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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"}
|
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.0-beta.
|
|
4
|
+
"version": "4.0.0-beta.7",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"publishConfig": {
|
|
@@ -36,14 +36,14 @@
|
|
|
36
36
|
],
|
|
37
37
|
"scripts": {
|
|
38
38
|
"pre-build": "npm run build-worker && npm run build-worker --env.dev && npm run build-bundle && npm run build-bundle -- --env=dev",
|
|
39
|
-
"build-bundle": "ocular-bundle ./src/index.ts",
|
|
40
|
-
"build-worker": "esbuild src/workers/flatgeobuf-worker.ts --bundle --outfile=dist/flatgeobuf-worker.js --define:__VERSION__=\\\"$npm_package_version\\\""
|
|
39
|
+
"build-bundle": "# ocular-bundle ./src/index.ts",
|
|
40
|
+
"build-worker": "# esbuild src/workers/flatgeobuf-worker.ts --bundle --outfile=dist/flatgeobuf-worker.js --define:__VERSION__=\\\"$npm_package_version\\\""
|
|
41
41
|
},
|
|
42
42
|
"dependencies": {
|
|
43
|
-
"@loaders.gl/gis": "4.0.0-beta.
|
|
44
|
-
"@loaders.gl/loader-utils": "4.0.0-beta.
|
|
43
|
+
"@loaders.gl/gis": "4.0.0-beta.7",
|
|
44
|
+
"@loaders.gl/loader-utils": "4.0.0-beta.7",
|
|
45
45
|
"@math.gl/proj4": "^4.0.0",
|
|
46
|
-
"flatgeobuf": "3.
|
|
46
|
+
"flatgeobuf": "3.27.0"
|
|
47
47
|
},
|
|
48
|
-
"gitHead": "
|
|
48
|
+
"gitHead": "5b6cab0ab5d73212cfa37fa5da6e25ad7ef83fe5"
|
|
49
49
|
}
|
|
@@ -1,21 +1,72 @@
|
|
|
1
|
-
|
|
1
|
+
// loaders.gl, MIT license
|
|
2
|
+
|
|
3
|
+
import {Geometry as FGBGeometry, Feature as FGBFeature} from 'flatgeobuf';
|
|
4
|
+
// import {GeometryType} from 'flatgeobuf/generic';
|
|
5
|
+
// Copy geometry type as it is hard to access the export
|
|
6
|
+
export declare enum GeometryType {
|
|
7
|
+
Unknown = 0,
|
|
8
|
+
Point = 1,
|
|
9
|
+
LineString = 2,
|
|
10
|
+
Polygon = 3,
|
|
11
|
+
MultiPoint = 4,
|
|
12
|
+
MultiLineString = 5,
|
|
13
|
+
MultiPolygon = 6,
|
|
14
|
+
GeometryCollection = 7,
|
|
15
|
+
CircularString = 8,
|
|
16
|
+
CompoundCurve = 9,
|
|
17
|
+
CurvePolygon = 10,
|
|
18
|
+
MultiCurve = 11,
|
|
19
|
+
MultiSurface = 12,
|
|
20
|
+
Curve = 13,
|
|
21
|
+
Surface = 14,
|
|
22
|
+
PolyhedralSurface = 15,
|
|
23
|
+
TIN = 16,
|
|
24
|
+
Triangle = 17
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export function fgbToBinaryFeature(geometry: FGBFeature | null, type: GeometryType) {
|
|
28
|
+
const fgbGeometry: FGBGeometry | null = geometry?.geometry() || null;
|
|
29
|
+
return fgbToBinaryGeometry(fgbGeometry, type);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export function fgbToBinaryGeometry(geometry: FGBGeometry | null, type: GeometryType) {
|
|
33
|
+
if (geometry === null) {
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
switch (type) {
|
|
37
|
+
case GeometryType.Point:
|
|
38
|
+
case GeometryType.MultiPoint:
|
|
39
|
+
return parsePoint(geometry);
|
|
40
|
+
case GeometryType.LineString:
|
|
41
|
+
case GeometryType.MultiLineString:
|
|
42
|
+
return parseLines(geometry);
|
|
43
|
+
case GeometryType.Polygon:
|
|
44
|
+
return parsePolygons(geometry);
|
|
45
|
+
case GeometryType.MultiPolygon:
|
|
46
|
+
return parseMultiPolygons(geometry);
|
|
47
|
+
default:
|
|
48
|
+
throw new Error(`Unimplemented geometry type: ${type}`);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
2
51
|
|
|
3
52
|
// Parse Point to flat array
|
|
4
|
-
function parsePoint(geometry) {
|
|
53
|
+
function parsePoint(geometry: FGBGeometry) {
|
|
5
54
|
const xy = geometry.xyArray();
|
|
6
55
|
const z = geometry.zArray();
|
|
56
|
+
// @ts-expect-error TODO handle null geometries
|
|
7
57
|
const positions = blitArrays(xy, z);
|
|
8
58
|
return {positions};
|
|
9
59
|
}
|
|
10
60
|
|
|
11
|
-
function parseLines(geometry) {
|
|
61
|
+
function parseLines(geometry: FGBGeometry) {
|
|
12
62
|
const xy = geometry.xyArray();
|
|
13
63
|
const z = geometry.zArray();
|
|
14
|
-
const positions = blitArrays(xy
|
|
64
|
+
const positions = blitArrays(xy!, z!);
|
|
15
65
|
|
|
16
66
|
// If endsArray is null, a single LineString. Otherwise, contains the end
|
|
17
67
|
// indices of each part of the MultiLineString. geometry.endsArray() omits the
|
|
18
68
|
// initial 0 that we have in our internal format.
|
|
69
|
+
// @ts-expect-error TODO handle null geometries
|
|
19
70
|
const ends = (geometry.endsArray() && Array.from(geometry.endsArray())) || [xy.length / 2];
|
|
20
71
|
ends.unshift(0);
|
|
21
72
|
|
|
@@ -27,19 +78,21 @@ function parseLines(geometry) {
|
|
|
27
78
|
};
|
|
28
79
|
}
|
|
29
80
|
|
|
30
|
-
function parsePolygons(geometry) {
|
|
81
|
+
function parsePolygons(geometry: FGBGeometry) {
|
|
31
82
|
const xy = geometry.xyArray();
|
|
32
83
|
const z = geometry.zArray();
|
|
84
|
+
// @ts-expect-error TODO handle null geometries
|
|
33
85
|
const positions = blitArrays(xy, z);
|
|
34
86
|
|
|
35
87
|
// If endsArray is null, a simple Polygon with no inner rings. Otherwise,
|
|
36
88
|
// contains the end indices of each ring of the Polygon. geometry.endsArray()
|
|
37
89
|
// omits the initial 0 that we have in our internal format.
|
|
90
|
+
// @ts-expect-error TODO handle null geometries
|
|
38
91
|
const ends = (geometry.endsArray() && Array.from(geometry.endsArray())) || [xy.length / 2];
|
|
39
92
|
ends.unshift(0);
|
|
40
93
|
|
|
41
94
|
const primitivePolygonIndices = {value: new Uint16Array(ends), size: 1};
|
|
42
|
-
const polygonIndices = {value: new Uint16Array([0, xy
|
|
95
|
+
const polygonIndices = {value: new Uint16Array([0, xy!.length / 2]), size: 1};
|
|
43
96
|
|
|
44
97
|
return {
|
|
45
98
|
positions,
|
|
@@ -49,7 +102,7 @@ function parsePolygons(geometry) {
|
|
|
49
102
|
}
|
|
50
103
|
|
|
51
104
|
// eslint-disable-next-line max-statements
|
|
52
|
-
function parseMultiPolygons(geometry) {
|
|
105
|
+
function parseMultiPolygons(geometry: FGBGeometry) {
|
|
53
106
|
// Create arrays for each geometry part, then concatenate
|
|
54
107
|
const parsedParts: any[] = [];
|
|
55
108
|
let nPositions = 0;
|
|
@@ -58,6 +111,7 @@ function parseMultiPolygons(geometry) {
|
|
|
58
111
|
|
|
59
112
|
for (let i = 0; i < geometry.partsLength(); i++) {
|
|
60
113
|
const part = geometry.parts(i);
|
|
114
|
+
// @ts-expect-error TODO handle null geometries
|
|
61
115
|
const polygon = parsePolygons(part);
|
|
62
116
|
|
|
63
117
|
nPositions += polygon.positions.value.length;
|
|
@@ -107,7 +161,7 @@ function parseMultiPolygons(geometry) {
|
|
|
107
161
|
}
|
|
108
162
|
|
|
109
163
|
// Combine xy and z arrays
|
|
110
|
-
function blitArrays(xy, z) {
|
|
164
|
+
function blitArrays(xy: Float64Array, z: Float64Array): {value: Float64Array; size: number} {
|
|
111
165
|
if (!z) {
|
|
112
166
|
return {value: xy, size: 2};
|
|
113
167
|
}
|
|
@@ -125,20 +179,3 @@ function blitArrays(xy, z) {
|
|
|
125
179
|
}
|
|
126
180
|
return {value: xyz, size: 3};
|
|
127
181
|
}
|
|
128
|
-
|
|
129
|
-
export function fromGeometry(geometry, type) {
|
|
130
|
-
switch (type) {
|
|
131
|
-
case GeometryType.Point:
|
|
132
|
-
case GeometryType.MultiPoint:
|
|
133
|
-
return parsePoint(geometry);
|
|
134
|
-
case GeometryType.LineString:
|
|
135
|
-
case GeometryType.MultiLineString:
|
|
136
|
-
return parseLines(geometry);
|
|
137
|
-
case GeometryType.Polygon:
|
|
138
|
-
return parsePolygons(geometry);
|
|
139
|
-
case GeometryType.MultiPolygon:
|
|
140
|
-
return parseMultiPolygons(geometry);
|
|
141
|
-
default:
|
|
142
|
-
throw new Error(`Unimplemented geometry type: ${type}`);
|
|
143
|
-
}
|
|
144
|
-
}
|
|
@@ -1,25 +1,30 @@
|
|
|
1
|
+
// loaders.gl, MIT license
|
|
2
|
+
|
|
1
3
|
import {Proj4Projection} from '@math.gl/proj4';
|
|
2
4
|
import {transformGeoJsonCoords} from '@loaders.gl/gis';
|
|
3
5
|
|
|
4
|
-
import {deserialize as deserializeGeoJson} from 'flatgeobuf/lib/cjs/geojson';
|
|
5
|
-
import {deserialize as deserializeGeneric} from 'flatgeobuf/lib/cjs/generic';
|
|
6
|
-
import {parseProperties as parsePropertiesBinary} from 'flatgeobuf/lib/cjs/generic/feature';
|
|
7
|
-
|
|
8
6
|
import type {FlatGeobufLoaderOptions} from '../flatgeobuf-loader';
|
|
9
7
|
import type {GeoJSONTable, Feature, Table} from '@loaders.gl/schema';
|
|
10
|
-
import {
|
|
11
|
-
|
|
8
|
+
import {fgbToBinaryGeometry} from './binary-geometries';
|
|
9
|
+
|
|
10
|
+
import {Feature as FBGFeature, HeaderMeta as FGBHeader} from 'flatgeobuf';
|
|
11
|
+
import * as geojson from 'flatgeobuf/lib/mjs/geojson.js';
|
|
12
|
+
import * as generic from 'flatgeobuf/lib/mjs/generic.js';
|
|
13
|
+
import {parseProperties as parsePropertiesBinary} from 'flatgeobuf/lib/mjs/generic/feature';
|
|
14
|
+
const deserializeGeoJson = geojson.deserialize;
|
|
15
|
+
const deserializeGeneric = generic.deserialize;
|
|
16
|
+
// const parsePropertiesBinary = FlatgeobufFeature.parseProperties;
|
|
12
17
|
|
|
13
18
|
// TODO: reproject binary features
|
|
14
|
-
function binaryFromFeature(feature, header) {
|
|
19
|
+
function binaryFromFeature(feature: FBGFeature, header: FGBHeader) {
|
|
15
20
|
const geometry = feature.geometry();
|
|
16
21
|
|
|
17
22
|
// FlatGeobuf files can only hold a single geometry type per file, otherwise
|
|
18
23
|
// GeometryType is GeometryCollection
|
|
19
24
|
// I believe geometry.type() is null (0) except when the geometry type isn't
|
|
20
25
|
// known in the header?
|
|
21
|
-
const geometryType = header.geometryType || geometry
|
|
22
|
-
const parsedGeometry =
|
|
26
|
+
const geometryType = header.geometryType || geometry?.type();
|
|
27
|
+
const parsedGeometry = fgbToBinaryGeometry(geometry, geometryType!);
|
|
23
28
|
// @ts-expect-error this looks wrong
|
|
24
29
|
parsedGeometry.properties = parsePropertiesBinary(feature, header.columns);
|
|
25
30
|
|
|
@@ -69,8 +74,8 @@ function parseFlatGeobufToBinary(arrayBuffer: ArrayBuffer, options: FlatGeobufLo
|
|
|
69
74
|
// const {reproject = false, _targetCrs = 'WGS84'} = (options && options.gis) || {};
|
|
70
75
|
|
|
71
76
|
const array = new Uint8Array(arrayBuffer);
|
|
72
|
-
// @ts-expect-error
|
|
73
|
-
return deserializeGeneric(array,
|
|
77
|
+
// @ts-expect-error
|
|
78
|
+
return deserializeGeneric(array, fgbToBinaryGeometry);
|
|
74
79
|
}
|
|
75
80
|
|
|
76
81
|
function parseFlatGeobufToGeoJSON(
|