@loaders.gl/wkt 3.1.3 → 4.0.0-alpha.5

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.
Files changed (86) hide show
  1. package/dist/bundle.js +2 -2
  2. package/dist/bundle.js.map +1 -0
  3. package/dist/index.js +5 -13
  4. package/dist/index.js.map +1 -0
  5. package/dist/lib/encode-wkb.js +278 -245
  6. package/dist/lib/encode-wkb.js.map +1 -0
  7. package/dist/lib/encode-wkt.js +41 -35
  8. package/dist/lib/encode-wkt.js.map +1 -0
  9. package/dist/lib/parse-wkb.js +276 -208
  10. package/dist/lib/parse-wkb.js.map +1 -0
  11. package/dist/lib/parse-wkt.js +189 -218
  12. package/dist/lib/parse-wkt.js.map +1 -0
  13. package/dist/lib/utils/binary-writer.js +150 -117
  14. package/dist/lib/utils/binary-writer.js.map +1 -0
  15. package/dist/lib/utils/version.js +2 -7
  16. package/dist/lib/utils/version.js.map +1 -0
  17. package/dist/wkb-loader.js +20 -32
  18. package/dist/wkb-loader.js.map +1 -0
  19. package/dist/wkb-writer.js +13 -22
  20. package/dist/wkb-writer.js.map +1 -0
  21. package/dist/wkt-loader.js +19 -31
  22. package/dist/wkt-loader.js.map +1 -0
  23. package/dist/wkt-worker.js +1 -1
  24. package/dist/wkt-writer.js +13 -22
  25. package/dist/wkt-writer.js.map +1 -0
  26. package/dist/workers/wkb-worker.js +4 -5
  27. package/dist/workers/wkb-worker.js.map +1 -0
  28. package/dist/workers/wkt-worker.js +4 -5
  29. package/dist/workers/wkt-worker.js.map +1 -0
  30. package/package.json +7 -7
  31. package/dist/es5/bundle.js +0 -7
  32. package/dist/es5/bundle.js.map +0 -1
  33. package/dist/es5/index.js +0 -50
  34. package/dist/es5/index.js.map +0 -1
  35. package/dist/es5/lib/encode-wkb.js +0 -468
  36. package/dist/es5/lib/encode-wkb.js.map +0 -1
  37. package/dist/es5/lib/encode-wkt.js +0 -59
  38. package/dist/es5/lib/encode-wkt.js.map +0 -1
  39. package/dist/es5/lib/parse-wkb.js +0 -347
  40. package/dist/es5/lib/parse-wkb.js.map +0 -1
  41. package/dist/es5/lib/parse-wkt.js +0 -205
  42. package/dist/es5/lib/parse-wkt.js.map +0 -1
  43. package/dist/es5/lib/utils/binary-writer.js +0 -186
  44. package/dist/es5/lib/utils/binary-writer.js.map +0 -1
  45. package/dist/es5/lib/utils/version.js +0 -9
  46. package/dist/es5/lib/utils/version.js.map +0 -1
  47. package/dist/es5/wkb-loader.js +0 -70
  48. package/dist/es5/wkb-loader.js.map +0 -1
  49. package/dist/es5/wkb-writer.js +0 -26
  50. package/dist/es5/wkb-writer.js.map +0 -1
  51. package/dist/es5/wkt-loader.js +0 -67
  52. package/dist/es5/wkt-loader.js.map +0 -1
  53. package/dist/es5/wkt-writer.js +0 -26
  54. package/dist/es5/wkt-writer.js.map +0 -1
  55. package/dist/es5/workers/wkb-worker.js +0 -8
  56. package/dist/es5/workers/wkb-worker.js.map +0 -1
  57. package/dist/es5/workers/wkt-worker.js +0 -8
  58. package/dist/es5/workers/wkt-worker.js.map +0 -1
  59. package/dist/esm/bundle.js +0 -5
  60. package/dist/esm/bundle.js.map +0 -1
  61. package/dist/esm/index.js +0 -5
  62. package/dist/esm/index.js.map +0 -1
  63. package/dist/esm/lib/encode-wkb.js +0 -323
  64. package/dist/esm/lib/encode-wkb.js.map +0 -1
  65. package/dist/esm/lib/encode-wkt.js +0 -52
  66. package/dist/esm/lib/encode-wkt.js.map +0 -1
  67. package/dist/esm/lib/parse-wkb.js +0 -304
  68. package/dist/esm/lib/parse-wkb.js.map +0 -1
  69. package/dist/esm/lib/parse-wkt.js +0 -198
  70. package/dist/esm/lib/parse-wkt.js.map +0 -1
  71. package/dist/esm/lib/utils/binary-writer.js +0 -153
  72. package/dist/esm/lib/utils/binary-writer.js.map +0 -1
  73. package/dist/esm/lib/utils/version.js +0 -2
  74. package/dist/esm/lib/utils/version.js.map +0 -1
  75. package/dist/esm/wkb-loader.js +0 -22
  76. package/dist/esm/wkb-loader.js.map +0 -1
  77. package/dist/esm/wkb-writer.js +0 -14
  78. package/dist/esm/wkb-writer.js.map +0 -1
  79. package/dist/esm/wkt-loader.js +0 -21
  80. package/dist/esm/wkt-loader.js.map +0 -1
  81. package/dist/esm/wkt-writer.js +0 -14
  82. package/dist/esm/wkt-writer.js.map +0 -1
  83. package/dist/esm/workers/wkb-worker.js +0 -4
  84. package/dist/esm/workers/wkb-worker.js.map +0 -1
  85. package/dist/esm/workers/wkt-worker.js +0 -4
  86. package/dist/esm/workers/wkt-worker.js.map +0 -1
@@ -1,236 +1,304 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
1
  const NUM_DIMENSIONS = {
4
- 0: 2,
5
- 1: 3,
6
- 2: 3,
7
- 3: 4 // 4D (ZM)
2
+ 0: 2,
3
+ 1: 3,
4
+ 2: 3,
5
+ 3: 4
8
6
  };
9
- function parseWKB(arrayBuffer) {
10
- const view = new DataView(arrayBuffer);
11
- let offset = 0;
12
- // Check endianness of data
13
- const littleEndian = view.getUint8(offset) === 1;
14
- offset++;
15
- // 4-digit code representing dimension and type of geometry
16
- const geometryCode = view.getUint32(offset, littleEndian);
17
- offset += 4;
18
- const geometryType = geometryCode % 1000;
19
- const type = ((geometryCode - geometryType) / 1000);
20
- const dimension = NUM_DIMENSIONS[type];
21
- switch (geometryType) {
22
- case 1:
23
- const point = parsePoint(view, offset, dimension, littleEndian);
24
- return point.geometry;
25
- case 2:
26
- const line = parseLineString(view, offset, dimension, littleEndian);
27
- return line.geometry;
28
- case 3:
29
- const polygon = parsePolygon(view, offset, dimension, littleEndian);
30
- return polygon.geometry;
31
- case 4:
32
- const multiPoint = parseMultiPoint(view, offset, dimension, littleEndian);
33
- multiPoint.type = 'Point';
34
- return multiPoint;
35
- case 5:
36
- const multiLine = parseMultiLineString(view, offset, dimension, littleEndian);
37
- multiLine.type = 'LineString';
38
- return multiLine;
39
- case 6:
40
- const multiPolygon = parseMultiPolygon(view, offset, dimension, littleEndian);
41
- multiPolygon.type = 'Polygon';
42
- return multiPolygon;
43
- // case 7:
44
- // TODO: handle GeometryCollections
45
- // return parseGeometryCollection(view, offset, dimension, littleEndian);
46
- default:
47
- throw new Error(`WKB: Unsupported geometry type: ${geometryType}`);
48
- }
7
+ export default function parseWKB(arrayBuffer) {
8
+ const view = new DataView(arrayBuffer);
9
+ let offset = 0;
10
+ const littleEndian = view.getUint8(offset) === 1;
11
+ offset++;
12
+ const geometryCode = view.getUint32(offset, littleEndian);
13
+ offset += 4;
14
+ const geometryType = geometryCode % 1000;
15
+ const type = (geometryCode - geometryType) / 1000;
16
+ const dimension = NUM_DIMENSIONS[type];
17
+
18
+ switch (geometryType) {
19
+ case 1:
20
+ const point = parsePoint(view, offset, dimension, littleEndian);
21
+ return point.geometry;
22
+
23
+ case 2:
24
+ const line = parseLineString(view, offset, dimension, littleEndian);
25
+ return line.geometry;
26
+
27
+ case 3:
28
+ const polygon = parsePolygon(view, offset, dimension, littleEndian);
29
+ return polygon.geometry;
30
+
31
+ case 4:
32
+ const multiPoint = parseMultiPoint(view, offset, dimension, littleEndian);
33
+ multiPoint.type = 'Point';
34
+ return multiPoint;
35
+
36
+ case 5:
37
+ const multiLine = parseMultiLineString(view, offset, dimension, littleEndian);
38
+ multiLine.type = 'LineString';
39
+ return multiLine;
40
+
41
+ case 6:
42
+ const multiPolygon = parseMultiPolygon(view, offset, dimension, littleEndian);
43
+ multiPolygon.type = 'Polygon';
44
+ return multiPolygon;
45
+
46
+ default:
47
+ throw new Error("WKB: Unsupported geometry type: ".concat(geometryType));
48
+ }
49
49
  }
50
- exports.default = parseWKB;
51
- // Primitives; parse point and linear ring
50
+
52
51
  function parsePoint(view, offset, dimension, littleEndian) {
53
- const positions = new Float64Array(dimension);
54
- for (let i = 0; i < dimension; i++) {
55
- positions[i] = view.getFloat64(offset, littleEndian);
56
- offset += 8;
57
- }
58
- return {
59
- geometry: { type: 'Point', positions: { value: positions, size: dimension } },
60
- offset
61
- };
52
+ const positions = new Float64Array(dimension);
53
+
54
+ for (let i = 0; i < dimension; i++) {
55
+ positions[i] = view.getFloat64(offset, littleEndian);
56
+ offset += 8;
57
+ }
58
+
59
+ return {
60
+ geometry: {
61
+ type: 'Point',
62
+ positions: {
63
+ value: positions,
64
+ size: dimension
65
+ }
66
+ },
67
+ offset
68
+ };
62
69
  }
70
+
63
71
  function parseLineString(view, offset, dimension, littleEndian) {
64
- const nPoints = view.getUint32(offset, littleEndian);
65
- offset += 4;
66
- // Instantiate array
67
- const positions = new Float64Array(nPoints * dimension);
68
- for (let i = 0; i < nPoints * dimension; i++) {
69
- positions[i] = view.getFloat64(offset, littleEndian);
70
- offset += 8;
71
- }
72
- const pathIndices = [0];
73
- if (nPoints > 0) {
74
- pathIndices.push(nPoints);
75
- }
76
- return {
77
- geometry: {
78
- type: 'LineString',
79
- positions: { value: positions, size: dimension },
80
- pathIndices: { value: new Uint16Array(pathIndices), size: 1 }
81
- },
82
- offset
83
- };
72
+ const nPoints = view.getUint32(offset, littleEndian);
73
+ offset += 4;
74
+ const positions = new Float64Array(nPoints * dimension);
75
+
76
+ for (let i = 0; i < nPoints * dimension; i++) {
77
+ positions[i] = view.getFloat64(offset, littleEndian);
78
+ offset += 8;
79
+ }
80
+
81
+ const pathIndices = [0];
82
+
83
+ if (nPoints > 0) {
84
+ pathIndices.push(nPoints);
85
+ }
86
+
87
+ return {
88
+ geometry: {
89
+ type: 'LineString',
90
+ positions: {
91
+ value: positions,
92
+ size: dimension
93
+ },
94
+ pathIndices: {
95
+ value: new Uint16Array(pathIndices),
96
+ size: 1
97
+ }
98
+ },
99
+ offset
100
+ };
84
101
  }
85
- // https://stackoverflow.com/a/55261098
86
- const cumulativeSum = (sum) => (value) => (sum += value);
102
+
103
+ const cumulativeSum = sum => value => sum += value;
104
+
87
105
  function parsePolygon(view, offset, dimension, littleEndian) {
88
- const nRings = view.getUint32(offset, littleEndian);
89
- offset += 4;
90
- const rings = [];
91
- for (let i = 0; i < nRings; i++) {
92
- const parsed = parseLineString(view, offset, dimension, littleEndian);
93
- const { positions } = parsed.geometry;
94
- offset = parsed.offset;
95
- rings.push(positions.value);
96
- }
97
- const concatenatedPositions = new Float64Array(concatTypedArrays(rings).buffer);
98
- const polygonIndices = [0];
99
- if (concatenatedPositions.length > 0) {
100
- polygonIndices.push(concatenatedPositions.length / dimension);
101
- }
102
- const primitivePolygonIndices = rings.map((l) => l.length / dimension).map(cumulativeSum(0));
103
- primitivePolygonIndices.unshift(0);
104
- return {
105
- geometry: {
106
- type: 'Polygon',
107
- positions: { value: concatenatedPositions, size: dimension },
108
- polygonIndices: {
109
- value: new Uint16Array(polygonIndices),
110
- size: 1
111
- },
112
- primitivePolygonIndices: { value: new Uint16Array(primitivePolygonIndices), size: 1 }
113
- },
114
- offset
115
- };
106
+ const nRings = view.getUint32(offset, littleEndian);
107
+ offset += 4;
108
+ const rings = [];
109
+
110
+ for (let i = 0; i < nRings; i++) {
111
+ const parsed = parseLineString(view, offset, dimension, littleEndian);
112
+ const {
113
+ positions
114
+ } = parsed.geometry;
115
+ offset = parsed.offset;
116
+ rings.push(positions.value);
117
+ }
118
+
119
+ const concatenatedPositions = new Float64Array(concatTypedArrays(rings).buffer);
120
+ const polygonIndices = [0];
121
+
122
+ if (concatenatedPositions.length > 0) {
123
+ polygonIndices.push(concatenatedPositions.length / dimension);
124
+ }
125
+
126
+ const primitivePolygonIndices = rings.map(l => l.length / dimension).map(cumulativeSum(0));
127
+ primitivePolygonIndices.unshift(0);
128
+ return {
129
+ geometry: {
130
+ type: 'Polygon',
131
+ positions: {
132
+ value: concatenatedPositions,
133
+ size: dimension
134
+ },
135
+ polygonIndices: {
136
+ value: new Uint16Array(polygonIndices),
137
+ size: 1
138
+ },
139
+ primitivePolygonIndices: {
140
+ value: new Uint16Array(primitivePolygonIndices),
141
+ size: 1
142
+ }
143
+ },
144
+ offset
145
+ };
116
146
  }
147
+
117
148
  function parseMultiPoint(view, offset, dimension, littleEndian) {
118
- const nPoints = view.getUint32(offset, littleEndian);
119
- offset += 4;
120
- const binaryPointGeometries = [];
121
- for (let i = 0; i < nPoints; i++) {
122
- // Byte order for point
123
- const littleEndianPoint = view.getUint8(offset) === 1;
124
- offset++;
125
- // Assert point type
126
- if (view.getUint32(offset, littleEndianPoint) % 1000 !== 1) {
127
- throw new Error('WKB: Inner geometries of MultiPoint not of type Point');
128
- }
129
- offset += 4;
130
- const parsed = parsePoint(view, offset, dimension, littleEndianPoint);
131
- offset = parsed.offset;
132
- binaryPointGeometries.push(parsed.geometry);
149
+ const nPoints = view.getUint32(offset, littleEndian);
150
+ offset += 4;
151
+ const binaryPointGeometries = [];
152
+
153
+ for (let i = 0; i < nPoints; i++) {
154
+ const littleEndianPoint = view.getUint8(offset) === 1;
155
+ offset++;
156
+
157
+ if (view.getUint32(offset, littleEndianPoint) % 1000 !== 1) {
158
+ throw new Error('WKB: Inner geometries of MultiPoint not of type Point');
133
159
  }
134
- return concatenateBinaryPointGeometries(binaryPointGeometries, dimension);
160
+
161
+ offset += 4;
162
+ const parsed = parsePoint(view, offset, dimension, littleEndianPoint);
163
+ offset = parsed.offset;
164
+ binaryPointGeometries.push(parsed.geometry);
165
+ }
166
+
167
+ return concatenateBinaryPointGeometries(binaryPointGeometries, dimension);
135
168
  }
169
+
136
170
  function parseMultiLineString(view, offset, dimension, littleEndian) {
137
- const nLines = view.getUint32(offset, littleEndian);
138
- offset += 4;
139
- const binaryLineGeometries = [];
140
- for (let i = 0; i < nLines; i++) {
141
- // Byte order for line
142
- const littleEndianLine = view.getUint8(offset) === 1;
143
- offset++;
144
- // Assert type LineString
145
- if (view.getUint32(offset, littleEndianLine) % 1000 !== 2) {
146
- throw new Error('WKB: Inner geometries of MultiLineString not of type LineString');
147
- }
148
- offset += 4;
149
- const parsed = parseLineString(view, offset, dimension, littleEndianLine);
150
- offset = parsed.offset;
151
- binaryLineGeometries.push(parsed.geometry);
171
+ const nLines = view.getUint32(offset, littleEndian);
172
+ offset += 4;
173
+ const binaryLineGeometries = [];
174
+
175
+ for (let i = 0; i < nLines; i++) {
176
+ const littleEndianLine = view.getUint8(offset) === 1;
177
+ offset++;
178
+
179
+ if (view.getUint32(offset, littleEndianLine) % 1000 !== 2) {
180
+ throw new Error('WKB: Inner geometries of MultiLineString not of type LineString');
152
181
  }
153
- return concatenateBinaryLineGeometries(binaryLineGeometries, dimension);
182
+
183
+ offset += 4;
184
+ const parsed = parseLineString(view, offset, dimension, littleEndianLine);
185
+ offset = parsed.offset;
186
+ binaryLineGeometries.push(parsed.geometry);
187
+ }
188
+
189
+ return concatenateBinaryLineGeometries(binaryLineGeometries, dimension);
154
190
  }
191
+
155
192
  function parseMultiPolygon(view, offset, dimension, littleEndian) {
156
- const nPolygons = view.getUint32(offset, littleEndian);
157
- offset += 4;
158
- const binaryPolygonGeometries = [];
159
- for (let i = 0; i < nPolygons; i++) {
160
- // Byte order for polygon
161
- const littleEndianPolygon = view.getUint8(offset) === 1;
162
- offset++;
163
- // Assert type Polygon
164
- if (view.getUint32(offset, littleEndianPolygon) % 1000 !== 3) {
165
- throw new Error('WKB: Inner geometries of MultiPolygon not of type Polygon');
166
- }
167
- offset += 4;
168
- const parsed = parsePolygon(view, offset, dimension, littleEndianPolygon);
169
- offset = parsed.offset;
170
- binaryPolygonGeometries.push(parsed.geometry);
193
+ const nPolygons = view.getUint32(offset, littleEndian);
194
+ offset += 4;
195
+ const binaryPolygonGeometries = [];
196
+
197
+ for (let i = 0; i < nPolygons; i++) {
198
+ const littleEndianPolygon = view.getUint8(offset) === 1;
199
+ offset++;
200
+
201
+ if (view.getUint32(offset, littleEndianPolygon) % 1000 !== 3) {
202
+ throw new Error('WKB: Inner geometries of MultiPolygon not of type Polygon');
171
203
  }
172
- return concatenateBinaryPolygonGeometries(binaryPolygonGeometries, dimension);
204
+
205
+ offset += 4;
206
+ const parsed = parsePolygon(view, offset, dimension, littleEndianPolygon);
207
+ offset = parsed.offset;
208
+ binaryPolygonGeometries.push(parsed.geometry);
209
+ }
210
+
211
+ return concatenateBinaryPolygonGeometries(binaryPolygonGeometries, dimension);
173
212
  }
174
- // TODO - move to loaders.gl/schema/gis
213
+
175
214
  function concatenateBinaryPointGeometries(binaryPointGeometries, dimension) {
176
- const positions = binaryPointGeometries.map((geometry) => geometry.positions.value);
177
- const concatenatedPositions = new Float64Array(concatTypedArrays(positions).buffer);
178
- return {
179
- type: 'Point',
180
- positions: { value: concatenatedPositions, size: dimension }
181
- };
215
+ const positions = binaryPointGeometries.map(geometry => geometry.positions.value);
216
+ const concatenatedPositions = new Float64Array(concatTypedArrays(positions).buffer);
217
+ return {
218
+ type: 'Point',
219
+ positions: {
220
+ value: concatenatedPositions,
221
+ size: dimension
222
+ }
223
+ };
182
224
  }
225
+
183
226
  function concatenateBinaryLineGeometries(binaryLineGeometries, dimension) {
184
- const lines = binaryLineGeometries.map((geometry) => geometry.positions.value);
185
- const concatenatedPositions = new Float64Array(concatTypedArrays(lines).buffer);
186
- const pathIndices = lines.map((line) => line.length / dimension).map(cumulativeSum(0));
187
- pathIndices.unshift(0);
188
- return {
189
- type: 'LineString',
190
- positions: { value: concatenatedPositions, size: dimension },
191
- pathIndices: { value: new Uint16Array(pathIndices), size: 1 }
192
- };
227
+ const lines = binaryLineGeometries.map(geometry => geometry.positions.value);
228
+ const concatenatedPositions = new Float64Array(concatTypedArrays(lines).buffer);
229
+ const pathIndices = lines.map(line => line.length / dimension).map(cumulativeSum(0));
230
+ pathIndices.unshift(0);
231
+ return {
232
+ type: 'LineString',
233
+ positions: {
234
+ value: concatenatedPositions,
235
+ size: dimension
236
+ },
237
+ pathIndices: {
238
+ value: new Uint16Array(pathIndices),
239
+ size: 1
240
+ }
241
+ };
193
242
  }
243
+
194
244
  function concatenateBinaryPolygonGeometries(binaryPolygonGeometries, dimension) {
195
- const polygons = [];
196
- const primitivePolygons = [];
197
- for (const binaryPolygon of binaryPolygonGeometries) {
198
- const { positions, primitivePolygonIndices } = binaryPolygon;
199
- polygons.push(positions.value);
200
- primitivePolygons.push(primitivePolygonIndices.value);
245
+ const polygons = [];
246
+ const primitivePolygons = [];
247
+
248
+ for (const binaryPolygon of binaryPolygonGeometries) {
249
+ const {
250
+ positions,
251
+ primitivePolygonIndices
252
+ } = binaryPolygon;
253
+ polygons.push(positions.value);
254
+ primitivePolygons.push(primitivePolygonIndices.value);
255
+ }
256
+
257
+ const concatenatedPositions = new Float64Array(concatTypedArrays(polygons).buffer);
258
+ const polygonIndices = polygons.map(p => p.length / dimension).map(cumulativeSum(0));
259
+ polygonIndices.unshift(0);
260
+ const primitivePolygonIndices = [0];
261
+
262
+ for (const primitivePolygon of primitivePolygons) {
263
+ primitivePolygonIndices.push(...primitivePolygon.filter(x => x > 0).map(x => x + primitivePolygonIndices[primitivePolygonIndices.length - 1]));
264
+ }
265
+
266
+ return {
267
+ type: 'Polygon',
268
+ positions: {
269
+ value: concatenatedPositions,
270
+ size: dimension
271
+ },
272
+ polygonIndices: {
273
+ value: new Uint16Array(polygonIndices),
274
+ size: 1
275
+ },
276
+ primitivePolygonIndices: {
277
+ value: new Uint16Array(primitivePolygonIndices),
278
+ size: 1
201
279
  }
202
- const concatenatedPositions = new Float64Array(concatTypedArrays(polygons).buffer);
203
- const polygonIndices = polygons.map((p) => p.length / dimension).map(cumulativeSum(0));
204
- polygonIndices.unshift(0);
205
- // Combine primitivePolygonIndices from each individual polygon
206
- const primitivePolygonIndices = [0];
207
- for (const primitivePolygon of primitivePolygons) {
208
- primitivePolygonIndices.push(...primitivePolygon
209
- .filter((x) => x > 0)
210
- .map((x) => x + primitivePolygonIndices[primitivePolygonIndices.length - 1]));
211
- }
212
- return {
213
- type: 'Polygon',
214
- positions: { value: concatenatedPositions, size: dimension },
215
- polygonIndices: { value: new Uint16Array(polygonIndices), size: 1 },
216
- primitivePolygonIndices: { value: new Uint16Array(primitivePolygonIndices), size: 1 }
217
- };
280
+ };
218
281
  }
219
- // TODO: remove copy; import from typed-array-utils
220
- // modules/math/src/geometry/typed-arrays/typed-array-utils.js
282
+
221
283
  function concatTypedArrays(arrays) {
222
- let byteLength = 0;
223
- for (let i = 0; i < arrays.length; ++i) {
224
- byteLength += arrays[i].byteLength;
225
- }
226
- const buffer = new Uint8Array(byteLength);
227
- let byteOffset = 0;
228
- for (let i = 0; i < arrays.length; ++i) {
229
- const data = new Uint8Array(arrays[i].buffer);
230
- byteLength = data.length;
231
- for (let j = 0; j < byteLength; ++j) {
232
- buffer[byteOffset++] = data[j];
233
- }
284
+ let byteLength = 0;
285
+
286
+ for (let i = 0; i < arrays.length; ++i) {
287
+ byteLength += arrays[i].byteLength;
288
+ }
289
+
290
+ const buffer = new Uint8Array(byteLength);
291
+ let byteOffset = 0;
292
+
293
+ for (let i = 0; i < arrays.length; ++i) {
294
+ const data = new Uint8Array(arrays[i].buffer);
295
+ byteLength = data.length;
296
+
297
+ for (let j = 0; j < byteLength; ++j) {
298
+ buffer[byteOffset++] = data[j];
234
299
  }
235
- return buffer;
300
+ }
301
+
302
+ return buffer;
236
303
  }
304
+ //# sourceMappingURL=parse-wkb.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/lib/parse-wkb.ts"],"names":["NUM_DIMENSIONS","parseWKB","arrayBuffer","view","DataView","offset","littleEndian","getUint8","geometryCode","getUint32","geometryType","type","dimension","point","parsePoint","geometry","line","parseLineString","polygon","parsePolygon","multiPoint","parseMultiPoint","multiLine","parseMultiLineString","multiPolygon","parseMultiPolygon","Error","positions","Float64Array","i","getFloat64","value","size","nPoints","pathIndices","push","Uint16Array","cumulativeSum","sum","nRings","rings","parsed","concatenatedPositions","concatTypedArrays","buffer","polygonIndices","length","primitivePolygonIndices","map","l","unshift","binaryPointGeometries","littleEndianPoint","concatenateBinaryPointGeometries","nLines","binaryLineGeometries","littleEndianLine","concatenateBinaryLineGeometries","nPolygons","binaryPolygonGeometries","littleEndianPolygon","concatenateBinaryPolygonGeometries","lines","polygons","primitivePolygons","binaryPolygon","p","primitivePolygon","filter","x","arrays","byteLength","Uint8Array","byteOffset","data","j"],"mappings":"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","sourcesContent":["import type {\n TypedArray,\n BinaryGeometry,\n BinaryPointGeometry,\n BinaryLineGeometry,\n BinaryPolygonGeometry\n} from '@loaders.gl/schema';\n\nconst NUM_DIMENSIONS = {\n 0: 2, // 2D\n 1: 3, // 3D (Z)\n 2: 3, // 3D (M)\n 3: 4 // 4D (ZM)\n};\n\nexport default function parseWKB(arrayBuffer: ArrayBuffer): BinaryGeometry {\n const view = new DataView(arrayBuffer);\n let offset = 0;\n\n // Check endianness of data\n const littleEndian = view.getUint8(offset) === 1;\n offset++;\n\n // 4-digit code representing dimension and type of geometry\n const geometryCode = view.getUint32(offset, littleEndian);\n offset += 4;\n\n const geometryType = geometryCode % 1000;\n const type = ((geometryCode - geometryType) / 1000) as 0 | 1 | 2 | 3;\n const dimension = NUM_DIMENSIONS[type];\n\n switch (geometryType) {\n case 1:\n const point = parsePoint(view, offset, dimension, littleEndian);\n return point.geometry;\n case 2:\n const line = parseLineString(view, offset, dimension, littleEndian);\n return line.geometry;\n case 3:\n const polygon = parsePolygon(view, offset, dimension, littleEndian);\n return polygon.geometry;\n case 4:\n const multiPoint = parseMultiPoint(view, offset, dimension, littleEndian);\n multiPoint.type = 'Point';\n return multiPoint;\n case 5:\n const multiLine = parseMultiLineString(view, offset, dimension, littleEndian);\n multiLine.type = 'LineString';\n return multiLine;\n case 6:\n const multiPolygon = parseMultiPolygon(view, offset, dimension, littleEndian);\n multiPolygon.type = 'Polygon';\n return multiPolygon;\n // case 7:\n // TODO: handle GeometryCollections\n // return parseGeometryCollection(view, offset, dimension, littleEndian);\n default:\n throw new Error(`WKB: Unsupported geometry type: ${geometryType}`);\n }\n}\n\n// Primitives; parse point and linear ring\nfunction parsePoint(\n view: DataView,\n offset: number,\n dimension: number,\n littleEndian: boolean\n): {geometry: BinaryPointGeometry; offset: number} {\n const positions = new Float64Array(dimension);\n for (let i = 0; i < dimension; i++) {\n positions[i] = view.getFloat64(offset, littleEndian);\n offset += 8;\n }\n\n return {\n geometry: {type: 'Point', positions: {value: positions, size: dimension}},\n offset\n };\n}\n\nfunction parseLineString(\n view: DataView,\n offset: number,\n dimension: number,\n littleEndian: boolean\n): {geometry: BinaryLineGeometry; offset: number} {\n const nPoints = view.getUint32(offset, littleEndian);\n offset += 4;\n\n // Instantiate array\n const positions = new Float64Array(nPoints * dimension);\n for (let i = 0; i < nPoints * dimension; i++) {\n positions[i] = view.getFloat64(offset, littleEndian);\n offset += 8;\n }\n\n const pathIndices = [0];\n if (nPoints > 0) {\n pathIndices.push(nPoints);\n }\n\n return {\n geometry: {\n type: 'LineString',\n positions: {value: positions, size: dimension},\n pathIndices: {value: new Uint16Array(pathIndices), size: 1}\n },\n offset\n };\n}\n\n// https://stackoverflow.com/a/55261098\nconst cumulativeSum = (sum: number) => (value: number) => (sum += value);\n\nfunction parsePolygon(\n view: DataView,\n offset: number,\n dimension: number,\n littleEndian: boolean\n): {geometry: BinaryPolygonGeometry; offset: number} {\n const nRings = view.getUint32(offset, littleEndian);\n offset += 4;\n\n const rings: TypedArray[] = [];\n for (let i = 0; i < nRings; i++) {\n const parsed = parseLineString(view, offset, dimension, littleEndian);\n const {positions} = parsed.geometry;\n offset = parsed.offset;\n rings.push(positions.value);\n }\n\n const concatenatedPositions = new Float64Array(concatTypedArrays(rings).buffer);\n const polygonIndices = [0];\n if (concatenatedPositions.length > 0) {\n polygonIndices.push(concatenatedPositions.length / dimension);\n }\n const primitivePolygonIndices = rings.map((l) => l.length / dimension).map(cumulativeSum(0));\n primitivePolygonIndices.unshift(0);\n\n return {\n geometry: {\n type: 'Polygon',\n positions: {value: concatenatedPositions, size: dimension},\n polygonIndices: {\n value: new Uint16Array(polygonIndices),\n size: 1\n },\n primitivePolygonIndices: {value: new Uint16Array(primitivePolygonIndices), size: 1}\n },\n offset\n };\n}\n\nfunction parseMultiPoint(\n view: DataView,\n offset: number,\n dimension: number,\n littleEndian: boolean\n): BinaryPointGeometry {\n const nPoints = view.getUint32(offset, littleEndian);\n offset += 4;\n\n const binaryPointGeometries: BinaryPointGeometry[] = [];\n for (let i = 0; i < nPoints; i++) {\n // Byte order for point\n const littleEndianPoint = view.getUint8(offset) === 1;\n offset++;\n\n // Assert point type\n if (view.getUint32(offset, littleEndianPoint) % 1000 !== 1) {\n throw new Error('WKB: Inner geometries of MultiPoint not of type Point');\n }\n\n offset += 4;\n\n const parsed = parsePoint(view, offset, dimension, littleEndianPoint);\n offset = parsed.offset;\n binaryPointGeometries.push(parsed.geometry);\n }\n\n return concatenateBinaryPointGeometries(binaryPointGeometries, dimension);\n}\n\nfunction parseMultiLineString(\n view: DataView,\n offset: number,\n dimension: number,\n littleEndian: boolean\n): BinaryLineGeometry {\n const nLines = view.getUint32(offset, littleEndian);\n offset += 4;\n\n const binaryLineGeometries: BinaryLineGeometry[] = [];\n for (let i = 0; i < nLines; i++) {\n // Byte order for line\n const littleEndianLine = view.getUint8(offset) === 1;\n offset++;\n\n // Assert type LineString\n if (view.getUint32(offset, littleEndianLine) % 1000 !== 2) {\n throw new Error('WKB: Inner geometries of MultiLineString not of type LineString');\n }\n offset += 4;\n\n const parsed = parseLineString(view, offset, dimension, littleEndianLine);\n offset = parsed.offset;\n binaryLineGeometries.push(parsed.geometry);\n }\n\n return concatenateBinaryLineGeometries(binaryLineGeometries, dimension);\n}\n\nfunction parseMultiPolygon(\n view: DataView,\n offset: number,\n dimension: number,\n littleEndian: boolean\n): BinaryPolygonGeometry {\n const nPolygons = view.getUint32(offset, littleEndian);\n offset += 4;\n\n const binaryPolygonGeometries: BinaryPolygonGeometry[] = [];\n for (let i = 0; i < nPolygons; i++) {\n // Byte order for polygon\n const littleEndianPolygon = view.getUint8(offset) === 1;\n offset++;\n\n // Assert type Polygon\n if (view.getUint32(offset, littleEndianPolygon) % 1000 !== 3) {\n throw new Error('WKB: Inner geometries of MultiPolygon not of type Polygon');\n }\n offset += 4;\n\n const parsed = parsePolygon(view, offset, dimension, littleEndianPolygon);\n offset = parsed.offset;\n binaryPolygonGeometries.push(parsed.geometry);\n }\n\n return concatenateBinaryPolygonGeometries(binaryPolygonGeometries, dimension);\n}\n\n// TODO - move to loaders.gl/schema/gis\n\nfunction concatenateBinaryPointGeometries(\n binaryPointGeometries: BinaryPointGeometry[],\n dimension: number\n): BinaryPointGeometry {\n const positions: TypedArray[] = binaryPointGeometries.map((geometry) => geometry.positions.value);\n const concatenatedPositions = new Float64Array(concatTypedArrays(positions).buffer);\n\n return {\n type: 'Point',\n positions: {value: concatenatedPositions, size: dimension}\n };\n}\n\nfunction concatenateBinaryLineGeometries(\n binaryLineGeometries: BinaryLineGeometry[],\n dimension: number\n): BinaryLineGeometry {\n const lines: TypedArray[] = binaryLineGeometries.map((geometry) => geometry.positions.value);\n const concatenatedPositions = new Float64Array(concatTypedArrays(lines).buffer);\n const pathIndices = lines.map((line) => line.length / dimension).map(cumulativeSum(0));\n pathIndices.unshift(0);\n\n return {\n type: 'LineString',\n positions: {value: concatenatedPositions, size: dimension},\n pathIndices: {value: new Uint16Array(pathIndices), size: 1}\n };\n}\n\nfunction concatenateBinaryPolygonGeometries(\n binaryPolygonGeometries: BinaryPolygonGeometry[],\n dimension: number\n): BinaryPolygonGeometry {\n const polygons: TypedArray[] = [];\n const primitivePolygons: TypedArray[] = [];\n\n for (const binaryPolygon of binaryPolygonGeometries) {\n const {positions, primitivePolygonIndices} = binaryPolygon;\n polygons.push(positions.value);\n primitivePolygons.push(primitivePolygonIndices.value);\n }\n\n const concatenatedPositions = new Float64Array(concatTypedArrays(polygons).buffer);\n const polygonIndices = polygons.map((p) => p.length / dimension).map(cumulativeSum(0));\n polygonIndices.unshift(0);\n\n // Combine primitivePolygonIndices from each individual polygon\n const primitivePolygonIndices = [0];\n for (const primitivePolygon of primitivePolygons) {\n primitivePolygonIndices.push(\n ...primitivePolygon\n .filter((x: number) => x > 0)\n .map((x: number) => x + primitivePolygonIndices[primitivePolygonIndices.length - 1])\n );\n }\n\n return {\n type: 'Polygon',\n positions: {value: concatenatedPositions, size: dimension},\n polygonIndices: {value: new Uint16Array(polygonIndices), size: 1},\n primitivePolygonIndices: {value: new Uint16Array(primitivePolygonIndices), size: 1}\n };\n}\n\n// TODO: remove copy; import from typed-array-utils\n// modules/math/src/geometry/typed-arrays/typed-array-utils.js\nfunction concatTypedArrays(arrays: TypedArray[]): TypedArray {\n let byteLength = 0;\n for (let i = 0; i < arrays.length; ++i) {\n byteLength += arrays[i].byteLength;\n }\n const buffer = new Uint8Array(byteLength);\n\n let byteOffset = 0;\n for (let i = 0; i < arrays.length; ++i) {\n const data = new Uint8Array(arrays[i].buffer);\n byteLength = data.length;\n for (let j = 0; j < byteLength; ++j) {\n buffer[byteOffset++] = data[j];\n }\n }\n return buffer;\n}\n"],"file":"parse-wkb.js"}