@math.gl/geoarrow 5.0.0-alpha.2

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 (47) hide show
  1. package/LICENSE +140 -0
  2. package/README.md +311 -0
  3. package/dist/builder.d.ts +90 -0
  4. package/dist/builder.d.ts.map +1 -0
  5. package/dist/builder.js +428 -0
  6. package/dist/builder.js.map +1 -0
  7. package/dist/codecs.d.ts +10 -0
  8. package/dist/codecs.d.ts.map +1 -0
  9. package/dist/codecs.js +122 -0
  10. package/dist/codecs.js.map +1 -0
  11. package/dist/index.cjs +1651 -0
  12. package/dist/index.cjs.map +6 -0
  13. package/dist/index.d.ts +12 -0
  14. package/dist/index.d.ts.map +1 -0
  15. package/dist/index.js +10 -0
  16. package/dist/index.js.map +1 -0
  17. package/dist/kernels.d.ts +51 -0
  18. package/dist/kernels.d.ts.map +1 -0
  19. package/dist/kernels.js +359 -0
  20. package/dist/kernels.js.map +1 -0
  21. package/dist/layout.d.ts +52 -0
  22. package/dist/layout.d.ts.map +1 -0
  23. package/dist/layout.js +669 -0
  24. package/dist/layout.js.map +1 -0
  25. package/dist/tessellate.d.ts +31 -0
  26. package/dist/tessellate.d.ts.map +1 -0
  27. package/dist/tessellate.js +102 -0
  28. package/dist/tessellate.js.map +1 -0
  29. package/dist/types.d.ts +113 -0
  30. package/dist/types.d.ts.map +1 -0
  31. package/dist/types.js +41 -0
  32. package/dist/types.js.map +1 -0
  33. package/dist/worker.cjs +73 -0
  34. package/dist/worker.cjs.map +6 -0
  35. package/dist/worker.d.ts +11 -0
  36. package/dist/worker.d.ts.map +1 -0
  37. package/dist/worker.js +10 -0
  38. package/dist/worker.js.map +1 -0
  39. package/package.json +48 -0
  40. package/src/builder.ts +569 -0
  41. package/src/codecs.ts +155 -0
  42. package/src/index.ts +93 -0
  43. package/src/kernels.ts +463 -0
  44. package/src/layout.ts +833 -0
  45. package/src/tessellate.ts +133 -0
  46. package/src/types.ts +200 -0
  47. package/src/worker.ts +20 -0
@@ -0,0 +1,428 @@
1
+ // math.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+ import { getGeoArrowDimensionSize, getGeoArrowEncodingForGeometry, getGeoArrowGeometryType } from "./types.js";
5
+ /**
6
+ * Two-pass writer for homogeneous native GeoArrow geometry columns.
7
+ *
8
+ * Feed the same rows to a measure builder, allocate its target, and then feed them to a write
9
+ * builder. The write result borrows the supplied target buffers.
10
+ */
11
+ export class GeoArrowBuilder {
12
+ constructor(options) {
13
+ this.length = 0;
14
+ this.nullCount = 0;
15
+ this.coordinateCount = 0;
16
+ this.partCount = 0;
17
+ this.ringCount = 0;
18
+ this.mode = options.mode;
19
+ this.encoding = options.encoding;
20
+ this.dimension = options.dimension || 'xy';
21
+ this.coordinateLayout = options.coordinateLayout || 'interleaved';
22
+ this.offsetType = options.offsetType || 'int32';
23
+ this.coordinateType = options.coordinateType || 'float64';
24
+ this.target = options.mode === 'write' ? options.target : undefined;
25
+ if (this.target)
26
+ this.initializeTargetOffsets(this.target);
27
+ }
28
+ /** Appends one geometry row or null. */
29
+ append(geometry) {
30
+ const rowIndex = this.length++;
31
+ if (!geometry) {
32
+ this.nullCount++;
33
+ this.appendNull(rowIndex);
34
+ return this;
35
+ }
36
+ const expectedType = getGeoArrowGeometryType(this.encoding);
37
+ if (geometry.type !== expectedType) {
38
+ throw new Error(`GeoArrowBuilder for ${this.encoding} cannot append ${geometry.type}`);
39
+ }
40
+ if (geometry.type === 'GeometryCollection') {
41
+ throw new Error('GeoArrowBuilder only accepts concrete geometry families');
42
+ }
43
+ if (this.target)
44
+ setValidityBit(this.target.validity, rowIndex);
45
+ const depth = getBuilderDepth(this.encoding);
46
+ const coordinates = geometry.coordinates;
47
+ if (depth === 0) {
48
+ this.writeCoordinate(coordinates);
49
+ }
50
+ else if (depth === 1) {
51
+ this.writeCoordinateList(coordinates);
52
+ this.writeOffset(this.target?.geometryOffsets, rowIndex + 1, this.coordinateCount);
53
+ }
54
+ else if (depth === 2) {
55
+ for (const part of coordinates) {
56
+ this.writeCoordinateList(part);
57
+ this.partCount++;
58
+ this.writeOffset(this.target?.partOffsets, this.partCount, this.coordinateCount);
59
+ }
60
+ this.writeOffset(this.target?.geometryOffsets, rowIndex + 1, this.partCount);
61
+ }
62
+ else {
63
+ for (const polygon of coordinates) {
64
+ for (const ring of polygon) {
65
+ this.writeCoordinateList(ring);
66
+ this.ringCount++;
67
+ this.writeOffset(this.target?.ringOffsets, this.ringCount, this.coordinateCount);
68
+ }
69
+ this.partCount++;
70
+ this.writeOffset(this.target?.partOffsets, this.partCount, this.ringCount);
71
+ }
72
+ this.writeOffset(this.target?.geometryOffsets, rowIndex + 1, this.partCount);
73
+ }
74
+ return this;
75
+ }
76
+ /** Returns current exact allocation counts. */
77
+ getMeasurement() {
78
+ const depth = getBuilderDepth(this.encoding);
79
+ return {
80
+ length: this.length,
81
+ nullCount: this.nullCount,
82
+ coordinateCount: this.coordinateCount,
83
+ geometryOffsetCount: depth >= 1 ? this.length + 1 : 0,
84
+ partOffsetCount: depth >= 2 ? this.partCount + 1 : 0,
85
+ ringOffsetCount: depth >= 3 ? this.ringCount + 1 : 0
86
+ };
87
+ }
88
+ /** Allocates a write target from the current measure pass. */
89
+ allocateTarget() {
90
+ if (this.mode !== 'measure')
91
+ throw new Error('Only a measure builder can allocate a target');
92
+ return allocateGeoArrowBuilderTarget(this.getMeasurement(), {
93
+ encoding: this.encoding,
94
+ dimension: this.dimension,
95
+ coordinateLayout: this.coordinateLayout,
96
+ offsetType: this.offsetType,
97
+ coordinateType: this.coordinateType
98
+ });
99
+ }
100
+ /** Finishes a write pass and returns a one-chunk borrowed column. */
101
+ finish() {
102
+ if (!this.target)
103
+ throw new Error('A measure builder has no finished column');
104
+ const measurement = this.getMeasurement();
105
+ assertTargetCapacity(this.target, measurement, getGeoArrowDimensionSize(this.dimension));
106
+ const coordinates = makeCoordinateArray(this.target.coordinates, measurement.coordinateCount, this.dimension, this.coordinateLayout);
107
+ const depth = getBuilderDepth(this.encoding);
108
+ let chunk = coordinates;
109
+ if (depth >= 3) {
110
+ chunk = {
111
+ kind: 'list',
112
+ length: this.ringCount,
113
+ offsets: this.target.ringOffsets,
114
+ child: chunk
115
+ };
116
+ }
117
+ if (depth >= 2) {
118
+ chunk = {
119
+ kind: 'list',
120
+ length: this.partCount,
121
+ offsets: this.target.partOffsets,
122
+ child: chunk
123
+ };
124
+ }
125
+ if (depth >= 1) {
126
+ chunk = {
127
+ kind: 'list',
128
+ length: this.length,
129
+ offsets: this.target.geometryOffsets,
130
+ child: chunk,
131
+ validity: { values: this.target.validity }
132
+ };
133
+ }
134
+ else {
135
+ chunk = { ...chunk, validity: { values: this.target.validity } };
136
+ }
137
+ return {
138
+ encoding: this.encoding,
139
+ dimension: this.dimension,
140
+ coordinateLayout: this.coordinateLayout,
141
+ chunks: [chunk]
142
+ };
143
+ }
144
+ /** Builds a homogeneous column using an internal measure/write pair. */
145
+ static build(rows, options) {
146
+ const measure = new GeoArrowBuilder({ ...options, mode: 'measure' });
147
+ for (const row of rows)
148
+ measure.append(row);
149
+ const write = new GeoArrowBuilder({
150
+ ...options,
151
+ mode: 'write',
152
+ target: measure.allocateTarget()
153
+ });
154
+ for (const row of rows)
155
+ write.append(row);
156
+ return write.finish();
157
+ }
158
+ appendNull(rowIndex) {
159
+ const depth = getBuilderDepth(this.encoding);
160
+ if (depth === 0) {
161
+ this.writeCoordinate(new Array(getGeoArrowDimensionSize(this.dimension)).fill(0));
162
+ }
163
+ else {
164
+ this.writeOffset(this.target?.geometryOffsets, rowIndex + 1, depth === 1 ? this.coordinateCount : this.partCount);
165
+ }
166
+ }
167
+ writeCoordinateList(coordinates) {
168
+ for (const coordinate of coordinates)
169
+ this.writeCoordinate(coordinate);
170
+ }
171
+ writeCoordinate(coordinate) {
172
+ const size = getGeoArrowDimensionSize(this.dimension);
173
+ if (coordinate.length !== size) {
174
+ throw new Error(`Expected ${size} coordinate values for ${this.dimension}`);
175
+ }
176
+ if (this.target)
177
+ writeCoordinate(this.target.coordinates, this.coordinateCount, coordinate, this.dimension);
178
+ this.coordinateCount++;
179
+ }
180
+ writeOffset(target, index, value) {
181
+ if (!target)
182
+ return;
183
+ if (target instanceof BigInt64Array)
184
+ target[index] = BigInt(value);
185
+ else
186
+ target[index] = value;
187
+ }
188
+ initializeTargetOffsets(target) {
189
+ this.writeOffset(target.geometryOffsets, 0, 0);
190
+ this.writeOffset(target.partOffsets, 0, 0);
191
+ this.writeOffset(target.ringOffsets, 0, 0);
192
+ }
193
+ }
194
+ /** Allocates exact buffers for one measured builder pass. */
195
+ export function allocateGeoArrowBuilderTarget(measurement, options) {
196
+ const dimension = options.dimension || 'xy';
197
+ const size = getGeoArrowDimensionSize(dimension);
198
+ const FloatArray = options.coordinateType === 'float32' ? Float32Array : Float64Array;
199
+ const coordinateLayout = options.coordinateLayout || 'interleaved';
200
+ const coordinates = coordinateLayout === 'interleaved'
201
+ ? new FloatArray(measurement.coordinateCount * size)
202
+ : makeSeparatedCoordinateTarget(FloatArray, measurement.coordinateCount, dimension);
203
+ const OffsetArray = options.offsetType === 'int64' ? BigInt64Array : Int32Array;
204
+ return {
205
+ validity: new Uint8Array(Math.ceil(measurement.length / 8)),
206
+ coordinates,
207
+ geometryOffsets: measurement.geometryOffsetCount
208
+ ? new OffsetArray(measurement.geometryOffsetCount)
209
+ : undefined,
210
+ partOffsets: measurement.partOffsetCount
211
+ ? new OffsetArray(measurement.partOffsetCount)
212
+ : undefined,
213
+ ringOffsets: measurement.ringOffsetCount
214
+ ? new OffsetArray(measurement.ringOffsetCount)
215
+ : undefined
216
+ };
217
+ }
218
+ /** Builds a concrete or dense-union column from materialized rows. */
219
+ export function makeGeoArrowColumnFromGeometryRows(rows, options = {}) {
220
+ const geometryTypes = [...new Set(rows.filter(Boolean).map(row => row.type))];
221
+ const dimension = options.dimension || inferRowsDimension(rows);
222
+ if (options.encoding === 'geoarrow.geometry') {
223
+ return {
224
+ encoding: 'geoarrow.geometry',
225
+ dimension,
226
+ coordinateLayout: options.coordinateLayout || 'interleaved',
227
+ chunks: [makeDenseUnionArray(rows, options, dimension)]
228
+ };
229
+ }
230
+ if (geometryTypes.length === 0) {
231
+ return GeoArrowBuilder.build(rows, { ...options, dimension, encoding: 'geoarrow.point' });
232
+ }
233
+ if (geometryTypes.length === 1 && geometryTypes[0] !== 'GeometryCollection') {
234
+ return GeoArrowBuilder.build(rows, {
235
+ ...options,
236
+ dimension,
237
+ encoding: getGeoArrowEncodingForGeometry(geometryTypes[0])
238
+ });
239
+ }
240
+ if (geometryTypes.length === 1 && geometryTypes[0] === 'GeometryCollection') {
241
+ return {
242
+ encoding: 'geoarrow.geometrycollection',
243
+ dimension,
244
+ coordinateLayout: options.coordinateLayout || 'interleaved',
245
+ chunks: [makeGeometryCollectionArray(rows, options, dimension)]
246
+ };
247
+ }
248
+ return {
249
+ encoding: 'geoarrow.geometry',
250
+ dimension,
251
+ coordinateLayout: options.coordinateLayout || 'interleaved',
252
+ chunks: [makeDenseUnionArray(rows, options, dimension)]
253
+ };
254
+ }
255
+ function makeDenseUnionArray(rows, options, dimension) {
256
+ const nonNullTypes = [...new Set(rows.filter(Boolean).map(row => row.type))];
257
+ const fallbackType = nonNullTypes[0] || 'Point';
258
+ const childRows = new Map();
259
+ for (const type of nonNullTypes.length ? nonNullTypes : [fallbackType])
260
+ childRows.set(type, []);
261
+ const typeIds = new Int8Array(rows.length);
262
+ const valueOffsets = new Int32Array(rows.length);
263
+ const validity = new Uint8Array(Math.ceil(rows.length / 8));
264
+ for (let rowIndex = 0; rowIndex < rows.length; rowIndex++) {
265
+ const geometry = rows[rowIndex];
266
+ const type = geometry?.type || fallbackType;
267
+ const values = childRows.get(type) || [];
268
+ typeIds[rowIndex] = getGeometryTypeId(type);
269
+ valueOffsets[rowIndex] = values.length;
270
+ if (geometry) {
271
+ values.push(geometry);
272
+ childRows.set(type, values);
273
+ setValidityBit(validity, rowIndex);
274
+ }
275
+ }
276
+ const children = [...childRows.entries()]
277
+ .sort(([left], [right]) => getGeometryTypeId(left) - getGeometryTypeId(right))
278
+ .map(([type, values]) => {
279
+ const data = type === 'GeometryCollection'
280
+ ? makeGeometryCollectionArray(values, options, dimension)
281
+ : GeoArrowBuilder.build(values, {
282
+ ...options,
283
+ dimension,
284
+ encoding: getGeoArrowEncodingForGeometry(type)
285
+ }).chunks[0];
286
+ return { name: type, typeId: getGeometryTypeId(type), data };
287
+ });
288
+ return {
289
+ kind: 'dense-union',
290
+ length: rows.length,
291
+ typeIds,
292
+ valueOffsets,
293
+ children,
294
+ validity: { values: validity }
295
+ };
296
+ }
297
+ function makeGeometryCollectionArray(rows, options, dimension) {
298
+ const offsets = new Int32Array(rows.length + 1);
299
+ const validity = new Uint8Array(Math.ceil(rows.length / 8));
300
+ const flattened = [];
301
+ for (let rowIndex = 0; rowIndex < rows.length; rowIndex++) {
302
+ const row = rows[rowIndex];
303
+ if (row?.type === 'GeometryCollection') {
304
+ flattened.push(...row.geometries);
305
+ setValidityBit(validity, rowIndex);
306
+ }
307
+ offsets[rowIndex + 1] = flattened.length;
308
+ }
309
+ return {
310
+ kind: 'list',
311
+ length: rows.length,
312
+ offsets,
313
+ child: makeDenseUnionArray(flattened, options, dimension),
314
+ validity: { values: validity }
315
+ };
316
+ }
317
+ function makeCoordinateArray(coordinates, coordinateCount, dimension, layout) {
318
+ const size = getGeoArrowDimensionSize(dimension);
319
+ if (layout === 'interleaved') {
320
+ const values = coordinates;
321
+ return {
322
+ kind: 'fixed-size-list',
323
+ length: coordinateCount,
324
+ size,
325
+ child: { kind: 'primitive', length: coordinateCount * size, values }
326
+ };
327
+ }
328
+ const separated = coordinates;
329
+ const children = {
330
+ x: { kind: 'primitive', length: coordinateCount, values: separated.x },
331
+ y: { kind: 'primitive', length: coordinateCount, values: separated.y }
332
+ };
333
+ if (separated.z) {
334
+ children['z'] = { kind: 'primitive', length: coordinateCount, values: separated.z };
335
+ }
336
+ if (separated.m) {
337
+ children['m'] = { kind: 'primitive', length: coordinateCount, values: separated.m };
338
+ }
339
+ return { kind: 'struct', length: coordinateCount, children };
340
+ }
341
+ function makeSeparatedCoordinateTarget(FloatArray, count, dimension) {
342
+ return {
343
+ x: new FloatArray(count),
344
+ y: new FloatArray(count),
345
+ z: dimension === 'xyz' || dimension === 'xyzm' ? new FloatArray(count) : undefined,
346
+ m: dimension === 'xym' || dimension === 'xyzm' ? new FloatArray(count) : undefined
347
+ };
348
+ }
349
+ function writeCoordinate(target, coordinateIndex, coordinate, dimension) {
350
+ if (target instanceof Float32Array || target instanceof Float64Array) {
351
+ target.set(coordinate, coordinateIndex * coordinate.length);
352
+ return;
353
+ }
354
+ target.x[coordinateIndex] = coordinate[0];
355
+ target.y[coordinateIndex] = coordinate[1];
356
+ if (dimension === 'xyz')
357
+ target.z[coordinateIndex] = coordinate[2];
358
+ else if (dimension === 'xym')
359
+ target.m[coordinateIndex] = coordinate[2];
360
+ else if (dimension === 'xyzm') {
361
+ target.z[coordinateIndex] = coordinate[2];
362
+ target.m[coordinateIndex] = coordinate[3];
363
+ }
364
+ }
365
+ function setValidityBit(validity, index) {
366
+ validity[index >> 3] |= 1 << (index & 7);
367
+ }
368
+ function getBuilderDepth(encoding) {
369
+ switch (encoding) {
370
+ case 'geoarrow.point':
371
+ return 0;
372
+ case 'geoarrow.linestring':
373
+ case 'geoarrow.multipoint':
374
+ return 1;
375
+ case 'geoarrow.polygon':
376
+ case 'geoarrow.multilinestring':
377
+ return 2;
378
+ case 'geoarrow.multipolygon':
379
+ return 3;
380
+ }
381
+ }
382
+ function getGeometryTypeId(type) {
383
+ return ([
384
+ 'Point',
385
+ 'LineString',
386
+ 'Polygon',
387
+ 'MultiPoint',
388
+ 'MultiLineString',
389
+ 'MultiPolygon',
390
+ 'GeometryCollection'
391
+ ].indexOf(type) + 1);
392
+ }
393
+ function inferRowsDimension(rows) {
394
+ let size = 2;
395
+ const visit = (value) => {
396
+ if (!Array.isArray(value) || value.length === 0)
397
+ return;
398
+ if (typeof value[0] === 'number')
399
+ size = Math.max(size, value.length);
400
+ else
401
+ for (const child of value)
402
+ visit(child);
403
+ };
404
+ const visitGeometry = (geometry) => {
405
+ if (geometry.type === 'GeometryCollection') {
406
+ for (const child of geometry.geometries)
407
+ visitGeometry(child);
408
+ }
409
+ else {
410
+ visit(geometry.coordinates);
411
+ }
412
+ };
413
+ for (const row of rows) {
414
+ if (row)
415
+ visitGeometry(row);
416
+ }
417
+ return size >= 4 ? 'xyzm' : size === 3 ? 'xyz' : 'xy';
418
+ }
419
+ function assertTargetCapacity(target, measurement, size) {
420
+ const coordinateLength = target.coordinates instanceof Float32Array || target.coordinates instanceof Float64Array
421
+ ? target.coordinates.length / size
422
+ : target.coordinates.x.length;
423
+ if (coordinateLength < measurement.coordinateCount ||
424
+ target.validity.length * 8 < measurement.length) {
425
+ throw new Error('GeoArrowBuilder target is smaller than its measured output');
426
+ }
427
+ }
428
+ //# sourceMappingURL=builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builder.js","sourceRoot":"","sources":["../src/builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { GeoArrowColumn } from "./types.js";
2
+ /** Decodes a GeoArrow WKB column into native physical geometry buffers. */
3
+ export declare function decodeGeoArrowWKB(column: GeoArrowColumn): GeoArrowColumn;
4
+ /** Encodes a native GeoArrow column as variable-width WKB bytes. */
5
+ export declare function encodeGeoArrowWKB(column: GeoArrowColumn): GeoArrowColumn;
6
+ /** Decodes a GeoArrow WKT column into native physical geometry buffers. */
7
+ export declare function decodeGeoArrowWKT(column: GeoArrowColumn): GeoArrowColumn;
8
+ /** Encodes a native GeoArrow column as variable-width UTF-8 WKT. */
9
+ export declare function encodeGeoArrowWKT(column: GeoArrowColumn): GeoArrowColumn;
10
+ //# sourceMappingURL=codecs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codecs.d.ts","sourceRoot":"","sources":["../src/codecs.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,cAAc,EAIf,mBAAgB;AAQjB,2EAA2E;AAC3E,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,cAAc,GAAG,cAAc,CAUxE;AAED,oEAAoE;AACpE,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,cAAc,GAAG,cAAc,CAKxE;AAED,2EAA2E;AAC3E,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,cAAc,GAAG,cAAc,CAUxE;AAED,oEAAoE;AACpE,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,cAAc,GAAG,cAAc,CAOxE"}
package/dist/codecs.js ADDED
@@ -0,0 +1,122 @@
1
+ // math.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+ import { formatWKT, parseWKB, parseWKT, writeWKB } from '@math.gl/wkb';
5
+ import { getGeoArrowDimensionSize } from "./types.js";
6
+ import { makeGeoArrowColumnFromGeometryRows } from "./builder.js";
7
+ import { getGeoArrowOffset, isGeoArrowValueValid, materializeGeoArrowRows } from "./layout.js";
8
+ const textEncoder = new TextEncoder();
9
+ const textDecoder = new TextDecoder();
10
+ /** Decodes a GeoArrow WKB column into native physical geometry buffers. */
11
+ export function decodeGeoArrowWKB(column) {
12
+ if (column.encoding !== 'geoarrow.wkb')
13
+ throw new Error('Expected a geoarrow.wkb column');
14
+ const rows = normalizeRowsToDimension(decodeSerializedRows(column, bytes => parseWKB(bytes).geometry), column.dimension);
15
+ return copyMetadata(column, makeGeoArrowColumnFromGeometryRows(rows, { dimension: column.dimension }));
16
+ }
17
+ /** Encodes a native GeoArrow column as variable-width WKB bytes. */
18
+ export function encodeGeoArrowWKB(column) {
19
+ if (column.encoding === 'geoarrow.wkb')
20
+ return column;
21
+ const rows = materializeGeoArrowRows(column);
22
+ const values = rows.map(row => (row ? writeWKB(row, column.dimension) : null));
23
+ return copyMetadata(column, makeSerializedColumn(values, 'geoarrow.wkb', column.dimension));
24
+ }
25
+ /** Decodes a GeoArrow WKT column into native physical geometry buffers. */
26
+ export function decodeGeoArrowWKT(column) {
27
+ if (column.encoding !== 'geoarrow.wkt')
28
+ throw new Error('Expected a geoarrow.wkt column');
29
+ const rows = normalizeRowsToDimension(decodeSerializedRows(column, bytes => parseWKT(textDecoder.decode(bytes))), column.dimension);
30
+ return copyMetadata(column, makeGeoArrowColumnFromGeometryRows(rows, { dimension: column.dimension }));
31
+ }
32
+ /** Encodes a native GeoArrow column as variable-width UTF-8 WKT. */
33
+ export function encodeGeoArrowWKT(column) {
34
+ if (column.encoding === 'geoarrow.wkt')
35
+ return column;
36
+ const rows = materializeGeoArrowRows(column);
37
+ const values = rows.map(row => row ? textEncoder.encode(formatWKT(row, column.dimension)) : null);
38
+ return copyMetadata(column, makeSerializedColumn(values, 'geoarrow.wkt', column.dimension));
39
+ }
40
+ function normalizeRowsToDimension(rows, dimension) {
41
+ const size = getGeoArrowDimensionSize(dimension);
42
+ const normalizeGeometry = (geometry) => {
43
+ if (geometry.type === 'GeometryCollection') {
44
+ return { ...geometry, geometries: geometry.geometries.map(normalizeGeometry) };
45
+ }
46
+ return {
47
+ ...geometry,
48
+ coordinates: normalizeCoordinateNesting(geometry.coordinates, size)
49
+ };
50
+ };
51
+ return rows.map(row => (row ? normalizeGeometry(row) : null));
52
+ }
53
+ function normalizeCoordinateNesting(value, size) {
54
+ if (value.length === 0)
55
+ return [];
56
+ if (typeof value[0] === 'number') {
57
+ const coordinate = value.slice(0, size);
58
+ while (coordinate.length < size)
59
+ coordinate.push(0);
60
+ return coordinate;
61
+ }
62
+ return value.map(child => normalizeCoordinateNesting(child, size));
63
+ }
64
+ function decodeSerializedRows(column, decoder) {
65
+ const rows = [];
66
+ for (const chunk of column.chunks) {
67
+ if (chunk.kind !== 'serialized')
68
+ throw new Error('Serialized column contains native storage');
69
+ for (let rowIndex = 0; rowIndex < chunk.length; rowIndex++) {
70
+ if (!isGeoArrowValueValid(chunk.validity, rowIndex)) {
71
+ rows.push(null);
72
+ continue;
73
+ }
74
+ rows.push(decoder(getSerializedBytes(chunk, rowIndex)));
75
+ }
76
+ }
77
+ return rows;
78
+ }
79
+ function getSerializedBytes(array, rowIndex) {
80
+ const offsetIndex = (array.offset || 0) + rowIndex;
81
+ const baseValue = array.offsetBase ?? 0;
82
+ const base = typeof baseValue === 'bigint' ? Number(baseValue) : baseValue;
83
+ const first = getGeoArrowOffset(array.offsets, offsetIndex) - base;
84
+ const last = getGeoArrowOffset(array.offsets, offsetIndex + 1) - base;
85
+ return array.values.subarray(first, last);
86
+ }
87
+ function makeSerializedColumn(rows, encoding, dimension) {
88
+ let byteLength = 0;
89
+ for (const row of rows)
90
+ byteLength += row?.byteLength || 0;
91
+ const values = new Uint8Array(byteLength);
92
+ const offsets = new Int32Array(rows.length + 1);
93
+ const validity = new Uint8Array(Math.ceil(rows.length / 8));
94
+ let byteOffset = 0;
95
+ for (let rowIndex = 0; rowIndex < rows.length; rowIndex++) {
96
+ const row = rows[rowIndex];
97
+ if (row) {
98
+ values.set(row, byteOffset);
99
+ byteOffset += row.byteLength;
100
+ validity[rowIndex >> 3] |= 1 << (rowIndex & 7);
101
+ }
102
+ offsets[rowIndex + 1] = byteOffset;
103
+ }
104
+ const chunk = {
105
+ kind: 'serialized',
106
+ encoding: encoding === 'geoarrow.wkb' ? 'binary' : 'utf8',
107
+ length: rows.length,
108
+ offsets,
109
+ values,
110
+ validity: { values: validity }
111
+ };
112
+ return { encoding, dimension, coordinateLayout: null, chunks: [chunk] };
113
+ }
114
+ function copyMetadata(source, target) {
115
+ return {
116
+ ...target,
117
+ spatialReference: source.spatialReference,
118
+ edges: source.edges,
119
+ metadata: source.metadata
120
+ };
121
+ }
122
+ //# sourceMappingURL=codecs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codecs.js","sourceRoot":"","sources":["../src/codecs.ts"],"names":[],"mappings":"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"}