@sqlrooms/deck 0.29.0-rc.5 → 0.29.0-rc.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/README.md +24 -2
- package/dist/DeckJsonMap.d.ts +1 -1
- package/dist/DeckJsonMap.d.ts.map +1 -1
- package/dist/DeckJsonMap.js +16 -11
- package/dist/DeckJsonMap.js.map +1 -1
- package/dist/LatitudeSelector.d.ts +11 -0
- package/dist/LatitudeSelector.d.ts.map +1 -0
- package/dist/LatitudeSelector.js +25 -0
- package/dist/LatitudeSelector.js.map +1 -0
- package/dist/LongitudeSelector.d.ts +11 -0
- package/dist/LongitudeSelector.d.ts.map +1 -0
- package/dist/LongitudeSelector.js +27 -0
- package/dist/LongitudeSelector.js.map +1 -0
- package/dist/MapSettings.d.ts +10 -0
- package/dist/MapSettings.d.ts.map +1 -0
- package/dist/MapSettings.js +96 -0
- package/dist/MapSettings.js.map +1 -0
- package/dist/ai.d.ts +168 -0
- package/dist/ai.d.ts.map +1 -0
- package/dist/ai.js +232 -0
- package/dist/ai.js.map +1 -0
- package/dist/dashboard.d.ts.map +1 -1
- package/dist/dashboard.js +72 -105
- package/dist/dashboard.js.map +1 -1
- package/dist/dashboardConfig.d.ts +22 -6
- package/dist/dashboardConfig.d.ts.map +1 -1
- package/dist/dashboardConfig.js +2 -5
- package/dist/dashboardConfig.js.map +1 -1
- package/dist/dashboardIntegration.d.ts +3 -0
- package/dist/dashboardIntegration.d.ts.map +1 -0
- package/dist/dashboardIntegration.js +16 -0
- package/dist/dashboardIntegration.js.map +1 -0
- package/dist/datasets/PreparedDatasetStore.js +2 -1
- package/dist/datasets/PreparedDatasetStore.js.map +1 -1
- package/dist/index.d.ts +8 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/json/colorScaleFunction.d.ts +1 -1
- package/dist/json/colorScaleFunction.d.ts.map +1 -1
- package/dist/json/colorScaleFunction.js +7 -1
- package/dist/json/colorScaleFunction.js.map +1 -1
- package/dist/json/extractColorScaleLegends.d.ts.map +1 -1
- package/dist/json/extractColorScaleLegends.js +0 -1
- package/dist/json/extractColorScaleLegends.js.map +1 -1
- package/dist/json/layerCompatibility.d.ts.map +1 -1
- package/dist/json/layerCompatibility.js +2 -0
- package/dist/json/layerCompatibility.js.map +1 -1
- package/dist/mapConfigUtils.d.ts +62 -0
- package/dist/mapConfigUtils.d.ts.map +1 -0
- package/dist/mapConfigUtils.js +233 -0
- package/dist/mapConfigUtils.js.map +1 -0
- package/dist/mapDataPolicy.d.ts +4 -0
- package/dist/mapDataPolicy.d.ts.map +1 -0
- package/dist/mapDataPolicy.js +25 -0
- package/dist/mapDataPolicy.js.map +1 -0
- package/dist/mapLayerConfigUtils.d.ts +38 -0
- package/dist/mapLayerConfigUtils.d.ts.map +1 -0
- package/dist/mapLayerConfigUtils.js +185 -0
- package/dist/mapLayerConfigUtils.js.map +1 -0
- package/dist/prepare/wkbDecoder.d.ts.map +1 -1
- package/dist/prepare/wkbDecoder.js +266 -67
- package/dist/prepare/wkbDecoder.js.map +1 -1
- package/dist/prepare/wkbParser.d.ts +19 -0
- package/dist/prepare/wkbParser.d.ts.map +1 -0
- package/dist/prepare/wkbParser.js +115 -0
- package/dist/prepare/wkbParser.js.map +1 -0
- package/dist/types.d.ts +8 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +8 -6
- package/dist/useDeckLayersReadyRedraw.d.ts +0 -13
- package/dist/useDeckLayersReadyRedraw.d.ts.map +0 -1
- package/dist/useDeckLayersReadyRedraw.js +0 -35
- package/dist/useDeckLayersReadyRedraw.js.map +0 -1
|
@@ -1,6 +1,15 @@
|
|
|
1
1
|
import { WKBLoader, WKTLoader } from '@loaders.gl/wkt';
|
|
2
|
-
import { Field, FixedSizeList, Float64, Table,
|
|
2
|
+
import { Field, FixedSizeList, Float64, List, makeData, Table, Vector, } from 'apache-arrow';
|
|
3
3
|
import { buildBinaryGeoJsonData } from './toGeoJsonBinary';
|
|
4
|
+
import { parseWKBHeader, readWKBPointXY, visitWKBMultiPolygonCoordinates, visitWKBPolygonCoordinates, WKB_MULTIPOLYGON, WKB_POINT, WKB_POLYGON, } from './wkbParser';
|
|
5
|
+
const COORD_FIELD = new Field('xy', new Float64(), false);
|
|
6
|
+
const VERTEX_TYPE = new FixedSizeList(2, COORD_FIELD);
|
|
7
|
+
const VERTEX_FIELD = new Field('', VERTEX_TYPE, true);
|
|
8
|
+
const RING_TYPE = new List(VERTEX_FIELD);
|
|
9
|
+
const RING_FIELD = new Field('', RING_TYPE, true);
|
|
10
|
+
const POLYGON_TYPE = new List(RING_FIELD);
|
|
11
|
+
const GEOMETRY_SAMPLE_LIMIT = 100;
|
|
12
|
+
const BITS_PER_VALIDITY_BYTE = 8;
|
|
4
13
|
function toArrayBuffer(value) {
|
|
5
14
|
if (ArrayBuffer.isView(value)) {
|
|
6
15
|
const copy = new Uint8Array(value.byteLength);
|
|
@@ -9,14 +18,51 @@ function toArrayBuffer(value) {
|
|
|
9
18
|
}
|
|
10
19
|
return value;
|
|
11
20
|
}
|
|
12
|
-
function
|
|
13
|
-
|
|
21
|
+
function isWKTEncoding(encoding, value) {
|
|
22
|
+
return (encoding === 'wkt' ||
|
|
23
|
+
encoding === 'geoarrow.wkt' ||
|
|
24
|
+
(encoding === 'unknown' && typeof value === 'string'));
|
|
25
|
+
}
|
|
26
|
+
function buildNullBitmap(n, isNull, nullCount) {
|
|
27
|
+
if (nullCount === 0)
|
|
14
28
|
return null;
|
|
29
|
+
const bitmap = new Uint8Array(Math.ceil(n / BITS_PER_VALIDITY_BYTE));
|
|
30
|
+
for (let i = 0; i < n; i++) {
|
|
31
|
+
if (isNull[i] !== 1)
|
|
32
|
+
setValidityBit(bitmap, i);
|
|
33
|
+
}
|
|
34
|
+
return bitmap;
|
|
35
|
+
}
|
|
36
|
+
function setValidityBit(bitmap, rowIndex) {
|
|
37
|
+
const byteIndex = Math.floor(rowIndex / BITS_PER_VALIDITY_BYTE);
|
|
38
|
+
const bitIndex = rowIndex % BITS_PER_VALIDITY_BYTE;
|
|
39
|
+
bitmap[byteIndex] |= 1 << bitIndex;
|
|
40
|
+
}
|
|
41
|
+
function buildPromotedResult(table, columnName, promotedGeometry, encoding) {
|
|
42
|
+
const columns = {};
|
|
43
|
+
for (const field of table.schema.fields) {
|
|
44
|
+
columns[field.name] =
|
|
45
|
+
field.name === columnName
|
|
46
|
+
? promotedGeometry
|
|
47
|
+
: table.getChild(field.name);
|
|
15
48
|
}
|
|
49
|
+
const promotedTable = new Table(columns);
|
|
50
|
+
return {
|
|
51
|
+
table: promotedTable,
|
|
52
|
+
geometryColumnName: columnName,
|
|
53
|
+
geometryColumn: promotedTable.getChild(columnName),
|
|
54
|
+
encoding,
|
|
55
|
+
source: 'promoted',
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
function parseGeometryValue(value, encoding) {
|
|
59
|
+
if (value == null)
|
|
60
|
+
return null;
|
|
16
61
|
try {
|
|
17
|
-
if (encoding
|
|
18
|
-
|
|
19
|
-
|
|
62
|
+
if (isWKTEncoding(encoding, value)) {
|
|
63
|
+
// Keep WKT support for ST_AsText(...) and geoarrow.wkt inputs.
|
|
64
|
+
// The upstream WKB parser plan does not cover WKT.
|
|
65
|
+
// See: https://github.com/geoarrow/geoarrow-js/issues/54
|
|
20
66
|
return (WKTLoader.parseTextSync?.(String(value), { wkt: { crs: false } }) ?? null);
|
|
21
67
|
}
|
|
22
68
|
return (WKBLoader.parseSync?.(toArrayBuffer(value), {
|
|
@@ -25,99 +71,252 @@ function parseGeometryValue(value, encoding) {
|
|
|
25
71
|
}
|
|
26
72
|
catch (error) {
|
|
27
73
|
const message = error instanceof Error ? error.message : String(error);
|
|
28
|
-
if (message.includes('WKB: Unsupported geometry type: 0')
|
|
74
|
+
if (message.includes('WKB: Unsupported geometry type: 0') ||
|
|
75
|
+
message.includes('WKB: Unsupported iso-wkb type')) {
|
|
29
76
|
throw new Error('DuckDB GEOMETRY values are not WKB by default. Select ST_AsWKB(geom) AS geom or ST_AsText(geom) AS geom before passing the result to DeckJsonMap.');
|
|
30
77
|
}
|
|
31
78
|
throw error instanceof Error ? error : new Error(message);
|
|
32
79
|
}
|
|
33
80
|
}
|
|
34
|
-
function
|
|
81
|
+
function getSampleWKBGeomTypes(table, columnName, sampleLimit = GEOMETRY_SAMPLE_LIMIT) {
|
|
35
82
|
const vector = table.getChild(columnName);
|
|
36
|
-
if (!vector)
|
|
83
|
+
if (!vector)
|
|
37
84
|
return null;
|
|
85
|
+
const geomTypes = [];
|
|
86
|
+
for (let i = 0; i < table.numRows; i++) {
|
|
87
|
+
const raw = vector.get(i);
|
|
88
|
+
if (raw == null)
|
|
89
|
+
continue;
|
|
90
|
+
const hdr = parseWKBHeader(toArrayBuffer(raw));
|
|
91
|
+
if (!hdr)
|
|
92
|
+
return null;
|
|
93
|
+
geomTypes.push(hdr.geomType);
|
|
94
|
+
if (geomTypes.length >= sampleLimit)
|
|
95
|
+
break;
|
|
96
|
+
}
|
|
97
|
+
return geomTypes;
|
|
98
|
+
}
|
|
99
|
+
function getSampleGeometryTypes(table, columnName, encoding, sampleLimit = GEOMETRY_SAMPLE_LIMIT) {
|
|
100
|
+
const vector = table.getChild(columnName);
|
|
101
|
+
if (!vector)
|
|
102
|
+
return null;
|
|
103
|
+
const geometryTypes = [];
|
|
104
|
+
for (let i = 0; i < table.numRows; i++) {
|
|
105
|
+
const geometry = parseGeometryValue(vector.get(i), encoding);
|
|
106
|
+
if (!geometry)
|
|
107
|
+
continue;
|
|
108
|
+
geometryTypes.push(geometry.type);
|
|
109
|
+
if (geometryTypes.length >= sampleLimit)
|
|
110
|
+
break;
|
|
111
|
+
}
|
|
112
|
+
return geometryTypes;
|
|
113
|
+
}
|
|
114
|
+
function appendPolygonCoordinates(rings, ringOffsetsList, xyList) {
|
|
115
|
+
for (const ring of rings) {
|
|
116
|
+
ringOffsetsList.push(xyList.length / 2);
|
|
117
|
+
for (const point of ring) {
|
|
118
|
+
xyList.push(point[0], point[1]);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
function sampledGeometriesMatch(table, columnName, encoding, matchesParsedType, matchesWKBType) {
|
|
123
|
+
try {
|
|
124
|
+
const geometryTypes = getSampleGeometryTypes(table, columnName, encoding);
|
|
125
|
+
return geometryTypes != null && geometryTypes.every(matchesParsedType);
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
try {
|
|
129
|
+
const geomTypes = getSampleWKBGeomTypes(table, columnName);
|
|
130
|
+
return geomTypes != null && geomTypes.every(matchesWKBType);
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
return false;
|
|
134
|
+
}
|
|
38
135
|
}
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
136
|
+
}
|
|
137
|
+
function tryPromotePolygonTable(table, columnName, encoding) {
|
|
138
|
+
const vector = table.getChild(columnName);
|
|
139
|
+
if (!vector)
|
|
140
|
+
return null;
|
|
141
|
+
const n = table.numRows;
|
|
142
|
+
const polygonOffsets = new Int32Array(n + 1);
|
|
143
|
+
const ringOffsetsList = [];
|
|
144
|
+
const xyList = [];
|
|
145
|
+
const isNull = new Uint8Array(n);
|
|
146
|
+
let nullCount = 0;
|
|
147
|
+
const polygonVisitor = {
|
|
148
|
+
onRingStart: () => ringOffsetsList.push(xyList.length / 2),
|
|
149
|
+
onCoordinate: (x, y) => xyList.push(x, y),
|
|
150
|
+
};
|
|
151
|
+
for (let i = 0; i < n; i++) {
|
|
152
|
+
polygonOffsets[i] = ringOffsetsList.length;
|
|
153
|
+
const raw = vector.get(i);
|
|
154
|
+
if (raw == null) {
|
|
155
|
+
isNull[i] = 1;
|
|
156
|
+
nullCount++;
|
|
157
|
+
continue;
|
|
158
|
+
}
|
|
159
|
+
if (isWKTEncoding(encoding, raw)) {
|
|
160
|
+
const geom = parseGeometryValue(raw, encoding);
|
|
161
|
+
if (!geom) {
|
|
162
|
+
isNull[i] = 1;
|
|
163
|
+
nullCount++;
|
|
164
|
+
continue;
|
|
165
|
+
}
|
|
166
|
+
if (geom.type === 'Polygon') {
|
|
167
|
+
appendPolygonCoordinates(geom.coordinates, ringOffsetsList, xyList);
|
|
168
|
+
}
|
|
169
|
+
else if (geom.type === 'MultiPolygon') {
|
|
170
|
+
for (const polygon of geom.coordinates) {
|
|
171
|
+
appendPolygonCoordinates(polygon, ringOffsetsList, xyList);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
else
|
|
175
|
+
return null;
|
|
176
|
+
continue;
|
|
43
177
|
}
|
|
178
|
+
const buf = toArrayBuffer(raw);
|
|
179
|
+
const hdr = parseWKBHeader(buf);
|
|
180
|
+
if (!hdr)
|
|
181
|
+
return null;
|
|
182
|
+
if (hdr.geomType === WKB_POLYGON) {
|
|
183
|
+
if (visitWKBPolygonCoordinates(buf, hdr, polygonVisitor) == null) {
|
|
184
|
+
return null;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
else if (hdr.geomType === WKB_MULTIPOLYGON) {
|
|
188
|
+
if (!visitWKBMultiPolygonCoordinates(buf, hdr, polygonVisitor)) {
|
|
189
|
+
return null;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
else
|
|
193
|
+
return null;
|
|
44
194
|
}
|
|
45
|
-
|
|
195
|
+
polygonOffsets[n] = ringOffsetsList.length;
|
|
196
|
+
const totalRings = ringOffsetsList.length;
|
|
197
|
+
const totalPoints = xyList.length / 2;
|
|
198
|
+
const ringOffsets = new Int32Array(totalRings + 1);
|
|
199
|
+
for (let j = 0; j < totalRings; j++)
|
|
200
|
+
ringOffsets[j] = ringOffsetsList[j];
|
|
201
|
+
ringOffsets[totalRings] = totalPoints;
|
|
202
|
+
const flatCoords = new Float64Array(xyList);
|
|
203
|
+
const floatData = makeData({
|
|
204
|
+
type: new Float64(),
|
|
205
|
+
length: totalPoints * 2,
|
|
206
|
+
data: flatCoords,
|
|
207
|
+
});
|
|
208
|
+
const pointData = makeData({
|
|
209
|
+
type: VERTEX_TYPE,
|
|
210
|
+
length: totalPoints,
|
|
211
|
+
child: floatData,
|
|
212
|
+
});
|
|
213
|
+
const ringData = makeData({
|
|
214
|
+
type: RING_TYPE,
|
|
215
|
+
length: totalRings,
|
|
216
|
+
valueOffsets: ringOffsets,
|
|
217
|
+
child: pointData,
|
|
218
|
+
});
|
|
219
|
+
const polyData = makeData({
|
|
220
|
+
type: POLYGON_TYPE,
|
|
221
|
+
length: n,
|
|
222
|
+
nullCount,
|
|
223
|
+
nullBitmap: buildNullBitmap(n, isNull, nullCount),
|
|
224
|
+
valueOffsets: polygonOffsets,
|
|
225
|
+
child: ringData,
|
|
226
|
+
});
|
|
227
|
+
return buildPromotedResult(table, columnName, new Vector([polyData]), 'geoarrow.polygon');
|
|
46
228
|
}
|
|
47
229
|
/**
|
|
48
230
|
* Attempt to promote WKB/WKT Point geometries into a native GeoArrow
|
|
49
|
-
* FixedSizeList column.
|
|
231
|
+
* FixedSizeList column. Returns `null` if any non-null geometry is not
|
|
50
232
|
* a Point, so callers can fall back to the GeoJSON binary path.
|
|
51
233
|
*/
|
|
52
234
|
function tryPromotePointTable(table, columnName, encoding) {
|
|
53
235
|
const vector = table.getChild(columnName);
|
|
54
|
-
if (!vector)
|
|
236
|
+
if (!vector)
|
|
55
237
|
return null;
|
|
56
|
-
|
|
57
|
-
const
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
238
|
+
const n = table.numRows;
|
|
239
|
+
const xyValues = new Float64Array(n * 2);
|
|
240
|
+
const isNull = new Uint8Array(n);
|
|
241
|
+
let nullCount = 0;
|
|
242
|
+
const markNullPoint = (rowIndex) => {
|
|
243
|
+
isNull[rowIndex] = 1;
|
|
244
|
+
xyValues[rowIndex * 2] = Number.NaN;
|
|
245
|
+
xyValues[rowIndex * 2 + 1] = Number.NaN;
|
|
246
|
+
nullCount++;
|
|
247
|
+
};
|
|
248
|
+
for (let i = 0; i < n; i++) {
|
|
249
|
+
const raw = vector.get(i);
|
|
250
|
+
if (raw == null) {
|
|
251
|
+
markNullPoint(i);
|
|
69
252
|
continue;
|
|
70
253
|
}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
254
|
+
if (isWKTEncoding(encoding, raw)) {
|
|
255
|
+
const geom = parseGeometryValue(raw, encoding);
|
|
256
|
+
if (!geom) {
|
|
257
|
+
markNullPoint(i);
|
|
258
|
+
continue;
|
|
259
|
+
}
|
|
260
|
+
if (geom.type !== 'Point')
|
|
261
|
+
return null;
|
|
262
|
+
const c = geom.coordinates;
|
|
263
|
+
xyValues[i * 2] = c[0];
|
|
264
|
+
xyValues[i * 2 + 1] = c[1];
|
|
77
265
|
continue;
|
|
78
266
|
}
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
field.name === columnName
|
|
88
|
-
? promotedGeometry
|
|
89
|
-
: table.getChild(field.name);
|
|
267
|
+
const hdr = parseWKBHeader(toArrayBuffer(raw));
|
|
268
|
+
if (!hdr)
|
|
269
|
+
return null;
|
|
270
|
+
const xy = readWKBPointXY(hdr);
|
|
271
|
+
if (!xy)
|
|
272
|
+
return null;
|
|
273
|
+
xyValues[i * 2] = xy[0];
|
|
274
|
+
xyValues[i * 2 + 1] = xy[1];
|
|
90
275
|
}
|
|
91
|
-
const
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
276
|
+
const floatData = makeData({
|
|
277
|
+
type: new Float64(),
|
|
278
|
+
length: n * 2,
|
|
279
|
+
data: xyValues,
|
|
280
|
+
});
|
|
281
|
+
const geomData = makeData({
|
|
282
|
+
type: VERTEX_TYPE,
|
|
283
|
+
length: n,
|
|
284
|
+
nullCount,
|
|
285
|
+
nullBitmap: buildNullBitmap(n, isNull, nullCount),
|
|
286
|
+
child: floatData,
|
|
287
|
+
});
|
|
288
|
+
return buildPromotedResult(table, columnName, new Vector([geomData]), 'geoarrow.point');
|
|
99
289
|
}
|
|
290
|
+
const POINT_LAYERS = new Set([
|
|
291
|
+
'GeoArrowScatterplotLayer',
|
|
292
|
+
'GeoArrowHeatmapLayer',
|
|
293
|
+
'GeoArrowColumnLayer',
|
|
294
|
+
]);
|
|
295
|
+
const POLYGON_LAYERS = new Set([
|
|
296
|
+
'GeoArrowPolygonLayer',
|
|
297
|
+
'GeoArrowSolidPolygonLayer',
|
|
298
|
+
]);
|
|
100
299
|
export const wkbGeometryDecoder = {
|
|
101
300
|
supportsGeoArrowPromotion(layerType, encoding, table, columnName) {
|
|
102
301
|
if (!['wkb', 'geoarrow.wkb', 'wkt', 'geoarrow.wkt', 'unknown'].includes(encoding)) {
|
|
103
302
|
return false;
|
|
104
303
|
}
|
|
105
|
-
if (
|
|
106
|
-
'
|
|
107
|
-
'GeoArrowHeatmapLayer',
|
|
108
|
-
'GeoArrowColumnLayer',
|
|
109
|
-
].includes(layerType)) {
|
|
110
|
-
return false;
|
|
304
|
+
if (POINT_LAYERS.has(layerType)) {
|
|
305
|
+
return sampledGeometriesMatch(table, columnName, encoding, (geometryType) => geometryType === 'Point', (geometryType) => geometryType === WKB_POINT);
|
|
111
306
|
}
|
|
112
|
-
|
|
113
|
-
|
|
307
|
+
if (POLYGON_LAYERS.has(layerType)) {
|
|
308
|
+
return sampledGeometriesMatch(table, columnName, encoding, (geometryType) => geometryType === 'Polygon' || geometryType === 'MultiPolygon', (geometryType) => geometryType === WKB_POLYGON || geometryType === WKB_MULTIPOLYGON);
|
|
309
|
+
}
|
|
310
|
+
return false;
|
|
114
311
|
},
|
|
115
312
|
toGeoArrowLike(table, columnName, encoding) {
|
|
116
|
-
const
|
|
117
|
-
if (
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
313
|
+
const pointResult = tryPromotePointTable(table, columnName, encoding);
|
|
314
|
+
if (pointResult)
|
|
315
|
+
return pointResult;
|
|
316
|
+
const result = tryPromotePolygonTable(table, columnName, encoding);
|
|
317
|
+
if (result)
|
|
318
|
+
return result;
|
|
319
|
+
throw new Error('GeoArrow promotion failed: unsupported geometry type for column.');
|
|
121
320
|
},
|
|
122
321
|
toGeoJsonBinary(table, columnName, encoding) {
|
|
123
322
|
return buildBinaryGeoJsonData({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wkbDecoder.js","sourceRoot":"","sources":["../../src/prepare/wkbDecoder.ts"],"names":[],"mappings":"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","sourcesContent":["import {WKBLoader, WKTLoader} from '@loaders.gl/wkt';\nimport type * as arrow from 'apache-arrow';\nimport {\n Field,\n FixedSizeList,\n Float64,\n Table,\n vectorFromArray,\n} from 'apache-arrow';\nimport type {GeometryDecoder} from './geometryDecoder';\nimport {buildBinaryGeoJsonData} from './toGeoJsonBinary';\nimport type {\n PreparedGeoArrowLayerData,\n ResolvedGeometryEncoding,\n} from './types';\n\nfunction toArrayBuffer(value: unknown) {\n if (ArrayBuffer.isView(value)) {\n const copy = new Uint8Array(value.byteLength);\n copy.set(\n new Uint8Array(value.buffer, value.byteOffset, value.byteLength),\n 0,\n );\n return copy.buffer;\n }\n return value as ArrayBuffer;\n}\n\nfunction parseGeometryValue(\n value: unknown,\n encoding: ResolvedGeometryEncoding,\n) {\n if (value == null) {\n return null;\n }\n\n try {\n if (\n encoding === 'wkt' ||\n encoding === 'geoarrow.wkt' ||\n (encoding === 'unknown' && typeof value === 'string')\n ) {\n return (\n WKTLoader.parseTextSync?.(String(value), {wkt: {crs: false}}) ?? null\n );\n }\n\n return (\n WKBLoader.parseSync?.(toArrayBuffer(value), {\n wkb: {shape: 'geojson-geometry'},\n }) ?? null\n );\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (message.includes('WKB: Unsupported geometry type: 0')) {\n throw new Error(\n 'DuckDB GEOMETRY values are not WKB by default. Select ST_AsWKB(geom) AS geom or ST_AsText(geom) AS geom before passing the result to DeckJsonMap.',\n );\n }\n\n throw error instanceof Error ? error : new Error(message);\n }\n}\n\nfunction getSampleGeometry(\n table: arrow.Table,\n columnName: string,\n encoding: ResolvedGeometryEncoding,\n) {\n const vector = table.getChild(columnName);\n if (!vector) {\n return null;\n }\n\n for (let rowIndex = 0; rowIndex < table.numRows; rowIndex++) {\n const geometry = parseGeometryValue(vector.get(rowIndex), encoding);\n if (geometry) {\n return geometry;\n }\n }\n\n return null;\n}\n\n/**\n * Attempt to promote WKB/WKT Point geometries into a native GeoArrow\n * FixedSizeList column. Returns `null` if any non-null geometry is not\n * a Point, so callers can fall back to the GeoJSON binary path.\n */\nfunction tryPromotePointTable(\n table: arrow.Table,\n columnName: string,\n encoding: ResolvedGeometryEncoding,\n): PreparedGeoArrowLayerData | null {\n const vector = table.getChild(columnName);\n if (!vector) {\n return null;\n }\n\n const points = [];\n for (let rowIndex = 0; rowIndex < table.numRows; rowIndex++) {\n const geometry = parseGeometryValue(vector.get(rowIndex), encoding);\n if (!geometry) {\n points.push(null);\n continue;\n }\n\n if (geometry.type !== 'Point') {\n return null;\n }\n\n if (!('coordinates' in geometry)) {\n points.push(null);\n continue;\n }\n\n const coords = geometry.coordinates;\n if (\n !Array.isArray(coords) ||\n coords.length < 2 ||\n !Number.isFinite(coords[0]) ||\n !Number.isFinite(coords[1])\n ) {\n points.push(null);\n continue;\n }\n\n points.push([coords[0], coords[1]]);\n }\n\n const coordinateField = new Field('xy', new Float64());\n const geomType = new FixedSizeList(2, coordinateField);\n const promotedGeometry = vectorFromArray(points, geomType);\n\n const nextColumns: Record<string, arrow.Vector> = {};\n for (const field of table.schema.fields) {\n nextColumns[field.name] =\n field.name === columnName\n ? promotedGeometry\n : (table.getChild(field.name) as arrow.Vector);\n }\n\n const promotedTable = new Table(nextColumns);\n\n return {\n table: promotedTable,\n geometryColumnName: columnName,\n geometryColumn: promotedTable.getChild(columnName)!,\n encoding: 'geoarrow.point',\n source: 'promoted',\n };\n}\n\nexport const wkbGeometryDecoder: GeometryDecoder = {\n supportsGeoArrowPromotion(\n layerType: string,\n encoding: ResolvedGeometryEncoding,\n table: arrow.Table,\n columnName: string,\n ) {\n if (\n !['wkb', 'geoarrow.wkb', 'wkt', 'geoarrow.wkt', 'unknown'].includes(\n encoding,\n )\n ) {\n return false;\n }\n\n if (\n ![\n 'GeoArrowScatterplotLayer',\n 'GeoArrowHeatmapLayer',\n 'GeoArrowColumnLayer',\n ].includes(layerType)\n ) {\n return false;\n }\n\n const sampleGeometry = getSampleGeometry(table, columnName, encoding);\n return sampleGeometry == null || sampleGeometry.type === 'Point';\n },\n toGeoArrowLike(\n table: arrow.Table,\n columnName: string,\n encoding: ResolvedGeometryEncoding,\n ) {\n const result = tryPromotePointTable(table, columnName, encoding);\n if (!result) {\n throw new Error(\n 'GeoArrow promotion failed: column contains non-Point geometries.',\n );\n }\n return result;\n },\n toGeoJsonBinary(\n table: arrow.Table,\n columnName: string,\n encoding: ResolvedGeometryEncoding,\n ) {\n return buildBinaryGeoJsonData({\n table,\n geometryColumnName: columnName,\n getGeometryAt: (rowIndex) => {\n const value = table.getChild(columnName)?.get(rowIndex);\n return parseGeometryValue(value, encoding);\n },\n });\n },\n};\n"]}
|
|
1
|
+
{"version":3,"file":"wkbDecoder.js","sourceRoot":"","sources":["../../src/prepare/wkbDecoder.ts"],"names":[],"mappings":"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","sourcesContent":["import {WKBLoader, WKTLoader} from '@loaders.gl/wkt';\nimport type * as arrow from 'apache-arrow';\nimport {\n Field,\n FixedSizeList,\n Float64,\n List,\n makeData,\n Table,\n Vector,\n} from 'apache-arrow';\nimport type {GeometryDecoder} from './geometryDecoder';\nimport {buildBinaryGeoJsonData} from './toGeoJsonBinary';\nimport type {\n PreparedGeoArrowLayerData,\n ResolvedGeometryEncoding,\n} from './types';\nimport {\n parseWKBHeader,\n readWKBPointXY,\n visitWKBMultiPolygonCoordinates,\n visitWKBPolygonCoordinates,\n WKB_MULTIPOLYGON,\n WKB_POINT,\n WKB_POLYGON,\n} from './wkbParser';\n\nconst COORD_FIELD = new Field('xy', new Float64(), false);\nconst VERTEX_TYPE = new FixedSizeList(2, COORD_FIELD);\nconst VERTEX_FIELD = new Field('', VERTEX_TYPE, true);\nconst RING_TYPE = new List(VERTEX_FIELD);\nconst RING_FIELD = new Field('', RING_TYPE, true);\nconst POLYGON_TYPE = new List(RING_FIELD);\n\nconst GEOMETRY_SAMPLE_LIMIT = 100;\nconst BITS_PER_VALIDITY_BYTE = 8;\n\nfunction toArrayBuffer(value: unknown): ArrayBuffer {\n if (ArrayBuffer.isView(value)) {\n const copy = new Uint8Array(value.byteLength);\n copy.set(\n new Uint8Array(value.buffer, value.byteOffset, value.byteLength),\n 0,\n );\n return copy.buffer;\n }\n return value as ArrayBuffer;\n}\n\nfunction isWKTEncoding(\n encoding: ResolvedGeometryEncoding,\n value: unknown,\n): boolean {\n return (\n encoding === 'wkt' ||\n encoding === 'geoarrow.wkt' ||\n (encoding === 'unknown' && typeof value === 'string')\n );\n}\n\nfunction buildNullBitmap(\n n: number,\n isNull: Uint8Array,\n nullCount: number,\n): Uint8Array | null {\n if (nullCount === 0) return null;\n const bitmap = new Uint8Array(Math.ceil(n / BITS_PER_VALIDITY_BYTE));\n for (let i = 0; i < n; i++) {\n if (isNull[i] !== 1) setValidityBit(bitmap, i);\n }\n return bitmap;\n}\n\nfunction setValidityBit(bitmap: Uint8Array, rowIndex: number) {\n const byteIndex = Math.floor(rowIndex / BITS_PER_VALIDITY_BYTE);\n const bitIndex = rowIndex % BITS_PER_VALIDITY_BYTE;\n bitmap[byteIndex]! |= 1 << bitIndex;\n}\n\nfunction buildPromotedResult(\n table: arrow.Table,\n columnName: string,\n promotedGeometry: arrow.Vector,\n encoding: PreparedGeoArrowLayerData['encoding'],\n): PreparedGeoArrowLayerData {\n const columns: Record<string, arrow.Vector> = {};\n for (const field of table.schema.fields) {\n columns[field.name] =\n field.name === columnName\n ? promotedGeometry\n : (table.getChild(field.name) as arrow.Vector);\n }\n const promotedTable = new Table(columns);\n return {\n table: promotedTable,\n geometryColumnName: columnName,\n geometryColumn: promotedTable.getChild(columnName)!,\n encoding,\n source: 'promoted',\n };\n}\n\nfunction parseGeometryValue(\n value: unknown,\n encoding: ResolvedGeometryEncoding,\n) {\n if (value == null) return null;\n\n try {\n if (isWKTEncoding(encoding, value)) {\n // Keep WKT support for ST_AsText(...) and geoarrow.wkt inputs.\n // The upstream WKB parser plan does not cover WKT.\n // See: https://github.com/geoarrow/geoarrow-js/issues/54\n return (\n WKTLoader.parseTextSync?.(String(value), {wkt: {crs: false}}) ?? null\n );\n }\n\n return (\n WKBLoader.parseSync?.(toArrayBuffer(value), {\n wkb: {shape: 'geojson-geometry'},\n }) ?? null\n );\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (\n message.includes('WKB: Unsupported geometry type: 0') ||\n message.includes('WKB: Unsupported iso-wkb type')\n ) {\n throw new Error(\n 'DuckDB GEOMETRY values are not WKB by default. Select ST_AsWKB(geom) AS geom or ST_AsText(geom) AS geom before passing the result to DeckJsonMap.',\n );\n }\n throw error instanceof Error ? error : new Error(message);\n }\n}\n\nfunction getSampleWKBGeomTypes(\n table: arrow.Table,\n columnName: string,\n sampleLimit = GEOMETRY_SAMPLE_LIMIT,\n): number[] | null {\n const vector = table.getChild(columnName);\n if (!vector) return null;\n const geomTypes: number[] = [];\n for (let i = 0; i < table.numRows; i++) {\n const raw = vector.get(i);\n if (raw == null) continue;\n const hdr = parseWKBHeader(toArrayBuffer(raw));\n if (!hdr) return null;\n geomTypes.push(hdr.geomType);\n if (geomTypes.length >= sampleLimit) break;\n }\n return geomTypes;\n}\n\nfunction getSampleGeometryTypes(\n table: arrow.Table,\n columnName: string,\n encoding: ResolvedGeometryEncoding,\n sampleLimit = GEOMETRY_SAMPLE_LIMIT,\n): string[] | null {\n const vector = table.getChild(columnName);\n if (!vector) return null;\n const geometryTypes: string[] = [];\n\n for (let i = 0; i < table.numRows; i++) {\n const geometry = parseGeometryValue(vector.get(i), encoding);\n if (!geometry) continue;\n geometryTypes.push(geometry.type);\n if (geometryTypes.length >= sampleLimit) break;\n }\n return geometryTypes;\n}\n\nfunction appendPolygonCoordinates(\n rings: number[][][],\n ringOffsetsList: number[],\n xyList: number[],\n) {\n for (const ring of rings) {\n ringOffsetsList.push(xyList.length / 2);\n for (const point of ring) {\n xyList.push(point[0]!, point[1]!);\n }\n }\n}\n\nfunction sampledGeometriesMatch(\n table: arrow.Table,\n columnName: string,\n encoding: ResolvedGeometryEncoding,\n matchesParsedType: (geometryType: string) => boolean,\n matchesWKBType: (geometryType: number) => boolean,\n) {\n try {\n const geometryTypes = getSampleGeometryTypes(table, columnName, encoding);\n return geometryTypes != null && geometryTypes.every(matchesParsedType);\n } catch {\n try {\n const geomTypes = getSampleWKBGeomTypes(table, columnName);\n return geomTypes != null && geomTypes.every(matchesWKBType);\n } catch {\n return false;\n }\n }\n}\n\nfunction tryPromotePolygonTable(\n table: arrow.Table,\n columnName: string,\n encoding: ResolvedGeometryEncoding,\n): PreparedGeoArrowLayerData | null {\n const vector = table.getChild(columnName);\n if (!vector) return null;\n\n const n = table.numRows;\n const polygonOffsets = new Int32Array(n + 1);\n const ringOffsetsList: number[] = [];\n const xyList: number[] = [];\n const isNull = new Uint8Array(n);\n let nullCount = 0;\n const polygonVisitor = {\n onRingStart: () => ringOffsetsList.push(xyList.length / 2),\n onCoordinate: (x: number, y: number) => xyList.push(x, y),\n };\n\n for (let i = 0; i < n; i++) {\n polygonOffsets[i] = ringOffsetsList.length;\n const raw = vector.get(i);\n\n if (raw == null) {\n isNull[i] = 1;\n nullCount++;\n continue;\n }\n\n if (isWKTEncoding(encoding, raw)) {\n const geom = parseGeometryValue(raw, encoding);\n if (!geom) {\n isNull[i] = 1;\n nullCount++;\n continue;\n }\n if (geom.type === 'Polygon') {\n appendPolygonCoordinates(\n geom.coordinates as number[][][],\n ringOffsetsList,\n xyList,\n );\n } else if (geom.type === 'MultiPolygon') {\n for (const polygon of geom.coordinates as number[][][][]) {\n appendPolygonCoordinates(polygon, ringOffsetsList, xyList);\n }\n } else return null;\n continue;\n }\n\n const buf = toArrayBuffer(raw);\n const hdr = parseWKBHeader(buf);\n if (!hdr) return null;\n\n if (hdr.geomType === WKB_POLYGON) {\n if (visitWKBPolygonCoordinates(buf, hdr, polygonVisitor) == null) {\n return null;\n }\n } else if (hdr.geomType === WKB_MULTIPOLYGON) {\n if (!visitWKBMultiPolygonCoordinates(buf, hdr, polygonVisitor)) {\n return null;\n }\n } else return null;\n }\n polygonOffsets[n] = ringOffsetsList.length;\n\n const totalRings = ringOffsetsList.length;\n const totalPoints = xyList.length / 2;\n\n const ringOffsets = new Int32Array(totalRings + 1);\n for (let j = 0; j < totalRings; j++) ringOffsets[j] = ringOffsetsList[j]!;\n ringOffsets[totalRings] = totalPoints;\n\n const flatCoords = new Float64Array(xyList);\n const floatData = makeData({\n type: new Float64(),\n length: totalPoints * 2,\n data: flatCoords,\n });\n const pointData = makeData({\n type: VERTEX_TYPE,\n length: totalPoints,\n child: floatData,\n });\n const ringData = makeData({\n type: RING_TYPE,\n length: totalRings,\n valueOffsets: ringOffsets,\n child: pointData,\n });\n const polyData = makeData({\n type: POLYGON_TYPE,\n length: n,\n nullCount,\n nullBitmap: buildNullBitmap(n, isNull, nullCount),\n valueOffsets: polygonOffsets,\n child: ringData,\n });\n return buildPromotedResult(\n table,\n columnName,\n new Vector([polyData]),\n 'geoarrow.polygon',\n );\n}\n\n/**\n * Attempt to promote WKB/WKT Point geometries into a native GeoArrow\n * FixedSizeList column. Returns `null` if any non-null geometry is not\n * a Point, so callers can fall back to the GeoJSON binary path.\n */\nfunction tryPromotePointTable(\n table: arrow.Table,\n columnName: string,\n encoding: ResolvedGeometryEncoding,\n): PreparedGeoArrowLayerData | null {\n const vector = table.getChild(columnName);\n if (!vector) return null;\n\n const n = table.numRows;\n const xyValues = new Float64Array(n * 2);\n const isNull = new Uint8Array(n);\n let nullCount = 0;\n\n const markNullPoint = (rowIndex: number) => {\n isNull[rowIndex] = 1;\n xyValues[rowIndex * 2] = Number.NaN;\n xyValues[rowIndex * 2 + 1] = Number.NaN;\n nullCount++;\n };\n\n for (let i = 0; i < n; i++) {\n const raw = vector.get(i);\n if (raw == null) {\n markNullPoint(i);\n continue;\n }\n\n if (isWKTEncoding(encoding, raw)) {\n const geom = parseGeometryValue(raw, encoding);\n if (!geom) {\n markNullPoint(i);\n continue;\n }\n if (geom.type !== 'Point') return null;\n const c = geom.coordinates as number[];\n xyValues[i * 2] = c[0]!;\n xyValues[i * 2 + 1] = c[1]!;\n continue;\n }\n\n const hdr = parseWKBHeader(toArrayBuffer(raw));\n if (!hdr) return null;\n const xy = readWKBPointXY(hdr);\n if (!xy) return null;\n xyValues[i * 2] = xy[0];\n xyValues[i * 2 + 1] = xy[1];\n }\n\n const floatData = makeData({\n type: new Float64(),\n length: n * 2,\n data: xyValues,\n });\n const geomData = makeData({\n type: VERTEX_TYPE,\n length: n,\n nullCount,\n nullBitmap: buildNullBitmap(n, isNull, nullCount),\n child: floatData,\n });\n return buildPromotedResult(\n table,\n columnName,\n new Vector([geomData]),\n 'geoarrow.point',\n );\n}\n\nconst POINT_LAYERS = new Set([\n 'GeoArrowScatterplotLayer',\n 'GeoArrowHeatmapLayer',\n 'GeoArrowColumnLayer',\n]);\n\nconst POLYGON_LAYERS = new Set([\n 'GeoArrowPolygonLayer',\n 'GeoArrowSolidPolygonLayer',\n]);\n\nexport const wkbGeometryDecoder: GeometryDecoder = {\n supportsGeoArrowPromotion(\n layerType: string,\n encoding: ResolvedGeometryEncoding,\n table: arrow.Table,\n columnName: string,\n ) {\n if (\n !['wkb', 'geoarrow.wkb', 'wkt', 'geoarrow.wkt', 'unknown'].includes(\n encoding,\n )\n ) {\n return false;\n }\n\n if (POINT_LAYERS.has(layerType)) {\n return sampledGeometriesMatch(\n table,\n columnName,\n encoding,\n (geometryType) => geometryType === 'Point',\n (geometryType) => geometryType === WKB_POINT,\n );\n }\n\n if (POLYGON_LAYERS.has(layerType)) {\n return sampledGeometriesMatch(\n table,\n columnName,\n encoding,\n (geometryType) =>\n geometryType === 'Polygon' || geometryType === 'MultiPolygon',\n (geometryType) =>\n geometryType === WKB_POLYGON || geometryType === WKB_MULTIPOLYGON,\n );\n }\n\n return false;\n },\n\n toGeoArrowLike(\n table: arrow.Table,\n columnName: string,\n encoding: ResolvedGeometryEncoding,\n ) {\n const pointResult = tryPromotePointTable(table, columnName, encoding);\n if (pointResult) return pointResult;\n\n const result = tryPromotePolygonTable(table, columnName, encoding);\n if (result) return result;\n\n throw new Error(\n 'GeoArrow promotion failed: unsupported geometry type for column.',\n );\n },\n\n toGeoJsonBinary(\n table: arrow.Table,\n columnName: string,\n encoding: ResolvedGeometryEncoding,\n ) {\n return buildBinaryGeoJsonData({\n table,\n geometryColumnName: columnName,\n getGeometryAt: (rowIndex) => {\n const value = table.getChild(columnName)?.get(rowIndex);\n return parseGeometryValue(value, encoding);\n },\n });\n },\n};\n"]}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export declare const WKB_POINT = 1;
|
|
2
|
+
export declare const WKB_POLYGON = 3;
|
|
3
|
+
export declare const WKB_MULTIPOLYGON = 6;
|
|
4
|
+
export type WKBHeader = {
|
|
5
|
+
view: DataView;
|
|
6
|
+
isLE: boolean;
|
|
7
|
+
geomType: number;
|
|
8
|
+
offset: number;
|
|
9
|
+
coordBytes: number;
|
|
10
|
+
};
|
|
11
|
+
export type WKBPolygonCoordinateVisitor = {
|
|
12
|
+
onRingStart: () => void;
|
|
13
|
+
onCoordinate: (x: number, y: number) => void;
|
|
14
|
+
};
|
|
15
|
+
export declare function parseWKBHeader(buf: ArrayBuffer, startOffset?: number): WKBHeader | null;
|
|
16
|
+
export declare function readWKBPointXY(header: WKBHeader): [number, number] | null;
|
|
17
|
+
export declare function visitWKBPolygonCoordinates(buf: ArrayBuffer, header: WKBHeader, visitor: WKBPolygonCoordinateVisitor): number | null;
|
|
18
|
+
export declare function visitWKBMultiPolygonCoordinates(buf: ArrayBuffer, header: WKBHeader, visitor: WKBPolygonCoordinateVisitor): boolean;
|
|
19
|
+
//# sourceMappingURL=wkbParser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wkbParser.d.ts","sourceRoot":"","sources":["../../src/prepare/wkbParser.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,SAAS,IAAI,CAAC;AAC3B,eAAO,MAAM,WAAW,IAAI,CAAC;AAC7B,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAyBlC,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG;IACxC,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,YAAY,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9C,CAAC;AAIF,wBAAgB,cAAc,CAC5B,GAAG,EAAE,WAAW,EAChB,WAAW,SAAI,GACd,SAAS,GAAG,IAAI,CA2BlB;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,SAAS,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAYzE;AAED,wBAAgB,0BAA0B,CACxC,GAAG,EAAE,WAAW,EAChB,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,2BAA2B,GACnC,MAAM,GAAG,IAAI,CAyBf;AAED,wBAAgB,+BAA+B,CAC7C,GAAG,EAAE,WAAW,EAChB,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,2BAA2B,GACnC,OAAO,CAiBT"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
export const WKB_POINT = 1;
|
|
2
|
+
export const WKB_POLYGON = 3;
|
|
3
|
+
export const WKB_MULTIPOLYGON = 6;
|
|
4
|
+
// Local WKB parser used until geoarrow-js ships WKB to GeoArrow parsing:
|
|
5
|
+
// See: https://github.com/geoarrow/geoarrow-js/issues/54
|
|
6
|
+
const WKB_BYTE_ORDER_BYTES = 1;
|
|
7
|
+
const WKB_GEOMETRY_TYPE_BYTES = 4;
|
|
8
|
+
const WKB_HEADER_BYTES = WKB_BYTE_ORDER_BYTES + WKB_GEOMETRY_TYPE_BYTES;
|
|
9
|
+
const WKB_GEOMETRY_TYPE_OFFSET = WKB_BYTE_ORDER_BYTES;
|
|
10
|
+
const WKB_SRID_BYTES = 4;
|
|
11
|
+
const WKB_UINT32_BYTES = 4;
|
|
12
|
+
const XY_COORDINATE_BYTES = 16;
|
|
13
|
+
const OPTIONAL_COORDINATE_DIMENSION_BYTES = 8;
|
|
14
|
+
const Y_COORDINATE_OFFSET_BYTES = 8;
|
|
15
|
+
// PostGIS EWKB stores Z/M/SRID metadata in the high bits
|
|
16
|
+
// of the WKB type word.
|
|
17
|
+
const EWKB_Z_FLAG = 0x80000000;
|
|
18
|
+
const EWKB_M_FLAG = 0x40000000;
|
|
19
|
+
const EWKB_SRID_FLAG = 0x20000000;
|
|
20
|
+
const ISO_WKB_TYPE_MASK = 0xffff;
|
|
21
|
+
const ISO_WKB_Z_OFFSET = 1000;
|
|
22
|
+
const ISO_WKB_M_OFFSET = 2000;
|
|
23
|
+
const ISO_WKB_ZM_OFFSET = 3000;
|
|
24
|
+
const ISO_WKB_MAX_BASE_TYPE = 7;
|
|
25
|
+
// Reads the shared WKB/EWKB prefix like byte order, geometry type, optional SRID
|
|
26
|
+
// and bytes per coordinate. Point/polygon readers use this to find their data.
|
|
27
|
+
export function parseWKBHeader(buf, startOffset = 0) {
|
|
28
|
+
if (buf.byteLength < startOffset + WKB_HEADER_BYTES)
|
|
29
|
+
return null;
|
|
30
|
+
const view = new DataView(buf);
|
|
31
|
+
const isLE = view.getUint8(startOffset) === 1;
|
|
32
|
+
const rawType = view.getUint32(startOffset + WKB_GEOMETRY_TYPE_OFFSET, isLE);
|
|
33
|
+
const isoType = rawType & ISO_WKB_TYPE_MASK;
|
|
34
|
+
const isoZ = hasIsoWKBTypeOffset(isoType, ISO_WKB_Z_OFFSET);
|
|
35
|
+
const isoM = hasIsoWKBTypeOffset(isoType, ISO_WKB_M_OFFSET);
|
|
36
|
+
const isoZM = hasIsoWKBTypeOffset(isoType, ISO_WKB_ZM_OFFSET);
|
|
37
|
+
const hasZ = (rawType & EWKB_Z_FLAG) !== 0 || isoZ || isoZM;
|
|
38
|
+
const hasM = (rawType & EWKB_M_FLAG) !== 0 || isoM || isoZM;
|
|
39
|
+
const hasSRID = (rawType & EWKB_SRID_FLAG) !== 0;
|
|
40
|
+
let base = isoType;
|
|
41
|
+
if (isoZM)
|
|
42
|
+
base -= ISO_WKB_ZM_OFFSET;
|
|
43
|
+
else if (isoM)
|
|
44
|
+
base -= ISO_WKB_M_OFFSET;
|
|
45
|
+
else if (isoZ)
|
|
46
|
+
base -= ISO_WKB_Z_OFFSET;
|
|
47
|
+
let offset = startOffset + WKB_HEADER_BYTES;
|
|
48
|
+
if (hasSRID)
|
|
49
|
+
offset += WKB_SRID_BYTES;
|
|
50
|
+
const coordBytes = XY_COORDINATE_BYTES +
|
|
51
|
+
(hasZ ? OPTIONAL_COORDINATE_DIMENSION_BYTES : 0) +
|
|
52
|
+
(hasM ? OPTIONAL_COORDINATE_DIMENSION_BYTES : 0);
|
|
53
|
+
return { view, isLE, geomType: base, offset, coordBytes };
|
|
54
|
+
}
|
|
55
|
+
export function readWKBPointXY(header) {
|
|
56
|
+
if (header.geomType !== WKB_POINT)
|
|
57
|
+
return null;
|
|
58
|
+
if (!hasBytes(header.view.buffer, header.offset, header.coordBytes)) {
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
return [
|
|
62
|
+
header.view.getFloat64(header.offset, header.isLE),
|
|
63
|
+
header.view.getFloat64(header.offset + Y_COORDINATE_OFFSET_BYTES, header.isLE),
|
|
64
|
+
];
|
|
65
|
+
}
|
|
66
|
+
export function visitWKBPolygonCoordinates(buf, header, visitor) {
|
|
67
|
+
if (header.geomType !== WKB_POLYGON)
|
|
68
|
+
return null;
|
|
69
|
+
const { view, isLE, offset: headerOffset, coordBytes } = header;
|
|
70
|
+
let offset = headerOffset;
|
|
71
|
+
if (!hasBytes(buf, offset, WKB_UINT32_BYTES))
|
|
72
|
+
return null;
|
|
73
|
+
const numRings = view.getUint32(offset, isLE);
|
|
74
|
+
offset += WKB_UINT32_BYTES;
|
|
75
|
+
for (let ringIndex = 0; ringIndex < numRings; ringIndex++) {
|
|
76
|
+
visitor.onRingStart();
|
|
77
|
+
if (!hasBytes(buf, offset, WKB_UINT32_BYTES))
|
|
78
|
+
return null;
|
|
79
|
+
const numPoints = view.getUint32(offset, isLE);
|
|
80
|
+
offset += WKB_UINT32_BYTES;
|
|
81
|
+
for (let pointIndex = 0; pointIndex < numPoints; pointIndex++) {
|
|
82
|
+
if (!hasBytes(buf, offset, coordBytes))
|
|
83
|
+
return null;
|
|
84
|
+
visitor.onCoordinate(view.getFloat64(offset, isLE), view.getFloat64(offset + Y_COORDINATE_OFFSET_BYTES, isLE));
|
|
85
|
+
offset += coordBytes;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return offset <= buf.byteLength ? offset : null;
|
|
89
|
+
}
|
|
90
|
+
export function visitWKBMultiPolygonCoordinates(buf, header, visitor) {
|
|
91
|
+
if (header.geomType !== WKB_MULTIPOLYGON)
|
|
92
|
+
return false;
|
|
93
|
+
let offset = header.offset;
|
|
94
|
+
if (!hasBytes(buf, offset, WKB_UINT32_BYTES))
|
|
95
|
+
return false;
|
|
96
|
+
const numPolygons = header.view.getUint32(offset, header.isLE);
|
|
97
|
+
offset += WKB_UINT32_BYTES;
|
|
98
|
+
for (let polygonIndex = 0; polygonIndex < numPolygons; polygonIndex++) {
|
|
99
|
+
const polygonHeader = parseWKBHeader(buf, offset);
|
|
100
|
+
if (!polygonHeader || polygonHeader.geomType !== WKB_POLYGON)
|
|
101
|
+
return false;
|
|
102
|
+
const nextOffset = visitWKBPolygonCoordinates(buf, polygonHeader, visitor);
|
|
103
|
+
if (nextOffset == null)
|
|
104
|
+
return false;
|
|
105
|
+
offset = nextOffset;
|
|
106
|
+
}
|
|
107
|
+
return offset <= buf.byteLength;
|
|
108
|
+
}
|
|
109
|
+
function hasIsoWKBTypeOffset(isoType, offset) {
|
|
110
|
+
return isoType >= offset && isoType <= offset + ISO_WKB_MAX_BASE_TYPE;
|
|
111
|
+
}
|
|
112
|
+
function hasBytes(buf, offset, byteLength) {
|
|
113
|
+
return offset >= 0 && offset + byteLength <= buf.byteLength;
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=wkbParser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wkbParser.js","sourceRoot":"","sources":["../../src/prepare/wkbParser.ts"],"names":[],"mappings":"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","sourcesContent":["export const WKB_POINT = 1;\nexport const WKB_POLYGON = 3;\nexport const WKB_MULTIPOLYGON = 6;\n\n// Local WKB parser used until geoarrow-js ships WKB to GeoArrow parsing:\n// See: https://github.com/geoarrow/geoarrow-js/issues/54\nconst WKB_BYTE_ORDER_BYTES = 1;\nconst WKB_GEOMETRY_TYPE_BYTES = 4;\nconst WKB_HEADER_BYTES = WKB_BYTE_ORDER_BYTES + WKB_GEOMETRY_TYPE_BYTES;\nconst WKB_GEOMETRY_TYPE_OFFSET = WKB_BYTE_ORDER_BYTES;\nconst WKB_SRID_BYTES = 4;\nconst WKB_UINT32_BYTES = 4;\nconst XY_COORDINATE_BYTES = 16;\nconst OPTIONAL_COORDINATE_DIMENSION_BYTES = 8;\nconst Y_COORDINATE_OFFSET_BYTES = 8;\n\n// PostGIS EWKB stores Z/M/SRID metadata in the high bits\n// of the WKB type word.\nconst EWKB_Z_FLAG = 0x80000000;\nconst EWKB_M_FLAG = 0x40000000;\nconst EWKB_SRID_FLAG = 0x20000000;\nconst ISO_WKB_TYPE_MASK = 0xffff;\nconst ISO_WKB_Z_OFFSET = 1000;\nconst ISO_WKB_M_OFFSET = 2000;\nconst ISO_WKB_ZM_OFFSET = 3000;\nconst ISO_WKB_MAX_BASE_TYPE = 7;\n\nexport type WKBHeader = {\n view: DataView;\n isLE: boolean;\n geomType: number;\n offset: number;\n coordBytes: number;\n};\n\nexport type WKBPolygonCoordinateVisitor = {\n onRingStart: () => void;\n onCoordinate: (x: number, y: number) => void;\n};\n\n// Reads the shared WKB/EWKB prefix like byte order, geometry type, optional SRID\n// and bytes per coordinate. Point/polygon readers use this to find their data.\nexport function parseWKBHeader(\n buf: ArrayBuffer,\n startOffset = 0,\n): WKBHeader | null {\n if (buf.byteLength < startOffset + WKB_HEADER_BYTES) return null;\n const view = new DataView(buf);\n const isLE = view.getUint8(startOffset) === 1;\n const rawType = view.getUint32(startOffset + WKB_GEOMETRY_TYPE_OFFSET, isLE);\n const isoType = rawType & ISO_WKB_TYPE_MASK;\n const isoZ = hasIsoWKBTypeOffset(isoType, ISO_WKB_Z_OFFSET);\n const isoM = hasIsoWKBTypeOffset(isoType, ISO_WKB_M_OFFSET);\n const isoZM = hasIsoWKBTypeOffset(isoType, ISO_WKB_ZM_OFFSET);\n\n const hasZ = (rawType & EWKB_Z_FLAG) !== 0 || isoZ || isoZM;\n const hasM = (rawType & EWKB_M_FLAG) !== 0 || isoM || isoZM;\n const hasSRID = (rawType & EWKB_SRID_FLAG) !== 0;\n\n let base = isoType;\n if (isoZM) base -= ISO_WKB_ZM_OFFSET;\n else if (isoM) base -= ISO_WKB_M_OFFSET;\n else if (isoZ) base -= ISO_WKB_Z_OFFSET;\n\n let offset = startOffset + WKB_HEADER_BYTES;\n if (hasSRID) offset += WKB_SRID_BYTES;\n\n const coordBytes =\n XY_COORDINATE_BYTES +\n (hasZ ? OPTIONAL_COORDINATE_DIMENSION_BYTES : 0) +\n (hasM ? OPTIONAL_COORDINATE_DIMENSION_BYTES : 0);\n return {view, isLE, geomType: base, offset, coordBytes};\n}\n\nexport function readWKBPointXY(header: WKBHeader): [number, number] | null {\n if (header.geomType !== WKB_POINT) return null;\n if (!hasBytes(header.view.buffer, header.offset, header.coordBytes)) {\n return null;\n }\n return [\n header.view.getFloat64(header.offset, header.isLE),\n header.view.getFloat64(\n header.offset + Y_COORDINATE_OFFSET_BYTES,\n header.isLE,\n ),\n ];\n}\n\nexport function visitWKBPolygonCoordinates(\n buf: ArrayBuffer,\n header: WKBHeader,\n visitor: WKBPolygonCoordinateVisitor,\n): number | null {\n if (header.geomType !== WKB_POLYGON) return null;\n\n const {view, isLE, offset: headerOffset, coordBytes} = header;\n let offset = headerOffset;\n if (!hasBytes(buf, offset, WKB_UINT32_BYTES)) return null;\n const numRings = view.getUint32(offset, isLE);\n offset += WKB_UINT32_BYTES;\n\n for (let ringIndex = 0; ringIndex < numRings; ringIndex++) {\n visitor.onRingStart();\n if (!hasBytes(buf, offset, WKB_UINT32_BYTES)) return null;\n const numPoints = view.getUint32(offset, isLE);\n offset += WKB_UINT32_BYTES;\n for (let pointIndex = 0; pointIndex < numPoints; pointIndex++) {\n if (!hasBytes(buf, offset, coordBytes)) return null;\n visitor.onCoordinate(\n view.getFloat64(offset, isLE),\n view.getFloat64(offset + Y_COORDINATE_OFFSET_BYTES, isLE),\n );\n offset += coordBytes;\n }\n }\n\n return offset <= buf.byteLength ? offset : null;\n}\n\nexport function visitWKBMultiPolygonCoordinates(\n buf: ArrayBuffer,\n header: WKBHeader,\n visitor: WKBPolygonCoordinateVisitor,\n): boolean {\n if (header.geomType !== WKB_MULTIPOLYGON) return false;\n\n let offset = header.offset;\n if (!hasBytes(buf, offset, WKB_UINT32_BYTES)) return false;\n const numPolygons = header.view.getUint32(offset, header.isLE);\n offset += WKB_UINT32_BYTES;\n\n for (let polygonIndex = 0; polygonIndex < numPolygons; polygonIndex++) {\n const polygonHeader = parseWKBHeader(buf, offset);\n if (!polygonHeader || polygonHeader.geomType !== WKB_POLYGON) return false;\n const nextOffset = visitWKBPolygonCoordinates(buf, polygonHeader, visitor);\n if (nextOffset == null) return false;\n offset = nextOffset;\n }\n\n return offset <= buf.byteLength;\n}\n\nfunction hasIsoWKBTypeOffset(isoType: number, offset: number): boolean {\n return isoType >= offset && isoType <= offset + ISO_WKB_MAX_BASE_TYPE;\n}\n\nfunction hasBytes(\n buf: {byteLength: number},\n offset: number,\n byteLength: number,\n) {\n return offset >= 0 && offset + byteLength <= buf.byteLength;\n}\n"]}
|
package/dist/types.d.ts
CHANGED
|
@@ -43,11 +43,19 @@ export type DeckJsonMapProps = {
|
|
|
43
43
|
spec: string | Record<string, unknown>;
|
|
44
44
|
datasets: Record<string, DeckDatasetInput>;
|
|
45
45
|
mapStyle?: string;
|
|
46
|
+
/**
|
|
47
|
+
* When true, deck.gl layers are inserted into MapLibre's layer stack sharing
|
|
48
|
+
* the same WebGL2 context. This allows rendering deck layers between basemap
|
|
49
|
+
* layers (e.g. under labels). Requires WebGL2 (MapLibre GL v3+).
|
|
50
|
+
* Defaults to false (deck renders in a separate overlay canvas on top).
|
|
51
|
+
*/
|
|
52
|
+
interleaved?: boolean;
|
|
46
53
|
deckProps?: Partial<DeckProps>;
|
|
47
54
|
mapProps?: Partial<MapProps>;
|
|
48
55
|
showLegends?: boolean;
|
|
49
56
|
className?: string;
|
|
50
57
|
children?: ReactNode;
|
|
58
|
+
onDatasetStatesChange?: (states: Record<string, PreparedDeckDatasetState>) => void;
|
|
51
59
|
};
|
|
52
60
|
export declare function isSqlDatasetInput(input: DeckDatasetInput): input is DeckSqlDatasetInput;
|
|
53
61
|
export declare function isArrowTableDatasetInput(input: DeckDatasetInput): input is DeckArrowTableDatasetInput;
|