@loaders.gl/wkt 4.2.0-alpha.4 → 4.2.0-alpha.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/dist.dev.js +137 -218
- package/dist/dist.min.js +10 -0
- package/dist/hex-wkb-loader.d.ts +1 -1
- package/dist/hex-wkb-loader.d.ts.map +1 -1
- package/dist/hex-wkb-loader.js +44 -28
- package/dist/index.cjs +87 -62
- package/dist/index.cjs.map +7 -0
- package/dist/index.d.ts +14 -14
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/lib/encode-twkb.js +158 -143
- package/dist/lib/encode-wkb.js +247 -211
- package/dist/lib/encode-wkt-crs.d.ts +1 -1
- package/dist/lib/encode-wkt-crs.d.ts.map +1 -1
- package/dist/lib/encode-wkt-crs.js +32 -18
- package/dist/lib/encode-wkt.js +35 -27
- package/dist/lib/parse-hex-wkb.js +1 -2
- package/dist/lib/parse-twkb.js +215 -218
- package/dist/lib/parse-wkb-header.js +124 -95
- package/dist/lib/parse-wkb.d.ts +1 -1
- package/dist/lib/parse-wkb.d.ts.map +1 -1
- package/dist/lib/parse-wkb.js +210 -235
- package/dist/lib/parse-wkt-crs.js +110 -86
- package/dist/lib/parse-wkt.js +251 -185
- package/dist/lib/utils/base64-encoder.js +151 -5
- package/dist/lib/utils/binary-reader.js +67 -64
- package/dist/lib/utils/binary-writer.js +117 -109
- package/dist/lib/utils/hex-encoder.js +46 -32
- package/dist/lib/utils/hex-transcoder.js +40 -24
- package/dist/lib/utils/version.js +7 -2
- package/dist/twkb-loader.js +26 -17
- package/dist/twkb-writer.js +18 -13
- package/dist/wkb-loader.js +26 -17
- package/dist/wkb-writer.js +22 -17
- package/dist/wkt-crs-loader.d.ts +1 -1
- package/dist/wkt-crs-loader.d.ts.map +1 -1
- package/dist/wkt-crs-loader.js +22 -15
- package/dist/wkt-crs-writer.d.ts +2 -2
- package/dist/wkt-crs-writer.d.ts.map +1 -1
- package/dist/wkt-crs-writer.js +23 -15
- package/dist/wkt-loader.js +28 -20
- package/dist/wkt-worker.js +4 -2
- package/dist/wkt-writer.js +19 -14
- package/dist/workers/wkb-worker.js +3 -1
- package/dist/workers/wkt-worker.js +3 -1
- package/package.json +11 -6
- package/src/lib/parse-wkb.ts +2 -2
- package/dist/hex-wkb-loader.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/lib/encode-twkb.js.map +0 -1
- package/dist/lib/encode-wkb.js.map +0 -1
- package/dist/lib/encode-wkt-crs.js.map +0 -1
- package/dist/lib/encode-wkt.js.map +0 -1
- package/dist/lib/parse-hex-wkb.js.map +0 -1
- package/dist/lib/parse-twkb.js.map +0 -1
- package/dist/lib/parse-wkb-header.js.map +0 -1
- package/dist/lib/parse-wkb.js.map +0 -1
- package/dist/lib/parse-wkt-crs.js.map +0 -1
- package/dist/lib/parse-wkt.js.map +0 -1
- package/dist/lib/utils/base64-encoder.js.map +0 -1
- package/dist/lib/utils/binary-reader.js.map +0 -1
- package/dist/lib/utils/binary-writer.js.map +0 -1
- package/dist/lib/utils/hex-encoder.js.map +0 -1
- package/dist/lib/utils/hex-transcoder.js.map +0 -1
- package/dist/lib/utils/version.js.map +0 -1
- package/dist/twkb-loader.js.map +0 -1
- package/dist/twkb-writer.js.map +0 -1
- package/dist/wkb-loader.js.map +0 -1
- package/dist/wkb-writer.js.map +0 -1
- package/dist/wkt-crs-loader.js.map +0 -1
- package/dist/wkt-crs-writer.js.map +0 -1
- package/dist/wkt-loader.js.map +0 -1
- package/dist/wkt-writer.js.map +0 -1
- package/dist/workers/wkb-worker.js.map +0 -1
- package/dist/workers/wkt-worker.js.map +0 -1
|
@@ -1,105 +1,134 @@
|
|
|
1
|
+
// loaders.gl
|
|
2
|
+
// SPDX-License-Identifier: MIT
|
|
3
|
+
// Copyright (c) vis.gl contributors
|
|
1
4
|
const EWKB_FLAG_Z = 0x80000000;
|
|
2
5
|
const EWKB_FLAG_M = 0x40000000;
|
|
3
6
|
const EWKB_FLAG_SRID = 0x20000000;
|
|
4
|
-
const MAX_SRID = 10000;
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
7
|
+
const MAX_SRID = 10000; // TBD: Assume no more than 10K SRIDs are defined
|
|
8
|
+
/**
|
|
9
|
+
* Integer code for geometry types in WKB and related formats
|
|
10
|
+
* Reference: https://en.wikipedia.org/wiki/Well-known_text_representation_of_geometry#Well-known_binary
|
|
11
|
+
*/
|
|
12
|
+
export var WKBGeometryType;
|
|
13
|
+
(function (WKBGeometryType) {
|
|
14
|
+
WKBGeometryType[WKBGeometryType["Point"] = 1] = "Point";
|
|
15
|
+
WKBGeometryType[WKBGeometryType["LineString"] = 2] = "LineString";
|
|
16
|
+
WKBGeometryType[WKBGeometryType["Polygon"] = 3] = "Polygon";
|
|
17
|
+
WKBGeometryType[WKBGeometryType["MultiPoint"] = 4] = "MultiPoint";
|
|
18
|
+
WKBGeometryType[WKBGeometryType["MultiLineString"] = 5] = "MultiLineString";
|
|
19
|
+
WKBGeometryType[WKBGeometryType["MultiPolygon"] = 6] = "MultiPolygon";
|
|
20
|
+
WKBGeometryType[WKBGeometryType["GeometryCollection"] = 7] = "GeometryCollection";
|
|
21
|
+
})(WKBGeometryType || (WKBGeometryType = {}));
|
|
22
|
+
/** Sanity checks that first to 5-9 bytes could represent a supported WKB dialect header */
|
|
15
23
|
export function isWKB(arrayBuffer) {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
const geometryType = geometry & 0x07;
|
|
27
|
-
if (geometryType === 0 || geometryType > 7) {
|
|
28
|
-
return false;
|
|
29
|
-
}
|
|
30
|
-
const geometryFlags = geometry - geometryType;
|
|
31
|
-
if (geometryFlags === 0 || geometryFlags === 1000 || geometryFlags === 2000 || geometryFlags === 3000) {
|
|
32
|
-
return true;
|
|
33
|
-
}
|
|
34
|
-
if ((geometryFlags & ~(EWKB_FLAG_Z | EWKB_FLAG_M | EWKB_FLAG_SRID)) !== 0) {
|
|
35
|
-
return false;
|
|
36
|
-
}
|
|
37
|
-
if (geometryFlags & EWKB_FLAG_SRID) {
|
|
38
|
-
const srid = dataView.getUint32(byteOffset, littleEndian);
|
|
24
|
+
const dataView = new DataView(arrayBuffer);
|
|
25
|
+
let byteOffset = 0;
|
|
26
|
+
const endianness = dataView.getUint8(byteOffset);
|
|
27
|
+
byteOffset += 1;
|
|
28
|
+
// Check valid endianness (only 0 or 1 are allowed)
|
|
29
|
+
if (endianness > 1) {
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
const littleEndian = endianness === 1;
|
|
33
|
+
const geometry = dataView.getUint32(byteOffset, littleEndian);
|
|
39
34
|
byteOffset += 4;
|
|
40
|
-
|
|
41
|
-
|
|
35
|
+
// check valid geometry type (we don't support extension geometries)
|
|
36
|
+
const geometryType = geometry & 0x07;
|
|
37
|
+
if (geometryType === 0 || geometryType > 7) {
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
const geometryFlags = geometry - geometryType;
|
|
41
|
+
// Accept iso-wkb flags
|
|
42
|
+
if (geometryFlags === 0 ||
|
|
43
|
+
geometryFlags === 1000 ||
|
|
44
|
+
geometryFlags === 2000 ||
|
|
45
|
+
geometryFlags === 3000) {
|
|
46
|
+
return true;
|
|
42
47
|
}
|
|
43
|
-
|
|
44
|
-
|
|
48
|
+
// Accept ewkb flags but reject otherwise
|
|
49
|
+
if ((geometryFlags & ~(EWKB_FLAG_Z | EWKB_FLAG_M | EWKB_FLAG_SRID)) !== 0) {
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
if (geometryFlags & EWKB_FLAG_SRID) {
|
|
53
|
+
const srid = dataView.getUint32(byteOffset, littleEndian);
|
|
54
|
+
byteOffset += 4;
|
|
55
|
+
if (srid > MAX_SRID) {
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return true;
|
|
45
60
|
}
|
|
61
|
+
/**
|
|
62
|
+
* Parses header and provides a byteOffset to start of geometry data
|
|
63
|
+
* @param dataView
|
|
64
|
+
* @param target optionally supply a WKBHeader object to avoid creating a new object for every call
|
|
65
|
+
* @returns a header object describing the WKB data
|
|
66
|
+
*/
|
|
67
|
+
// eslint-disable-next-line max-statements
|
|
46
68
|
export function parseWKBHeader(dataView, target) {
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
const isoType = (geometryCode - wkbHeader.geometryType) / 1000;
|
|
61
|
-
switch (isoType) {
|
|
62
|
-
case 0:
|
|
63
|
-
break;
|
|
64
|
-
case 1:
|
|
65
|
-
wkbHeader.type = 'iso-wkb';
|
|
66
|
-
wkbHeader.dimensions = 3;
|
|
67
|
-
wkbHeader.coordinates = 'xyz';
|
|
68
|
-
break;
|
|
69
|
-
case 2:
|
|
70
|
-
wkbHeader.type = 'iso-wkb';
|
|
71
|
-
wkbHeader.dimensions = 3;
|
|
72
|
-
wkbHeader.coordinates = 'xym';
|
|
73
|
-
break;
|
|
74
|
-
case 3:
|
|
75
|
-
wkbHeader.type = 'iso-wkb';
|
|
76
|
-
wkbHeader.dimensions = 4;
|
|
77
|
-
wkbHeader.coordinates = 'xyzm';
|
|
78
|
-
break;
|
|
79
|
-
default:
|
|
80
|
-
throw new Error(`WKB: Unsupported iso-wkb type: ${isoType}`);
|
|
81
|
-
}
|
|
82
|
-
const ewkbZ = geometryCode & EWKB_FLAG_Z;
|
|
83
|
-
const ewkbM = geometryCode & EWKB_FLAG_M;
|
|
84
|
-
const ewkbSRID = geometryCode & EWKB_FLAG_SRID;
|
|
85
|
-
if (ewkbZ && ewkbM) {
|
|
86
|
-
wkbHeader.type = 'ewkb';
|
|
87
|
-
wkbHeader.dimensions = 4;
|
|
88
|
-
wkbHeader.coordinates = 'xyzm';
|
|
89
|
-
} else if (ewkbZ) {
|
|
90
|
-
wkbHeader.type = 'ewkb';
|
|
91
|
-
wkbHeader.dimensions = 3;
|
|
92
|
-
wkbHeader.coordinates = 'xyz';
|
|
93
|
-
} else if (ewkbM) {
|
|
94
|
-
wkbHeader.type = 'ewkb';
|
|
95
|
-
wkbHeader.dimensions = 3;
|
|
96
|
-
wkbHeader.coordinates = 'xym';
|
|
97
|
-
}
|
|
98
|
-
if (ewkbSRID) {
|
|
99
|
-
wkbHeader.type = 'ewkb';
|
|
100
|
-
wkbHeader.srid = dataView.getUint32(wkbHeader.byteOffset, wkbHeader.littleEndian);
|
|
69
|
+
const wkbHeader = Object.assign(target || {}, {
|
|
70
|
+
type: 'wkb',
|
|
71
|
+
geometryType: 1,
|
|
72
|
+
dimensions: 2,
|
|
73
|
+
coordinates: 'xy',
|
|
74
|
+
littleEndian: true,
|
|
75
|
+
byteOffset: 0
|
|
76
|
+
});
|
|
77
|
+
// Check endianness of data
|
|
78
|
+
wkbHeader.littleEndian = dataView.getUint8(wkbHeader.byteOffset) === 1;
|
|
79
|
+
wkbHeader.byteOffset++;
|
|
80
|
+
// 4-digit code representing dimension and type of geometry
|
|
81
|
+
const geometryCode = dataView.getUint32(wkbHeader.byteOffset, wkbHeader.littleEndian);
|
|
101
82
|
wkbHeader.byteOffset += 4;
|
|
102
|
-
|
|
103
|
-
|
|
83
|
+
wkbHeader.geometryType = (geometryCode & 0x7);
|
|
84
|
+
// Check if iso-wkb variant: iso-wkb adds 1000, 2000 or 3000 to the geometry code
|
|
85
|
+
const isoType = (geometryCode - wkbHeader.geometryType) / 1000;
|
|
86
|
+
switch (isoType) {
|
|
87
|
+
case 0:
|
|
88
|
+
break;
|
|
89
|
+
case 1:
|
|
90
|
+
wkbHeader.type = 'iso-wkb';
|
|
91
|
+
wkbHeader.dimensions = 3;
|
|
92
|
+
wkbHeader.coordinates = 'xyz';
|
|
93
|
+
break;
|
|
94
|
+
case 2:
|
|
95
|
+
wkbHeader.type = 'iso-wkb';
|
|
96
|
+
wkbHeader.dimensions = 3;
|
|
97
|
+
wkbHeader.coordinates = 'xym';
|
|
98
|
+
break;
|
|
99
|
+
case 3:
|
|
100
|
+
wkbHeader.type = 'iso-wkb';
|
|
101
|
+
wkbHeader.dimensions = 4;
|
|
102
|
+
wkbHeader.coordinates = 'xyzm';
|
|
103
|
+
break;
|
|
104
|
+
default:
|
|
105
|
+
throw new Error(`WKB: Unsupported iso-wkb type: ${isoType}`);
|
|
106
|
+
}
|
|
107
|
+
// Check if EWKB variant. Uses bitmasks for Z&M dimensions as well as optional SRID field
|
|
108
|
+
const ewkbZ = geometryCode & EWKB_FLAG_Z;
|
|
109
|
+
const ewkbM = geometryCode & EWKB_FLAG_M;
|
|
110
|
+
const ewkbSRID = geometryCode & EWKB_FLAG_SRID;
|
|
111
|
+
if (ewkbZ && ewkbM) {
|
|
112
|
+
wkbHeader.type = 'ewkb';
|
|
113
|
+
wkbHeader.dimensions = 4;
|
|
114
|
+
wkbHeader.coordinates = 'xyzm';
|
|
115
|
+
}
|
|
116
|
+
else if (ewkbZ) {
|
|
117
|
+
wkbHeader.type = 'ewkb';
|
|
118
|
+
wkbHeader.dimensions = 3;
|
|
119
|
+
wkbHeader.coordinates = 'xyz';
|
|
120
|
+
}
|
|
121
|
+
else if (ewkbM) {
|
|
122
|
+
wkbHeader.type = 'ewkb';
|
|
123
|
+
wkbHeader.dimensions = 3;
|
|
124
|
+
wkbHeader.coordinates = 'xym';
|
|
125
|
+
}
|
|
126
|
+
// If SRID present read four more bytes
|
|
127
|
+
if (ewkbSRID) {
|
|
128
|
+
wkbHeader.type = 'ewkb';
|
|
129
|
+
// 4-digit code representing dimension and type of geometry
|
|
130
|
+
wkbHeader.srid = dataView.getUint32(wkbHeader.byteOffset, wkbHeader.littleEndian);
|
|
131
|
+
wkbHeader.byteOffset += 4;
|
|
132
|
+
}
|
|
133
|
+
return wkbHeader;
|
|
104
134
|
}
|
|
105
|
-
//# sourceMappingURL=parse-wkb-header.js.map
|
package/dist/lib/parse-wkb.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { BinaryGeometry, Geometry } from '@loaders.gl/schema';
|
|
2
|
-
import type { WKBLoaderOptions } from
|
|
2
|
+
import type { WKBLoaderOptions } from "../wkb-loader.js";
|
|
3
3
|
export declare function parseWKB(arrayBuffer: ArrayBuffer, options?: WKBLoaderOptions): BinaryGeometry | Geometry;
|
|
4
4
|
export declare function parseWKBToBinary(arrayBuffer: ArrayBuffer, options?: WKBLoaderOptions): BinaryGeometry;
|
|
5
5
|
//# sourceMappingURL=parse-wkb.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse-wkb.d.ts","sourceRoot":"","sources":["../../src/lib/parse-wkb.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAEV,cAAc,EAId,QAAQ,EACT,MAAM,oBAAoB,CAAC;AAE5B,OAAO,KAAK,EAAC,gBAAgB,EAAC,
|
|
1
|
+
{"version":3,"file":"parse-wkb.d.ts","sourceRoot":"","sources":["../../src/lib/parse-wkb.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAEV,cAAc,EAId,QAAQ,EACT,MAAM,oBAAoB,CAAC;AAE5B,OAAO,KAAK,EAAC,gBAAgB,EAAC,yBAAsB;AAIpD,wBAAgB,QAAQ,CACtB,WAAW,EAAE,WAAW,EACxB,OAAO,CAAC,EAAE,gBAAgB,GACzB,cAAc,GAAG,QAAQ,CAe3B;AAED,wBAAgB,gBAAgB,CAC9B,WAAW,EAAE,WAAW,EACxB,OAAO,CAAC,EAAE,gBAAgB,GACzB,cAAc,CAoChB"}
|