@loaders.gl/arrow 4.2.0-alpha.4 → 4.2.0-alpha.6
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/arrow-loader.d.ts +1 -1
- package/dist/arrow-loader.d.ts.map +1 -1
- package/dist/arrow-loader.js +30 -19
- package/dist/arrow-worker.js +4 -2
- package/dist/arrow-writer.d.ts +1 -1
- package/dist/arrow-writer.d.ts.map +1 -1
- package/dist/arrow-writer.js +23 -16
- package/dist/dist.dev.js +361 -333
- package/dist/dist.min.js +23 -0
- package/dist/geoarrow/convert-geoarrow-to-binary-geometry.js +345 -288
- package/dist/geoarrow/convert-geoarrow-to-geojson-geometry.js +151 -124
- package/dist/geoarrow/get-arrow-bounds.js +32 -22
- package/dist/geoarrow-loader.d.ts +1 -1
- package/dist/geoarrow-loader.d.ts.map +1 -1
- package/dist/geoarrow-loader.js +22 -15
- package/dist/geoarrow-writer.js +25 -16
- package/dist/index.cjs +55 -71
- package/dist/index.cjs.map +7 -0
- package/dist/index.d.ts +16 -16
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -1
- package/dist/lib/arrow-table-batch.d.ts +1 -1
- package/dist/lib/arrow-table-batch.d.ts.map +1 -1
- package/dist/lib/arrow-table-batch.js +55 -51
- package/dist/lib/arrow-table.js +3 -1
- package/dist/lib/encode-arrow.d.ts +1 -1
- package/dist/lib/encode-arrow.d.ts.map +1 -1
- package/dist/lib/encode-arrow.js +31 -16
- package/dist/lib/encode-geoarrow.d.ts +1 -1
- package/dist/lib/encode-geoarrow.d.ts.map +1 -1
- package/dist/lib/encode-geoarrow.js +31 -16
- package/dist/parsers/parse-arrow-in-batches.d.ts +2 -2
- package/dist/parsers/parse-arrow-in-batches.d.ts.map +1 -1
- package/dist/parsers/parse-arrow-in-batches.js +49 -21
- package/dist/parsers/parse-arrow-sync.d.ts +1 -1
- package/dist/parsers/parse-arrow-sync.d.ts.map +1 -1
- package/dist/parsers/parse-arrow-sync.js +26 -22
- package/dist/parsers/parse-geoarrow-in-batches.d.ts +1 -1
- package/dist/parsers/parse-geoarrow-in-batches.d.ts.map +1 -1
- package/dist/parsers/parse-geoarrow-in-batches.js +7 -2
- package/dist/parsers/parse-geoarrow-sync.d.ts +1 -1
- package/dist/parsers/parse-geoarrow-sync.d.ts.map +1 -1
- package/dist/parsers/parse-geoarrow-sync.js +12 -10
- package/dist/schema/arrow-type-utils.js +36 -9
- package/dist/schema/convert-arrow-schema.js +253 -240
- package/dist/tables/convert-arrow-to-columnar-table.d.ts +1 -1
- package/dist/tables/convert-arrow-to-columnar-table.d.ts.map +1 -1
- package/dist/tables/convert-arrow-to-columnar-table.js +22 -13
- package/dist/tables/convert-arrow-to-geojson-table.d.ts +1 -1
- package/dist/tables/convert-arrow-to-geojson-table.d.ts.map +1 -1
- package/dist/tables/convert-arrow-to-geojson-table.js +47 -32
- package/dist/tables/convert-columnar-to-row-table.js +22 -16
- package/dist/tables/convert-table-to-arrow.js +58 -1
- package/dist/triangulate-on-worker.js +24 -19
- package/dist/triangulation-worker.js +6 -1
- package/dist/types.js +8 -6
- package/dist/workers/arrow-worker.js +3 -1
- package/dist/workers/hard-clone.js +93 -49
- package/dist/workers/triangulation-worker-node.d.ts +1 -1
- package/dist/workers/triangulation-worker-node.d.ts.map +1 -1
- package/dist/workers/triangulation-worker-node.js +3 -1
- package/dist/workers/triangulation-worker.js +48 -48
- package/package.json +13 -8
- package/dist/arrow-loader.js.map +0 -1
- package/dist/arrow-writer.js.map +0 -1
- package/dist/geoarrow/convert-geoarrow-to-binary-geometry.js.map +0 -1
- package/dist/geoarrow/convert-geoarrow-to-geojson-geometry.js.map +0 -1
- package/dist/geoarrow/get-arrow-bounds.js.map +0 -1
- package/dist/geoarrow-loader.js.map +0 -1
- package/dist/geoarrow-writer.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/lib/arrow-table-batch.js.map +0 -1
- package/dist/lib/arrow-table.js.map +0 -1
- package/dist/lib/encode-arrow.js.map +0 -1
- package/dist/lib/encode-geoarrow.js.map +0 -1
- package/dist/parsers/parse-arrow-in-batches.js.map +0 -1
- package/dist/parsers/parse-arrow-sync.js.map +0 -1
- package/dist/parsers/parse-geoarrow-in-batches.js.map +0 -1
- package/dist/parsers/parse-geoarrow-sync.js.map +0 -1
- package/dist/schema/arrow-type-utils.js.map +0 -1
- package/dist/schema/convert-arrow-schema.js.map +0 -1
- package/dist/tables/convert-arrow-to-columnar-table.js.map +0 -1
- package/dist/tables/convert-arrow-to-geojson-table.js.map +0 -1
- package/dist/tables/convert-columnar-to-row-table.js.map +0 -1
- package/dist/tables/convert-table-to-arrow.js.map +0 -1
- package/dist/triangulate-on-worker.js.map +0 -1
- package/dist/types.js.map +0 -1
- package/dist/workers/arrow-worker.js.map +0 -1
- package/dist/workers/hard-clone.js.map +0 -1
- package/dist/workers/triangulation-worker-node.js.map +0 -1
- package/dist/workers/triangulation-worker.js.map +0 -1
|
@@ -1,19 +1,25 @@
|
|
|
1
|
+
// loaders.gl
|
|
2
|
+
// SPDX-License-Identifier: MIT
|
|
3
|
+
// Copyright (c) vis.gl contributors
|
|
4
|
+
/**
|
|
5
|
+
*
|
|
6
|
+
* @note - should be part of schema module
|
|
7
|
+
*/
|
|
1
8
|
export function convertColumnarToRowFormatTable(columnarTable) {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
9
|
+
const tableKeys = Object.keys(columnarTable);
|
|
10
|
+
const tableRowsCount = columnarTable[tableKeys[0]].length;
|
|
11
|
+
const rowFormatTable = [];
|
|
12
|
+
for (let index = 0; index < tableRowsCount; index++) {
|
|
13
|
+
const tableItem = {};
|
|
14
|
+
for (let keyIndex = 0; keyIndex < tableKeys.length; keyIndex++) {
|
|
15
|
+
const fieldName = tableKeys[keyIndex];
|
|
16
|
+
tableItem[fieldName] = columnarTable[fieldName][index];
|
|
17
|
+
}
|
|
18
|
+
rowFormatTable.push(tableItem);
|
|
10
19
|
}
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
data: rowFormatTable
|
|
17
|
-
};
|
|
20
|
+
return {
|
|
21
|
+
shape: 'object-row-table',
|
|
22
|
+
schema: columnarTable.schema,
|
|
23
|
+
data: rowFormatTable
|
|
24
|
+
};
|
|
18
25
|
}
|
|
19
|
-
//# sourceMappingURL=convert-columnar-to-row-table.js.map
|
|
@@ -1,2 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// loaders.gl
|
|
3
|
+
// SPDX-License-Identifier: MIT
|
|
4
|
+
// Copyright (c) vis.gl contributors
|
|
5
|
+
// import {
|
|
6
|
+
// Table as ApacheArrowTable,
|
|
7
|
+
// Schema as ApacheArrowSchema,
|
|
8
|
+
// RecordBatch,
|
|
9
|
+
// FixedSizeList,
|
|
10
|
+
// Field,
|
|
11
|
+
// Data,
|
|
12
|
+
// FixedSizeListVector
|
|
13
|
+
// } from 'apache-arrow/Arrow.dom';
|
|
14
|
+
// import {AbstractVector} from 'apache-arrow/vector';
|
|
15
|
+
// import {Table} from '../../types/category-table';
|
|
16
|
+
// import {getArrowType, getArrowVector} from './arrow-type-utils';
|
|
17
|
+
// import {makeMeshAttributeMetadata} from './deduce-mesh-schema';
|
|
18
|
+
// import {getTableLength, getTableNumCols} from './table-accessors';
|
|
19
|
+
/**
|
|
20
|
+
* * Convert a loaders.gl Mesh to an Apache Arrow Table
|
|
21
|
+
* @param mesh
|
|
22
|
+
* @param metadata
|
|
23
|
+
* @param batchSize
|
|
24
|
+
* @returns
|
|
25
|
+
*
|
|
26
|
+
export function convertTableToArrow(table: Table, options?: {batchSize?: number}): ArrowTable {
|
|
27
|
+
const vectors: AbstractVector[] = [];
|
|
28
|
+
const fields: Field[] = [];
|
|
1
29
|
|
|
2
|
-
|
|
30
|
+
const length = getTableLength(table);
|
|
31
|
+
const batchSize = options?.batchSize || length;
|
|
32
|
+
|
|
33
|
+
const recordBatches: RecordBatch[] = [];
|
|
34
|
+
for (let i = 0; i < length; i += batchSize) {
|
|
35
|
+
for (let columnIndex = 0; columnIndex < getTableNumCols(table); ++columnIndex) {
|
|
36
|
+
const field_ = table.schema.fields[columnIndex];
|
|
37
|
+
const column = getTableColumnAt(table, columnIndex, i, batchSize);
|
|
38
|
+
const type = getArrowType(column);
|
|
39
|
+
const vector = getArrowVector(column);
|
|
40
|
+
const listType = new FixedSizeList(size, new Field('value', type));
|
|
41
|
+
const field = new Field(field_.name, listType, false, makeMeshAttributeMetadata(attribute));
|
|
42
|
+
const data = new Data(listType, 0, value.length / size, 0, undefined, [vector]);
|
|
43
|
+
const listVector = new FixedSizeListVector(data);
|
|
44
|
+
vectors.push(listVector);
|
|
45
|
+
fields.push(field);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
for (const attributeKey in table.columns) {
|
|
49
|
+
const attribute = mesh.attributes[attributeKey];
|
|
50
|
+
const {value, size = 1} = attribute;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const schema = new ApacheArrowSchema(fields, table?.schema?.metadata || new Map<string, string>());
|
|
54
|
+
const recordBatch = new RecordBatch(schema, vectors[0].length, vectors);
|
|
55
|
+
const apacheArrowTable = new ApacheArrowTable(schema, recordBatch);
|
|
56
|
+
|
|
57
|
+
return apacheArrowTable;
|
|
58
|
+
}
|
|
59
|
+
*/
|
|
@@ -1,24 +1,29 @@
|
|
|
1
|
+
// loaders.gl
|
|
2
|
+
// SPDX-License-Identifier: MIT
|
|
3
|
+
// Copyright (c) vis.gl contributors
|
|
1
4
|
import { processOnWorker } from '@loaders.gl/worker-utils';
|
|
2
|
-
|
|
5
|
+
// __VERSION__ is injected by babel-plugin-version-inline
|
|
6
|
+
// @ts-ignore TS2304: Cannot find name '__VERSION__'.
|
|
7
|
+
const VERSION = typeof "4.2.0-alpha.5" !== 'undefined' ? "4.2.0-alpha.5" : 'latest';
|
|
8
|
+
/**
|
|
9
|
+
* Worker for tessellating geometries. Normally called through triangulateOnWorker
|
|
10
|
+
*/
|
|
3
11
|
export const TriangulationWorker = {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
12
|
+
id: 'triangulation',
|
|
13
|
+
name: 'Triangulate',
|
|
14
|
+
module: 'arrow',
|
|
15
|
+
version: VERSION,
|
|
16
|
+
options: {}
|
|
9
17
|
};
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
operation: 'triangulate'
|
|
15
|
-
}, options);
|
|
18
|
+
/**
|
|
19
|
+
* Triangulate a set of polygons on worker, type safe API
|
|
20
|
+
*/
|
|
21
|
+
export function triangulateOnWorker(data, options = {}) {
|
|
22
|
+
return processOnWorker(TriangulationWorker, { ...data, operation: 'triangulate' }, options);
|
|
16
23
|
}
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
operation: 'parse-geoarrow'
|
|
22
|
-
}, options);
|
|
24
|
+
/**
|
|
25
|
+
* Parse GeoArrow geometry colum on worker, type safe API
|
|
26
|
+
*/
|
|
27
|
+
export function parseGeoArrowOnWorker(data, options = {}) {
|
|
28
|
+
return processOnWorker(TriangulationWorker, { ...data, operation: 'parse-geoarrow' }, options);
|
|
23
29
|
}
|
|
24
|
-
//# sourceMappingURL=triangulate-on-worker.js.map
|
|
@@ -11739,7 +11739,9 @@ return true;`);
|
|
|
11739
11739
|
}
|
|
11740
11740
|
getParentPort().then((parentPort2) => {
|
|
11741
11741
|
if (parentPort2) {
|
|
11742
|
-
parentPort2.on("message",
|
|
11742
|
+
parentPort2.on("message", (message) => {
|
|
11743
|
+
handleMessage(message);
|
|
11744
|
+
});
|
|
11743
11745
|
parentPort2.on("exit", () => console.debug("Node worker closing"));
|
|
11744
11746
|
} else {
|
|
11745
11747
|
globalThis.onmessage = handleMessage;
|
|
@@ -11798,6 +11800,9 @@ return true;`);
|
|
|
11798
11800
|
|
|
11799
11801
|
// ../worker-utils/src/lib/async-queue/async-queue.ts
|
|
11800
11802
|
var AsyncQueue2 = class {
|
|
11803
|
+
_values;
|
|
11804
|
+
_settlers;
|
|
11805
|
+
_closed;
|
|
11801
11806
|
constructor() {
|
|
11802
11807
|
this._values = [];
|
|
11803
11808
|
this._settlers = [];
|
package/dist/types.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
// loaders.gl
|
|
2
|
+
// SPDX-License-Identifier: MIT
|
|
3
|
+
// Copyright (c) vis.gl contributors
|
|
4
|
+
export var VECTOR_TYPES;
|
|
5
|
+
(function (VECTOR_TYPES) {
|
|
6
|
+
VECTOR_TYPES[VECTOR_TYPES["FLOAT"] = 0] = "FLOAT";
|
|
7
|
+
VECTOR_TYPES[VECTOR_TYPES["DATE"] = 1] = "DATE";
|
|
8
|
+
})(VECTOR_TYPES || (VECTOR_TYPES = {}));
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
+
// loaders.gl
|
|
2
|
+
// SPDX-License-Identifier: MIT
|
|
3
|
+
// Copyright (c) vis.gl contributors
|
|
1
4
|
import { createLoaderWorker } from '@loaders.gl/loader-utils';
|
|
2
5
|
import { ArrowLoader } from "../arrow-loader.js";
|
|
3
6
|
createLoaderWorker(ArrowLoader);
|
|
4
|
-
//# sourceMappingURL=arrow-worker.js.map
|
|
@@ -1,57 +1,101 @@
|
|
|
1
1
|
import * as arrow from 'apache-arrow';
|
|
2
|
-
export function hardClone(data) {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
clonedDictionary
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
2
|
+
export function hardClone(data, force = false) {
|
|
3
|
+
// Check if `data` is an arrow.Vector
|
|
4
|
+
if ('data' in data) {
|
|
5
|
+
return new arrow.Vector(data.data.map((data) => hardClone(data, force)));
|
|
6
|
+
}
|
|
7
|
+
// Clone each of the children, recursively
|
|
8
|
+
const clonedChildren = [];
|
|
9
|
+
for (const childData of data.children) {
|
|
10
|
+
clonedChildren.push(hardClone(childData, force));
|
|
11
|
+
}
|
|
12
|
+
// Clone the dictionary if there is one
|
|
13
|
+
let clonedDictionary;
|
|
14
|
+
if (data.dictionary !== undefined) {
|
|
15
|
+
clonedDictionary = hardClone(data.dictionary, force);
|
|
16
|
+
}
|
|
17
|
+
// Buffers can have up to four entries. Each of these can be `undefined` for
|
|
18
|
+
// one or more array types.
|
|
19
|
+
//
|
|
20
|
+
// - OFFSET: value offsets for variable size list types
|
|
21
|
+
// - DATA: the underlying data
|
|
22
|
+
// - VALIDITY: the null buffer. This may be empty or undefined if all elements
|
|
23
|
+
// are non-null/valid.
|
|
24
|
+
// - TYPE: type ids for a union type.
|
|
25
|
+
const clonedBuffers = {
|
|
26
|
+
[arrow.BufferType.OFFSET]: cloneBuffer(data.buffers[arrow.BufferType.OFFSET], force),
|
|
27
|
+
[arrow.BufferType.DATA]: cloneBuffer(data.buffers[arrow.BufferType.DATA], force),
|
|
28
|
+
[arrow.BufferType.VALIDITY]: cloneBuffer(data.buffers[arrow.BufferType.VALIDITY], force),
|
|
29
|
+
[arrow.BufferType.TYPE]: cloneBuffer(data.buffers[arrow.BufferType.TYPE], force)
|
|
30
|
+
};
|
|
31
|
+
// Note: the data.offset is passed on so that a sliced Data instance will not
|
|
32
|
+
// be "un-sliced". However keep in mind that this means we're cloning the
|
|
33
|
+
// _original backing buffer_, not only the portion of the Data that was
|
|
34
|
+
// sliced.
|
|
35
|
+
return new arrow.Data(data.type, data.offset, data.length,
|
|
36
|
+
// @ts-expect-error _nullCount is protected. We're using it here to mimic
|
|
37
|
+
// `Data.clone`
|
|
38
|
+
data._nullCount, clonedBuffers, clonedChildren, clonedDictionary);
|
|
22
39
|
}
|
|
40
|
+
/**
|
|
41
|
+
* Test whether an arrow.Data instance is a slice of a larger `ArrayBuffer`.
|
|
42
|
+
*/
|
|
23
43
|
export function isShared(data) {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
+
// Loop over arrow.Vector
|
|
45
|
+
if ('data' in data) {
|
|
46
|
+
return data.data.some((data) => isShared(data));
|
|
47
|
+
}
|
|
48
|
+
// Check child data
|
|
49
|
+
for (const childData of data.children) {
|
|
50
|
+
if (isShared(childData)) {
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
// Check dictionary
|
|
55
|
+
if (data.dictionary !== undefined) {
|
|
56
|
+
if (isShared(data.dictionary)) {
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
const bufferTypes = [
|
|
61
|
+
arrow.BufferType.OFFSET,
|
|
62
|
+
arrow.BufferType.DATA,
|
|
63
|
+
arrow.BufferType.VALIDITY,
|
|
64
|
+
arrow.BufferType.TYPE
|
|
65
|
+
];
|
|
66
|
+
for (const bufferType of bufferTypes) {
|
|
67
|
+
if (data.buffers[bufferType] !== undefined && isTypedArraySliced(data.buffers[bufferType])) {
|
|
68
|
+
return true;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return false;
|
|
44
72
|
}
|
|
73
|
+
/**
|
|
74
|
+
* Returns true if the current typed array is a partial slice on a larger
|
|
75
|
+
* ArrayBuffer
|
|
76
|
+
*/
|
|
45
77
|
function isTypedArraySliced(arr) {
|
|
46
|
-
|
|
78
|
+
return !(arr.byteOffset === 0 && arr.byteLength === arr.buffer.byteLength);
|
|
47
79
|
}
|
|
80
|
+
/**
|
|
81
|
+
* If a slice of a larger ArrayBuffer, clone to a fresh `ArrayBuffer`.
|
|
82
|
+
*
|
|
83
|
+
* If `force` is `true`, always clone the array, even if not shared.
|
|
84
|
+
*/
|
|
48
85
|
function cloneBuffer(arr, force) {
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
86
|
+
// Not all buffer types are defined for every type of Arrow array. E.g.
|
|
87
|
+
// `arrow.BufferType.TYPE` is only defined for the Union type.
|
|
88
|
+
if (arr === undefined) {
|
|
89
|
+
return arr;
|
|
90
|
+
}
|
|
91
|
+
// The current array is not a part of a larger ArrayBuffer, don't clone it
|
|
92
|
+
if (!force && !isTypedArraySliced(arr)) {
|
|
93
|
+
return arr;
|
|
94
|
+
}
|
|
95
|
+
// Note: TypedArray.slice() **copies** into a new ArrayBuffer
|
|
96
|
+
// @ts-expect-error 'Uint8Array' is assignable to the constraint of type 'A',
|
|
97
|
+
// but 'A' could be instantiated with a different subtype of constraint
|
|
98
|
+
// 'TypedArray'
|
|
99
|
+
// We know from arr.slice that it will always return the same
|
|
100
|
+
return arr.slice();
|
|
56
101
|
}
|
|
57
|
-
//# sourceMappingURL=hard-clone.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import
|
|
1
|
+
import "./triangulation-worker.js";
|
|
2
2
|
//# sourceMappingURL=triangulation-worker-node.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"triangulation-worker-node.d.ts","sourceRoot":"","sources":["../../src/workers/triangulation-worker-node.ts"],"names":[],"mappings":"AAIA,
|
|
1
|
+
{"version":3,"file":"triangulation-worker-node.d.ts","sourceRoot":"","sources":["../../src/workers/triangulation-worker-node.ts"],"names":[],"mappings":"AAIA,mCAAgC"}
|
|
@@ -1,58 +1,58 @@
|
|
|
1
|
+
// loaders.gl
|
|
2
|
+
// SPDX-License-Identifier: MIT
|
|
3
|
+
// Copyright (c) vis.gl contributors
|
|
1
4
|
import * as arrow from 'apache-arrow';
|
|
2
5
|
import { createWorker } from '@loaders.gl/worker-utils';
|
|
3
6
|
import { getTriangleIndices, getBinaryGeometriesFromArrow } from "../geoarrow/convert-geoarrow-to-binary-geometry.js";
|
|
4
|
-
createWorker(async
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
}
|
|
7
|
+
createWorker(async (data, options = {}) => {
|
|
8
|
+
const input = data;
|
|
9
|
+
const operation = input?.operation;
|
|
10
|
+
switch (operation) {
|
|
11
|
+
case 'test':
|
|
12
|
+
return input;
|
|
13
|
+
case 'triangulate':
|
|
14
|
+
return triangulateBatch(data);
|
|
15
|
+
case 'parse-geoarrow':
|
|
16
|
+
return parseGeoArrowBatch(data);
|
|
17
|
+
default:
|
|
18
|
+
throw new Error(`TriangulationWorker: Unsupported operation ${operation}. Expected 'triangulate'`);
|
|
19
|
+
}
|
|
18
20
|
});
|
|
19
21
|
function triangulateBatch(data) {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
} : {})
|
|
26
|
-
};
|
|
22
|
+
// Parse any WKT/WKB geometries
|
|
23
|
+
// Build binary geometries
|
|
24
|
+
// Call earcut and triangulate
|
|
25
|
+
const triangleIndices = getTriangleIndices(data.polygonIndices, data.primitivePolygonIndices, data.flatCoordinateArray, data.nDim);
|
|
26
|
+
return { ...data, ...(triangleIndices ? { triangleIndices } : {}) };
|
|
27
27
|
}
|
|
28
|
+
/**
|
|
29
|
+
* Reading the arrow file into memory is very fast. Parsing the geoarrow column is slow, and blocking the main thread.
|
|
30
|
+
* To address this issue, we can move the parsing job from main thread to parallel web workers.
|
|
31
|
+
* Each web worker will parse one chunk/batch of geoarrow column, and return binary geometries to main thread.
|
|
32
|
+
* The app on the main thread will render the binary geometries and the parsing will not block the main thread.
|
|
33
|
+
*
|
|
34
|
+
* @param data
|
|
35
|
+
* @returns
|
|
36
|
+
*/
|
|
28
37
|
function parseGeoArrowBatch(data) {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
chunkData
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
chunkOffset
|
|
46
|
-
};
|
|
47
|
-
binaryDataFromGeoArrow = getBinaryGeometriesFromArrow(geometryColumn, geometryEncoding, options);
|
|
38
|
+
let binaryDataFromGeoArrow = null;
|
|
39
|
+
const { chunkData, chunkIndex, chunkOffset, geometryEncoding, calculateMeanCenters, triangle } = data;
|
|
40
|
+
// rebuild chunkData that is only for geoarrow column
|
|
41
|
+
const arrowData = new arrow.Data(chunkData.type, chunkData.offset, chunkData.length, chunkData.nullCount, chunkData.buffers, chunkData.children, chunkData.dictionary);
|
|
42
|
+
// rebuild geometry column with chunkData
|
|
43
|
+
const geometryColumn = arrow.makeVector(arrowData);
|
|
44
|
+
if (geometryColumn) {
|
|
45
|
+
// NOTE: for a rebuild arrow.Vector, there is only one chunk, so chunkIndex is always 0
|
|
46
|
+
const options = { calculateMeanCenters, triangle, chunkIndex: 0, chunkOffset };
|
|
47
|
+
binaryDataFromGeoArrow = getBinaryGeometriesFromArrow(geometryColumn, geometryEncoding, options);
|
|
48
|
+
// NOTE: here binaryGeometry will be copied to main thread
|
|
49
|
+
return {
|
|
50
|
+
binaryDataFromGeoArrow,
|
|
51
|
+
chunkIndex
|
|
52
|
+
};
|
|
53
|
+
}
|
|
48
54
|
return {
|
|
49
|
-
|
|
50
|
-
|
|
55
|
+
binaryDataFromGeoArrow,
|
|
56
|
+
chunkIndex
|
|
51
57
|
};
|
|
52
|
-
}
|
|
53
|
-
return {
|
|
54
|
-
binaryDataFromGeoArrow,
|
|
55
|
-
chunkIndex
|
|
56
|
-
};
|
|
57
58
|
}
|
|
58
|
-
//# sourceMappingURL=triangulation-worker.js.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@loaders.gl/arrow",
|
|
3
|
-
"version": "4.2.0-alpha.
|
|
3
|
+
"version": "4.2.0-alpha.6",
|
|
4
4
|
"description": "Simple columnar table loader for the Apache Arrow format",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -44,20 +44,25 @@
|
|
|
44
44
|
"fs": false
|
|
45
45
|
},
|
|
46
46
|
"scripts": {
|
|
47
|
-
"pre-build": "npm run build-worker && npm run build-bundle && npm run build-bundle
|
|
48
|
-
"build-bundle": "ocular-bundle ./
|
|
47
|
+
"pre-build": "npm run build-worker && npm run build-bundle && npm run build-bundle-dev && npm run build-triangulation-worker",
|
|
48
|
+
"build-bundle": "ocular-bundle ./bundle.ts --output=dist/dist.min.js",
|
|
49
|
+
"build-bundle-dev": "ocular-bundle ./bundle.ts --env=dev --output=dist/dist.dev.js",
|
|
49
50
|
"build-triangulation-worker": "esbuild src/workers/triangulation-worker.ts --bundle --outfile=dist/triangulation-worker.js --platform=browser --external:{stream} --define:__VERSION__=\\\"$npm_package_version\\\"",
|
|
50
51
|
"pre-build2": "cp fixed-package.json ../../node_modules/apache-arrow/package.json && npm run build-bundle && npm run build-worker",
|
|
51
52
|
"build-worker": "esbuild src/workers/arrow-worker.ts --bundle --outfile=dist/arrow-worker.js --platform=browser --external:{stream} --define:__VERSION__=\\\"$npm_package_version\\\"",
|
|
52
53
|
"build-worker2": "esbuild src/workers/arrow-worker.ts --bundle --outfile=dist/arrow-worker.js --platform=browser --external:{stream}"
|
|
53
54
|
},
|
|
54
55
|
"dependencies": {
|
|
55
|
-
"@loaders.gl/gis": "4.2.0-alpha.
|
|
56
|
-
"@loaders.gl/loader-utils": "4.2.0-alpha.
|
|
57
|
-
"@loaders.gl/schema": "4.2.0-alpha.
|
|
58
|
-
"@loaders.gl/wkt": "4.2.0-alpha.
|
|
56
|
+
"@loaders.gl/gis": "4.2.0-alpha.6",
|
|
57
|
+
"@loaders.gl/loader-utils": "4.2.0-alpha.6",
|
|
58
|
+
"@loaders.gl/schema": "4.2.0-alpha.6",
|
|
59
|
+
"@loaders.gl/wkt": "4.2.0-alpha.6",
|
|
60
|
+
"@loaders.gl/worker-utils": "4.2.0-alpha.6",
|
|
59
61
|
"@math.gl/polygon": "4.0.0",
|
|
60
62
|
"apache-arrow": ">= 15.0.0"
|
|
61
63
|
},
|
|
62
|
-
"
|
|
64
|
+
"peerDependencies": {
|
|
65
|
+
"@loaders.gl/core": "^4.0.0"
|
|
66
|
+
},
|
|
67
|
+
"gitHead": "37bd8ca71763529f18727ee4bf29dd176aa914ca"
|
|
63
68
|
}
|
package/dist/arrow-loader.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"arrow-loader.js","names":["parseArrowSync","parseArrowInBatches","VERSION","ArrowWorkerLoader","name","id","module","version","category","extensions","mimeTypes","binary","tests","options","arrow","shape","ArrowLoader","parse","arraybuffer","parseSync","parseInBatches"],"sources":["../src/arrow-loader.ts"],"sourcesContent":["// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {Loader, LoaderWithParser, LoaderOptions} from '@loaders.gl/loader-utils';\nimport type {\n ArrayRowTable,\n ArrowTableBatch,\n ColumnarTable,\n ObjectRowTable\n} from '@loaders.gl/schema';\nimport type {ArrowTable} from './lib/arrow-table';\nimport {parseArrowSync} from './parsers/parse-arrow-sync';\nimport {parseArrowInBatches} from './parsers/parse-arrow-in-batches';\n\n// __VERSION__ is injected by babel-plugin-version-inline\n// @ts-ignore TS2304: Cannot find name '__VERSION__'.\nconst VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'latest';\n\nexport type ArrowLoaderOptions = LoaderOptions & {\n arrow?: {\n shape: 'arrow-table' | 'columnar-table' | 'array-row-table' | 'object-row-table';\n batchDebounceMs?: number;\n };\n};\n\n/** ArrowJS table loader */\nexport const ArrowWorkerLoader: Loader<ArrowTable, never, ArrowLoaderOptions> = {\n name: 'Apache Arrow',\n id: 'arrow',\n module: 'arrow',\n version: VERSION,\n // worker: true,\n category: 'table',\n extensions: ['arrow', 'feather'],\n mimeTypes: [\n 'application/vnd.apache.arrow.file',\n 'application/vnd.apache.arrow.stream',\n 'application/octet-stream'\n ],\n binary: true,\n tests: ['ARROW'],\n options: {\n arrow: {\n shape: 'columnar-table'\n }\n }\n};\n\n/** ArrowJS table loader */\nexport const ArrowLoader: LoaderWithParser<\n ArrowTable | ColumnarTable | ObjectRowTable | ArrayRowTable,\n ArrowTableBatch,\n ArrowLoaderOptions\n> = {\n ...ArrowWorkerLoader,\n parse: async (arraybuffer: ArrayBuffer, options?: ArrowLoaderOptions) =>\n parseArrowSync(arraybuffer, options?.arrow),\n parseSync: (arraybuffer: ArrayBuffer, options?: ArrowLoaderOptions) =>\n parseArrowSync(arraybuffer, options?.arrow),\n parseInBatches: parseArrowInBatches\n};\n"],"mappings":"SAYQA,cAAc;AAAA,SACdC,mBAAmB;AAI3B,MAAMC,OAAO,GAAG,sBAAkB,KAAK,WAAW,qBAAiB,QAAQ;AAU3E,OAAO,MAAMC,iBAAgE,GAAG;EAC9EC,IAAI,EAAE,cAAc;EACpBC,EAAE,EAAE,OAAO;EACXC,MAAM,EAAE,OAAO;EACfC,OAAO,EAAEL,OAAO;EAEhBM,QAAQ,EAAE,OAAO;EACjBC,UAAU,EAAE,CAAC,OAAO,EAAE,SAAS,CAAC;EAChCC,SAAS,EAAE,CACT,mCAAmC,EACnC,qCAAqC,EACrC,0BAA0B,CAC3B;EACDC,MAAM,EAAE,IAAI;EACZC,KAAK,EAAE,CAAC,OAAO,CAAC;EAChBC,OAAO,EAAE;IACPC,KAAK,EAAE;MACLC,KAAK,EAAE;IACT;EACF;AACF,CAAC;AAGD,OAAO,MAAMC,WAIZ,GAAG;EACF,GAAGb,iBAAiB;EACpBc,KAAK,EAAE,MAAAA,CAAOC,WAAwB,EAAEL,OAA4B,KAClEb,cAAc,CAACkB,WAAW,EAAEL,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAEC,KAAK,CAAC;EAC7CK,SAAS,EAAEA,CAACD,WAAwB,EAAEL,OAA4B,KAChEb,cAAc,CAACkB,WAAW,EAAEL,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAEC,KAAK,CAAC;EAC7CM,cAAc,EAAEnB;AAClB,CAAC"}
|
package/dist/arrow-writer.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"arrow-writer.js","names":["encodeArrowSync","VERSION","ArrowWriter","name","id","module","version","extensions","mimeTypes","binary","options","encode","encodeArrow","data","encodeSync"],"sources":["../src/arrow-writer.ts"],"sourcesContent":["// import type {} from '@loaders.gl/loader-utils';\n\nimport type {WriterWithEncoder, WriterOptions} from '@loaders.gl/loader-utils';\nimport {ColumnarTable} from './lib/encode-arrow';\nimport {encodeArrowSync} from './lib/encode-arrow';\n\n// __VERSION__ is injected by babel-plugin-version-inline\n// @ts-ignore TS2304: Cannot find name '__VERSION__'.\nconst VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'latest';\n\ntype ArrowWriterOptions = WriterOptions & {\n arrow?: {};\n};\n\n/** Apache Arrow writer */\nexport const ArrowWriter: WriterWithEncoder<ColumnarTable, never, ArrowWriterOptions> = {\n name: 'Apache Arrow',\n id: 'arrow',\n module: 'arrow',\n version: VERSION,\n extensions: ['arrow', 'feather'],\n mimeTypes: [\n 'application/vnd.apache.arrow.file',\n 'application/vnd.apache.arrow.stream',\n 'application/octet-stream'\n ],\n binary: true,\n options: {},\n encode: async function encodeArrow(data, options?): Promise<ArrayBuffer> {\n return encodeArrowSync(data);\n },\n encodeSync(data, options?) {\n return encodeArrowSync(data);\n }\n};\n"],"mappings":"SAIQA,eAAe;AAIvB,MAAMC,OAAO,GAAG,sBAAkB,KAAK,WAAW,qBAAiB,QAAQ;AAO3E,OAAO,MAAMC,WAAwE,GAAG;EACtFC,IAAI,EAAE,cAAc;EACpBC,EAAE,EAAE,OAAO;EACXC,MAAM,EAAE,OAAO;EACfC,OAAO,EAAEL,OAAO;EAChBM,UAAU,EAAE,CAAC,OAAO,EAAE,SAAS,CAAC;EAChCC,SAAS,EAAE,CACT,mCAAmC,EACnC,qCAAqC,EACrC,0BAA0B,CAC3B;EACDC,MAAM,EAAE,IAAI;EACZC,OAAO,EAAE,CAAC,CAAC;EACXC,MAAM,EAAE,eAAeC,WAAWA,CAACC,IAAI,EAAEH,OAAQ,EAAwB;IACvE,OAAOV,eAAe,CAACa,IAAI,CAAC;EAC9B,CAAC;EACDC,UAAUA,CAACD,IAAI,EAAEH,OAAQ,EAAE;IACzB,OAAOV,eAAe,CAACa,IAAI,CAAC;EAC9B;AACF,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"convert-geoarrow-to-binary-geometry.js","names":["earcut","updateBoundsFromGeoArrowSamples","BinaryGeometryType","getBinaryGeometryTemplate","globalFeatureIds","value","Uint32Array","size","positions","Float32Array","properties","numericProps","featureIds","getBinaryGeometriesFromArrow","geoColumn","geoEncoding","options","featureTypes","polygon","point","line","chunks","chunkIndex","undefined","data","bounds","Infinity","globalFeatureIdOffset","chunkOffset","binaryGeometries","forEach","chunk","flatCoordinateArray","nDim","geomOffset","triangles","getBinaryGeometriesFromChunk","length","i","binaryContent","Array","keys","map","index","push","shape","points","type","lines","pathIndices","Uint16Array","polygons","polygonIndices","primitivePolygonIndices","calculateMeanCenters","meanCenters","getMeanCentersFromBinaryGeometries","globalMeanCenters","binaryGeometry","binaryGeometryType","_binaryContent$primit","getMeanCentersFromGeometry","center","geometryType","vertexCount","vertexIndex","coordIdx","primitiveIdx","featureId","vertexCountInFeature","getBinaryPointsFromChunk","getBinaryLinesFromChunk","getBinaryPolygonsFromChunk","Error","getTriangleIndices","primitiveIndex","startIdx","endIdx","slicedFlatCoords","subarray","holeIndices","triangleIndices","j","trianglesUint32","error","isMultiPolygon","polygonData","children","polygonOffset","valueOffsets","partData","at","ringData","pointData","coordData","stride","values","geometryIndicies","numOfVertices","triangulate","isMultiLineString","lineData","isMultiPoint","Int32Array"],"sources":["../../src/geoarrow/convert-geoarrow-to-binary-geometry.ts"],"sourcesContent":["// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport * as arrow from 'apache-arrow';\nimport {earcut} from '@math.gl/polygon';\nimport {BinaryFeatureCollection as BinaryFeatures} from '@loaders.gl/schema';\nimport {GeoArrowEncoding} from '@loaders.gl/gis';\nimport {updateBoundsFromGeoArrowSamples} from './get-arrow-bounds';\nimport {TypedArray} from '@loaders.gl/loader-utils';\n\n/**\n * Binary geometry type\n */\nenum BinaryGeometryType {\n points = 'points',\n lines = 'lines',\n polygons = 'polygons'\n}\n\n/**\n * Binary data from geoarrow column and can be used by e.g. deck.gl GeojsonLayer\n */\nexport type BinaryDataFromGeoArrow = {\n /** Binary format geometries, an array of BinaryFeatureCollection */\n binaryGeometries: BinaryFeatures[];\n /** Boundary of the binary geometries */\n bounds: [number, number, number, number];\n /** Feature types of the binary geometries */\n featureTypes: {polygon: boolean; point: boolean; line: boolean};\n /** (Optional) mean centers of the binary geometries for e.g. polygon filtering */\n meanCenters?: number[][];\n};\n\n/**\n * Binary geometry content returned from getBinaryGeometriesFromChunk\n */\ntype BinaryGeometryContent = {\n // Array of Point feature indexes by vertex\n featureIds: Uint32Array;\n /** Flat coordinate array of e.g. x, y or x,y,z */\n flatCoordinateArray: Float64Array;\n /** Dimention of each position */\n nDim: number;\n /** Array of geometry offsets: the start index of primitive geometry */\n geomOffset: Int32Array;\n /** Array of geometry indicies: the start index of each geometry */\n geometryIndicies: Uint16Array;\n /** (Optional) indices of triangels returned from polygon triangulation (Polygon only) */\n triangles?: Uint32Array;\n /** (Optional) array of mean center of each geometry */\n meanCenters?: Float64Array;\n};\n\n/**\n * binary geometry template, see deck.gl BinaryGeometry\n */\nexport function getBinaryGeometryTemplate() {\n return {\n globalFeatureIds: {value: new Uint32Array(0), size: 1},\n positions: {value: new Float32Array(0), size: 2},\n properties: [],\n numericProps: {},\n featureIds: {value: new Uint32Array(0), size: 1}\n };\n}\n\nexport type BinaryGeometriesFromArrowOptions = {\n /** option to specify which chunk to get binary geometries from, for progressive rendering */\n chunkIndex?: number;\n /** The offset (beginning index of rows) of input chunk. Used for reconstructing globalFeatureIds in web workers */\n chunkOffset?: number;\n /** option to get mean centers from geometries, for polygon filtering */\n calculateMeanCenters?: boolean;\n /** option to compute the triangle indices by tesselating polygons */\n triangulate?: boolean;\n};\n\n/**\n * get binary geometries from geoarrow column\n *\n * @param geoColumn the geoarrow column, e.g. arrowTable.getChildAt(geoColumnIndex)\n * @param geoEncoding the geo encoding of the geoarrow column, e.g. getGeoArrowEncoding(arrowTable.schema, geoColumnName)\n * @param options options for getting binary geometries {meanCenter: boolean}\n * @returns BinaryDataFromGeoArrow\n */\nexport function getBinaryGeometriesFromArrow(\n geoColumn: arrow.Vector,\n geoEncoding: GeoArrowEncoding,\n options?: BinaryGeometriesFromArrowOptions\n): BinaryDataFromGeoArrow {\n const featureTypes = {\n polygon: geoEncoding === 'geoarrow.multipolygon' || geoEncoding === 'geoarrow.polygon',\n point: geoEncoding === 'geoarrow.multipoint' || geoEncoding === 'geoarrow.point',\n line: geoEncoding === 'geoarrow.multilinestring' || geoEncoding === 'geoarrow.linestring'\n };\n\n const chunks =\n options?.chunkIndex !== undefined && options?.chunkIndex >= 0\n ? [geoColumn.data[options?.chunkIndex]]\n : geoColumn.data;\n let bounds: [number, number, number, number] = [Infinity, Infinity, -Infinity, -Infinity];\n let globalFeatureIdOffset = options?.chunkOffset || 0;\n const binaryGeometries: BinaryFeatures[] = [];\n\n chunks.forEach((chunk) => {\n const {featureIds, flatCoordinateArray, nDim, geomOffset, triangles} =\n getBinaryGeometriesFromChunk(chunk, geoEncoding, options);\n\n const globalFeatureIds = new Uint32Array(featureIds.length);\n for (let i = 0; i < featureIds.length; i++) {\n globalFeatureIds[i] = featureIds[i] + globalFeatureIdOffset;\n }\n\n const binaryContent = {\n globalFeatureIds: {value: globalFeatureIds, size: 1},\n positions: {\n value: flatCoordinateArray,\n size: nDim\n },\n featureIds: {value: featureIds, size: 1},\n // eslint-disable-next-line no-loop-func\n properties: [...Array(chunk.length).keys()].map((i) => ({\n index: i + globalFeatureIdOffset\n }))\n };\n\n // TODO: check if chunks are sequentially accessed\n globalFeatureIdOffset += chunk.length;\n // NOTE: deck.gl defines the BinaryFeatures structure must have points, lines, polygons even if they are empty\n binaryGeometries.push({\n shape: 'binary-feature-collection',\n points: {\n type: 'Point',\n ...getBinaryGeometryTemplate(),\n ...(featureTypes.point ? binaryContent : {})\n },\n lines: {\n type: 'LineString',\n ...getBinaryGeometryTemplate(),\n ...(featureTypes.line ? binaryContent : {}),\n pathIndices: {value: featureTypes.line ? geomOffset : new Uint16Array(0), size: 1}\n },\n polygons: {\n type: 'Polygon',\n ...getBinaryGeometryTemplate(),\n ...(featureTypes.polygon ? binaryContent : {}),\n polygonIndices: {\n // use geomOffset as polygonIndices same as primitivePolygonIndices since we are using earcut to get triangule indices\n value: featureTypes.polygon ? geomOffset : new Uint16Array(0),\n size: 1\n },\n primitivePolygonIndices: {\n value: featureTypes.polygon ? geomOffset : new Uint16Array(0),\n size: 1\n },\n ...(triangles ? {triangles: {value: triangles, size: 1}} : {})\n }\n });\n\n bounds = updateBoundsFromGeoArrowSamples(flatCoordinateArray, nDim, bounds);\n });\n\n return {\n binaryGeometries,\n bounds,\n featureTypes,\n ...(options?.calculateMeanCenters\n ? {meanCenters: getMeanCentersFromBinaryGeometries(binaryGeometries)}\n : {})\n };\n}\n\n/**\n * Get mean centers from binary geometries\n * @param binaryGeometries binary geometries from geoarrow column, an array of BinaryFeatureCollection\n * @returns mean centers of the binary geometries\n */\nexport function getMeanCentersFromBinaryGeometries(binaryGeometries: BinaryFeatures[]): number[][] {\n const globalMeanCenters: number[][] = [];\n binaryGeometries.forEach((binaryGeometry: BinaryFeatures) => {\n let binaryGeometryType: keyof typeof BinaryGeometryType | null = null;\n if (binaryGeometry.points && binaryGeometry.points.positions.value.length > 0) {\n binaryGeometryType = BinaryGeometryType.points;\n } else if (binaryGeometry.lines && binaryGeometry.lines.positions.value.length > 0) {\n binaryGeometryType = BinaryGeometryType.lines;\n } else if (binaryGeometry.polygons && binaryGeometry.polygons.positions.value.length > 0) {\n binaryGeometryType = BinaryGeometryType.polygons;\n }\n\n const binaryContent = binaryGeometryType ? binaryGeometry[binaryGeometryType] : null;\n if (binaryContent && binaryGeometryType !== null) {\n const featureIds = binaryContent.featureIds.value;\n const flatCoordinateArray = binaryContent.positions.value;\n const nDim = binaryContent.positions.size;\n const primitivePolygonIndices =\n binaryContent.type === 'Polygon' ? binaryContent.primitivePolygonIndices?.value : undefined;\n\n const meanCenters = getMeanCentersFromGeometry(\n featureIds,\n flatCoordinateArray,\n nDim,\n binaryGeometryType,\n primitivePolygonIndices\n );\n meanCenters.forEach((center) => {\n globalMeanCenters.push(center);\n });\n }\n });\n return globalMeanCenters;\n}\n\n/**\n * Get mean centers from raw coordinates and feature ids\n * @param featureIds Array of feature ids indexes by vertex\n * @param flatCoordinateArray Array of vertex, e.g. x, y or x, y, z, positions\n * @param nDim number of dimensions per position\n * @returns - mean centers of each polygon\n */\nfunction getMeanCentersFromGeometry(\n featureIds: TypedArray,\n flatCoordinateArray: TypedArray,\n nDim: number,\n geometryType: keyof typeof BinaryGeometryType,\n primitivePolygonIndices?: TypedArray\n) {\n const meanCenters: number[][] = [];\n const vertexCount = flatCoordinateArray.length;\n let vertexIndex = 0;\n let coordIdx = 0;\n let primitiveIdx = 0;\n while (vertexIndex < vertexCount) {\n const featureId = featureIds[vertexIndex / nDim];\n const center = [0, 0];\n let vertexCountInFeature = 0;\n while (vertexIndex < vertexCount && featureIds[coordIdx] === featureId) {\n if (\n geometryType === BinaryGeometryType.polygons &&\n primitivePolygonIndices?.[primitiveIdx] === coordIdx\n ) {\n // skip the first point since it is the same as the last point in each ring for polygons\n vertexIndex += nDim;\n primitiveIdx++;\n } else {\n center[0] += flatCoordinateArray[vertexIndex];\n center[1] += flatCoordinateArray[vertexIndex + 1];\n vertexIndex += nDim;\n vertexCountInFeature++;\n }\n coordIdx += 1;\n }\n center[0] /= vertexCountInFeature;\n center[1] /= vertexCountInFeature;\n meanCenters.push(center);\n }\n return meanCenters;\n}\n\n/**\n * get binary geometries from geoarrow column\n * @param chunk one chunk/batch of geoarrow column\n * @param geoEncoding geo encoding of the geoarrow column\n * @param options options for getting binary geometries\n * @returns BinaryGeometryContent\n */\nfunction getBinaryGeometriesFromChunk(\n chunk: arrow.Data,\n geoEncoding: GeoArrowEncoding,\n options?: BinaryGeometriesFromArrowOptions\n): BinaryGeometryContent {\n switch (geoEncoding) {\n case 'geoarrow.point':\n case 'geoarrow.multipoint':\n return getBinaryPointsFromChunk(chunk, geoEncoding);\n case 'geoarrow.linestring':\n case 'geoarrow.multilinestring':\n return getBinaryLinesFromChunk(chunk, geoEncoding);\n case 'geoarrow.polygon':\n case 'geoarrow.multipolygon':\n return getBinaryPolygonsFromChunk(chunk, geoEncoding, options);\n default:\n throw Error('invalid geoarrow encoding');\n }\n}\n\n/**\n * get triangle indices. Allows deck.gl to skip performing costly triangulation on main thread.\n * @param polygonIndices Indices within positions of the start of each simple Polygon\n * @param primitivePolygonIndices Indices within positions of the start of each primitive Polygon/ring\n * @param flatCoordinateArray Array of x, y or x, y, z positions\n * @param nDim - number of dimensions per position\n * @returns triangle indices or null if invalid polygon and earcut fails\n */\nexport function getTriangleIndices(\n polygonIndices: Uint16Array,\n primitivePolygonIndices: Int32Array,\n flatCoordinateArray: Float64Array,\n nDim: number\n): Uint32Array | null {\n try {\n let primitiveIndex = 0;\n const triangles: number[] = [];\n // loop polygonIndices to get triangles\n for (let i = 0; i < polygonIndices.length - 1; i++) {\n const startIdx = polygonIndices[i];\n const endIdx = polygonIndices[i + 1];\n // get subarray of flatCoordinateArray\n const slicedFlatCoords = flatCoordinateArray.subarray(startIdx * nDim, endIdx * nDim);\n // get holeIndices for earcut\n const holeIndices: number[] = [];\n while (primitivePolygonIndices[primitiveIndex] < endIdx) {\n if (primitivePolygonIndices[primitiveIndex] > startIdx) {\n holeIndices.push(primitivePolygonIndices[primitiveIndex] - startIdx);\n }\n primitiveIndex++;\n }\n // TODO check if each ring is closed\n const triangleIndices = earcut(\n slicedFlatCoords,\n holeIndices.length > 0 ? holeIndices : undefined,\n nDim\n );\n if (triangleIndices.length === 0) {\n throw Error('earcut failed e.g. invalid polygon');\n }\n for (let j = 0; j < triangleIndices.length; j++) {\n triangles.push(triangleIndices[j] + startIdx);\n }\n }\n // convert traingles to Uint32Array\n const trianglesUint32 = new Uint32Array(triangles.length);\n for (let i = 0; i < triangles.length; i++) {\n trianglesUint32[i] = triangles[i];\n }\n return trianglesUint32;\n } catch (error) {\n // if earcut fails, return null\n return null;\n }\n}\n\n/**\n * get binary polygons from geoarrow polygon column\n * @param chunk one chunk of geoarrow polygon column\n * @param geoEncoding the geo encoding of the geoarrow polygon column\n * @param options options for getting binary geometries\n * @returns BinaryGeometryContent\n */\nfunction getBinaryPolygonsFromChunk(\n chunk: arrow.Data,\n geoEncoding: string,\n options?: BinaryGeometriesFromArrowOptions\n): BinaryGeometryContent {\n const isMultiPolygon = geoEncoding === 'geoarrow.multipolygon';\n\n const polygonData = isMultiPolygon ? chunk.children[0] : chunk;\n const polygonOffset = polygonData.valueOffsets;\n const partData = isMultiPolygon\n ? chunk.valueOffsets.map((i) => polygonOffset.at(i) || i)\n : chunk.valueOffsets;\n const ringData = polygonData.children[0];\n const pointData = ringData.children[0];\n const coordData = pointData.children[0];\n const nDim = pointData.stride;\n const geomOffset = ringData.valueOffsets;\n const flatCoordinateArray = coordData.values;\n\n const geometryIndicies = new Uint16Array(polygonOffset.length);\n for (let i = 0; i < polygonOffset.length; i++) {\n geometryIndicies[i] = geomOffset[polygonOffset[i]];\n }\n\n const numOfVertices = flatCoordinateArray.length / nDim;\n const featureIds = new Uint32Array(numOfVertices);\n for (let i = 0; i < partData.length - 1; i++) {\n const startIdx = geomOffset[partData[i]];\n const endIdx = geomOffset[partData[i + 1]];\n for (let j = startIdx; j < endIdx; j++) {\n featureIds[j] = i;\n }\n }\n\n const triangles = options?.triangulate\n ? getTriangleIndices(geometryIndicies, geomOffset, flatCoordinateArray, nDim)\n : null;\n\n return {\n featureIds,\n nDim,\n flatCoordinateArray,\n geomOffset,\n geometryIndicies,\n ...(options?.triangulate && triangles ? {triangles} : {})\n };\n}\n\n/**\n * get binary lines from geoarrow line column\n * @param chunk one chunk/batch of geoarrow column\n * @param geoEncoding the geo encoding of the geoarrow column\n * @returns BinaryGeometryContent\n */\nfunction getBinaryLinesFromChunk(chunk: arrow.Data, geoEncoding: string): BinaryGeometryContent {\n const isMultiLineString = geoEncoding === 'geoarrow.multilinestring';\n\n const lineData = isMultiLineString ? chunk.children[0] : chunk;\n const pointData = lineData.children[0];\n const coordData = pointData.children[0];\n\n const nDim = pointData.stride;\n const geomOffset = lineData.valueOffsets;\n const flatCoordinateArray = coordData.values;\n\n // geometryIndicies is not needed for line string\n const geometryIndicies = new Uint16Array(0);\n\n const numOfVertices = flatCoordinateArray.length / nDim;\n const featureIds = new Uint32Array(numOfVertices);\n\n if (isMultiLineString) {\n const partData = chunk.valueOffsets;\n for (let i = 0; i < partData.length - 1; i++) {\n const startIdx = geomOffset[partData[i]];\n const endIdx = geomOffset[partData[i + 1]];\n for (let j = startIdx; j < endIdx; j++) {\n featureIds[j] = i;\n }\n }\n } else {\n for (let i = 0; i < chunk.length; i++) {\n const startIdx = geomOffset[i];\n const endIdx = geomOffset[i + 1];\n for (let j = startIdx; j < endIdx; j++) {\n featureIds[j] = i;\n }\n }\n }\n\n return {\n featureIds,\n flatCoordinateArray,\n nDim,\n geomOffset,\n geometryIndicies\n };\n}\n\n/**\n * get binary points from geoarrow point column\n * @param chunk one chunk/batch of geoarrow column\n * @param geoEncoding geo encoding of the geoarrow column\n * @returns BinaryGeometryContent\n */\nfunction getBinaryPointsFromChunk(chunk: arrow.Data, geoEncoding: string): BinaryGeometryContent {\n const isMultiPoint = geoEncoding === 'geoarrow.multipoint';\n\n const pointData = isMultiPoint ? chunk.children[0] : chunk;\n const coordData = pointData.children[0];\n\n const nDim = pointData.stride;\n const flatCoordinateArray = coordData.values;\n\n // geometryIndices is not needed for point\n const geometryIndicies = new Uint16Array(0);\n // geomOffset is not needed for point\n const geomOffset = new Int32Array(0);\n\n const numOfVertices = flatCoordinateArray.length / nDim;\n const featureIds = new Uint32Array(numOfVertices);\n\n if (isMultiPoint) {\n const partData = chunk.valueOffsets;\n for (let i = 0; i < partData.length - 1; i++) {\n const startIdx = partData[i];\n const endIdx = partData[i + 1];\n for (let j = startIdx; j < endIdx; j++) {\n featureIds[j] = i;\n }\n }\n } else {\n for (let i = 0; i < chunk.length; i++) {\n featureIds[i] = i;\n }\n }\n\n return {\n featureIds,\n flatCoordinateArray,\n nDim,\n geomOffset,\n geometryIndicies\n };\n}\n"],"mappings":"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"}
|