@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.
Files changed (75) hide show
  1. package/dist/dist.dev.js +137 -218
  2. package/dist/dist.min.js +10 -0
  3. package/dist/hex-wkb-loader.d.ts +1 -1
  4. package/dist/hex-wkb-loader.d.ts.map +1 -1
  5. package/dist/hex-wkb-loader.js +44 -28
  6. package/dist/index.cjs +87 -62
  7. package/dist/index.cjs.map +7 -0
  8. package/dist/index.d.ts +14 -14
  9. package/dist/index.d.ts.map +1 -1
  10. package/dist/index.js +4 -1
  11. package/dist/lib/encode-twkb.js +158 -143
  12. package/dist/lib/encode-wkb.js +247 -211
  13. package/dist/lib/encode-wkt-crs.d.ts +1 -1
  14. package/dist/lib/encode-wkt-crs.d.ts.map +1 -1
  15. package/dist/lib/encode-wkt-crs.js +32 -18
  16. package/dist/lib/encode-wkt.js +35 -27
  17. package/dist/lib/parse-hex-wkb.js +1 -2
  18. package/dist/lib/parse-twkb.js +215 -218
  19. package/dist/lib/parse-wkb-header.js +124 -95
  20. package/dist/lib/parse-wkb.d.ts +1 -1
  21. package/dist/lib/parse-wkb.d.ts.map +1 -1
  22. package/dist/lib/parse-wkb.js +210 -235
  23. package/dist/lib/parse-wkt-crs.js +110 -86
  24. package/dist/lib/parse-wkt.js +251 -185
  25. package/dist/lib/utils/base64-encoder.js +151 -5
  26. package/dist/lib/utils/binary-reader.js +67 -64
  27. package/dist/lib/utils/binary-writer.js +117 -109
  28. package/dist/lib/utils/hex-encoder.js +46 -32
  29. package/dist/lib/utils/hex-transcoder.js +40 -24
  30. package/dist/lib/utils/version.js +7 -2
  31. package/dist/twkb-loader.js +26 -17
  32. package/dist/twkb-writer.js +18 -13
  33. package/dist/wkb-loader.js +26 -17
  34. package/dist/wkb-writer.js +22 -17
  35. package/dist/wkt-crs-loader.d.ts +1 -1
  36. package/dist/wkt-crs-loader.d.ts.map +1 -1
  37. package/dist/wkt-crs-loader.js +22 -15
  38. package/dist/wkt-crs-writer.d.ts +2 -2
  39. package/dist/wkt-crs-writer.d.ts.map +1 -1
  40. package/dist/wkt-crs-writer.js +23 -15
  41. package/dist/wkt-loader.js +28 -20
  42. package/dist/wkt-worker.js +4 -2
  43. package/dist/wkt-writer.js +19 -14
  44. package/dist/workers/wkb-worker.js +3 -1
  45. package/dist/workers/wkt-worker.js +3 -1
  46. package/package.json +11 -6
  47. package/src/lib/parse-wkb.ts +2 -2
  48. package/dist/hex-wkb-loader.js.map +0 -1
  49. package/dist/index.js.map +0 -1
  50. package/dist/lib/encode-twkb.js.map +0 -1
  51. package/dist/lib/encode-wkb.js.map +0 -1
  52. package/dist/lib/encode-wkt-crs.js.map +0 -1
  53. package/dist/lib/encode-wkt.js.map +0 -1
  54. package/dist/lib/parse-hex-wkb.js.map +0 -1
  55. package/dist/lib/parse-twkb.js.map +0 -1
  56. package/dist/lib/parse-wkb-header.js.map +0 -1
  57. package/dist/lib/parse-wkb.js.map +0 -1
  58. package/dist/lib/parse-wkt-crs.js.map +0 -1
  59. package/dist/lib/parse-wkt.js.map +0 -1
  60. package/dist/lib/utils/base64-encoder.js.map +0 -1
  61. package/dist/lib/utils/binary-reader.js.map +0 -1
  62. package/dist/lib/utils/binary-writer.js.map +0 -1
  63. package/dist/lib/utils/hex-encoder.js.map +0 -1
  64. package/dist/lib/utils/hex-transcoder.js.map +0 -1
  65. package/dist/lib/utils/version.js.map +0 -1
  66. package/dist/twkb-loader.js.map +0 -1
  67. package/dist/twkb-writer.js.map +0 -1
  68. package/dist/wkb-loader.js.map +0 -1
  69. package/dist/wkb-writer.js.map +0 -1
  70. package/dist/wkt-crs-loader.js.map +0 -1
  71. package/dist/wkt-crs-writer.js.map +0 -1
  72. package/dist/wkt-loader.js.map +0 -1
  73. package/dist/wkt-writer.js.map +0 -1
  74. package/dist/workers/wkb-worker.js.map +0 -1
  75. 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
- export let WKBGeometryType = function (WKBGeometryType) {
6
- WKBGeometryType[WKBGeometryType["Point"] = 1] = "Point";
7
- WKBGeometryType[WKBGeometryType["LineString"] = 2] = "LineString";
8
- WKBGeometryType[WKBGeometryType["Polygon"] = 3] = "Polygon";
9
- WKBGeometryType[WKBGeometryType["MultiPoint"] = 4] = "MultiPoint";
10
- WKBGeometryType[WKBGeometryType["MultiLineString"] = 5] = "MultiLineString";
11
- WKBGeometryType[WKBGeometryType["MultiPolygon"] = 6] = "MultiPolygon";
12
- WKBGeometryType[WKBGeometryType["GeometryCollection"] = 7] = "GeometryCollection";
13
- return WKBGeometryType;
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
- const dataView = new DataView(arrayBuffer);
17
- let byteOffset = 0;
18
- const endianness = dataView.getUint8(byteOffset);
19
- byteOffset += 1;
20
- if (endianness > 1) {
21
- return false;
22
- }
23
- const littleEndian = endianness === 1;
24
- const geometry = dataView.getUint32(byteOffset, littleEndian);
25
- byteOffset += 4;
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
- if (srid > MAX_SRID) {
41
- return false;
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
- return true;
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
- const wkbHeader = Object.assign(target || {}, {
48
- type: 'wkb',
49
- geometryType: 1,
50
- dimensions: 2,
51
- coordinates: 'xy',
52
- littleEndian: true,
53
- byteOffset: 0
54
- });
55
- wkbHeader.littleEndian = dataView.getUint8(wkbHeader.byteOffset) === 1;
56
- wkbHeader.byteOffset++;
57
- const geometryCode = dataView.getUint32(wkbHeader.byteOffset, wkbHeader.littleEndian);
58
- wkbHeader.byteOffset += 4;
59
- wkbHeader.geometryType = geometryCode & 0x7;
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
- return wkbHeader;
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
@@ -1,5 +1,5 @@
1
1
  import type { BinaryGeometry, Geometry } from '@loaders.gl/schema';
2
- import type { WKBLoaderOptions } from '../wkb-loader';
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,MAAM,eAAe,CAAC;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"}
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"}