@loaders.gl/arrow 4.0.4 → 4.1.0-alpha.10
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 -0
- package/dist/arrow-loader.d.ts.map +1 -1
- package/dist/arrow-loader.js +1 -1
- package/dist/arrow-loader.js.map +1 -1
- package/dist/arrow-worker.js +241 -3
- package/dist/arrow-writer.js +1 -1
- package/dist/arrow-writer.js.map +1 -1
- package/dist/dist.dev.js +1496 -641
- package/dist/geoarrow/convert-geoarrow-to-binary-geometry.d.ts +8 -4
- package/dist/geoarrow/convert-geoarrow-to-binary-geometry.d.ts.map +1 -1
- package/dist/geoarrow/convert-geoarrow-to-binary-geometry.js +75 -54
- package/dist/geoarrow/convert-geoarrow-to-binary-geometry.js.map +1 -1
- package/dist/geoarrow/convert-geoarrow-to-geojson-geometry.d.ts +13 -0
- package/dist/geoarrow/convert-geoarrow-to-geojson-geometry.d.ts.map +1 -0
- package/dist/geoarrow/{convert-geoarrow-to-geojson.js → convert-geoarrow-to-geojson-geometry.js} +34 -27
- package/dist/geoarrow/convert-geoarrow-to-geojson-geometry.js.map +1 -0
- package/dist/geoarrow/get-arrow-bounds.d.ts.map +1 -1
- package/dist/geoarrow/get-arrow-bounds.js.map +1 -1
- package/dist/geoarrow-loader.d.ts.map +1 -1
- package/dist/geoarrow-loader.js +0 -1
- package/dist/geoarrow-loader.js.map +1 -1
- package/dist/geoarrow-writer.js +1 -1
- package/dist/geoarrow-writer.js.map +1 -1
- package/dist/index.cjs +436 -347
- package/dist/index.d.ts +5 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -3
- package/dist/index.js.map +1 -1
- package/dist/lib/arrow-table-batch.d.ts.map +1 -1
- package/dist/lib/arrow-table-batch.js.map +1 -1
- package/dist/lib/arrow-table.d.ts.map +1 -1
- package/dist/lib/arrow-table.js.map +1 -1
- package/dist/lib/encode-arrow.d.ts.map +1 -1
- package/dist/lib/encode-arrow.js.map +1 -1
- package/dist/lib/encode-geoarrow.d.ts.map +1 -1
- package/dist/lib/encode-geoarrow.js.map +1 -1
- package/dist/parsers/parse-arrow-in-batches.d.ts +2 -1
- package/dist/parsers/parse-arrow-in-batches.d.ts.map +1 -1
- package/dist/parsers/parse-arrow-in-batches.js +8 -1
- package/dist/parsers/parse-arrow-in-batches.js.map +1 -1
- package/dist/parsers/parse-arrow-sync.d.ts.map +1 -1
- package/dist/parsers/parse-arrow-sync.js +2 -0
- package/dist/parsers/parse-arrow-sync.js.map +1 -1
- package/dist/parsers/parse-geoarrow-in-batches.d.ts.map +1 -1
- package/dist/parsers/parse-geoarrow-in-batches.js.map +1 -1
- package/dist/parsers/parse-geoarrow-sync.d.ts.map +1 -1
- package/dist/parsers/parse-geoarrow-sync.js.map +1 -1
- package/dist/schema/arrow-type-utils.d.ts.map +1 -1
- package/dist/schema/arrow-type-utils.js.map +1 -1
- package/dist/schema/convert-arrow-schema.d.ts.map +1 -1
- package/dist/schema/convert-arrow-schema.js.map +1 -1
- package/dist/tables/convert-arrow-to-columnar-table.d.ts.map +1 -1
- package/dist/tables/convert-arrow-to-columnar-table.js +1 -0
- package/dist/tables/convert-arrow-to-columnar-table.js.map +1 -1
- 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 +14 -8
- package/dist/tables/convert-arrow-to-geojson-table.js.map +1 -1
- package/dist/tables/convert-columnar-to-row-table.d.ts.map +1 -1
- package/dist/tables/convert-columnar-to-row-table.js +1 -0
- package/dist/tables/convert-columnar-to-row-table.js.map +1 -1
- package/dist/tables/convert-table-to-arrow.d.ts.map +1 -1
- package/dist/tables/convert-table-to-arrow.js.map +1 -1
- package/dist/triangulate-on-worker.d.ts +40 -6
- package/dist/triangulate-on-worker.d.ts.map +1 -1
- package/dist/triangulate-on-worker.js +12 -2
- package/dist/triangulate-on-worker.js.map +1 -1
- package/dist/triangulation-worker.js +11703 -34
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/workers/arrow-worker.js.map +1 -1
- package/dist/workers/hard-clone.d.ts +23 -0
- package/dist/workers/hard-clone.d.ts.map +1 -0
- package/dist/workers/hard-clone.js +57 -0
- package/dist/workers/hard-clone.js.map +1 -0
- package/dist/workers/triangulation-worker-node.d.ts.map +1 -1
- package/dist/workers/triangulation-worker-node.js.map +1 -1
- package/dist/workers/triangulation-worker.js +37 -2
- package/dist/workers/triangulation-worker.js.map +1 -1
- package/package.json +18 -12
- package/src/arrow-loader.ts +3 -1
- package/src/geoarrow/convert-geoarrow-to-binary-geometry.ts +105 -62
- package/src/geoarrow/{convert-geoarrow-to-geojson.ts → convert-geoarrow-to-geojson-geometry.ts} +58 -47
- package/src/geoarrow/get-arrow-bounds.ts +2 -1
- package/src/geoarrow-loader.ts +2 -5
- package/src/index.ts +11 -4
- package/src/lib/arrow-table-batch.ts +2 -1
- package/src/lib/arrow-table.ts +2 -1
- package/src/lib/encode-arrow.ts +2 -1
- package/src/lib/encode-geoarrow.ts +2 -1
- package/src/parsers/parse-arrow-in-batches.ts +9 -2
- package/src/parsers/parse-arrow-sync.ts +8 -2
- package/src/parsers/parse-geoarrow-in-batches.ts +2 -1
- package/src/parsers/parse-geoarrow-sync.ts +2 -1
- package/src/schema/arrow-type-utils.ts +2 -1
- package/src/schema/convert-arrow-schema.ts +2 -1
- package/src/tables/convert-arrow-to-columnar-table.ts +3 -1
- package/src/tables/convert-arrow-to-geojson-table.ts +20 -8
- package/src/tables/convert-columnar-to-row-table.ts +3 -1
- package/src/tables/convert-table-to-arrow.ts +2 -1
- package/src/triangulate-on-worker.ts +53 -9
- package/src/types.ts +2 -1
- package/src/workers/arrow-worker.ts +2 -1
- package/src/workers/hard-clone.ts +162 -0
- package/src/workers/triangulation-worker-node.ts +2 -1
- package/src/workers/triangulation-worker.ts +59 -4
- package/dist/geoarrow/convert-geoarrow-to-geojson.d.ts +0 -20
- package/dist/geoarrow/convert-geoarrow-to-geojson.d.ts.map +0 -1
- package/dist/geoarrow/convert-geoarrow-to-geojson.js.map +0 -1
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import * as arrow from 'apache-arrow';
|
|
2
|
+
import type {Buffers} from 'apache-arrow/data';
|
|
3
|
+
|
|
4
|
+
type TypedArray =
|
|
5
|
+
| Uint8Array
|
|
6
|
+
| Uint8ClampedArray
|
|
7
|
+
| Uint16Array
|
|
8
|
+
| Uint32Array
|
|
9
|
+
| Int8Array
|
|
10
|
+
| Int16Array
|
|
11
|
+
| Int32Array
|
|
12
|
+
| Float32Array
|
|
13
|
+
| Float64Array;
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Clone an Arrow JS Data or Vector, detaching from an existing ArrayBuffer if
|
|
17
|
+
* it is shared with other.
|
|
18
|
+
*
|
|
19
|
+
* The purpose of this function is to enable transferring a `Data` instance,
|
|
20
|
+
* e.g. to a web worker, without neutering any other data.
|
|
21
|
+
*
|
|
22
|
+
* Any internal buffers that are a slice of a larger `ArrayBuffer` (i.e. where
|
|
23
|
+
* the typed array's `byteOffset` is not `0` and where its `byteLength` does not
|
|
24
|
+
* match its `array.buffer.byteLength`) are copied into new `ArrayBuffers`.
|
|
25
|
+
*
|
|
26
|
+
* If `force` is `true`, always clone internal buffers, even if not shared. If
|
|
27
|
+
* the default, `false`, any internal buffers that are **not** a slice of a
|
|
28
|
+
* larger `ArrayBuffer` will not be copied.
|
|
29
|
+
*/
|
|
30
|
+
export function hardClone<T extends arrow.DataType>(
|
|
31
|
+
input: arrow.Data<T>,
|
|
32
|
+
force?: boolean
|
|
33
|
+
): arrow.Data<T>;
|
|
34
|
+
export function hardClone<T extends arrow.DataType>(
|
|
35
|
+
input: arrow.Vector<T>,
|
|
36
|
+
force?: boolean
|
|
37
|
+
): arrow.Vector<T>;
|
|
38
|
+
|
|
39
|
+
export function hardClone<T extends arrow.DataType>(
|
|
40
|
+
data: arrow.Data<T> | arrow.Vector<T>,
|
|
41
|
+
force: boolean = false
|
|
42
|
+
): arrow.Data<T> | arrow.Vector<T> {
|
|
43
|
+
// Check if `data` is an arrow.Vector
|
|
44
|
+
if ('data' in data) {
|
|
45
|
+
return new arrow.Vector(data.data.map((data) => hardClone(data, force)));
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// Clone each of the children, recursively
|
|
49
|
+
const clonedChildren: arrow.Data[] = [];
|
|
50
|
+
for (const childData of data.children) {
|
|
51
|
+
clonedChildren.push(hardClone(childData, force));
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// Clone the dictionary if there is one
|
|
55
|
+
let clonedDictionary: arrow.Vector | undefined;
|
|
56
|
+
if (data.dictionary !== undefined) {
|
|
57
|
+
clonedDictionary = hardClone(data.dictionary, force);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Buffers can have up to four entries. Each of these can be `undefined` for
|
|
61
|
+
// one or more array types.
|
|
62
|
+
//
|
|
63
|
+
// - OFFSET: value offsets for variable size list types
|
|
64
|
+
// - DATA: the underlying data
|
|
65
|
+
// - VALIDITY: the null buffer. This may be empty or undefined if all elements
|
|
66
|
+
// are non-null/valid.
|
|
67
|
+
// - TYPE: type ids for a union type.
|
|
68
|
+
const clonedBuffers: Buffers<T> = {
|
|
69
|
+
[arrow.BufferType.OFFSET]: cloneBuffer(data.buffers[arrow.BufferType.OFFSET], force),
|
|
70
|
+
[arrow.BufferType.DATA]: cloneBuffer(data.buffers[arrow.BufferType.DATA], force),
|
|
71
|
+
[arrow.BufferType.VALIDITY]: cloneBuffer(data.buffers[arrow.BufferType.VALIDITY], force),
|
|
72
|
+
[arrow.BufferType.TYPE]: cloneBuffer(data.buffers[arrow.BufferType.TYPE], force)
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
// Note: the data.offset is passed on so that a sliced Data instance will not
|
|
76
|
+
// be "un-sliced". However keep in mind that this means we're cloning the
|
|
77
|
+
// _original backing buffer_, not only the portion of the Data that was
|
|
78
|
+
// sliced.
|
|
79
|
+
return new arrow.Data(
|
|
80
|
+
data.type,
|
|
81
|
+
data.offset,
|
|
82
|
+
data.length,
|
|
83
|
+
// @ts-expect-error _nullCount is protected. We're using it here to mimic
|
|
84
|
+
// `Data.clone`
|
|
85
|
+
data._nullCount,
|
|
86
|
+
clonedBuffers,
|
|
87
|
+
clonedChildren,
|
|
88
|
+
clonedDictionary
|
|
89
|
+
);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Test whether an arrow.Data instance is a slice of a larger `ArrayBuffer`.
|
|
94
|
+
*/
|
|
95
|
+
export function isShared<T extends arrow.DataType>(data: arrow.Data<T> | arrow.Vector<T>): boolean {
|
|
96
|
+
// Loop over arrow.Vector
|
|
97
|
+
if ('data' in data) {
|
|
98
|
+
return data.data.some((data) => isShared(data));
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// Check child data
|
|
102
|
+
for (const childData of data.children) {
|
|
103
|
+
if (isShared(childData)) {
|
|
104
|
+
return true;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// Check dictionary
|
|
109
|
+
if (data.dictionary !== undefined) {
|
|
110
|
+
if (isShared(data.dictionary)) {
|
|
111
|
+
return true;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
const bufferTypes = [
|
|
116
|
+
arrow.BufferType.OFFSET,
|
|
117
|
+
arrow.BufferType.DATA,
|
|
118
|
+
arrow.BufferType.VALIDITY,
|
|
119
|
+
arrow.BufferType.TYPE
|
|
120
|
+
];
|
|
121
|
+
for (const bufferType of bufferTypes) {
|
|
122
|
+
if (data.buffers[bufferType] !== undefined && isTypedArraySliced(data.buffers[bufferType])) {
|
|
123
|
+
return true;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
return false;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Returns true if the current typed array is a partial slice on a larger
|
|
132
|
+
* ArrayBuffer
|
|
133
|
+
*/
|
|
134
|
+
function isTypedArraySliced(arr: TypedArray): boolean {
|
|
135
|
+
return !(arr.byteOffset === 0 && arr.byteLength === arr.buffer.byteLength);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* If a slice of a larger ArrayBuffer, clone to a fresh `ArrayBuffer`.
|
|
140
|
+
*
|
|
141
|
+
* If `force` is `true`, always clone the array, even if not shared.
|
|
142
|
+
*/
|
|
143
|
+
function cloneBuffer<A extends TypedArray | undefined>(arr: A, force: boolean): A {
|
|
144
|
+
// Not all buffer types are defined for every type of Arrow array. E.g.
|
|
145
|
+
// `arrow.BufferType.TYPE` is only defined for the Union type.
|
|
146
|
+
if (arr === undefined) {
|
|
147
|
+
return arr;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// The current array is not a part of a larger ArrayBuffer, don't clone it
|
|
151
|
+
if (!force && !isTypedArraySliced(arr)) {
|
|
152
|
+
return arr;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// Note: TypedArray.slice() **copies** into a new ArrayBuffer
|
|
156
|
+
|
|
157
|
+
// @ts-expect-error 'Uint8Array' is assignable to the constraint of type 'A',
|
|
158
|
+
// but 'A' could be instantiated with a different subtype of constraint
|
|
159
|
+
// 'TypedArray'
|
|
160
|
+
// We know from arr.slice that it will always return the same
|
|
161
|
+
return arr.slice();
|
|
162
|
+
}
|
|
@@ -1,12 +1,20 @@
|
|
|
1
|
-
// loaders.gl
|
|
1
|
+
// loaders.gl
|
|
2
|
+
// SPDX-License-Identifier: MIT
|
|
2
3
|
// Copyright (c) vis.gl contributors
|
|
3
4
|
|
|
5
|
+
import * as arrow from 'apache-arrow';
|
|
4
6
|
import {createWorker} from '@loaders.gl/worker-utils';
|
|
5
|
-
import {
|
|
7
|
+
import {
|
|
8
|
+
getTriangleIndices,
|
|
9
|
+
getBinaryGeometriesFromArrow,
|
|
10
|
+
BinaryDataFromGeoArrow
|
|
11
|
+
} from '../geoarrow/convert-geoarrow-to-binary-geometry';
|
|
6
12
|
import type {
|
|
7
13
|
TriangulationWorkerInput,
|
|
8
14
|
TriangulateInput,
|
|
9
|
-
TriangulateResult
|
|
15
|
+
TriangulateResult,
|
|
16
|
+
ParseGeoArrowInput,
|
|
17
|
+
ParseGeoArrowResult
|
|
10
18
|
} from '../triangulate-on-worker';
|
|
11
19
|
|
|
12
20
|
createWorker(async (data, options = {}) => {
|
|
@@ -17,6 +25,8 @@ createWorker(async (data, options = {}) => {
|
|
|
17
25
|
return input;
|
|
18
26
|
case 'triangulate':
|
|
19
27
|
return triangulateBatch(data);
|
|
28
|
+
case 'parse-geoarrow':
|
|
29
|
+
return parseGeoArrowBatch(data);
|
|
20
30
|
default:
|
|
21
31
|
throw new Error(
|
|
22
32
|
`TriangulationWorker: Unsupported operation ${operation}. Expected 'triangulate'`
|
|
@@ -35,5 +45,50 @@ function triangulateBatch(data: TriangulateInput): TriangulateResult {
|
|
|
35
45
|
data.flatCoordinateArray,
|
|
36
46
|
data.nDim
|
|
37
47
|
);
|
|
38
|
-
return {...data, triangleIndices};
|
|
48
|
+
return {...data, ...(triangleIndices ? {triangleIndices} : {})};
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Reading the arrow file into memory is very fast. Parsing the geoarrow column is slow, and blocking the main thread.
|
|
53
|
+
* To address this issue, we can move the parsing job from main thread to parallel web workers.
|
|
54
|
+
* Each web worker will parse one chunk/batch of geoarrow column, and return binary geometries to main thread.
|
|
55
|
+
* The app on the main thread will render the binary geometries and the parsing will not block the main thread.
|
|
56
|
+
*
|
|
57
|
+
* @param data
|
|
58
|
+
* @returns
|
|
59
|
+
*/
|
|
60
|
+
function parseGeoArrowBatch(data: ParseGeoArrowInput): ParseGeoArrowResult {
|
|
61
|
+
let binaryDataFromGeoArrow: BinaryDataFromGeoArrow | null = null;
|
|
62
|
+
const {chunkData, chunkIndex, chunkOffset, geometryEncoding, calculateMeanCenters, triangle} =
|
|
63
|
+
data;
|
|
64
|
+
// rebuild chunkData that is only for geoarrow column
|
|
65
|
+
const arrowData = new arrow.Data(
|
|
66
|
+
chunkData.type,
|
|
67
|
+
chunkData.offset,
|
|
68
|
+
chunkData.length,
|
|
69
|
+
chunkData.nullCount,
|
|
70
|
+
chunkData.buffers,
|
|
71
|
+
chunkData.children,
|
|
72
|
+
chunkData.dictionary
|
|
73
|
+
);
|
|
74
|
+
// rebuild geometry column with chunkData
|
|
75
|
+
const geometryColumn = arrow.makeVector(arrowData);
|
|
76
|
+
if (geometryColumn) {
|
|
77
|
+
// NOTE: for a rebuild arrow.Vector, there is only one chunk, so chunkIndex is always 0
|
|
78
|
+
const options = {calculateMeanCenters, triangle, chunkIndex: 0, chunkOffset};
|
|
79
|
+
binaryDataFromGeoArrow = getBinaryGeometriesFromArrow(
|
|
80
|
+
geometryColumn,
|
|
81
|
+
geometryEncoding,
|
|
82
|
+
options
|
|
83
|
+
);
|
|
84
|
+
// NOTE: here binaryGeometry will be copied to main thread
|
|
85
|
+
return {
|
|
86
|
+
binaryDataFromGeoArrow,
|
|
87
|
+
chunkIndex
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
return {
|
|
91
|
+
binaryDataFromGeoArrow,
|
|
92
|
+
chunkIndex
|
|
93
|
+
};
|
|
39
94
|
}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import * as arrow from 'apache-arrow';
|
|
2
|
-
import { Feature } from '@loaders.gl/schema';
|
|
3
|
-
import type { GeoArrowEncoding } from '@loaders.gl/gis';
|
|
4
|
-
type RawArrowFeature = {
|
|
5
|
-
data: arrow.Vector;
|
|
6
|
-
encoding?: GeoArrowEncoding;
|
|
7
|
-
};
|
|
8
|
-
/**
|
|
9
|
-
* parse geometry from arrow data that is returned from processArrowData()
|
|
10
|
-
* NOTE: this function could be duplicated with the binaryToFeature() in deck.gl,
|
|
11
|
-
* it is currently only used for picking because currently deck.gl returns only the index of the feature
|
|
12
|
-
* So the following functions could be deprecated once deck.gl returns the feature directly for binary geojson layer
|
|
13
|
-
*
|
|
14
|
-
* @param rawData the raw geometry data returned from processArrowData, which is an object with two properties: encoding and data
|
|
15
|
-
* @see processArrowData
|
|
16
|
-
* @returns Feature or null
|
|
17
|
-
*/
|
|
18
|
-
export declare function parseGeometryFromArrow(rawData: RawArrowFeature): Feature | null;
|
|
19
|
-
export {};
|
|
20
|
-
//# sourceMappingURL=convert-geoarrow-to-geojson.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"convert-geoarrow-to-geojson.d.ts","sourceRoot":"","sources":["../../src/geoarrow/convert-geoarrow-to-geojson.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,EACL,OAAO,EAQR,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAC,gBAAgB,EAAC,MAAM,iBAAiB,CAAC;AAEtD,KAAK,eAAe,GAAG;IACrB,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,gBAAgB,CAAC;CAC7B,CAAC;AAEF;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,GAAG,IAAI,CAyC/E"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"convert-geoarrow-to-geojson.js","names":["parseGeometryFromArrow","rawData","_rawData$encoding","encoding","toLowerCase","data","geometry","arrowMultiPolygonToFeature","arrowPolygonToFeature","arrowMultiPointToFeature","arrowPointToFeature","arrowMultiLineStringToFeature","arrowLineStringToFeature","Error","type","properties","arrowMultiPolygon","multiPolygon","m","length","arrowPolygon","get","polygon","i","arrowRing","ring","j","arrowCoord","coord","Array","from","push","coordinates","coords","arrowMultiPoint","multiPoint","arrowPoint","point","arrowMultiLineString","multiLineString","arrowLineString","lineString"],"sources":["../../src/geoarrow/convert-geoarrow-to-geojson.ts"],"sourcesContent":["// loaders.gl, MIT license\n// Copyright (c) vis.gl contributors\n\nimport * as arrow from 'apache-arrow';\nimport {\n Feature,\n MultiPolygon,\n Position,\n Polygon,\n MultiPoint,\n Point,\n MultiLineString,\n LineString\n} from '@loaders.gl/schema';\nimport type {GeoArrowEncoding} from '@loaders.gl/gis';\n\ntype RawArrowFeature = {\n data: arrow.Vector;\n encoding?: GeoArrowEncoding;\n};\n\n/**\n * parse geometry from arrow data that is returned from processArrowData()\n * NOTE: this function could be duplicated with the binaryToFeature() in deck.gl,\n * it is currently only used for picking because currently deck.gl returns only the index of the feature\n * So the following functions could be deprecated once deck.gl returns the feature directly for binary geojson layer\n *\n * @param rawData the raw geometry data returned from processArrowData, which is an object with two properties: encoding and data\n * @see processArrowData\n * @returns Feature or null\n */\nexport function parseGeometryFromArrow(rawData: RawArrowFeature): Feature | null {\n const encoding = rawData.encoding?.toLowerCase() as typeof rawData.encoding;\n const data = rawData.data;\n if (!encoding || !data) {\n return null;\n }\n\n let geometry;\n\n switch (encoding) {\n case 'geoarrow.multipolygon':\n geometry = arrowMultiPolygonToFeature(data);\n break;\n case 'geoarrow.polygon':\n geometry = arrowPolygonToFeature(data);\n break;\n case 'geoarrow.multipoint':\n geometry = arrowMultiPointToFeature(data);\n break;\n case 'geoarrow.point':\n geometry = arrowPointToFeature(data);\n break;\n case 'geoarrow.multilinestring':\n geometry = arrowMultiLineStringToFeature(data);\n break;\n case 'geoarrow.linestring':\n geometry = arrowLineStringToFeature(data);\n break;\n case 'geoarrow.wkb':\n throw Error(`GeoArrow encoding not supported ${encoding}`);\n case 'geoarrow.wkt':\n throw Error(`GeoArrow encoding not supported ${encoding}`);\n default: {\n throw Error(`GeoArrow encoding not supported ${encoding}`);\n }\n }\n return {\n type: 'Feature',\n geometry,\n properties: {}\n };\n}\n\n/**\n * convert Arrow MultiPolygon to geojson Feature\n */\nfunction arrowMultiPolygonToFeature(arrowMultiPolygon: arrow.Vector): MultiPolygon {\n const multiPolygon: Position[][][] = [];\n for (let m = 0; m < arrowMultiPolygon.length; m++) {\n const arrowPolygon = arrowMultiPolygon.get(m);\n const polygon: Position[][] = [];\n for (let i = 0; arrowPolygon && i < arrowPolygon?.length; i++) {\n const arrowRing = arrowPolygon?.get(i);\n const ring: Position[] = [];\n for (let j = 0; arrowRing && j < arrowRing.length; j++) {\n const arrowCoord = arrowRing.get(j);\n const coord: Position = Array.from(arrowCoord);\n ring.push(coord);\n }\n polygon.push(ring);\n }\n multiPolygon.push(polygon);\n }\n const geometry: MultiPolygon = {\n type: 'MultiPolygon',\n coordinates: multiPolygon\n };\n return geometry;\n}\n\n/**\n * convert Arrow Polygon to geojson Feature\n */\nfunction arrowPolygonToFeature(arrowPolygon: arrow.Vector): Polygon {\n const polygon: Position[][] = [];\n for (let i = 0; arrowPolygon && i < arrowPolygon.length; i++) {\n const arrowRing = arrowPolygon.get(i);\n const ring: Position[] = [];\n for (let j = 0; arrowRing && j < arrowRing.length; j++) {\n const arrowCoord = arrowRing.get(j);\n const coords: Position = Array.from(arrowCoord);\n ring.push(coords);\n }\n polygon.push(ring);\n }\n const geometry: Polygon = {\n type: 'Polygon',\n coordinates: polygon\n };\n return geometry;\n}\n\n/**\n * convert Arrow MultiPoint to geojson MultiPoint\n */\nfunction arrowMultiPointToFeature(arrowMultiPoint: arrow.Vector): MultiPoint {\n const multiPoint: Position[] = [];\n for (let i = 0; arrowMultiPoint && i < arrowMultiPoint.length; i++) {\n const arrowPoint = arrowMultiPoint.get(i);\n if (arrowPoint) {\n const coord: Position = Array.from(arrowPoint);\n multiPoint.push(coord);\n }\n }\n const geometry: MultiPoint = {\n type: 'MultiPoint',\n coordinates: multiPoint\n };\n return geometry;\n}\n\n/**\n * convert Arrow Point to geojson Point\n */\nfunction arrowPointToFeature(arrowPoint: arrow.Vector): Point {\n const point: Position = Array.from(arrowPoint);\n const geometry: Point = {\n type: 'Point',\n coordinates: point\n };\n return geometry;\n}\n\n/**\n * convert Arrow MultiLineString to geojson MultiLineString\n */\nfunction arrowMultiLineStringToFeature(arrowMultiLineString: arrow.Vector): MultiLineString {\n const multiLineString: Position[][] = [];\n for (let i = 0; arrowMultiLineString && i < arrowMultiLineString.length; i++) {\n const arrowLineString = arrowMultiLineString.get(i);\n const lineString: Position[] = [];\n for (let j = 0; arrowLineString && j < arrowLineString.length; j++) {\n const arrowCoord = arrowLineString.get(j);\n if (arrowCoord) {\n const coords: Position = Array.from(arrowCoord);\n lineString.push(coords);\n }\n }\n multiLineString.push(lineString);\n }\n const geometry: MultiLineString = {\n type: 'MultiLineString',\n coordinates: multiLineString\n };\n return geometry;\n}\n\n/**\n * convert Arrow LineString to geojson LineString\n */\nfunction arrowLineStringToFeature(arrowLineString: arrow.Vector): LineString {\n const lineString: Position[] = [];\n for (let i = 0; arrowLineString && i < arrowLineString.length; i++) {\n const arrowCoord = arrowLineString.get(i);\n if (arrowCoord) {\n const coords: Position = Array.from(arrowCoord);\n lineString.push(coords);\n }\n }\n const geometry: LineString = {\n type: 'LineString',\n coordinates: lineString\n };\n return geometry;\n}\n"],"mappings":"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"}
|