@loaders.gl/arrow 4.0.3 → 4.1.0-alpha.1
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 +6 -3
- package/dist/arrow-loader.d.ts.map +1 -1
- package/dist/arrow-loader.js +9 -1
- package/dist/arrow-loader.js.map +1 -1
- package/dist/arrow-worker.js +272 -537
- package/dist/dist.dev.js +2399 -269
- package/dist/geoarrow/convert-geoarrow-to-binary-geometry.d.ts +33 -1
- package/dist/geoarrow/convert-geoarrow-to-binary-geometry.d.ts.map +1 -1
- package/dist/geoarrow/convert-geoarrow-to-binary-geometry.js +146 -17
- 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} +36 -25
- package/dist/geoarrow/convert-geoarrow-to-geojson-geometry.js.map +1 -0
- package/dist/geoarrow-loader.d.ts +19 -0
- package/dist/geoarrow-loader.d.ts.map +1 -0
- package/dist/geoarrow-loader.js +23 -0
- package/dist/geoarrow-loader.js.map +1 -0
- package/dist/geoarrow-writer.d.ts +9 -0
- package/dist/geoarrow-writer.d.ts.map +1 -0
- package/dist/geoarrow-writer.js +19 -0
- package/dist/geoarrow-writer.js.map +1 -0
- package/dist/index.cjs +481 -255
- package/dist/index.d.ts +9 -12
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -13
- 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/encode-arrow.d.ts.map +1 -1
- package/dist/lib/encode-arrow.js.map +1 -1
- package/dist/lib/encode-geoarrow.d.ts +15 -0
- package/dist/lib/encode-geoarrow.d.ts.map +1 -0
- package/dist/lib/encode-geoarrow.js +22 -0
- package/dist/lib/encode-geoarrow.js.map +1 -0
- package/dist/{lib → parsers}/parse-arrow-in-batches.d.ts +1 -1
- package/dist/parsers/parse-arrow-in-batches.d.ts.map +1 -0
- package/dist/parsers/parse-arrow-in-batches.js.map +1 -0
- package/dist/parsers/parse-arrow-sync.d.ts +6 -0
- package/dist/parsers/parse-arrow-sync.d.ts.map +1 -0
- package/dist/parsers/parse-arrow-sync.js +28 -0
- package/dist/parsers/parse-arrow-sync.js.map +1 -0
- package/dist/parsers/parse-geoarrow-in-batches.d.ts +6 -0
- package/dist/parsers/parse-geoarrow-in-batches.d.ts.map +1 -0
- package/dist/parsers/parse-geoarrow-in-batches.js +5 -0
- package/dist/parsers/parse-geoarrow-in-batches.js.map +1 -0
- package/dist/parsers/parse-geoarrow-sync.d.ts +6 -0
- package/dist/parsers/parse-geoarrow-sync.d.ts.map +1 -0
- package/dist/parsers/parse-geoarrow-sync.js +14 -0
- package/dist/parsers/parse-geoarrow-sync.js.map +1 -0
- package/dist/tables/convert-arrow-to-columnar-table.d.ts +8 -0
- package/dist/tables/convert-arrow-to-columnar-table.d.ts.map +1 -0
- package/dist/tables/convert-arrow-to-columnar-table.js +15 -0
- package/dist/tables/convert-arrow-to-columnar-table.js.map +1 -0
- package/dist/tables/convert-arrow-to-geojson-table.d.ts +16 -0
- package/dist/tables/convert-arrow-to-geojson-table.d.ts.map +1 -0
- package/dist/tables/convert-arrow-to-geojson-table.js +39 -0
- package/dist/tables/convert-arrow-to-geojson-table.js.map +1 -0
- package/dist/tables/convert-columnar-to-row-table.d.ts +7 -0
- package/dist/tables/convert-columnar-to-row-table.d.ts.map +1 -0
- package/dist/tables/convert-columnar-to-row-table.js +19 -0
- package/dist/tables/convert-columnar-to-row-table.js.map +1 -0
- package/dist/triangulate-on-worker.d.ts +36 -0
- package/dist/triangulate-on-worker.d.ts.map +1 -0
- package/dist/triangulate-on-worker.js +14 -0
- package/dist/triangulate-on-worker.js.map +1 -0
- package/dist/triangulation-worker.js +887 -0
- package/dist/workers/arrow-worker.js +1 -1
- package/dist/workers/arrow-worker.js.map +1 -1
- package/dist/workers/triangulation-worker-node.d.ts +2 -0
- package/dist/workers/triangulation-worker-node.d.ts.map +1 -0
- package/dist/workers/triangulation-worker-node.js +2 -0
- package/dist/workers/triangulation-worker-node.js.map +1 -0
- package/dist/workers/triangulation-worker.d.ts +2 -0
- package/dist/workers/triangulation-worker.d.ts.map +1 -0
- package/dist/workers/triangulation-worker.js +26 -0
- package/dist/workers/triangulation-worker.js.map +1 -0
- package/package.json +20 -12
- package/src/arrow-loader.ts +25 -3
- package/src/geoarrow/convert-geoarrow-to-binary-geometry.ts +247 -23
- package/src/geoarrow/{convert-geoarrow-to-geojson.ts → convert-geoarrow-to-geojson-geometry.ts} +58 -44
- package/src/geoarrow-loader.ts +51 -0
- package/src/geoarrow-writer.ts +41 -0
- package/src/index.ts +31 -37
- package/src/lib/arrow-table-batch.ts +3 -0
- package/src/lib/encode-arrow.ts +3 -0
- package/src/lib/encode-geoarrow.ts +45 -0
- package/src/{lib → parsers}/parse-arrow-in-batches.ts +4 -2
- package/src/parsers/parse-arrow-sync.ts +43 -0
- package/src/parsers/parse-geoarrow-in-batches.ts +15 -0
- package/src/parsers/parse-geoarrow-sync.ts +22 -0
- package/src/tables/convert-arrow-to-columnar-table.ts +30 -0
- package/src/tables/convert-arrow-to-geojson-table.ts +65 -0
- package/src/tables/convert-columnar-to-row-table.ts +30 -0
- package/src/triangulate-on-worker.ts +47 -0
- package/src/workers/arrow-worker.ts +1 -1
- package/src/workers/triangulation-worker-node.ts +4 -0
- package/src/workers/triangulation-worker.ts +39 -0
- package/dist/geoarrow/convert-geoarrow-to-geojson.d.ts +0 -19
- package/dist/geoarrow/convert-geoarrow-to-geojson.d.ts.map +0 -1
- package/dist/geoarrow/convert-geoarrow-to-geojson.js.map +0 -1
- package/dist/lib/parse-arrow-in-batches.d.ts.map +0 -1
- package/dist/lib/parse-arrow-in-batches.js.map +0 -1
- package/dist/lib/parse-arrow-sync.d.ts +0 -5
- package/dist/lib/parse-arrow-sync.d.ts.map +0 -1
- package/dist/lib/parse-arrow-sync.js +0 -21
- package/dist/lib/parse-arrow-sync.js.map +0 -1
- package/dist/tables/convert-arrow-to-table.d.ts +0 -21
- package/dist/tables/convert-arrow-to-table.d.ts.map +0 -1
- package/dist/tables/convert-arrow-to-table.js +0 -37
- package/dist/tables/convert-arrow-to-table.js.map +0 -1
- package/src/lib/parse-arrow-sync.ts +0 -35
- package/src/tables/convert-arrow-to-table.ts +0 -68
- /package/dist/{lib → parsers}/parse-arrow-in-batches.js +0 -0
|
@@ -5,14 +5,22 @@ import { GeoArrowEncoding } from '@loaders.gl/gis';
|
|
|
5
5
|
* Binary data from geoarrow column and can be used by e.g. deck.gl GeojsonLayer
|
|
6
6
|
*/
|
|
7
7
|
export type BinaryDataFromGeoArrow = {
|
|
8
|
+
/** Binary format geometries, an array of BinaryFeatureCollection */
|
|
8
9
|
binaryGeometries: BinaryFeatures[];
|
|
10
|
+
/** Boundary of the binary geometries */
|
|
9
11
|
bounds: [number, number, number, number];
|
|
12
|
+
/** Feature types of the binary geometries */
|
|
10
13
|
featureTypes: {
|
|
11
14
|
polygon: boolean;
|
|
12
15
|
point: boolean;
|
|
13
16
|
line: boolean;
|
|
14
17
|
};
|
|
18
|
+
/** (Optional) mean centers of the binary geometries for e.g. polygon filtering */
|
|
19
|
+
meanCenters?: number[][];
|
|
15
20
|
};
|
|
21
|
+
/**
|
|
22
|
+
* binary geometry template, see deck.gl BinaryGeometry
|
|
23
|
+
*/
|
|
16
24
|
export declare const BINARY_GEOMETRY_TEMPLATE: {
|
|
17
25
|
globalFeatureIds: {
|
|
18
26
|
value: Uint32Array;
|
|
@@ -29,12 +37,36 @@ export declare const BINARY_GEOMETRY_TEMPLATE: {
|
|
|
29
37
|
size: number;
|
|
30
38
|
};
|
|
31
39
|
};
|
|
40
|
+
export type BinaryGeometriesFromArrowOptions = {
|
|
41
|
+
/** option to specify which chunk to get binary geometries from, for progressive rendering */
|
|
42
|
+
chunkIndex?: number;
|
|
43
|
+
/** option to get mean centers from geometries, for polygon filtering */
|
|
44
|
+
calculateMeanCenters?: boolean;
|
|
45
|
+
/** option to compute the triangle indices by tesselating polygons */
|
|
46
|
+
triangulate?: boolean;
|
|
47
|
+
};
|
|
32
48
|
/**
|
|
33
49
|
* get binary geometries from geoarrow column
|
|
34
50
|
*
|
|
35
51
|
* @param geoColumn the geoarrow column, e.g. arrowTable.getChildAt(geoColumnIndex)
|
|
36
52
|
* @param geoEncoding the geo encoding of the geoarrow column, e.g. getGeoArrowEncoding(arrowTable.schema, geoColumnName)
|
|
53
|
+
* @param options options for getting binary geometries {meanCenter: boolean}
|
|
37
54
|
* @returns BinaryDataFromGeoArrow
|
|
38
55
|
*/
|
|
39
|
-
export declare function getBinaryGeometriesFromArrow(geoColumn: arrow.Vector, geoEncoding: GeoArrowEncoding): BinaryDataFromGeoArrow;
|
|
56
|
+
export declare function getBinaryGeometriesFromArrow(geoColumn: arrow.Vector, geoEncoding: GeoArrowEncoding, options?: BinaryGeometriesFromArrowOptions): BinaryDataFromGeoArrow;
|
|
57
|
+
/**
|
|
58
|
+
* Get mean centers from binary geometries
|
|
59
|
+
* @param binaryGeometries binary geometries from geoarrow column, an array of BinaryFeatureCollection
|
|
60
|
+
* @returns mean centers of the binary geometries
|
|
61
|
+
*/
|
|
62
|
+
export declare function getMeanCentersFromBinaryGeometries(binaryGeometries: BinaryFeatures[]): number[][];
|
|
63
|
+
/**
|
|
64
|
+
* get triangle indices. Allows deck.gl to skip performing costly triangulation on main thread.
|
|
65
|
+
* @param polygonIndices Indices within positions of the start of each simple Polygon
|
|
66
|
+
* @param primitivePolygonIndices Indices within positions of the start of each primitive Polygon/ring
|
|
67
|
+
* @param flatCoordinateArray Array of x, y or x, y, z positions
|
|
68
|
+
* @param nDim - number of dimensions per position
|
|
69
|
+
* @returns
|
|
70
|
+
*/
|
|
71
|
+
export declare function getTriangleIndices(polygonIndices: Uint16Array, primitivePolygonIndices: Int32Array, flatCoordinateArray: Float64Array, nDim: number): Uint32Array | null;
|
|
40
72
|
//# sourceMappingURL=convert-geoarrow-to-binary-geometry.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"convert-geoarrow-to-binary-geometry.d.ts","sourceRoot":"","sources":["../../src/geoarrow/convert-geoarrow-to-binary-geometry.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"convert-geoarrow-to-binary-geometry.d.ts","sourceRoot":"","sources":["../../src/geoarrow/convert-geoarrow-to-binary-geometry.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAEtC,OAAO,EAAC,uBAAuB,IAAI,cAAc,EAAC,MAAM,oBAAoB,CAAC;AAC7E,OAAO,EAAC,gBAAgB,EAAC,MAAM,iBAAiB,CAAC;AAajD;;GAEG;AACH,MAAM,MAAM,sBAAsB,GAAG;IACnC,oEAAoE;IACpE,gBAAgB,EAAE,cAAc,EAAE,CAAC;IACnC,wCAAwC;IACxC,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,6CAA6C;IAC7C,YAAY,EAAE;QAAC,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,OAAO,CAAA;KAAC,CAAC;IAChE,kFAAkF;IAClF,WAAW,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC;CAC1B,CAAC;AAsBF;;GAEG;AACH,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;CAMpC,CAAC;AAEF,MAAM,MAAM,gCAAgC,GAAG;IAC7C,6FAA6F;IAC7F,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,wEAAwE;IACxE,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,qEAAqE;IACrE,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,4BAA4B,CAC1C,SAAS,EAAE,KAAK,CAAC,MAAM,EACvB,WAAW,EAAE,gBAAgB,EAC7B,OAAO,CAAC,EAAE,gCAAgC,GACzC,sBAAsB,CA6ExB;AAED;;;;GAIG;AACH,wBAAgB,kCAAkC,CAAC,gBAAgB,EAAE,cAAc,EAAE,GAAG,MAAM,EAAE,EAAE,CAiCjG;AA2ED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,cAAc,EAAE,WAAW,EAC3B,uBAAuB,EAAE,UAAU,EACnC,mBAAmB,EAAE,YAAY,EACjC,IAAI,EAAE,MAAM,GACX,WAAW,GAAG,IAAI,CA0CpB"}
|
|
@@ -1,4 +1,11 @@
|
|
|
1
|
+
import { earcut } from '@math.gl/polygon';
|
|
1
2
|
import { updateBoundsFromGeoArrowSamples } from "./get-arrow-bounds.js";
|
|
3
|
+
var BinaryGeometryType = function (BinaryGeometryType) {
|
|
4
|
+
BinaryGeometryType["points"] = "points";
|
|
5
|
+
BinaryGeometryType["lines"] = "lines";
|
|
6
|
+
BinaryGeometryType["polygons"] = "polygons";
|
|
7
|
+
return BinaryGeometryType;
|
|
8
|
+
}(BinaryGeometryType || {});
|
|
2
9
|
export const BINARY_GEOMETRY_TEMPLATE = {
|
|
3
10
|
globalFeatureIds: {
|
|
4
11
|
value: new Uint32Array(0),
|
|
@@ -15,13 +22,13 @@ export const BINARY_GEOMETRY_TEMPLATE = {
|
|
|
15
22
|
size: 1
|
|
16
23
|
}
|
|
17
24
|
};
|
|
18
|
-
export function getBinaryGeometriesFromArrow(geoColumn, geoEncoding) {
|
|
25
|
+
export function getBinaryGeometriesFromArrow(geoColumn, geoEncoding, options) {
|
|
19
26
|
const featureTypes = {
|
|
20
27
|
polygon: geoEncoding === 'geoarrow.multipolygon' || geoEncoding === 'geoarrow.polygon',
|
|
21
28
|
point: geoEncoding === 'geoarrow.multipoint' || geoEncoding === 'geoarrow.point',
|
|
22
29
|
line: geoEncoding === 'geoarrow.multilinestring' || geoEncoding === 'geoarrow.linestring'
|
|
23
30
|
};
|
|
24
|
-
const chunks = geoColumn.data;
|
|
31
|
+
const chunks = options !== null && options !== void 0 && options.chunkIndex ? [geoColumn.data[options === null || options === void 0 ? void 0 : options.chunkIndex]] : geoColumn.data;
|
|
25
32
|
let bounds = [Infinity, Infinity, -Infinity, -Infinity];
|
|
26
33
|
let globalFeatureIdOffset = 0;
|
|
27
34
|
const binaryGeometries = [];
|
|
@@ -30,8 +37,9 @@ export function getBinaryGeometriesFromArrow(geoColumn, geoEncoding) {
|
|
|
30
37
|
featureIds,
|
|
31
38
|
flatCoordinateArray,
|
|
32
39
|
nDim,
|
|
33
|
-
geomOffset
|
|
34
|
-
|
|
40
|
+
geomOffset,
|
|
41
|
+
triangles
|
|
42
|
+
} = getBinaryGeometriesFromChunk(chunk, geoEncoding, options);
|
|
35
43
|
const globalFeatureIds = new Uint32Array(featureIds.length);
|
|
36
44
|
for (let i = 0; i < featureIds.length; i++) {
|
|
37
45
|
globalFeatureIds[i] = featureIds[i] + globalFeatureIdOffset;
|
|
@@ -81,7 +89,13 @@ export function getBinaryGeometriesFromArrow(geoColumn, geoEncoding) {
|
|
|
81
89
|
primitivePolygonIndices: {
|
|
82
90
|
value: featureTypes.polygon ? geomOffset : new Uint16Array(0),
|
|
83
91
|
size: 1
|
|
84
|
-
}
|
|
92
|
+
},
|
|
93
|
+
...(triangles ? {
|
|
94
|
+
triangles: {
|
|
95
|
+
value: triangles,
|
|
96
|
+
size: 1
|
|
97
|
+
}
|
|
98
|
+
} : {})
|
|
85
99
|
}
|
|
86
100
|
});
|
|
87
101
|
bounds = updateBoundsFromGeoArrowSamples(flatCoordinateArray, nDim, bounds);
|
|
@@ -89,10 +103,67 @@ export function getBinaryGeometriesFromArrow(geoColumn, geoEncoding) {
|
|
|
89
103
|
return {
|
|
90
104
|
binaryGeometries,
|
|
91
105
|
bounds,
|
|
92
|
-
featureTypes
|
|
106
|
+
featureTypes,
|
|
107
|
+
...(options !== null && options !== void 0 && options.calculateMeanCenters ? {
|
|
108
|
+
meanCenters: getMeanCentersFromBinaryGeometries(binaryGeometries)
|
|
109
|
+
} : {})
|
|
93
110
|
};
|
|
94
111
|
}
|
|
95
|
-
function
|
|
112
|
+
export function getMeanCentersFromBinaryGeometries(binaryGeometries) {
|
|
113
|
+
const globalMeanCenters = [];
|
|
114
|
+
binaryGeometries.forEach(binaryGeometry => {
|
|
115
|
+
let binaryGeometryType = null;
|
|
116
|
+
if (binaryGeometry.points && binaryGeometry.points.positions.value.length > 0) {
|
|
117
|
+
binaryGeometryType = BinaryGeometryType.points;
|
|
118
|
+
} else if (binaryGeometry.lines && binaryGeometry.lines.positions.value.length > 0) {
|
|
119
|
+
binaryGeometryType = BinaryGeometryType.lines;
|
|
120
|
+
} else if (binaryGeometry.polygons && binaryGeometry.polygons.positions.value.length > 0) {
|
|
121
|
+
binaryGeometryType = BinaryGeometryType.polygons;
|
|
122
|
+
}
|
|
123
|
+
const binaryContent = binaryGeometryType ? binaryGeometry[binaryGeometryType] : null;
|
|
124
|
+
if (binaryContent && binaryGeometryType !== null) {
|
|
125
|
+
var _binaryContent$primit;
|
|
126
|
+
const featureIds = binaryContent.featureIds.value;
|
|
127
|
+
const flatCoordinateArray = binaryContent.positions.value;
|
|
128
|
+
const nDim = binaryContent.positions.size;
|
|
129
|
+
const primitivePolygonIndices = binaryContent.type === 'Polygon' ? (_binaryContent$primit = binaryContent.primitivePolygonIndices) === null || _binaryContent$primit === void 0 ? void 0 : _binaryContent$primit.value : undefined;
|
|
130
|
+
const meanCenters = getMeanCentersFromGeometry(featureIds, flatCoordinateArray, nDim, binaryGeometryType, primitivePolygonIndices);
|
|
131
|
+
meanCenters.forEach(center => {
|
|
132
|
+
globalMeanCenters.push(center);
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
return globalMeanCenters;
|
|
137
|
+
}
|
|
138
|
+
function getMeanCentersFromGeometry(featureIds, flatCoordinateArray, nDim, geometryType, primitivePolygonIndices) {
|
|
139
|
+
const meanCenters = [];
|
|
140
|
+
const vertexCount = flatCoordinateArray.length;
|
|
141
|
+
let vertexIndex = 0;
|
|
142
|
+
let coordIdx = 0;
|
|
143
|
+
let primitiveIdx = 0;
|
|
144
|
+
while (vertexIndex < vertexCount) {
|
|
145
|
+
const featureId = featureIds[vertexIndex / nDim];
|
|
146
|
+
const center = [0, 0];
|
|
147
|
+
let vertexCountInFeature = 0;
|
|
148
|
+
while (vertexIndex < vertexCount && featureIds[coordIdx] === featureId) {
|
|
149
|
+
if (geometryType === BinaryGeometryType.polygons && (primitivePolygonIndices === null || primitivePolygonIndices === void 0 ? void 0 : primitivePolygonIndices[primitiveIdx]) === coordIdx) {
|
|
150
|
+
vertexIndex += nDim;
|
|
151
|
+
primitiveIdx++;
|
|
152
|
+
} else {
|
|
153
|
+
center[0] += flatCoordinateArray[vertexIndex];
|
|
154
|
+
center[1] += flatCoordinateArray[vertexIndex + 1];
|
|
155
|
+
vertexIndex += nDim;
|
|
156
|
+
vertexCountInFeature++;
|
|
157
|
+
}
|
|
158
|
+
coordIdx += 1;
|
|
159
|
+
}
|
|
160
|
+
center[0] /= vertexCountInFeature;
|
|
161
|
+
center[1] /= vertexCountInFeature;
|
|
162
|
+
meanCenters.push(center);
|
|
163
|
+
}
|
|
164
|
+
return meanCenters;
|
|
165
|
+
}
|
|
166
|
+
function getBinaryGeometriesFromChunk(chunk, geoEncoding, options) {
|
|
96
167
|
switch (geoEncoding) {
|
|
97
168
|
case 'geoarrow.point':
|
|
98
169
|
case 'geoarrow.multipoint':
|
|
@@ -102,12 +173,44 @@ function getBinaryGeometriesFromChunk(chunk, geoEncoding) {
|
|
|
102
173
|
return getBinaryLinesFromChunk(chunk, geoEncoding);
|
|
103
174
|
case 'geoarrow.polygon':
|
|
104
175
|
case 'geoarrow.multipolygon':
|
|
105
|
-
return getBinaryPolygonsFromChunk(chunk, geoEncoding);
|
|
176
|
+
return getBinaryPolygonsFromChunk(chunk, geoEncoding, options);
|
|
106
177
|
default:
|
|
107
178
|
throw Error('invalid geoarrow encoding');
|
|
108
179
|
}
|
|
109
180
|
}
|
|
110
|
-
function
|
|
181
|
+
export function getTriangleIndices(polygonIndices, primitivePolygonIndices, flatCoordinateArray, nDim) {
|
|
182
|
+
try {
|
|
183
|
+
let primitiveIndex = 0;
|
|
184
|
+
const triangles = [];
|
|
185
|
+
for (let i = 0; i < polygonIndices.length - 1; i++) {
|
|
186
|
+
const startIdx = polygonIndices[i];
|
|
187
|
+
const endIdx = polygonIndices[i + 1];
|
|
188
|
+
const slicedFlatCoords = flatCoordinateArray.subarray(startIdx * nDim, endIdx * nDim);
|
|
189
|
+
const holeIndices = [];
|
|
190
|
+
while (primitivePolygonIndices[primitiveIndex] < endIdx) {
|
|
191
|
+
if (primitivePolygonIndices[primitiveIndex] > startIdx) {
|
|
192
|
+
holeIndices.push(primitivePolygonIndices[primitiveIndex] - startIdx);
|
|
193
|
+
}
|
|
194
|
+
primitiveIndex++;
|
|
195
|
+
}
|
|
196
|
+
const triangleIndices = earcut(slicedFlatCoords, holeIndices.length > 0 ? holeIndices : undefined, nDim);
|
|
197
|
+
if (triangleIndices.length === 0) {
|
|
198
|
+
throw Error('can not tesselate invalid polygon');
|
|
199
|
+
}
|
|
200
|
+
for (let j = 0; j < triangleIndices.length; j++) {
|
|
201
|
+
triangles.push(triangleIndices[j] + startIdx);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
const trianglesUint32 = new Uint32Array(triangles.length);
|
|
205
|
+
for (let i = 0; i < triangles.length; i++) {
|
|
206
|
+
trianglesUint32[i] = triangles[i];
|
|
207
|
+
}
|
|
208
|
+
return trianglesUint32;
|
|
209
|
+
} catch (error) {
|
|
210
|
+
return null;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
function getBinaryPolygonsFromChunk(chunk, geoEncoding, options) {
|
|
111
214
|
const isMultiPolygon = geoEncoding === 'geoarrow.multipolygon';
|
|
112
215
|
const polygonData = isMultiPolygon ? chunk.children[0] : chunk;
|
|
113
216
|
const polygonOffset = polygonData.valueOffsets;
|
|
@@ -131,12 +234,16 @@ function getBinaryPolygonsFromChunk(chunk, geoEncoding) {
|
|
|
131
234
|
featureIds[j] = i;
|
|
132
235
|
}
|
|
133
236
|
}
|
|
237
|
+
const triangles = options !== null && options !== void 0 && options.triangulate ? getTriangleIndices(geometryIndicies, geomOffset, flatCoordinateArray, nDim) : null;
|
|
134
238
|
return {
|
|
135
239
|
featureIds,
|
|
136
240
|
flatCoordinateArray,
|
|
137
241
|
nDim,
|
|
138
242
|
geomOffset,
|
|
139
|
-
geometryIndicies
|
|
243
|
+
geometryIndicies,
|
|
244
|
+
...(options !== null && options !== void 0 && options.triangulate && triangles ? {
|
|
245
|
+
triangles
|
|
246
|
+
} : {})
|
|
140
247
|
};
|
|
141
248
|
}
|
|
142
249
|
function getBinaryLinesFromChunk(chunk, geoEncoding) {
|
|
@@ -150,11 +257,22 @@ function getBinaryLinesFromChunk(chunk, geoEncoding) {
|
|
|
150
257
|
const geometryIndicies = new Uint16Array(0);
|
|
151
258
|
const numOfVertices = flatCoordinateArray.length / nDim;
|
|
152
259
|
const featureIds = new Uint32Array(numOfVertices);
|
|
153
|
-
|
|
154
|
-
const
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
260
|
+
if (isMultiLineString) {
|
|
261
|
+
const partData = chunk.valueOffsets;
|
|
262
|
+
for (let i = 0; i < partData.length - 1; i++) {
|
|
263
|
+
const startIdx = geomOffset[partData[i]];
|
|
264
|
+
const endIdx = geomOffset[partData[i + 1]];
|
|
265
|
+
for (let j = startIdx; j < endIdx; j++) {
|
|
266
|
+
featureIds[j] = i;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
} else {
|
|
270
|
+
for (let i = 0; i < chunk.length; i++) {
|
|
271
|
+
const startIdx = geomOffset[i];
|
|
272
|
+
const endIdx = geomOffset[i + 1];
|
|
273
|
+
for (let j = startIdx; j < endIdx; j++) {
|
|
274
|
+
featureIds[j] = i;
|
|
275
|
+
}
|
|
158
276
|
}
|
|
159
277
|
}
|
|
160
278
|
return {
|
|
@@ -175,8 +293,19 @@ function getBinaryPointsFromChunk(chunk, geoEncoding) {
|
|
|
175
293
|
const geomOffset = new Int32Array(0);
|
|
176
294
|
const numOfVertices = flatCoordinateArray.length / nDim;
|
|
177
295
|
const featureIds = new Uint32Array(numOfVertices);
|
|
178
|
-
|
|
179
|
-
|
|
296
|
+
if (isMultiPoint) {
|
|
297
|
+
const partData = chunk.valueOffsets;
|
|
298
|
+
for (let i = 0; i < partData.length - 1; i++) {
|
|
299
|
+
const startIdx = partData[i];
|
|
300
|
+
const endIdx = partData[i + 1];
|
|
301
|
+
for (let j = startIdx; j < endIdx; j++) {
|
|
302
|
+
featureIds[j] = i;
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
} else {
|
|
306
|
+
for (let i = 0; i < chunk.length; i++) {
|
|
307
|
+
featureIds[i] = i;
|
|
308
|
+
}
|
|
180
309
|
}
|
|
181
310
|
return {
|
|
182
311
|
featureIds,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"convert-geoarrow-to-binary-geometry.js","names":["updateBoundsFromGeoArrowSamples","BINARY_GEOMETRY_TEMPLATE","globalFeatureIds","value","Uint32Array","size","positions","Float32Array","properties","numericProps","featureIds","getBinaryGeometriesFromArrow","geoColumn","geoEncoding","featureTypes","polygon","point","line","chunks","data","bounds","Infinity","globalFeatureIdOffset","binaryGeometries","forEach","chunk","flatCoordinateArray","nDim","geomOffset","getBinaryGeometriesFromChunk","length","i","binaryContent","Array","keys","map","index","push","shape","points","type","lines","pathIndices","Uint16Array","polygons","polygonIndices","primitivePolygonIndices","getBinaryPointsFromChunk","getBinaryLinesFromChunk","getBinaryPolygonsFromChunk","Error","isMultiPolygon","polygonData","children","polygonOffset","valueOffsets","partData","at","ringData","pointData","coordData","stride","values","geometryIndicies","numOfVertices","startIdx","endIdx","j","isMultiLineString","lineData","isMultiPoint","Int32Array"],"sources":["../../src/geoarrow/convert-geoarrow-to-binary-geometry.ts"],"sourcesContent":["// loaders.gl, MIT license\n// Copyright (c) vis.gl contributors\n\nimport * as arrow from 'apache-arrow';\nimport {BinaryFeatureCollection as BinaryFeatures} from '@loaders.gl/schema';\nimport {GeoArrowEncoding} from '@loaders.gl/gis';\nimport {updateBoundsFromGeoArrowSamples} from './get-arrow-bounds';\n\n/**\n * Binary data from geoarrow column and can be used by e.g. deck.gl GeojsonLayer\n */\nexport type BinaryDataFromGeoArrow = {\n binaryGeometries: BinaryFeatures[];\n bounds: [number, number, number, number];\n featureTypes: {polygon: boolean; point: boolean; line: boolean};\n};\n\ntype BinaryGeometryContent = {\n featureIds: Uint32Array;\n flatCoordinateArray: Float64Array;\n nDim: number;\n geomOffset: Int32Array;\n geometryIndicies: Uint16Array;\n};\n\n// binary geometry template, see deck.gl BinaryGeometry\nexport const BINARY_GEOMETRY_TEMPLATE = {\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/**\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 * @returns BinaryDataFromGeoArrow\n */\nexport function getBinaryGeometriesFromArrow(\n geoColumn: arrow.Vector,\n geoEncoding: GeoArrowEncoding\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 = geoColumn.data;\n let bounds: [number, number, number, number] = [Infinity, Infinity, -Infinity, -Infinity];\n let globalFeatureIdOffset = 0;\n const binaryGeometries: BinaryFeatures[] = [];\n\n chunks.forEach((chunk) => {\n const {featureIds, flatCoordinateArray, nDim, geomOffset} = getBinaryGeometriesFromChunk(\n chunk,\n geoEncoding\n );\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 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\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 ...BINARY_GEOMETRY_TEMPLATE,\n ...(featureTypes.point ? binaryContent : {})\n },\n lines: {\n type: 'LineString',\n ...BINARY_GEOMETRY_TEMPLATE,\n ...(featureTypes.line ? binaryContent : {}),\n pathIndices: {value: featureTypes.line ? geomOffset : new Uint16Array(0), size: 1}\n },\n polygons: {\n type: 'Polygon',\n ...BINARY_GEOMETRY_TEMPLATE,\n ...(featureTypes.polygon ? binaryContent : {}),\n polygonIndices: {\n // TODO why deck.gl's tessellatePolygon performance is not good when using geometryIndicies\n // even when there is no hole in any polygon\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 }\n });\n\n bounds = updateBoundsFromGeoArrowSamples(flatCoordinateArray, nDim, bounds);\n });\n\n return {binaryGeometries, bounds, featureTypes};\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 * @returns BinaryGeometryContent\n */\nfunction getBinaryGeometriesFromChunk(\n chunk: arrow.Data,\n geoEncoding: GeoArrowEncoding\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);\n default:\n throw Error('invalid geoarrow encoding');\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 * @returns BinaryGeometryContent\n */\nfunction getBinaryPolygonsFromChunk(chunk: arrow.Data, geoEncoding: string): 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 return {\n featureIds,\n flatCoordinateArray,\n nDim,\n geomOffset,\n geometryIndicies\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 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 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 for (let i = 0; i < chunk.length; i++) {\n featureIds[i] = i;\n }\n\n return {\n featureIds,\n flatCoordinateArray,\n nDim,\n geomOffset,\n geometryIndicies\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"convert-geoarrow-to-binary-geometry.js","names":["earcut","updateBoundsFromGeoArrowSamples","BinaryGeometryType","BINARY_GEOMETRY_TEMPLATE","globalFeatureIds","value","Uint32Array","size","positions","Float32Array","properties","numericProps","featureIds","getBinaryGeometriesFromArrow","geoColumn","geoEncoding","options","featureTypes","polygon","point","line","chunks","chunkIndex","data","bounds","Infinity","globalFeatureIdOffset","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","undefined","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, MIT license\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 tessellation (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 const BINARY_GEOMETRY_TEMPLATE = {\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\nexport type BinaryGeometriesFromArrowOptions = {\n /** option to specify which chunk to get binary geometries from, for progressive rendering */\n chunkIndex?: 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 = options?.chunkIndex ? [geoColumn.data[options?.chunkIndex]] : geoColumn.data;\n let bounds: [number, number, number, number] = [Infinity, Infinity, -Infinity, -Infinity];\n let globalFeatureIdOffset = 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 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 ...BINARY_GEOMETRY_TEMPLATE,\n ...(featureTypes.point ? binaryContent : {})\n },\n lines: {\n type: 'LineString',\n ...BINARY_GEOMETRY_TEMPLATE,\n ...(featureTypes.line ? binaryContent : {}),\n pathIndices: {value: featureTypes.line ? geomOffset : new Uint16Array(0), size: 1}\n },\n polygons: {\n type: 'Polygon',\n ...BINARY_GEOMETRY_TEMPLATE,\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\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 const triangleIndices = earcut(\n slicedFlatCoords,\n holeIndices.length > 0 ? holeIndices : undefined,\n nDim\n );\n if (triangleIndices.length === 0) {\n throw Error('can not tesselate 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 // TODO - add logging\n // there is an expection when tesselating invalid polygon, e.g. polygon with self-intersection\n // return null to skip tesselating\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 flatCoordinateArray,\n nDim,\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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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Geometry } from '@loaders.gl/schema';
|
|
2
|
+
import { type GeoArrowEncoding } from '@loaders.gl/gis';
|
|
3
|
+
/**
|
|
4
|
+
* parse geometry from arrow data that is returned from processArrowData()
|
|
5
|
+
* NOTE: this function could be deduplicated with the binaryToFeature() in deck.gl,
|
|
6
|
+
* it is currently used for deck.gl picking because currently deck.gl returns only the index of the feature
|
|
7
|
+
*
|
|
8
|
+
* @param data data extraced from arrow vector representing a geometry
|
|
9
|
+
* @param encoding the geoarrow encoding of the geometry column
|
|
10
|
+
* @returns Feature or null
|
|
11
|
+
*/
|
|
12
|
+
export declare function parseGeometryFromArrow(arrowCellValue: any, encoding?: GeoArrowEncoding): Geometry | null;
|
|
13
|
+
//# sourceMappingURL=convert-geoarrow-to-geojson-geometry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"convert-geoarrow-to-geojson-geometry.d.ts","sourceRoot":"","sources":["../../src/geoarrow/convert-geoarrow-to-geojson-geometry.ts"],"names":[],"mappings":"AAIA,OAAO,EAQL,QAAQ,EAET,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAmB,KAAK,gBAAgB,EAAC,MAAM,iBAAiB,CAAC;AAGxE;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CACpC,cAAc,EAAE,GAAG,EACnB,QAAQ,CAAC,EAAE,gBAAgB,GAC1B,QAAQ,GAAG,IAAI,CAwCjB"}
|
package/dist/geoarrow/{convert-geoarrow-to-geojson.js → convert-geoarrow-to-geojson-geometry.js}
RENAMED
|
@@ -1,40 +1,55 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
import { binaryToGeometry } from '@loaders.gl/gis';
|
|
2
|
+
import { WKBLoader, WKTLoader } from '@loaders.gl/wkt';
|
|
3
|
+
export function parseGeometryFromArrow(arrowCellValue, encoding) {
|
|
4
|
+
var _encoding;
|
|
5
|
+
encoding = (_encoding = encoding) === null || _encoding === void 0 ? void 0 : _encoding.toLowerCase();
|
|
6
|
+
if (!encoding || !arrowCellValue) {
|
|
6
7
|
return null;
|
|
7
8
|
}
|
|
8
9
|
let geometry;
|
|
9
10
|
switch (encoding) {
|
|
10
11
|
case 'geoarrow.multipolygon':
|
|
11
|
-
geometry = arrowMultiPolygonToFeature(
|
|
12
|
+
geometry = arrowMultiPolygonToFeature(arrowCellValue);
|
|
12
13
|
break;
|
|
13
14
|
case 'geoarrow.polygon':
|
|
14
|
-
geometry = arrowPolygonToFeature(
|
|
15
|
+
geometry = arrowPolygonToFeature(arrowCellValue);
|
|
15
16
|
break;
|
|
16
17
|
case 'geoarrow.multipoint':
|
|
17
|
-
geometry = arrowMultiPointToFeature(
|
|
18
|
+
geometry = arrowMultiPointToFeature(arrowCellValue);
|
|
18
19
|
break;
|
|
19
20
|
case 'geoarrow.point':
|
|
20
|
-
geometry = arrowPointToFeature(
|
|
21
|
+
geometry = arrowPointToFeature(arrowCellValue);
|
|
21
22
|
break;
|
|
22
23
|
case 'geoarrow.multilinestring':
|
|
23
|
-
geometry = arrowMultiLineStringToFeature(
|
|
24
|
+
geometry = arrowMultiLineStringToFeature(arrowCellValue);
|
|
24
25
|
break;
|
|
25
26
|
case 'geoarrow.linestring':
|
|
26
|
-
geometry = arrowLineStringToFeature(
|
|
27
|
+
geometry = arrowLineStringToFeature(arrowCellValue);
|
|
28
|
+
break;
|
|
29
|
+
case 'geoarrow.wkb':
|
|
30
|
+
geometry = arrowWKBToFeature(arrowCellValue);
|
|
31
|
+
break;
|
|
32
|
+
case 'geoarrow.wkt':
|
|
33
|
+
geometry = arrowWKTToFeature(arrowCellValue);
|
|
27
34
|
break;
|
|
28
35
|
default:
|
|
29
36
|
{
|
|
30
37
|
throw Error(`GeoArrow encoding not supported ${encoding}`);
|
|
31
38
|
}
|
|
32
39
|
}
|
|
33
|
-
return
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
40
|
+
return geometry;
|
|
41
|
+
}
|
|
42
|
+
function arrowWKBToFeature(arrowCellValue) {
|
|
43
|
+
var _WKBLoader$parseSync;
|
|
44
|
+
const arrayBuffer = arrowCellValue.buffer.slice(arrowCellValue.byteOffset, arrowCellValue.byteOffset + arrowCellValue.byteLength);
|
|
45
|
+
const binaryGeometry = (_WKBLoader$parseSync = WKBLoader.parseSync) === null || _WKBLoader$parseSync === void 0 ? void 0 : _WKBLoader$parseSync.call(WKBLoader, arrayBuffer);
|
|
46
|
+
const geometry = binaryToGeometry(binaryGeometry);
|
|
47
|
+
return geometry;
|
|
48
|
+
}
|
|
49
|
+
function arrowWKTToFeature(arrowCellValue) {
|
|
50
|
+
var _WKTLoader$parseTextS;
|
|
51
|
+
const string = arrowCellValue;
|
|
52
|
+
return (_WKTLoader$parseTextS = WKTLoader.parseTextSync) === null || _WKTLoader$parseTextS === void 0 ? void 0 : _WKTLoader$parseTextS.call(WKTLoader, string);
|
|
38
53
|
}
|
|
39
54
|
function arrowMultiPolygonToFeature(arrowMultiPolygon) {
|
|
40
55
|
const multiPolygon = [];
|
|
@@ -86,19 +101,17 @@ function arrowMultiPointToFeature(arrowMultiPoint) {
|
|
|
86
101
|
multiPoint.push(coord);
|
|
87
102
|
}
|
|
88
103
|
}
|
|
89
|
-
|
|
104
|
+
return {
|
|
90
105
|
type: 'MultiPoint',
|
|
91
106
|
coordinates: multiPoint
|
|
92
107
|
};
|
|
93
|
-
return geometry;
|
|
94
108
|
}
|
|
95
109
|
function arrowPointToFeature(arrowPoint) {
|
|
96
110
|
const point = Array.from(arrowPoint);
|
|
97
|
-
|
|
111
|
+
return {
|
|
98
112
|
type: 'Point',
|
|
99
113
|
coordinates: point
|
|
100
114
|
};
|
|
101
|
-
return geometry;
|
|
102
115
|
}
|
|
103
116
|
function arrowMultiLineStringToFeature(arrowMultiLineString) {
|
|
104
117
|
const multiLineString = [];
|
|
@@ -114,11 +127,10 @@ function arrowMultiLineStringToFeature(arrowMultiLineString) {
|
|
|
114
127
|
}
|
|
115
128
|
multiLineString.push(lineString);
|
|
116
129
|
}
|
|
117
|
-
|
|
130
|
+
return {
|
|
118
131
|
type: 'MultiLineString',
|
|
119
132
|
coordinates: multiLineString
|
|
120
133
|
};
|
|
121
|
-
return geometry;
|
|
122
134
|
}
|
|
123
135
|
function arrowLineStringToFeature(arrowLineString) {
|
|
124
136
|
const lineString = [];
|
|
@@ -129,10 +141,9 @@ function arrowLineStringToFeature(arrowLineString) {
|
|
|
129
141
|
lineString.push(coords);
|
|
130
142
|
}
|
|
131
143
|
}
|
|
132
|
-
|
|
144
|
+
return {
|
|
133
145
|
type: 'LineString',
|
|
134
146
|
coordinates: lineString
|
|
135
147
|
};
|
|
136
|
-
return geometry;
|
|
137
148
|
}
|
|
138
|
-
//# sourceMappingURL=convert-geoarrow-to-geojson.js.map
|
|
149
|
+
//# sourceMappingURL=convert-geoarrow-to-geojson-geometry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"convert-geoarrow-to-geojson-geometry.js","names":["binaryToGeometry","WKBLoader","WKTLoader","parseGeometryFromArrow","arrowCellValue","encoding","_encoding","toLowerCase","geometry","arrowMultiPolygonToFeature","arrowPolygonToFeature","arrowMultiPointToFeature","arrowPointToFeature","arrowMultiLineStringToFeature","arrowLineStringToFeature","arrowWKBToFeature","arrowWKTToFeature","Error","_WKBLoader$parseSync","arrayBuffer","buffer","slice","byteOffset","byteLength","binaryGeometry","parseSync","call","_WKTLoader$parseTextS","string","parseTextSync","arrowMultiPolygon","multiPolygon","m","length","arrowPolygon","get","polygon","i","arrowRing","ring","j","arrowCoord","coord","Array","from","push","type","coordinates","coords","arrowMultiPoint","multiPoint","arrowPoint","point","arrowMultiLineString","multiLineString","arrowLineString","lineString"],"sources":["../../src/geoarrow/convert-geoarrow-to-geojson-geometry.ts"],"sourcesContent":["// loaders.gl, MIT license\n// Copyright (c) vis.gl contributors\n\n// import * as arrow from 'apache-arrow';\nimport {\n MultiPolygon,\n Position,\n Polygon,\n MultiPoint,\n Point,\n MultiLineString,\n LineString,\n Geometry,\n BinaryGeometry\n} from '@loaders.gl/schema';\nimport {binaryToGeometry, type GeoArrowEncoding} from '@loaders.gl/gis';\nimport {WKBLoader, WKTLoader} from '@loaders.gl/wkt';\n\n/**\n * parse geometry from arrow data that is returned from processArrowData()\n * NOTE: this function could be deduplicated with the binaryToFeature() in deck.gl,\n * it is currently used for deck.gl picking because currently deck.gl returns only the index of the feature\n *\n * @param data data extraced from arrow vector representing a geometry\n * @param encoding the geoarrow encoding of the geometry column\n * @returns Feature or null\n */\nexport function parseGeometryFromArrow(\n arrowCellValue: any,\n encoding?: GeoArrowEncoding\n): Geometry | null {\n // sanity\n encoding = encoding?.toLowerCase() as GeoArrowEncoding;\n if (!encoding || !arrowCellValue) {\n return null;\n }\n\n let geometry: Geometry;\n\n switch (encoding) {\n case 'geoarrow.multipolygon':\n geometry = arrowMultiPolygonToFeature(arrowCellValue);\n break;\n case 'geoarrow.polygon':\n geometry = arrowPolygonToFeature(arrowCellValue);\n break;\n case 'geoarrow.multipoint':\n geometry = arrowMultiPointToFeature(arrowCellValue);\n break;\n case 'geoarrow.point':\n geometry = arrowPointToFeature(arrowCellValue);\n break;\n case 'geoarrow.multilinestring':\n geometry = arrowMultiLineStringToFeature(arrowCellValue);\n break;\n case 'geoarrow.linestring':\n geometry = arrowLineStringToFeature(arrowCellValue);\n break;\n case 'geoarrow.wkb':\n geometry = arrowWKBToFeature(arrowCellValue);\n break;\n case 'geoarrow.wkt':\n geometry = arrowWKTToFeature(arrowCellValue);\n break;\n default: {\n throw Error(`GeoArrow encoding not supported ${encoding}`);\n }\n }\n\n return geometry;\n}\n\nfunction arrowWKBToFeature(arrowCellValue: any) {\n // The actual WKB array buffer starts from byteOffset and ends at byteOffset + byteLength\n const arrayBuffer: ArrayBuffer = arrowCellValue.buffer.slice(\n arrowCellValue.byteOffset,\n arrowCellValue.byteOffset + arrowCellValue.byteLength\n );\n const binaryGeometry = WKBLoader.parseSync?.(arrayBuffer)! as BinaryGeometry;\n const geometry = binaryToGeometry(binaryGeometry);\n return geometry;\n}\n\nfunction arrowWKTToFeature(arrowCellValue: any) {\n const string: string = arrowCellValue;\n return WKTLoader.parseTextSync?.(string)!;\n}\n\n/**\n * convert Arrow MultiPolygon to geojson Feature\n */\nfunction arrowMultiPolygonToFeature(arrowMultiPolygon: any): 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: any): 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: any): 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 return {\n type: 'MultiPoint',\n coordinates: multiPoint\n };\n}\n\n/**\n * convert Arrow Point to geojson Point\n */\nfunction arrowPointToFeature(arrowPoint: any): Point {\n const point: Position = Array.from(arrowPoint);\n return {\n type: 'Point',\n coordinates: point\n };\n}\n\n/**\n * convert Arrow MultiLineString to geojson MultiLineString\n */\nfunction arrowMultiLineStringToFeature(arrowMultiLineString: any): 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 return {\n type: 'MultiLineString',\n coordinates: multiLineString\n };\n}\n\n/**\n * convert Arrow LineString to geojson LineString\n */\nfunction arrowLineStringToFeature(arrowLineString: any): 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 return {\n type: 'LineString',\n coordinates: lineString\n };\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { Loader, LoaderWithParser, LoaderOptions } from '@loaders.gl/loader-utils';
|
|
2
|
+
import type { GeoJSONTable, GeoJSONTableBatch, BinaryGeometry } from '@loaders.gl/schema';
|
|
3
|
+
import type { ArrowTable, ArrowTableBatch } from './lib/arrow-table';
|
|
4
|
+
export type GeoArrowLoaderOptions = LoaderOptions & {
|
|
5
|
+
arrow?: {
|
|
6
|
+
shape: 'arrow-table' | 'binary-geometry';
|
|
7
|
+
};
|
|
8
|
+
};
|
|
9
|
+
/** ArrowJS table loader */
|
|
10
|
+
export declare const GeoArrowWorkerLoader: Loader<ArrowTable | BinaryGeometry, never, GeoArrowLoaderOptions>;
|
|
11
|
+
/**
|
|
12
|
+
* GeoArrowLoader loads an Apache Arrow table, parses GeoArrow type extension data
|
|
13
|
+
* to convert it to a GeoJSON table or a BinaryGeometry
|
|
14
|
+
*/
|
|
15
|
+
export declare const GeoArrowLoader: LoaderWithParser<ArrowTable | GeoJSONTable, // | BinaryGeometry,
|
|
16
|
+
// | BinaryGeometry,
|
|
17
|
+
ArrowTableBatch | GeoJSONTableBatch, // | BinaryGeometry,
|
|
18
|
+
GeoArrowLoaderOptions>;
|
|
19
|
+
//# sourceMappingURL=geoarrow-loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"geoarrow-loader.d.ts","sourceRoot":"","sources":["../src/geoarrow-loader.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAC,MAAM,EAAE,gBAAgB,EAAE,aAAa,EAAC,MAAM,0BAA0B,CAAC;AAEtF,OAAO,KAAK,EAAC,YAAY,EAAE,iBAAiB,EAAE,cAAc,EAAC,MAAM,oBAAoB,CAAC;AACxF,OAAO,KAAK,EAAC,UAAU,EAAE,eAAe,EAAC,MAAM,mBAAmB,CAAC;AAInE,MAAM,MAAM,qBAAqB,GAAG,aAAa,GAAG;IAClD,KAAK,CAAC,EAAE;QACN,KAAK,EAAE,aAAa,GAAG,iBAAiB,CAAC;KAC1C,CAAC;CACH,CAAC;AAEF,2BAA2B;AAC3B,eAAO,MAAM,oBAAoB,EAAE,MAAM,CACvC,UAAU,GAAG,cAAc,EAC3B,KAAK,EACL,qBAAqB,CAQtB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,cAAc,EAAE,gBAAgB,CAC3C,UAAU,GAAG,YAAY,EAAE,oBAAoB;AAC/C,AAD2B,oBAAoB;AAC/C,eAAe,GAAG,iBAAiB,EAAE,oBAAoB;AACzD,qBAAqB,CAatB,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { ArrowWorkerLoader } from "./arrow-loader.js";
|
|
2
|
+
import { parseGeoArrowSync } from "./parsers/parse-geoarrow-sync.js";
|
|
3
|
+
import { parseGeoArrowInBatches } from "./parsers/parse-geoarrow-in-batches.js";
|
|
4
|
+
export const GeoArrowWorkerLoader = {
|
|
5
|
+
...ArrowWorkerLoader,
|
|
6
|
+
options: {
|
|
7
|
+
arrow: {
|
|
8
|
+
shape: 'arrow-table'
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
};
|
|
12
|
+
export const GeoArrowLoader = {
|
|
13
|
+
...ArrowWorkerLoader,
|
|
14
|
+
options: {
|
|
15
|
+
arrow: {
|
|
16
|
+
shape: 'arrow-table'
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
parse: async (arraybuffer, options) => parseGeoArrowSync(arraybuffer, options === null || options === void 0 ? void 0 : options.arrow),
|
|
20
|
+
parseSync: (arraybuffer, options) => parseGeoArrowSync(arraybuffer, options === null || options === void 0 ? void 0 : options.arrow),
|
|
21
|
+
parseInBatches: parseGeoArrowInBatches
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=geoarrow-loader.js.map
|