@loaders.gl/wkt 4.0.0-beta.2 → 4.0.0-beta.3

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 (236) hide show
  1. package/dist/{dist.min.js → dist.dev.js} +587 -606
  2. package/dist/hex-wkb-loader.d.ts.map +1 -0
  3. package/dist/{esm/hex-wkb-loader.js → hex-wkb-loader.js} +3 -3
  4. package/dist/hex-wkb-loader.js.map +1 -0
  5. package/dist/index.cjs +1799 -0
  6. package/dist/index.d.ts.map +1 -0
  7. package/dist/index.js +14 -0
  8. package/dist/index.js.map +1 -0
  9. package/dist/lib/encode-twkb.d.ts.map +1 -0
  10. package/dist/{esm/lib → lib}/encode-twkb.js +2 -2
  11. package/dist/lib/encode-twkb.js.map +1 -0
  12. package/dist/lib/encode-wkb.d.ts.map +1 -0
  13. package/dist/{esm/lib → lib}/encode-wkb.js +3 -3
  14. package/dist/lib/encode-wkb.js.map +1 -0
  15. package/dist/lib/encode-wkt-crs.d.ts.map +1 -0
  16. package/dist/{esm/lib → lib}/encode-wkt-crs.js +4 -4
  17. package/dist/lib/encode-wkt-crs.js.map +1 -0
  18. package/dist/lib/encode-wkt.d.ts.map +1 -0
  19. package/dist/{esm/lib → lib}/encode-wkt.js +8 -8
  20. package/dist/lib/encode-wkt.js.map +1 -0
  21. package/dist/lib/parse-hex-wkb.d.ts.map +1 -0
  22. package/dist/lib/parse-hex-wkb.js.map +1 -0
  23. package/dist/lib/parse-twkb.d.ts.map +1 -0
  24. package/dist/{esm/lib → lib}/parse-twkb.js +3 -3
  25. package/dist/lib/parse-twkb.js.map +1 -0
  26. package/dist/lib/parse-wkb-header.d.ts.map +1 -0
  27. package/dist/{esm/lib → lib}/parse-wkb-header.js +1 -1
  28. package/dist/lib/parse-wkb-header.js.map +1 -0
  29. package/dist/lib/parse-wkb.d.ts.map +1 -0
  30. package/dist/{esm/lib → lib}/parse-wkb.js +2 -2
  31. package/dist/lib/parse-wkb.js.map +1 -0
  32. package/dist/lib/parse-wkt-crs.d.ts.map +1 -0
  33. package/dist/{esm/lib → lib}/parse-wkt-crs.js +7 -7
  34. package/dist/lib/parse-wkt-crs.js.map +1 -0
  35. package/dist/lib/parse-wkt.d.ts.map +1 -0
  36. package/dist/lib/parse-wkt.js.map +1 -0
  37. package/dist/lib/utils/base64-encoder.d.ts.map +1 -0
  38. package/dist/lib/utils/base64-encoder.js.map +1 -0
  39. package/dist/lib/utils/binary-reader.d.ts.map +1 -0
  40. package/dist/{esm/lib → lib}/utils/binary-reader.js +4 -5
  41. package/dist/lib/utils/binary-reader.js.map +1 -0
  42. package/dist/lib/utils/binary-writer.d.ts.map +1 -0
  43. package/dist/{esm/lib → lib}/utils/binary-writer.js +4 -5
  44. package/dist/lib/utils/binary-writer.js.map +1 -0
  45. package/dist/lib/utils/hex-encoder.d.ts.map +1 -0
  46. package/dist/lib/utils/hex-encoder.js.map +1 -0
  47. package/dist/lib/utils/hex-transcoder.d.ts.map +1 -0
  48. package/dist/lib/utils/hex-transcoder.js.map +1 -0
  49. package/dist/lib/utils/version.d.ts.map +1 -0
  50. package/dist/lib/utils/version.js +2 -0
  51. package/dist/lib/utils/version.js.map +1 -0
  52. package/dist/twkb-loader.d.ts.map +1 -0
  53. package/dist/{esm/twkb-loader.js → twkb-loader.js} +2 -2
  54. package/dist/twkb-loader.js.map +1 -0
  55. package/dist/twkb-writer.d.ts.map +1 -0
  56. package/dist/{esm/twkb-writer.js → twkb-writer.js} +2 -2
  57. package/dist/twkb-writer.js.map +1 -0
  58. package/dist/wkb-loader.d.ts.map +1 -0
  59. package/dist/{esm/wkb-loader.js → wkb-loader.js} +3 -3
  60. package/dist/wkb-loader.js.map +1 -0
  61. package/dist/wkb-writer.d.ts.map +1 -0
  62. package/dist/{esm/wkb-writer.js → wkb-writer.js} +2 -2
  63. package/dist/wkb-writer.js.map +1 -0
  64. package/dist/wkt-crs-loader.d.ts.map +1 -0
  65. package/dist/{esm/wkt-crs-loader.js → wkt-crs-loader.js} +2 -2
  66. package/dist/wkt-crs-loader.js.map +1 -0
  67. package/dist/wkt-crs-writer.d.ts.map +1 -0
  68. package/dist/{esm/wkt-crs-writer.js → wkt-crs-writer.js} +2 -2
  69. package/dist/wkt-crs-writer.js.map +1 -0
  70. package/dist/wkt-loader.d.ts.map +1 -0
  71. package/dist/{esm/wkt-loader.js → wkt-loader.js} +3 -3
  72. package/dist/wkt-loader.js.map +1 -0
  73. package/dist/wkt-worker.js +18 -3
  74. package/dist/wkt-writer.d.ts.map +1 -0
  75. package/dist/{esm/wkt-writer.js → wkt-writer.js} +2 -2
  76. package/dist/wkt-writer.js.map +1 -0
  77. package/dist/{src/workers → workers}/wkb-worker.d.ts.map +1 -1
  78. package/dist/{esm/workers → workers}/wkb-worker.js +1 -1
  79. package/dist/workers/wkb-worker.js.map +1 -0
  80. package/dist/{src/workers → workers}/wkt-worker.d.ts.map +1 -1
  81. package/dist/{esm/workers → workers}/wkt-worker.js +1 -1
  82. package/dist/workers/wkt-worker.js.map +1 -0
  83. package/package.json +16 -8
  84. package/dist/es5/bundle.js +0 -6
  85. package/dist/es5/bundle.js.map +0 -1
  86. package/dist/es5/hex-wkb-loader.js +0 -64
  87. package/dist/es5/hex-wkb-loader.js.map +0 -1
  88. package/dist/es5/index.js +0 -121
  89. package/dist/es5/index.js.map +0 -1
  90. package/dist/es5/lib/encode-twkb.js +0 -269
  91. package/dist/es5/lib/encode-twkb.js.map +0 -1
  92. package/dist/es5/lib/encode-wkb.js +0 -376
  93. package/dist/es5/lib/encode-wkb.js.map +0 -1
  94. package/dist/es5/lib/encode-wkt-crs.js +0 -32
  95. package/dist/es5/lib/encode-wkt-crs.js.map +0 -1
  96. package/dist/es5/lib/encode-wkt.js +0 -45
  97. package/dist/es5/lib/encode-wkt.js.map +0 -1
  98. package/dist/es5/lib/parse-hex-wkb.js +0 -2
  99. package/dist/es5/lib/parse-hex-wkb.js.map +0 -1
  100. package/dist/es5/lib/parse-twkb.js +0 -263
  101. package/dist/es5/lib/parse-twkb.js.map +0 -1
  102. package/dist/es5/lib/parse-wkb-header.js +0 -114
  103. package/dist/es5/lib/parse-wkb-header.js.map +0 -1
  104. package/dist/es5/lib/parse-wkb.js +0 -297
  105. package/dist/es5/lib/parse-wkb.js.map +0 -1
  106. package/dist/es5/lib/parse-wkt-crs.js +0 -106
  107. package/dist/es5/lib/parse-wkt-crs.js.map +0 -1
  108. package/dist/es5/lib/parse-wkt.js +0 -233
  109. package/dist/es5/lib/parse-wkt.js.map +0 -1
  110. package/dist/es5/lib/utils/base64-encoder.js +0 -26
  111. package/dist/es5/lib/utils/base64-encoder.js.map +0 -1
  112. package/dist/es5/lib/utils/binary-reader.js +0 -98
  113. package/dist/es5/lib/utils/binary-reader.js.map +0 -1
  114. package/dist/es5/lib/utils/binary-writer.js +0 -161
  115. package/dist/es5/lib/utils/binary-writer.js.map +0 -1
  116. package/dist/es5/lib/utils/hex-encoder.js +0 -63
  117. package/dist/es5/lib/utils/hex-encoder.js.map +0 -1
  118. package/dist/es5/lib/utils/hex-transcoder.js +0 -41
  119. package/dist/es5/lib/utils/hex-transcoder.js.map +0 -1
  120. package/dist/es5/lib/utils/version.js +0 -9
  121. package/dist/es5/lib/utils/version.js.map +0 -1
  122. package/dist/es5/twkb-loader.js +0 -53
  123. package/dist/es5/twkb-loader.js.map +0 -1
  124. package/dist/es5/twkb-writer.js +0 -40
  125. package/dist/es5/twkb-writer.js.map +0 -1
  126. package/dist/es5/wkb-loader.js +0 -54
  127. package/dist/es5/wkb-loader.js.map +0 -1
  128. package/dist/es5/wkb-writer.js +0 -24
  129. package/dist/es5/wkb-writer.js.map +0 -1
  130. package/dist/es5/wkt-crs-loader.js +0 -47
  131. package/dist/es5/wkt-crs-loader.js.map +0 -1
  132. package/dist/es5/wkt-crs-writer.js +0 -49
  133. package/dist/es5/wkt-crs-writer.js.map +0 -1
  134. package/dist/es5/wkt-loader.js +0 -55
  135. package/dist/es5/wkt-loader.js.map +0 -1
  136. package/dist/es5/wkt-writer.js +0 -21
  137. package/dist/es5/wkt-writer.js.map +0 -1
  138. package/dist/es5/workers/wkb-worker.js +0 -6
  139. package/dist/es5/workers/wkb-worker.js.map +0 -1
  140. package/dist/es5/workers/wkt-worker.js +0 -6
  141. package/dist/es5/workers/wkt-worker.js.map +0 -1
  142. package/dist/esm/bundle.js +0 -4
  143. package/dist/esm/bundle.js.map +0 -1
  144. package/dist/esm/hex-wkb-loader.js.map +0 -1
  145. package/dist/esm/index.js +0 -14
  146. package/dist/esm/index.js.map +0 -1
  147. package/dist/esm/lib/encode-twkb.js.map +0 -1
  148. package/dist/esm/lib/encode-wkb.js.map +0 -1
  149. package/dist/esm/lib/encode-wkt-crs.js.map +0 -1
  150. package/dist/esm/lib/encode-wkt.js.map +0 -1
  151. package/dist/esm/lib/parse-hex-wkb.js.map +0 -1
  152. package/dist/esm/lib/parse-twkb.js.map +0 -1
  153. package/dist/esm/lib/parse-wkb-header.js.map +0 -1
  154. package/dist/esm/lib/parse-wkb.js.map +0 -1
  155. package/dist/esm/lib/parse-wkt-crs.js.map +0 -1
  156. package/dist/esm/lib/parse-wkt.js.map +0 -1
  157. package/dist/esm/lib/utils/base64-encoder.js.map +0 -1
  158. package/dist/esm/lib/utils/binary-reader.js.map +0 -1
  159. package/dist/esm/lib/utils/binary-writer.js.map +0 -1
  160. package/dist/esm/lib/utils/hex-encoder.js.map +0 -1
  161. package/dist/esm/lib/utils/hex-transcoder.js.map +0 -1
  162. package/dist/esm/lib/utils/version.js +0 -2
  163. package/dist/esm/lib/utils/version.js.map +0 -1
  164. package/dist/esm/twkb-loader.js.map +0 -1
  165. package/dist/esm/twkb-writer.js.map +0 -1
  166. package/dist/esm/wkb-loader.js.map +0 -1
  167. package/dist/esm/wkb-writer.js.map +0 -1
  168. package/dist/esm/wkt-crs-loader.js.map +0 -1
  169. package/dist/esm/wkt-crs-writer.js.map +0 -1
  170. package/dist/esm/wkt-loader.js.map +0 -1
  171. package/dist/esm/wkt-writer.js.map +0 -1
  172. package/dist/esm/workers/wkb-worker.js.map +0 -1
  173. package/dist/esm/workers/wkt-worker.js.map +0 -1
  174. package/dist/src/bundle.d.ts +0 -2
  175. package/dist/src/bundle.d.ts.map +0 -1
  176. package/dist/src/hex-wkb-loader.d.ts.map +0 -1
  177. package/dist/src/index.d.ts.map +0 -1
  178. package/dist/src/lib/encode-twkb.d.ts.map +0 -1
  179. package/dist/src/lib/encode-wkb.d.ts.map +0 -1
  180. package/dist/src/lib/encode-wkt-crs.d.ts.map +0 -1
  181. package/dist/src/lib/encode-wkt.d.ts.map +0 -1
  182. package/dist/src/lib/parse-hex-wkb.d.ts.map +0 -1
  183. package/dist/src/lib/parse-twkb.d.ts.map +0 -1
  184. package/dist/src/lib/parse-wkb-header.d.ts.map +0 -1
  185. package/dist/src/lib/parse-wkb.d.ts.map +0 -1
  186. package/dist/src/lib/parse-wkt-crs.d.ts.map +0 -1
  187. package/dist/src/lib/parse-wkt.d.ts.map +0 -1
  188. package/dist/src/lib/utils/base64-encoder.d.ts.map +0 -1
  189. package/dist/src/lib/utils/binary-reader.d.ts.map +0 -1
  190. package/dist/src/lib/utils/binary-writer.d.ts.map +0 -1
  191. package/dist/src/lib/utils/hex-encoder.d.ts.map +0 -1
  192. package/dist/src/lib/utils/hex-transcoder.d.ts.map +0 -1
  193. package/dist/src/lib/utils/version.d.ts.map +0 -1
  194. package/dist/src/twkb-loader.d.ts.map +0 -1
  195. package/dist/src/twkb-writer.d.ts.map +0 -1
  196. package/dist/src/wkb-loader.d.ts.map +0 -1
  197. package/dist/src/wkb-writer.d.ts.map +0 -1
  198. package/dist/src/wkt-crs-loader.d.ts.map +0 -1
  199. package/dist/src/wkt-crs-writer.d.ts.map +0 -1
  200. package/dist/src/wkt-loader.d.ts.map +0 -1
  201. package/dist/src/wkt-writer.d.ts.map +0 -1
  202. package/dist/tsconfig.tsbuildinfo +0 -1
  203. package/src/bundle.ts +0 -4
  204. /package/dist/{src/hex-wkb-loader.d.ts → hex-wkb-loader.d.ts} +0 -0
  205. /package/dist/{src/index.d.ts → index.d.ts} +0 -0
  206. /package/dist/{src/lib → lib}/encode-twkb.d.ts +0 -0
  207. /package/dist/{src/lib → lib}/encode-wkb.d.ts +0 -0
  208. /package/dist/{src/lib → lib}/encode-wkt-crs.d.ts +0 -0
  209. /package/dist/{src/lib → lib}/encode-wkt.d.ts +0 -0
  210. /package/dist/{src/lib → lib}/parse-hex-wkb.d.ts +0 -0
  211. /package/dist/{esm/lib → lib}/parse-hex-wkb.js +0 -0
  212. /package/dist/{src/lib → lib}/parse-twkb.d.ts +0 -0
  213. /package/dist/{src/lib → lib}/parse-wkb-header.d.ts +0 -0
  214. /package/dist/{src/lib → lib}/parse-wkb.d.ts +0 -0
  215. /package/dist/{src/lib → lib}/parse-wkt-crs.d.ts +0 -0
  216. /package/dist/{src/lib → lib}/parse-wkt.d.ts +0 -0
  217. /package/dist/{esm/lib → lib}/parse-wkt.js +0 -0
  218. /package/dist/{src/lib → lib}/utils/base64-encoder.d.ts +0 -0
  219. /package/dist/{esm/lib → lib}/utils/base64-encoder.js +0 -0
  220. /package/dist/{src/lib → lib}/utils/binary-reader.d.ts +0 -0
  221. /package/dist/{src/lib → lib}/utils/binary-writer.d.ts +0 -0
  222. /package/dist/{src/lib → lib}/utils/hex-encoder.d.ts +0 -0
  223. /package/dist/{esm/lib → lib}/utils/hex-encoder.js +0 -0
  224. /package/dist/{src/lib → lib}/utils/hex-transcoder.d.ts +0 -0
  225. /package/dist/{esm/lib → lib}/utils/hex-transcoder.js +0 -0
  226. /package/dist/{src/lib → lib}/utils/version.d.ts +0 -0
  227. /package/dist/{src/twkb-loader.d.ts → twkb-loader.d.ts} +0 -0
  228. /package/dist/{src/twkb-writer.d.ts → twkb-writer.d.ts} +0 -0
  229. /package/dist/{src/wkb-loader.d.ts → wkb-loader.d.ts} +0 -0
  230. /package/dist/{src/wkb-writer.d.ts → wkb-writer.d.ts} +0 -0
  231. /package/dist/{src/wkt-crs-loader.d.ts → wkt-crs-loader.d.ts} +0 -0
  232. /package/dist/{src/wkt-crs-writer.d.ts → wkt-crs-writer.d.ts} +0 -0
  233. /package/dist/{src/wkt-loader.d.ts → wkt-loader.d.ts} +0 -0
  234. /package/dist/{src/wkt-writer.d.ts → wkt-writer.d.ts} +0 -0
  235. /package/dist/{src/workers → workers}/wkb-worker.d.ts +0 -0
  236. /package/dist/{src/workers → workers}/wkt-worker.d.ts +0 -0
package/dist/index.cjs ADDED
@@ -0,0 +1,1799 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var src_exports = {};
22
+ __export(src_exports, {
23
+ HexWKBLoader: () => HexWKBLoader,
24
+ TWKBLoader: () => TWKBLoader,
25
+ TWKBWriter: () => TWKBWriter,
26
+ WKBLoader: () => WKBLoader,
27
+ WKBWorkerLoader: () => WKBWorkerLoader,
28
+ WKBWriter: () => WKBWriter,
29
+ WKTCRSLoader: () => WKTCRSLoader,
30
+ WKTCRSWriter: () => WKTCRSWriter,
31
+ WKTLoader: () => WKTLoader,
32
+ WKTWorkerLoader: () => WKTWorkerLoader,
33
+ WKTWriter: () => WKTWriter,
34
+ decodeHex: () => decodeHex,
35
+ encodeHex: () => encodeHex,
36
+ isTWKB: () => isTWKB,
37
+ isWKB: () => isWKB,
38
+ isWKT: () => isWKT,
39
+ parseWKBHeader: () => parseWKBHeader
40
+ });
41
+ module.exports = __toCommonJS(src_exports);
42
+
43
+ // src/lib/utils/version.ts
44
+ var VERSION = typeof __VERSION__ !== "undefined" ? __VERSION__ : "latest";
45
+
46
+ // src/lib/parse-wkt-crs.ts
47
+ function parseWKTCRS(wkt, options) {
48
+ if (options == null ? void 0 : options.debug) {
49
+ console.log("[wktcrs] parse starting with\n", wkt);
50
+ }
51
+ wkt = wkt.replace(/[A-Z][A-Z\d_]+\[/gi, (match) => `["${match.substr(0, match.length - 1)}",`);
52
+ wkt = wkt.replace(/, ?([A-Z][A-Z\d_]+[,\]])/gi, (match, p1) => {
53
+ const varname = p1.substr(0, p1.length - 1);
54
+ return `,"${(options == null ? void 0 : options.raw) ? "raw:" : ""}${varname}"${p1[p1.length - 1]}`;
55
+ });
56
+ if (options == null ? void 0 : options.raw) {
57
+ wkt = wkt.replace(/, {0,2}(-?[\.\d]+)(?=,|\])/g, function(match, p1) {
58
+ return `,"${(options == null ? void 0 : options.raw) ? "raw:" : ""}${p1}"`;
59
+ });
60
+ }
61
+ if (options == null ? void 0 : options.debug) {
62
+ console.log(`[wktcrs] json'd wkt: '${wkt}'`);
63
+ }
64
+ let data;
65
+ try {
66
+ data = JSON.parse(wkt);
67
+ } catch (error) {
68
+ console.error(`[wktcrs] failed to parse '${wkt}'`);
69
+ throw error;
70
+ }
71
+ if (options == null ? void 0 : options.debug) {
72
+ console.log(`[wktcrs] json parsed: '${wkt}'`);
73
+ }
74
+ function process(data2, parent) {
75
+ const kw = data2[0];
76
+ data2.forEach(function(it) {
77
+ if (Array.isArray(it)) {
78
+ process(it, data2);
79
+ }
80
+ });
81
+ const kwarr = `MULTIPLE_${kw}`;
82
+ if (kwarr in parent) {
83
+ parent[kwarr].push(data2);
84
+ } else if (kw in parent) {
85
+ parent[kwarr] = [parent[kw], data2];
86
+ delete parent[kw];
87
+ } else {
88
+ parent[kw] = data2;
89
+ }
90
+ return parent;
91
+ }
92
+ const result = process(data, [data]);
93
+ if (options == null ? void 0 : options.debug) {
94
+ console.log("[wktcrs] parse returning", result);
95
+ }
96
+ if (options == null ? void 0 : options.sort) {
97
+ sort(result, options);
98
+ }
99
+ return result;
100
+ }
101
+ function sort(data, options) {
102
+ const keys = Object.keys(data).filter((k) => !/\d+/.test(k));
103
+ const keywords = (options == null ? void 0 : options.keywords) || [];
104
+ if (!(options == null ? void 0 : options.keywords)) {
105
+ const counts = {};
106
+ if (Array.isArray(data)) {
107
+ data.forEach((it) => {
108
+ if (Array.isArray(it) && it.length >= 2 && typeof it[1] === "string") {
109
+ const k = it[0];
110
+ if (!counts[k])
111
+ counts[k] = 0;
112
+ counts[k]++;
113
+ }
114
+ });
115
+ for (const k in counts) {
116
+ if (counts[k] > 0)
117
+ keywords.push(k);
118
+ }
119
+ }
120
+ }
121
+ keys.forEach((key) => {
122
+ data[key] = sort(data[key]);
123
+ });
124
+ keywords.forEach((key) => {
125
+ const indices = [];
126
+ const params = [];
127
+ data.forEach((item, i) => {
128
+ if (Array.isArray(item) && item[0] === key) {
129
+ indices.push(i);
130
+ params.push(item);
131
+ }
132
+ });
133
+ params.sort((a, b) => {
134
+ a = a[1].toString();
135
+ b = b[1].toString();
136
+ return a < b ? -1 : a > b ? 1 : 0;
137
+ });
138
+ params.forEach((param, i) => {
139
+ data[indices[i]] = param;
140
+ });
141
+ });
142
+ return data;
143
+ }
144
+
145
+ // src/wkt-crs-loader.ts
146
+ var WKTCRSLoader = {
147
+ name: "WKT CRS (Well-Known Text Coordinate Reference System)",
148
+ id: "wkt-crs",
149
+ module: "wkt-crs",
150
+ version: VERSION,
151
+ worker: true,
152
+ extensions: [],
153
+ mimeTypes: ["text/plain"],
154
+ category: "json",
155
+ text: true,
156
+ options: {
157
+ "wkt-crs": {}
158
+ },
159
+ parse: async (arrayBuffer, options) => parseWKTCRS(new TextDecoder().decode(arrayBuffer), options == null ? void 0 : options["wkt-crs"]),
160
+ parseTextSync: (string, options) => parseWKTCRS(string, options == null ? void 0 : options["wkt-crs"])
161
+ };
162
+
163
+ // src/lib/encode-wkt-crs.ts
164
+ function encodeWKTCRS(wkt, options) {
165
+ if (Array.isArray(wkt) && wkt.length === 1 && Array.isArray(wkt[0])) {
166
+ wkt = wkt[0];
167
+ }
168
+ const [kw, ...attrs] = wkt;
169
+ const str = `${kw}[${attrs.map((attr) => {
170
+ if (Array.isArray(attr)) {
171
+ return encodeWKTCRS(attr, options);
172
+ } else if (typeof attr === "number") {
173
+ return attr.toString();
174
+ } else if (typeof attr === "string") {
175
+ if (attr.startsWith("raw:")) {
176
+ return attr.replace("raw:", "");
177
+ }
178
+ return `"${attr}"`;
179
+ }
180
+ throw new Error(`[wktcrs] unexpected attribute "${attr}"`);
181
+ }).join(",")}]`;
182
+ return str;
183
+ }
184
+
185
+ // src/wkt-crs-writer.ts
186
+ var WKTCRSWriter = {
187
+ name: "WKT CRS (Well-Known Text Coordinate Reference System)",
188
+ id: "wkt-crs",
189
+ module: "wkt-crs",
190
+ version: VERSION,
191
+ worker: true,
192
+ extensions: [],
193
+ mimeTypes: ["text/plain"],
194
+ // category: 'json',
195
+ text: true,
196
+ options: {
197
+ "wkt-crs": {}
198
+ },
199
+ encode: async (wktcrs, options) => new TextEncoder().encode(encodeWKTCRS(wktcrs, options == null ? void 0 : options["wkt-crs"])),
200
+ encodeSync: (wktcrs, options) => new TextEncoder().encode(encodeWKTCRS(wktcrs, options == null ? void 0 : options["wkt-crs"])),
201
+ encodeTextSync: (wktcrs, options) => encodeWKTCRS(wktcrs, options == null ? void 0 : options["wkt-crs"])
202
+ };
203
+
204
+ // src/lib/parse-wkt.ts
205
+ var numberRegexp = /[-+]?([0-9]*\.[0-9]+|[0-9]+)([eE][-+]?[0-9]+)?/;
206
+ var tuples = new RegExp("^" + numberRegexp.source + "(\\s" + numberRegexp.source + "){1,}");
207
+ var WKT_MAGIC_STRINGS = [
208
+ "POINT(",
209
+ "LINESTRING(",
210
+ "POLYGON(",
211
+ "MULTIPOINT(",
212
+ "MULTILINESTRING(",
213
+ "MULTIPOLYGON(",
214
+ "GEOMETRYCOLLECTION("
215
+ // We only support this "geojson" subset of the OGC simple features standard
216
+ ];
217
+ function isWKT(input) {
218
+ return WKT_MAGIC_STRINGS.some((magicString) => input.startsWith(magicString));
219
+ }
220
+ function parseWKT(input, options) {
221
+ return parseWKTToGeometry(input, options);
222
+ }
223
+ function parseWKTToGeometry(input, options) {
224
+ var _a;
225
+ const parts = input.split(";");
226
+ let _ = parts.pop();
227
+ const srid = (parts.shift() || "").split("=").pop();
228
+ const state = { parts, _, i: 0 };
229
+ const geometry = parseGeometry(state);
230
+ return ((_a = options == null ? void 0 : options.wkt) == null ? void 0 : _a.crs) ? addCRS(geometry, srid) : geometry;
231
+ }
232
+ function parseGeometry(state) {
233
+ return parsePoint(state) || parseLineString(state) || parsePolygon(state) || parseMultiPoint(state) || parseMultiLineString(state) || parseMultiPolygon(state) || parseGeometryCollection(state);
234
+ }
235
+ function addCRS(obj, srid) {
236
+ if (obj && (srid == null ? void 0 : srid.match(/\d+/))) {
237
+ const crs = {
238
+ type: "name",
239
+ properties: {
240
+ name: "urn:ogc:def:crs:EPSG::" + srid
241
+ }
242
+ };
243
+ obj.crs = crs;
244
+ }
245
+ return obj;
246
+ }
247
+ function parsePoint(state) {
248
+ if (!$(/^(POINT(\sz)?)/i, state)) {
249
+ return null;
250
+ }
251
+ white(state);
252
+ if (!$(/^(\()/, state)) {
253
+ return null;
254
+ }
255
+ const c = coords(state);
256
+ if (!c) {
257
+ return null;
258
+ }
259
+ white(state);
260
+ if (!$(/^(\))/, state)) {
261
+ return null;
262
+ }
263
+ return {
264
+ type: "Point",
265
+ coordinates: c[0]
266
+ };
267
+ }
268
+ function parseMultiPoint(state) {
269
+ var _a, _b;
270
+ if (!$(/^(MULTIPOINT)/i, state)) {
271
+ return null;
272
+ }
273
+ white(state);
274
+ const newCoordsFormat = (_b = state._) == null ? void 0 : _b.substring(((_a = state._) == null ? void 0 : _a.indexOf("(")) + 1, state._.length - 1).replace(/\(/g, "").replace(/\)/g, "");
275
+ state._ = "MULTIPOINT (" + newCoordsFormat + ")";
276
+ const c = multicoords(state);
277
+ if (!c) {
278
+ return null;
279
+ }
280
+ white(state);
281
+ return {
282
+ type: "MultiPoint",
283
+ coordinates: c
284
+ };
285
+ }
286
+ function parseLineString(state) {
287
+ if (!$(/^(LINESTRING(\sz)?)/i, state)) {
288
+ return null;
289
+ }
290
+ white(state);
291
+ if (!$(/^(\()/, state)) {
292
+ return null;
293
+ }
294
+ const c = coords(state);
295
+ if (!c) {
296
+ return null;
297
+ }
298
+ if (!$(/^(\))/, state)) {
299
+ return null;
300
+ }
301
+ return {
302
+ type: "LineString",
303
+ coordinates: c
304
+ };
305
+ }
306
+ function parseMultiLineString(state) {
307
+ if (!$(/^(MULTILINESTRING)/i, state))
308
+ return null;
309
+ white(state);
310
+ const c = multicoords(state);
311
+ if (!c) {
312
+ return null;
313
+ }
314
+ white(state);
315
+ return {
316
+ type: "MultiLineString",
317
+ // @ts-expect-error
318
+ coordinates: c
319
+ };
320
+ }
321
+ function parsePolygon(state) {
322
+ if (!$(/^(POLYGON(\sz)?)/i, state)) {
323
+ return null;
324
+ }
325
+ white(state);
326
+ const c = multicoords(state);
327
+ if (!c) {
328
+ return null;
329
+ }
330
+ return {
331
+ type: "Polygon",
332
+ // @ts-expect-error
333
+ coordinates: c
334
+ };
335
+ }
336
+ function parseMultiPolygon(state) {
337
+ if (!$(/^(MULTIPOLYGON)/i, state)) {
338
+ return null;
339
+ }
340
+ white(state);
341
+ const c = multicoords(state);
342
+ if (!c) {
343
+ return null;
344
+ }
345
+ return {
346
+ type: "MultiPolygon",
347
+ // @ts-expect-error
348
+ coordinates: c
349
+ };
350
+ }
351
+ function parseGeometryCollection(state) {
352
+ const geometries = [];
353
+ let geometry;
354
+ if (!$(/^(GEOMETRYCOLLECTION)/i, state)) {
355
+ return null;
356
+ }
357
+ white(state);
358
+ if (!$(/^(\()/, state)) {
359
+ return null;
360
+ }
361
+ while (geometry = parseGeometry(state)) {
362
+ geometries.push(geometry);
363
+ white(state);
364
+ $(/^(,)/, state);
365
+ white(state);
366
+ }
367
+ if (!$(/^(\))/, state)) {
368
+ return null;
369
+ }
370
+ return {
371
+ type: "GeometryCollection",
372
+ geometries
373
+ };
374
+ }
375
+ function multicoords(state) {
376
+ white(state);
377
+ let depth = 0;
378
+ const rings = [];
379
+ const stack = [rings];
380
+ let pointer = rings;
381
+ let elem;
382
+ while (elem = $(/^(\()/, state) || $(/^(\))/, state) || $(/^(,)/, state) || $(tuples, state)) {
383
+ if (elem === "(") {
384
+ stack.push(pointer);
385
+ pointer = [];
386
+ stack[stack.length - 1].push(pointer);
387
+ depth++;
388
+ } else if (elem === ")") {
389
+ if (pointer.length === 0)
390
+ return null;
391
+ pointer = stack.pop();
392
+ if (!pointer)
393
+ return null;
394
+ depth--;
395
+ if (depth === 0)
396
+ break;
397
+ } else if (elem === ",") {
398
+ pointer = [];
399
+ stack[stack.length - 1].push(pointer);
400
+ } else if (!elem.split(/\s/g).some(isNaN)) {
401
+ Array.prototype.push.apply(pointer, elem.split(/\s/g).map(parseFloat));
402
+ } else {
403
+ return null;
404
+ }
405
+ white(state);
406
+ }
407
+ if (depth !== 0)
408
+ return null;
409
+ return rings;
410
+ }
411
+ function coords(state) {
412
+ const list = [];
413
+ let item;
414
+ let pt;
415
+ while (pt = $(tuples, state) || $(/^(,)/, state)) {
416
+ if (pt === ",") {
417
+ list.push(item);
418
+ item = [];
419
+ } else if (!pt.split(/\s/g).some(isNaN)) {
420
+ if (!item)
421
+ item = [];
422
+ Array.prototype.push.apply(item, pt.split(/\s/g).map(parseFloat));
423
+ }
424
+ white(state);
425
+ }
426
+ if (item)
427
+ list.push(item);
428
+ else
429
+ return null;
430
+ return list.length ? list : null;
431
+ }
432
+ function $(regexp, state) {
433
+ var _a;
434
+ const match = (_a = state._) == null ? void 0 : _a.substring(state.i).match(regexp);
435
+ if (!match)
436
+ return null;
437
+ else {
438
+ state.i += match[0].length;
439
+ return match[0];
440
+ }
441
+ }
442
+ function white(state) {
443
+ $(/^\s*/, state);
444
+ }
445
+
446
+ // src/wkt-loader.ts
447
+ var WKTWorkerLoader = {
448
+ name: "WKT (Well-Known Text)",
449
+ id: "wkt",
450
+ module: "wkt",
451
+ version: VERSION,
452
+ worker: true,
453
+ extensions: ["wkt"],
454
+ mimeTypes: ["text/plain"],
455
+ category: "geometry",
456
+ text: true,
457
+ tests: WKT_MAGIC_STRINGS,
458
+ testText: isWKT,
459
+ options: {
460
+ wkt: {
461
+ crs: true
462
+ }
463
+ }
464
+ };
465
+ var WKTLoader = {
466
+ ...WKTWorkerLoader,
467
+ parse: async (arrayBuffer, options) => parseWKT(new TextDecoder().decode(arrayBuffer), options),
468
+ parseTextSync: parseWKT
469
+ };
470
+
471
+ // src/lib/encode-wkt.ts
472
+ function encodeWKT(geometry) {
473
+ if (geometry.type === "Feature") {
474
+ geometry = geometry.geometry;
475
+ }
476
+ switch (geometry.type) {
477
+ case "Point":
478
+ return `POINT ${wrapParens(pairWKT(geometry.coordinates))}`;
479
+ case "LineString":
480
+ return `LINESTRING ${wrapParens(ringWKT(geometry.coordinates))}`;
481
+ case "Polygon":
482
+ return `POLYGON ${wrapParens(ringsWKT(geometry.coordinates))}`;
483
+ case "MultiPoint":
484
+ return `MULTIPOINT ${wrapParens(ringWKT(geometry.coordinates))}`;
485
+ case "MultiPolygon":
486
+ return `MULTIPOLYGON ${wrapParens(multiRingsWKT(geometry.coordinates))}`;
487
+ case "MultiLineString":
488
+ return `MULTILINESTRING ${wrapParens(ringsWKT(geometry.coordinates))}`;
489
+ case "GeometryCollection":
490
+ return `GEOMETRYCOLLECTION ${wrapParens(geometry.geometries.map(encodeWKT).join(", "))}`;
491
+ default:
492
+ throw new Error("stringify requires a valid GeoJSON Feature or geometry object as input");
493
+ }
494
+ }
495
+ function pairWKT(c) {
496
+ return c.join(" ");
497
+ }
498
+ function ringWKT(r) {
499
+ return r.map(pairWKT).join(", ");
500
+ }
501
+ function ringsWKT(r) {
502
+ return r.map(ringWKT).map(wrapParens).join(", ");
503
+ }
504
+ function multiRingsWKT(r) {
505
+ return r.map(ringsWKT).map(wrapParens).join(", ");
506
+ }
507
+ function wrapParens(s) {
508
+ return `(${s})`;
509
+ }
510
+
511
+ // src/wkt-writer.ts
512
+ var WKTWriter = {
513
+ name: "WKT (Well Known Text)",
514
+ id: "wkt",
515
+ module: "wkt",
516
+ version: VERSION,
517
+ extensions: ["wkt"],
518
+ // @ts-expect-error
519
+ encodeSync: encodeWKT,
520
+ options: {
521
+ wkt: {}
522
+ }
523
+ };
524
+
525
+ // src/lib/parse-wkb.ts
526
+ var import_gis = require("@loaders.gl/gis");
527
+
528
+ // src/lib/parse-wkb-header.ts
529
+ var EWKB_FLAG_Z = 2147483648;
530
+ var EWKB_FLAG_M = 1073741824;
531
+ var EWKB_FLAG_SRID = 536870912;
532
+ var MAX_SRID = 1e4;
533
+ function isWKB(arrayBuffer) {
534
+ const dataView = new DataView(arrayBuffer);
535
+ let byteOffset = 0;
536
+ const endianness = dataView.getUint8(byteOffset);
537
+ byteOffset += 1;
538
+ if (endianness > 1) {
539
+ return false;
540
+ }
541
+ const littleEndian = endianness === 1;
542
+ const geometry = dataView.getUint32(byteOffset, littleEndian);
543
+ byteOffset += 4;
544
+ const geometryType = geometry & 7;
545
+ if (geometryType === 0 || geometryType > 7) {
546
+ return false;
547
+ }
548
+ const geometryFlags = geometry - geometryType;
549
+ if (geometryFlags === 0 || geometryFlags === 1e3 || geometryFlags === 2e3 || geometryFlags === 3e3) {
550
+ return true;
551
+ }
552
+ if ((geometryFlags & ~(EWKB_FLAG_Z | EWKB_FLAG_M | EWKB_FLAG_SRID)) !== 0) {
553
+ return false;
554
+ }
555
+ if (geometryFlags & EWKB_FLAG_SRID) {
556
+ const srid = dataView.getUint32(byteOffset, littleEndian);
557
+ byteOffset += 4;
558
+ if (srid > MAX_SRID) {
559
+ return false;
560
+ }
561
+ }
562
+ return true;
563
+ }
564
+ function parseWKBHeader(dataView, target) {
565
+ const wkbHeader = Object.assign(target || {}, {
566
+ type: "wkb",
567
+ geometryType: 1,
568
+ dimensions: 2,
569
+ coordinates: "xy",
570
+ littleEndian: true,
571
+ byteOffset: 0
572
+ });
573
+ wkbHeader.littleEndian = dataView.getUint8(wkbHeader.byteOffset) === 1;
574
+ wkbHeader.byteOffset++;
575
+ const geometryCode = dataView.getUint32(wkbHeader.byteOffset, wkbHeader.littleEndian);
576
+ wkbHeader.byteOffset += 4;
577
+ wkbHeader.geometryType = geometryCode & 7;
578
+ const isoType = (geometryCode - wkbHeader.geometryType) / 1e3;
579
+ switch (isoType) {
580
+ case 0:
581
+ break;
582
+ case 1:
583
+ wkbHeader.type = "iso-wkb";
584
+ wkbHeader.dimensions = 3;
585
+ wkbHeader.coordinates = "xyz";
586
+ break;
587
+ case 2:
588
+ wkbHeader.type = "iso-wkb";
589
+ wkbHeader.dimensions = 3;
590
+ wkbHeader.coordinates = "xym";
591
+ break;
592
+ case 3:
593
+ wkbHeader.type = "iso-wkb";
594
+ wkbHeader.dimensions = 4;
595
+ wkbHeader.coordinates = "xyzm";
596
+ break;
597
+ default:
598
+ throw new Error(`WKB: Unsupported iso-wkb type: ${isoType}`);
599
+ }
600
+ const ewkbZ = geometryCode & EWKB_FLAG_Z;
601
+ const ewkbM = geometryCode & EWKB_FLAG_M;
602
+ const ewkbSRID = geometryCode & EWKB_FLAG_SRID;
603
+ if (ewkbZ && ewkbM) {
604
+ wkbHeader.type = "ewkb";
605
+ wkbHeader.dimensions = 4;
606
+ wkbHeader.coordinates = "xyzm";
607
+ } else if (ewkbZ) {
608
+ wkbHeader.type = "ewkb";
609
+ wkbHeader.dimensions = 3;
610
+ wkbHeader.coordinates = "xyz";
611
+ } else if (ewkbM) {
612
+ wkbHeader.type = "ewkb";
613
+ wkbHeader.dimensions = 3;
614
+ wkbHeader.coordinates = "xym";
615
+ }
616
+ if (ewkbSRID) {
617
+ wkbHeader.type = "ewkb";
618
+ wkbHeader.srid = dataView.getUint32(wkbHeader.byteOffset, wkbHeader.littleEndian);
619
+ wkbHeader.byteOffset += 4;
620
+ }
621
+ return wkbHeader;
622
+ }
623
+
624
+ // src/lib/parse-wkb.ts
625
+ function parseWKB(arrayBuffer, options) {
626
+ var _a;
627
+ const binaryGeometry = parseWKBToBinary(arrayBuffer, options);
628
+ const shape = ((_a = options == null ? void 0 : options.wkb) == null ? void 0 : _a.shape) || "binary-geometry";
629
+ switch (shape) {
630
+ case "binary-geometry":
631
+ return binaryGeometry;
632
+ case "geometry":
633
+ return (0, import_gis.binaryToGeometry)(binaryGeometry);
634
+ default:
635
+ throw new Error(shape);
636
+ }
637
+ }
638
+ function parseWKBToBinary(arrayBuffer, options) {
639
+ const dataView = new DataView(arrayBuffer);
640
+ const wkbHeader = parseWKBHeader(dataView);
641
+ const { geometryType, dimensions, littleEndian } = wkbHeader;
642
+ const offset = wkbHeader.byteOffset;
643
+ switch (geometryType) {
644
+ case 1 /* Point */:
645
+ const point = parsePoint2(dataView, offset, dimensions, littleEndian);
646
+ return point.geometry;
647
+ case 2 /* LineString */:
648
+ const line = parseLineString2(dataView, offset, dimensions, littleEndian);
649
+ return line.geometry;
650
+ case 3 /* Polygon */:
651
+ const polygon = parsePolygon2(dataView, offset, dimensions, littleEndian);
652
+ return polygon.geometry;
653
+ case 4 /* MultiPoint */:
654
+ const multiPoint = parseMultiPoint2(dataView, offset, dimensions, littleEndian);
655
+ multiPoint.type = "Point";
656
+ return multiPoint;
657
+ case 5 /* MultiLineString */:
658
+ const multiLine = parseMultiLineString2(dataView, offset, dimensions, littleEndian);
659
+ multiLine.type = "LineString";
660
+ return multiLine;
661
+ case 6 /* MultiPolygon */:
662
+ const multiPolygon = parseMultiPolygon2(dataView, offset, dimensions, littleEndian);
663
+ multiPolygon.type = "Polygon";
664
+ return multiPolygon;
665
+ default:
666
+ throw new Error(`WKB: Unsupported geometry type: ${geometryType}`);
667
+ }
668
+ }
669
+ function parsePoint2(dataView, offset, dimension, littleEndian) {
670
+ const positions = new Float64Array(dimension);
671
+ for (let i = 0; i < dimension; i++) {
672
+ positions[i] = dataView.getFloat64(offset, littleEndian);
673
+ offset += 8;
674
+ }
675
+ return {
676
+ geometry: { type: "Point", positions: { value: positions, size: dimension } },
677
+ offset
678
+ };
679
+ }
680
+ function parseLineString2(dataView, offset, dimension, littleEndian) {
681
+ const nPoints = dataView.getUint32(offset, littleEndian);
682
+ offset += 4;
683
+ const positions = new Float64Array(nPoints * dimension);
684
+ for (let i = 0; i < nPoints * dimension; i++) {
685
+ positions[i] = dataView.getFloat64(offset, littleEndian);
686
+ offset += 8;
687
+ }
688
+ const pathIndices = [0];
689
+ if (nPoints > 0) {
690
+ pathIndices.push(nPoints);
691
+ }
692
+ return {
693
+ geometry: {
694
+ type: "LineString",
695
+ positions: { value: positions, size: dimension },
696
+ pathIndices: { value: new Uint16Array(pathIndices), size: 1 }
697
+ },
698
+ offset
699
+ };
700
+ }
701
+ var cumulativeSum = (sum) => (value) => sum += value;
702
+ function parsePolygon2(dataView, offset, dimension, littleEndian) {
703
+ const nRings = dataView.getUint32(offset, littleEndian);
704
+ offset += 4;
705
+ const rings = [];
706
+ for (let i = 0; i < nRings; i++) {
707
+ const parsed = parseLineString2(dataView, offset, dimension, littleEndian);
708
+ const { positions } = parsed.geometry;
709
+ offset = parsed.offset;
710
+ rings.push(positions.value);
711
+ }
712
+ const concatenatedPositions = new Float64Array(concatTypedArrays(rings).buffer);
713
+ const polygonIndices = [0];
714
+ if (concatenatedPositions.length > 0) {
715
+ polygonIndices.push(concatenatedPositions.length / dimension);
716
+ }
717
+ const primitivePolygonIndices = rings.map((l) => l.length / dimension).map(cumulativeSum(0));
718
+ primitivePolygonIndices.unshift(0);
719
+ return {
720
+ geometry: {
721
+ type: "Polygon",
722
+ positions: { value: concatenatedPositions, size: dimension },
723
+ polygonIndices: {
724
+ value: new Uint16Array(polygonIndices),
725
+ size: 1
726
+ },
727
+ primitivePolygonIndices: { value: new Uint16Array(primitivePolygonIndices), size: 1 }
728
+ },
729
+ offset
730
+ };
731
+ }
732
+ function parseMultiPoint2(dataView, offset, dimension, littleEndian) {
733
+ const nPoints = dataView.getUint32(offset, littleEndian);
734
+ offset += 4;
735
+ const binaryPointGeometries = [];
736
+ for (let i = 0; i < nPoints; i++) {
737
+ const littleEndianPoint = dataView.getUint8(offset) === 1;
738
+ offset++;
739
+ if (dataView.getUint32(offset, littleEndianPoint) % 1e3 !== 1) {
740
+ throw new Error("WKB: Inner geometries of MultiPoint not of type Point");
741
+ }
742
+ offset += 4;
743
+ const parsed = parsePoint2(dataView, offset, dimension, littleEndianPoint);
744
+ offset = parsed.offset;
745
+ binaryPointGeometries.push(parsed.geometry);
746
+ }
747
+ return concatenateBinaryPointGeometries(binaryPointGeometries, dimension);
748
+ }
749
+ function parseMultiLineString2(dataView, offset, dimension, littleEndian) {
750
+ const nLines = dataView.getUint32(offset, littleEndian);
751
+ offset += 4;
752
+ const binaryLineGeometries = [];
753
+ for (let i = 0; i < nLines; i++) {
754
+ const littleEndianLine = dataView.getUint8(offset) === 1;
755
+ offset++;
756
+ if (dataView.getUint32(offset, littleEndianLine) % 1e3 !== 2) {
757
+ throw new Error("WKB: Inner geometries of MultiLineString not of type LineString");
758
+ }
759
+ offset += 4;
760
+ const parsed = parseLineString2(dataView, offset, dimension, littleEndianLine);
761
+ offset = parsed.offset;
762
+ binaryLineGeometries.push(parsed.geometry);
763
+ }
764
+ return concatenateBinaryLineGeometries(binaryLineGeometries, dimension);
765
+ }
766
+ function parseMultiPolygon2(dataView, offset, dimension, littleEndian) {
767
+ const nPolygons = dataView.getUint32(offset, littleEndian);
768
+ offset += 4;
769
+ const binaryPolygonGeometries = [];
770
+ for (let i = 0; i < nPolygons; i++) {
771
+ const littleEndianPolygon = dataView.getUint8(offset) === 1;
772
+ offset++;
773
+ if (dataView.getUint32(offset, littleEndianPolygon) % 1e3 !== 3) {
774
+ throw new Error("WKB: Inner geometries of MultiPolygon not of type Polygon");
775
+ }
776
+ offset += 4;
777
+ const parsed = parsePolygon2(dataView, offset, dimension, littleEndianPolygon);
778
+ offset = parsed.offset;
779
+ binaryPolygonGeometries.push(parsed.geometry);
780
+ }
781
+ return concatenateBinaryPolygonGeometries(binaryPolygonGeometries, dimension);
782
+ }
783
+ function concatenateBinaryPointGeometries(binaryPointGeometries, dimension) {
784
+ const positions = binaryPointGeometries.map((geometry) => geometry.positions.value);
785
+ const concatenatedPositions = new Float64Array(concatTypedArrays(positions).buffer);
786
+ return {
787
+ type: "Point",
788
+ positions: { value: concatenatedPositions, size: dimension }
789
+ };
790
+ }
791
+ function concatenateBinaryLineGeometries(binaryLineGeometries, dimension) {
792
+ const lines = binaryLineGeometries.map((geometry) => geometry.positions.value);
793
+ const concatenatedPositions = new Float64Array(concatTypedArrays(lines).buffer);
794
+ const pathIndices = lines.map((line) => line.length / dimension).map(cumulativeSum(0));
795
+ pathIndices.unshift(0);
796
+ return {
797
+ type: "LineString",
798
+ positions: { value: concatenatedPositions, size: dimension },
799
+ pathIndices: { value: new Uint16Array(pathIndices), size: 1 }
800
+ };
801
+ }
802
+ function concatenateBinaryPolygonGeometries(binaryPolygonGeometries, dimension) {
803
+ const polygons = [];
804
+ const primitivePolygons = [];
805
+ for (const binaryPolygon of binaryPolygonGeometries) {
806
+ const { positions, primitivePolygonIndices: primitivePolygonIndices2 } = binaryPolygon;
807
+ polygons.push(positions.value);
808
+ primitivePolygons.push(primitivePolygonIndices2.value);
809
+ }
810
+ const concatenatedPositions = new Float64Array(concatTypedArrays(polygons).buffer);
811
+ const polygonIndices = polygons.map((p) => p.length / dimension).map(cumulativeSum(0));
812
+ polygonIndices.unshift(0);
813
+ const primitivePolygonIndices = [0];
814
+ for (const primitivePolygon of primitivePolygons) {
815
+ primitivePolygonIndices.push(
816
+ ...primitivePolygon.filter((x) => x > 0).map((x) => x + primitivePolygonIndices[primitivePolygonIndices.length - 1])
817
+ );
818
+ }
819
+ return {
820
+ type: "Polygon",
821
+ positions: { value: concatenatedPositions, size: dimension },
822
+ polygonIndices: { value: new Uint16Array(polygonIndices), size: 1 },
823
+ primitivePolygonIndices: { value: new Uint16Array(primitivePolygonIndices), size: 1 }
824
+ };
825
+ }
826
+ function concatTypedArrays(arrays) {
827
+ let byteLength = 0;
828
+ for (let i = 0; i < arrays.length; ++i) {
829
+ byteLength += arrays[i].byteLength;
830
+ }
831
+ const buffer = new Uint8Array(byteLength);
832
+ let byteOffset = 0;
833
+ for (let i = 0; i < arrays.length; ++i) {
834
+ const data = new Uint8Array(arrays[i].buffer);
835
+ byteLength = data.length;
836
+ for (let j = 0; j < byteLength; ++j) {
837
+ buffer[byteOffset++] = data[j];
838
+ }
839
+ }
840
+ return buffer;
841
+ }
842
+
843
+ // src/wkb-loader.ts
844
+ var WKBWorkerLoader = {
845
+ name: "WKB",
846
+ id: "wkb",
847
+ module: "wkt",
848
+ version: VERSION,
849
+ worker: true,
850
+ category: "geometry",
851
+ extensions: ["wkb"],
852
+ mimeTypes: [],
853
+ // TODO can we define static, serializable tests, eg. some binary strings?
854
+ tests: [isWKB],
855
+ options: {
856
+ wkb: {
857
+ shape: "binary-geometry"
858
+ }
859
+ }
860
+ };
861
+ var WKBLoader = {
862
+ ...WKBWorkerLoader,
863
+ parse: async (arrayBuffer) => parseWKB(arrayBuffer),
864
+ parseSync: parseWKB
865
+ };
866
+
867
+ // src/lib/utils/binary-writer.ts
868
+ var LE = true;
869
+ var BE = false;
870
+ var BinaryWriter = class {
871
+ constructor(size, allowResize) {
872
+ this.byteOffset = 0;
873
+ this.allowResize = false;
874
+ this.arrayBuffer = new ArrayBuffer(size);
875
+ this.dataView = new DataView(this.arrayBuffer);
876
+ this.byteOffset = 0;
877
+ this.allowResize = allowResize || false;
878
+ }
879
+ writeUInt8(value) {
880
+ this._ensureSize(1);
881
+ this.dataView.setUint8(this.byteOffset, value);
882
+ this.byteOffset += 1;
883
+ }
884
+ writeUInt16LE(value) {
885
+ this._ensureSize(2);
886
+ this.dataView.setUint16(this.byteOffset, value, LE);
887
+ this.byteOffset += 2;
888
+ }
889
+ writeUInt16BE(value) {
890
+ this._ensureSize(2);
891
+ this.dataView.setUint16(this.byteOffset, value, BE);
892
+ this.byteOffset += 2;
893
+ }
894
+ writeUInt32LE(value) {
895
+ this._ensureSize(4);
896
+ this.dataView.setUint32(this.byteOffset, value, LE);
897
+ this.byteOffset += 4;
898
+ }
899
+ writeUInt32BE(value) {
900
+ this._ensureSize(4);
901
+ this.dataView.setUint32(this.byteOffset, value, BE);
902
+ this.byteOffset += 4;
903
+ }
904
+ writeInt8(value) {
905
+ this._ensureSize(1);
906
+ this.dataView.setInt8(this.byteOffset, value);
907
+ this.byteOffset += 1;
908
+ }
909
+ writeInt16LE(value) {
910
+ this._ensureSize(2);
911
+ this.dataView.setInt16(this.byteOffset, value, LE);
912
+ this.byteOffset += 2;
913
+ }
914
+ writeInt16BE(value) {
915
+ this._ensureSize(2);
916
+ this.dataView.setInt16(this.byteOffset, value, BE);
917
+ this.byteOffset += 2;
918
+ }
919
+ writeInt32LE(value) {
920
+ this._ensureSize(4);
921
+ this.dataView.setInt32(this.byteOffset, value, LE);
922
+ this.byteOffset += 4;
923
+ }
924
+ writeInt32BE(value) {
925
+ this._ensureSize(4);
926
+ this.dataView.setInt32(this.byteOffset, value, BE);
927
+ this.byteOffset += 4;
928
+ }
929
+ writeFloatLE(value) {
930
+ this._ensureSize(4);
931
+ this.dataView.setFloat32(this.byteOffset, value, LE);
932
+ this.byteOffset += 4;
933
+ }
934
+ writeFloatBE(value) {
935
+ this._ensureSize(4);
936
+ this.dataView.setFloat32(this.byteOffset, value, BE);
937
+ this.byteOffset += 4;
938
+ }
939
+ writeDoubleLE(value) {
940
+ this._ensureSize(8);
941
+ this.dataView.setFloat64(this.byteOffset, value, LE);
942
+ this.byteOffset += 8;
943
+ }
944
+ writeDoubleBE(value) {
945
+ this._ensureSize(8);
946
+ this.dataView.setFloat64(this.byteOffset, value, BE);
947
+ this.byteOffset += 8;
948
+ }
949
+ /** A varint uses a variable number of bytes */
950
+ writeVarInt(value) {
951
+ let length = 1;
952
+ while ((value & 4294967168) !== 0) {
953
+ this.writeUInt8(value & 127 | 128);
954
+ value >>>= 7;
955
+ length++;
956
+ }
957
+ this.writeUInt8(value & 127);
958
+ return length;
959
+ }
960
+ /** Append another ArrayBuffer to this ArrayBuffer */
961
+ writeBuffer(arrayBuffer) {
962
+ this._ensureSize(arrayBuffer.byteLength);
963
+ const tempArray = new Uint8Array(this.arrayBuffer);
964
+ tempArray.set(new Uint8Array(arrayBuffer), this.byteOffset);
965
+ this.byteOffset += arrayBuffer.byteLength;
966
+ }
967
+ /** Resizes this.arrayBuffer if not enough space */
968
+ _ensureSize(size) {
969
+ if (this.arrayBuffer.byteLength < this.byteOffset + size) {
970
+ if (this.allowResize) {
971
+ const newArrayBuffer = new ArrayBuffer(this.byteOffset + size);
972
+ const tempArray = new Uint8Array(newArrayBuffer);
973
+ tempArray.set(new Uint8Array(this.arrayBuffer));
974
+ this.arrayBuffer = newArrayBuffer;
975
+ } else {
976
+ throw new Error("BinaryWriter overflow");
977
+ }
978
+ }
979
+ }
980
+ };
981
+
982
+ // src/lib/encode-wkb.ts
983
+ function encodeWKB(geometry, options = {}) {
984
+ if (geometry.type === "Feature") {
985
+ geometry = geometry.geometry;
986
+ }
987
+ if ("wkb" in options) {
988
+ options = options.wkb;
989
+ }
990
+ switch (geometry.type) {
991
+ case "Point":
992
+ return encodePoint(geometry.coordinates, options);
993
+ case "LineString":
994
+ return encodeLineString(geometry.coordinates, options);
995
+ case "Polygon":
996
+ return encodePolygon(geometry.coordinates, options);
997
+ case "MultiPoint":
998
+ return encodeMultiPoint(geometry, options);
999
+ case "MultiPolygon":
1000
+ return encodeMultiPolygon(geometry, options);
1001
+ case "MultiLineString":
1002
+ return encodeMultiLineString(geometry, options);
1003
+ case "GeometryCollection":
1004
+ return encodeGeometryCollection(geometry, options);
1005
+ default:
1006
+ const exhaustiveCheck = geometry;
1007
+ throw new Error(`Unhandled case: ${exhaustiveCheck}`);
1008
+ }
1009
+ }
1010
+ function getGeometrySize(geometry, options) {
1011
+ switch (geometry.type) {
1012
+ case "Point":
1013
+ return getPointSize(options);
1014
+ case "LineString":
1015
+ return getLineStringSize(geometry.coordinates, options);
1016
+ case "Polygon":
1017
+ return getPolygonSize(geometry.coordinates, options);
1018
+ case "MultiPoint":
1019
+ return getMultiPointSize(geometry, options);
1020
+ case "MultiPolygon":
1021
+ return getMultiPolygonSize(geometry, options);
1022
+ case "MultiLineString":
1023
+ return getMultiLineStringSize(geometry, options);
1024
+ case "GeometryCollection":
1025
+ return getGeometryCollectionSize(geometry, options);
1026
+ default:
1027
+ const exhaustiveCheck = geometry;
1028
+ throw new Error(`Unhandled case: ${exhaustiveCheck}`);
1029
+ }
1030
+ }
1031
+ function encodePoint(coordinates, options) {
1032
+ const writer = new BinaryWriter(getPointSize(options));
1033
+ writer.writeInt8(1);
1034
+ writeWkbType(writer, 1 /* Point */, options);
1035
+ if (typeof coordinates[0] === "undefined" && typeof coordinates[1] === "undefined") {
1036
+ writer.writeDoubleLE(NaN);
1037
+ writer.writeDoubleLE(NaN);
1038
+ if (options.hasZ) {
1039
+ writer.writeDoubleLE(NaN);
1040
+ }
1041
+ if (options.hasM) {
1042
+ writer.writeDoubleLE(NaN);
1043
+ }
1044
+ } else {
1045
+ writeCoordinate(writer, coordinates, options);
1046
+ }
1047
+ return writer.arrayBuffer;
1048
+ }
1049
+ function writeCoordinate(writer, coordinate, options) {
1050
+ writer.writeDoubleLE(coordinate[0]);
1051
+ writer.writeDoubleLE(coordinate[1]);
1052
+ if (options.hasZ) {
1053
+ writer.writeDoubleLE(coordinate[2]);
1054
+ }
1055
+ if (options.hasM) {
1056
+ writer.writeDoubleLE(coordinate[3]);
1057
+ }
1058
+ }
1059
+ function getPointSize(options) {
1060
+ const coordinateSize = getCoordinateSize(options);
1061
+ return 1 + 4 + coordinateSize;
1062
+ }
1063
+ function encodeLineString(coordinates, options) {
1064
+ const size = getLineStringSize(coordinates, options);
1065
+ const writer = new BinaryWriter(size);
1066
+ writer.writeInt8(1);
1067
+ writeWkbType(writer, 2 /* LineString */, options);
1068
+ writer.writeUInt32LE(coordinates.length);
1069
+ for (const coordinate of coordinates) {
1070
+ writeCoordinate(writer, coordinate, options);
1071
+ }
1072
+ return writer.arrayBuffer;
1073
+ }
1074
+ function getLineStringSize(coordinates, options) {
1075
+ const coordinateSize = getCoordinateSize(options);
1076
+ return 1 + 4 + 4 + coordinates.length * coordinateSize;
1077
+ }
1078
+ function encodePolygon(coordinates, options) {
1079
+ const writer = new BinaryWriter(getPolygonSize(coordinates, options));
1080
+ writer.writeInt8(1);
1081
+ writeWkbType(writer, 3 /* Polygon */, options);
1082
+ const [exteriorRing, ...interiorRings] = coordinates;
1083
+ if (exteriorRing.length > 0) {
1084
+ writer.writeUInt32LE(1 + interiorRings.length);
1085
+ writer.writeUInt32LE(exteriorRing.length);
1086
+ } else {
1087
+ writer.writeUInt32LE(0);
1088
+ }
1089
+ for (const coordinate of exteriorRing) {
1090
+ writeCoordinate(writer, coordinate, options);
1091
+ }
1092
+ for (const interiorRing of interiorRings) {
1093
+ writer.writeUInt32LE(interiorRing.length);
1094
+ for (const coordinate of interiorRing) {
1095
+ writeCoordinate(writer, coordinate, options);
1096
+ }
1097
+ }
1098
+ return writer.arrayBuffer;
1099
+ }
1100
+ function getPolygonSize(coordinates, options) {
1101
+ const coordinateSize = getCoordinateSize(options);
1102
+ const [exteriorRing, ...interiorRings] = coordinates;
1103
+ let size = 1 + 4 + 4;
1104
+ if (exteriorRing.length > 0) {
1105
+ size += 4 + exteriorRing.length * coordinateSize;
1106
+ }
1107
+ for (const interiorRing of interiorRings) {
1108
+ size += 4 + interiorRing.length * coordinateSize;
1109
+ }
1110
+ return size;
1111
+ }
1112
+ function encodeMultiPoint(multiPoint, options) {
1113
+ const writer = new BinaryWriter(getMultiPointSize(multiPoint, options));
1114
+ const points = multiPoint.coordinates;
1115
+ writer.writeInt8(1);
1116
+ writeWkbType(writer, 4 /* MultiPoint */, options);
1117
+ writer.writeUInt32LE(points.length);
1118
+ for (const point of points) {
1119
+ const arrayBuffer = encodePoint(point, options);
1120
+ writer.writeBuffer(arrayBuffer);
1121
+ }
1122
+ return writer.arrayBuffer;
1123
+ }
1124
+ function getMultiPointSize(multiPoint, options) {
1125
+ let coordinateSize = getCoordinateSize(options);
1126
+ const points = multiPoint.coordinates;
1127
+ coordinateSize += 5;
1128
+ return 1 + 4 + 4 + points.length * coordinateSize;
1129
+ }
1130
+ function encodeMultiLineString(multiLineString, options) {
1131
+ const writer = new BinaryWriter(getMultiLineStringSize(multiLineString, options));
1132
+ const lineStrings = multiLineString.coordinates;
1133
+ writer.writeInt8(1);
1134
+ writeWkbType(writer, 5 /* MultiLineString */, options);
1135
+ writer.writeUInt32LE(lineStrings.length);
1136
+ for (const lineString of lineStrings) {
1137
+ const encodedLineString = encodeLineString(lineString, options);
1138
+ writer.writeBuffer(encodedLineString);
1139
+ }
1140
+ return writer.arrayBuffer;
1141
+ }
1142
+ function getMultiLineStringSize(multiLineString, options) {
1143
+ let size = 1 + 4 + 4;
1144
+ const lineStrings = multiLineString.coordinates;
1145
+ for (const lineString of lineStrings) {
1146
+ size += getLineStringSize(lineString, options);
1147
+ }
1148
+ return size;
1149
+ }
1150
+ function encodeMultiPolygon(multiPolygon, options) {
1151
+ const writer = new BinaryWriter(getMultiPolygonSize(multiPolygon, options));
1152
+ const polygons = multiPolygon.coordinates;
1153
+ writer.writeInt8(1);
1154
+ writeWkbType(writer, 6 /* MultiPolygon */, options);
1155
+ writer.writeUInt32LE(polygons.length);
1156
+ for (const polygon of polygons) {
1157
+ const encodedPolygon = encodePolygon(polygon, options);
1158
+ writer.writeBuffer(encodedPolygon);
1159
+ }
1160
+ return writer.arrayBuffer;
1161
+ }
1162
+ function getMultiPolygonSize(multiPolygon, options) {
1163
+ let size = 1 + 4 + 4;
1164
+ const polygons = multiPolygon.coordinates;
1165
+ for (const polygon of polygons) {
1166
+ size += getPolygonSize(polygon, options);
1167
+ }
1168
+ return size;
1169
+ }
1170
+ function encodeGeometryCollection(collection, options) {
1171
+ const writer = new BinaryWriter(getGeometryCollectionSize(collection, options));
1172
+ writer.writeInt8(1);
1173
+ writeWkbType(writer, 7 /* GeometryCollection */, options);
1174
+ writer.writeUInt32LE(collection.geometries.length);
1175
+ for (const geometry of collection.geometries) {
1176
+ const arrayBuffer = encodeWKB(geometry, options);
1177
+ writer.writeBuffer(arrayBuffer);
1178
+ }
1179
+ return writer.arrayBuffer;
1180
+ }
1181
+ function getGeometryCollectionSize(collection, options) {
1182
+ let size = 1 + 4 + 4;
1183
+ for (const geometry of collection.geometries) {
1184
+ size += getGeometrySize(geometry, options);
1185
+ }
1186
+ return size;
1187
+ }
1188
+ function writeWkbType(writer, geometryType, options) {
1189
+ const { hasZ, hasM, srid } = options;
1190
+ let dimensionType = 0;
1191
+ if (!srid) {
1192
+ if (hasZ && hasM) {
1193
+ dimensionType += 3e3;
1194
+ } else if (hasZ) {
1195
+ dimensionType += 1e3;
1196
+ } else if (hasM) {
1197
+ dimensionType += 2e3;
1198
+ }
1199
+ } else {
1200
+ if (hasZ) {
1201
+ dimensionType |= 2147483648;
1202
+ }
1203
+ if (hasM) {
1204
+ dimensionType |= 1073741824;
1205
+ }
1206
+ }
1207
+ writer.writeUInt32LE(dimensionType + geometryType >>> 0);
1208
+ }
1209
+ function getCoordinateSize(options) {
1210
+ let coordinateSize = 16;
1211
+ if (options.hasZ) {
1212
+ coordinateSize += 8;
1213
+ }
1214
+ if (options.hasM) {
1215
+ coordinateSize += 8;
1216
+ }
1217
+ return coordinateSize;
1218
+ }
1219
+
1220
+ // src/wkb-writer.ts
1221
+ var WKBWriter = {
1222
+ name: "WKB (Well Known Binary)",
1223
+ id: "wkb",
1224
+ module: "wkt",
1225
+ version: VERSION,
1226
+ extensions: ["wkb"],
1227
+ encodeSync: encodeWKB,
1228
+ options: {
1229
+ wkb: {
1230
+ hasZ: false,
1231
+ hasM: false
1232
+ }
1233
+ }
1234
+ };
1235
+
1236
+ // src/lib/utils/hex-transcoder.ts
1237
+ var alphabet = "0123456789abcdef";
1238
+ var encodeLookup = [];
1239
+ var decodeLookup = [];
1240
+ for (let i = 0; i < 256; i++) {
1241
+ encodeLookup[i] = alphabet[i >> 4 & 15] + alphabet[i & 15];
1242
+ if (i < 16) {
1243
+ if (i < 10) {
1244
+ decodeLookup[48 + i] = i;
1245
+ } else {
1246
+ decodeLookup[97 - 10 + i] = i;
1247
+ }
1248
+ }
1249
+ }
1250
+ function encodeHex(array) {
1251
+ const length = array.length;
1252
+ let string = "";
1253
+ let i = 0;
1254
+ while (i < length) {
1255
+ string += encodeLookup[array[i++]];
1256
+ }
1257
+ return string;
1258
+ }
1259
+ function decodeHex(string) {
1260
+ const sizeof = string.length >> 1;
1261
+ const length = sizeof << 1;
1262
+ const array = new Uint8Array(sizeof);
1263
+ let n = 0;
1264
+ let i = 0;
1265
+ while (i < length) {
1266
+ array[n++] = decodeLookup[string.charCodeAt(i++)] << 4 | decodeLookup[string.charCodeAt(i++)];
1267
+ }
1268
+ return array;
1269
+ }
1270
+
1271
+ // src/hex-wkb-loader.ts
1272
+ var HexWKBLoader = {
1273
+ name: "Hexadecimal WKB",
1274
+ id: "wkb",
1275
+ module: "wkt",
1276
+ version: VERSION,
1277
+ worker: true,
1278
+ category: "geometry",
1279
+ extensions: ["wkb"],
1280
+ mimeTypes: [],
1281
+ options: WKBLoader.options,
1282
+ text: true,
1283
+ testText: isHexWKB,
1284
+ // TODO - encoding here seems wasteful - extend hex transcoder?
1285
+ parse: async (arrayBuffer) => parseHexWKB(new TextDecoder().decode(arrayBuffer)),
1286
+ parseTextSync: parseHexWKB
1287
+ };
1288
+ function parseHexWKB(text, options) {
1289
+ var _a, _b;
1290
+ const uint8Array = decodeHex(text);
1291
+ const binaryGeometry = (_b = (_a = WKBLoader).parseSync) == null ? void 0 : _b.call(_a, uint8Array.buffer, options);
1292
+ return binaryGeometry;
1293
+ }
1294
+ function isHexWKB(string) {
1295
+ if (!string) {
1296
+ return false;
1297
+ }
1298
+ if (string.length < 10 || string.length % 2 !== 0) {
1299
+ return false;
1300
+ }
1301
+ if (!string.startsWith("00") && !string.startsWith("01")) {
1302
+ return false;
1303
+ }
1304
+ return /^[0-9a-fA-F]+$/.test(string.slice(2));
1305
+ }
1306
+
1307
+ // src/lib/utils/binary-reader.ts
1308
+ var BinaryReader = class {
1309
+ constructor(arrayBuffer, isBigEndian = false) {
1310
+ this.arrayBuffer = arrayBuffer;
1311
+ this.dataView = new DataView(arrayBuffer);
1312
+ this.byteOffset = 0;
1313
+ this.littleEndian = !isBigEndian;
1314
+ }
1315
+ readUInt8() {
1316
+ const value = this.dataView.getUint8(this.byteOffset);
1317
+ this.byteOffset += 1;
1318
+ return value;
1319
+ }
1320
+ readUInt16() {
1321
+ const value = this.dataView.getUint16(this.byteOffset, this.littleEndian);
1322
+ this.byteOffset += 2;
1323
+ return value;
1324
+ }
1325
+ readUInt32() {
1326
+ const value = this.dataView.getUint32(this.byteOffset, this.littleEndian);
1327
+ this.byteOffset += 4;
1328
+ return value;
1329
+ }
1330
+ readInt8() {
1331
+ const value = this.dataView.getInt8(this.byteOffset);
1332
+ this.byteOffset += 1;
1333
+ return value;
1334
+ }
1335
+ readInt16() {
1336
+ const value = this.dataView.getInt16(this.byteOffset, this.littleEndian);
1337
+ this.byteOffset += 2;
1338
+ return value;
1339
+ }
1340
+ readInt32() {
1341
+ const value = this.dataView.getInt32(this.byteOffset, this.littleEndian);
1342
+ this.byteOffset += 4;
1343
+ return value;
1344
+ }
1345
+ readFloat() {
1346
+ const value = this.dataView.getFloat32(this.byteOffset, this.littleEndian);
1347
+ this.byteOffset += 4;
1348
+ return value;
1349
+ }
1350
+ readDouble() {
1351
+ const value = this.dataView.getFloat64(this.byteOffset, this.littleEndian);
1352
+ this.byteOffset += 8;
1353
+ return value;
1354
+ }
1355
+ readVarInt() {
1356
+ let result = 0;
1357
+ let bytesRead = 0;
1358
+ let nextByte;
1359
+ do {
1360
+ nextByte = this.dataView.getUint8(this.byteOffset + bytesRead);
1361
+ result += (nextByte & 127) << 7 * bytesRead;
1362
+ bytesRead++;
1363
+ } while (nextByte >= 128);
1364
+ this.byteOffset += bytesRead;
1365
+ return result;
1366
+ }
1367
+ };
1368
+
1369
+ // src/lib/parse-twkb.ts
1370
+ function isTWKB(arrayBuffer) {
1371
+ const binaryReader = new BinaryReader(arrayBuffer);
1372
+ const type = binaryReader.readUInt8();
1373
+ const geometryType = type & 15;
1374
+ if (geometryType < 1 || geometryType > 7) {
1375
+ return false;
1376
+ }
1377
+ return true;
1378
+ }
1379
+ function parseTWKBGeometry(arrayBuffer) {
1380
+ const binaryReader = new BinaryReader(arrayBuffer);
1381
+ const context = parseTWKBHeader(binaryReader);
1382
+ if (context.hasSizeAttribute) {
1383
+ binaryReader.readVarInt();
1384
+ }
1385
+ if (context.hasBoundingBox) {
1386
+ let dimensions = 2;
1387
+ if (context.hasZ) {
1388
+ dimensions++;
1389
+ }
1390
+ if (context.hasM) {
1391
+ dimensions++;
1392
+ }
1393
+ for (let i = 0; i < dimensions; i++) {
1394
+ binaryReader.readVarInt();
1395
+ binaryReader.readVarInt();
1396
+ }
1397
+ }
1398
+ return parseGeometry2(binaryReader, context, context.geometryType);
1399
+ }
1400
+ function parseTWKBHeader(binaryReader) {
1401
+ const type = binaryReader.readUInt8();
1402
+ const metadataHeader = binaryReader.readUInt8();
1403
+ const geometryType = type & 15;
1404
+ const precision = zigZagDecode(type >> 4);
1405
+ const hasExtendedPrecision = Boolean(metadataHeader >> 3 & 1);
1406
+ let hasZ = false;
1407
+ let hasM = false;
1408
+ let zPrecision = 0;
1409
+ let zPrecisionFactor = 1;
1410
+ let mPrecision = 0;
1411
+ let mPrecisionFactor = 1;
1412
+ if (hasExtendedPrecision) {
1413
+ const extendedPrecision = binaryReader.readUInt8();
1414
+ hasZ = (extendedPrecision & 1) === 1;
1415
+ hasM = (extendedPrecision & 2) === 2;
1416
+ zPrecision = zigZagDecode((extendedPrecision & 28) >> 2);
1417
+ zPrecisionFactor = Math.pow(10, zPrecision);
1418
+ mPrecision = zigZagDecode((extendedPrecision & 224) >> 5);
1419
+ mPrecisionFactor = Math.pow(10, mPrecision);
1420
+ }
1421
+ return {
1422
+ geometryType,
1423
+ precision,
1424
+ precisionFactor: Math.pow(10, precision),
1425
+ hasBoundingBox: Boolean(metadataHeader >> 0 & 1),
1426
+ hasSizeAttribute: Boolean(metadataHeader >> 1 & 1),
1427
+ hasIdList: Boolean(metadataHeader >> 2 & 1),
1428
+ hasExtendedPrecision,
1429
+ isEmpty: Boolean(metadataHeader >> 4 & 1),
1430
+ hasZ,
1431
+ hasM,
1432
+ zPrecision,
1433
+ zPrecisionFactor,
1434
+ mPrecision,
1435
+ mPrecisionFactor
1436
+ };
1437
+ }
1438
+ function parseGeometry2(binaryReader, context, geometryType) {
1439
+ switch (geometryType) {
1440
+ case 1 /* Point */:
1441
+ return parsePoint3(binaryReader, context);
1442
+ case 2 /* LineString */:
1443
+ return parseLineString3(binaryReader, context);
1444
+ case 3 /* Polygon */:
1445
+ return parsePolygon3(binaryReader, context);
1446
+ case 4 /* MultiPoint */:
1447
+ return parseMultiPoint3(binaryReader, context);
1448
+ case 5 /* MultiLineString */:
1449
+ return parseMultiLineString3(binaryReader, context);
1450
+ case 6 /* MultiPolygon */:
1451
+ return parseMultiPolygon3(binaryReader, context);
1452
+ case 7 /* GeometryCollection */:
1453
+ return parseGeometryCollection2(binaryReader, context);
1454
+ default:
1455
+ throw new Error(`GeometryType ${geometryType} not supported`);
1456
+ }
1457
+ }
1458
+ function parsePoint3(reader, context) {
1459
+ if (context.isEmpty) {
1460
+ return { type: "Point", coordinates: [] };
1461
+ }
1462
+ return { type: "Point", coordinates: readFirstPoint(reader, context) };
1463
+ }
1464
+ function parseLineString3(reader, context) {
1465
+ if (context.isEmpty) {
1466
+ return { type: "LineString", coordinates: [] };
1467
+ }
1468
+ const pointCount = reader.readVarInt();
1469
+ const previousPoint = makePreviousPoint(context);
1470
+ const points = [];
1471
+ for (let i = 0; i < pointCount; i++) {
1472
+ points.push(parseNextPoint(reader, context, previousPoint));
1473
+ }
1474
+ return { type: "LineString", coordinates: points };
1475
+ }
1476
+ function parsePolygon3(reader, context) {
1477
+ if (context.isEmpty) {
1478
+ return { type: "Polygon", coordinates: [] };
1479
+ }
1480
+ const ringCount = reader.readVarInt();
1481
+ const previousPoint = makePreviousPoint(context);
1482
+ const exteriorRingLength = reader.readVarInt();
1483
+ const exteriorRing = [];
1484
+ for (let i = 0; i < exteriorRingLength; i++) {
1485
+ exteriorRing.push(parseNextPoint(reader, context, previousPoint));
1486
+ }
1487
+ const polygon = [exteriorRing];
1488
+ for (let i = 1; i < ringCount; i++) {
1489
+ const interiorRingCount = reader.readVarInt();
1490
+ const interiorRing = [];
1491
+ for (let j = 0; j < interiorRingCount; j++) {
1492
+ interiorRing.push(parseNextPoint(reader, context, previousPoint));
1493
+ }
1494
+ polygon.push(interiorRing);
1495
+ }
1496
+ return { type: "Polygon", coordinates: polygon };
1497
+ }
1498
+ function parseMultiPoint3(reader, context) {
1499
+ if (context.isEmpty) {
1500
+ return { type: "MultiPoint", coordinates: [] };
1501
+ }
1502
+ const previousPoint = makePreviousPoint(context);
1503
+ const pointCount = reader.readVarInt();
1504
+ const coordinates = [];
1505
+ for (let i = 0; i < pointCount; i++) {
1506
+ coordinates.push(parseNextPoint(reader, context, previousPoint));
1507
+ }
1508
+ return { type: "MultiPoint", coordinates };
1509
+ }
1510
+ function parseMultiLineString3(reader, context) {
1511
+ if (context.isEmpty) {
1512
+ return { type: "MultiLineString", coordinates: [] };
1513
+ }
1514
+ const previousPoint = makePreviousPoint(context);
1515
+ const lineStringCount = reader.readVarInt();
1516
+ const coordinates = [];
1517
+ for (let i = 0; i < lineStringCount; i++) {
1518
+ const pointCount = reader.readVarInt();
1519
+ const lineString = [];
1520
+ for (let j = 0; j < pointCount; j++) {
1521
+ lineString.push(parseNextPoint(reader, context, previousPoint));
1522
+ }
1523
+ coordinates.push(lineString);
1524
+ }
1525
+ return { type: "MultiLineString", coordinates };
1526
+ }
1527
+ function parseMultiPolygon3(reader, context) {
1528
+ if (context.isEmpty) {
1529
+ return { type: "MultiPolygon", coordinates: [] };
1530
+ }
1531
+ const previousPoint = makePreviousPoint(context);
1532
+ const polygonCount = reader.readVarInt();
1533
+ const polygons = [];
1534
+ for (let i = 0; i < polygonCount; i++) {
1535
+ const ringCount = reader.readVarInt();
1536
+ const exteriorPointCount = reader.readVarInt();
1537
+ const exteriorRing = [];
1538
+ for (let j = 0; j < exteriorPointCount; j++) {
1539
+ exteriorRing.push(parseNextPoint(reader, context, previousPoint));
1540
+ }
1541
+ const polygon = exteriorRing ? [exteriorRing] : [];
1542
+ for (let j = 1; j < ringCount; j++) {
1543
+ const interiorRing = [];
1544
+ const interiorRingLength = reader.readVarInt();
1545
+ for (let k = 0; k < interiorRingLength; k++) {
1546
+ interiorRing.push(parseNextPoint(reader, context, previousPoint));
1547
+ }
1548
+ polygon.push(interiorRing);
1549
+ }
1550
+ polygons.push(polygon);
1551
+ }
1552
+ return { type: "MultiPolygon", coordinates: polygons };
1553
+ }
1554
+ function parseGeometryCollection2(reader, context) {
1555
+ return { type: "GeometryCollection", geometries: [] };
1556
+ }
1557
+ function zigZagDecode(value) {
1558
+ return value >> 1 ^ -(value & 1);
1559
+ }
1560
+ function makePointCoordinates(x, y, z, m) {
1561
+ return z !== void 0 ? m !== void 0 ? [x, y, z, m] : [x, y, z] : [x, y];
1562
+ }
1563
+ function makePreviousPoint(context) {
1564
+ return makePointCoordinates(0, 0, context.hasZ ? 0 : void 0, context.hasM ? 0 : void 0);
1565
+ }
1566
+ function readFirstPoint(reader, context) {
1567
+ const x = zigZagDecode(reader.readVarInt()) / context.precisionFactor;
1568
+ const y = zigZagDecode(reader.readVarInt()) / context.precisionFactor;
1569
+ const z = context.hasZ ? zigZagDecode(reader.readVarInt()) / context.zPrecisionFactor : void 0;
1570
+ const m = context.hasM ? zigZagDecode(reader.readVarInt()) / context.mPrecisionFactor : void 0;
1571
+ return makePointCoordinates(x, y, z, m);
1572
+ }
1573
+ function parseNextPoint(reader, context, previousPoint) {
1574
+ previousPoint[0] += zigZagDecode(reader.readVarInt()) / context.precisionFactor;
1575
+ previousPoint[1] += zigZagDecode(reader.readVarInt()) / context.precisionFactor;
1576
+ if (context.hasZ) {
1577
+ previousPoint[2] += zigZagDecode(reader.readVarInt()) / context.zPrecisionFactor;
1578
+ }
1579
+ if (context.hasM) {
1580
+ previousPoint[3] += zigZagDecode(reader.readVarInt()) / context.mPrecisionFactor;
1581
+ }
1582
+ return previousPoint.slice();
1583
+ }
1584
+
1585
+ // src/twkb-loader.ts
1586
+ var TWKBWorkerLoader = {
1587
+ name: "TWKB (Tiny Well-Known Binary)",
1588
+ id: "twkb",
1589
+ module: "wkt",
1590
+ version: VERSION,
1591
+ worker: true,
1592
+ category: "geometry",
1593
+ extensions: ["twkb"],
1594
+ mimeTypes: [],
1595
+ // TODO can we define static, serializable tests, eg. some binary strings?
1596
+ tests: [isTWKB],
1597
+ options: {
1598
+ wkb: {
1599
+ shape: "binary-geometry"
1600
+ }
1601
+ }
1602
+ };
1603
+ var TWKBLoader = {
1604
+ ...TWKBWorkerLoader,
1605
+ parse: async (arrayBuffer) => parseTWKBGeometry(arrayBuffer),
1606
+ parseSync: parseTWKBGeometry
1607
+ };
1608
+
1609
+ // src/lib/encode-twkb.ts
1610
+ function encodeTWKB(geometry, options) {
1611
+ const writer = new BinaryWriter(0, true);
1612
+ const context = {
1613
+ ...getTwkbPrecision(5, 0, 0),
1614
+ hasZ: options == null ? void 0 : options.hasZ,
1615
+ hasM: options == null ? void 0 : options.hasM
1616
+ };
1617
+ encodeGeometry(writer, geometry, context);
1618
+ return writer.arrayBuffer;
1619
+ }
1620
+ function encodeGeometry(writer, geometry, context) {
1621
+ switch (geometry.type) {
1622
+ case "Point":
1623
+ return encodePoint2(writer, context, geometry);
1624
+ case "LineString":
1625
+ return encodeLineString2(writer, context, geometry);
1626
+ case "Polygon":
1627
+ return encodePolygon2(writer, context, geometry);
1628
+ case "MultiPoint":
1629
+ return encodeMultiPoint2(writer, context, geometry);
1630
+ case "MultiLineString":
1631
+ return encodeMultiLineString2(writer, context, geometry);
1632
+ case "MultiPolygon":
1633
+ return encodeMultiPolygon2(writer, context, geometry);
1634
+ case "GeometryCollection":
1635
+ return encodeGeometryCollection2(writer, context, geometry);
1636
+ default:
1637
+ throw new Error("unsupported geometry type");
1638
+ }
1639
+ }
1640
+ function encodePoint2(writer, context, point) {
1641
+ const isEmpty = point.coordinates.length === 0 || point[0] === "undefined" || point[1] === "undefined";
1642
+ writeTwkbHeader(writer, context, 1 /* Point */, isEmpty);
1643
+ if (!isEmpty) {
1644
+ const previousPoint = [0, 0, 0, 0];
1645
+ writeTwkbPoint(writer, context, point.coordinates, previousPoint);
1646
+ }
1647
+ }
1648
+ function encodeLineString2(writer, context, lineString) {
1649
+ const points = lineString.coordinates;
1650
+ const isEmpty = points.length === 0;
1651
+ writeTwkbHeader(writer, context, 2 /* LineString */, isEmpty);
1652
+ if (!isEmpty) {
1653
+ writer.writeVarInt(points.length);
1654
+ const previousPoint = [0, 0, 0, 0];
1655
+ for (const point of points) {
1656
+ writeTwkbPoint(writer, context, point, previousPoint);
1657
+ }
1658
+ }
1659
+ return writer.arrayBuffer;
1660
+ }
1661
+ function encodePolygon2(writer, context, polygon) {
1662
+ const polygonRings = polygon.coordinates;
1663
+ const isEmpty = polygonRings.length === 0;
1664
+ writeTwkbHeader(writer, context, 3 /* Polygon */, isEmpty);
1665
+ if (!isEmpty) {
1666
+ writer.writeVarInt(polygonRings.length);
1667
+ const previousPoint = [0, 0, 0, 0];
1668
+ for (const ring of polygonRings) {
1669
+ writer.writeVarInt(ring.length);
1670
+ for (const point of ring) {
1671
+ writeTwkbPoint(writer, context, previousPoint, point);
1672
+ }
1673
+ }
1674
+ }
1675
+ return writer.arrayBuffer;
1676
+ }
1677
+ function encodeMultiPoint2(writer, context, multiPoint) {
1678
+ const points = multiPoint.coordinates;
1679
+ const isEmpty = points.length === 0;
1680
+ writeTwkbHeader(writer, context, 4 /* MultiPoint */, isEmpty);
1681
+ if (!isEmpty) {
1682
+ writer.writeVarInt(points.length);
1683
+ const previousPoint = [0, 0, 0, 0];
1684
+ for (let i = 0; i < points.length; i++) {
1685
+ writeTwkbPoint(writer, context, previousPoint, points[i]);
1686
+ }
1687
+ }
1688
+ }
1689
+ function encodeMultiLineString2(writer, context, multiLineStrings) {
1690
+ const lineStrings = multiLineStrings.coordinates;
1691
+ const isEmpty = lineStrings.length === 0;
1692
+ writeTwkbHeader(writer, context, 5 /* MultiLineString */, isEmpty);
1693
+ if (!isEmpty) {
1694
+ writer.writeVarInt(lineStrings.length);
1695
+ const previousPoint = [0, 0, 0, 0];
1696
+ for (const lineString of lineStrings) {
1697
+ writer.writeVarInt(lineString.length);
1698
+ for (const point of lineString) {
1699
+ writeTwkbPoint(writer, context, previousPoint, point);
1700
+ }
1701
+ }
1702
+ }
1703
+ return writer.arrayBuffer;
1704
+ }
1705
+ function encodeMultiPolygon2(writer, context, multiPolygon) {
1706
+ const { coordinates } = multiPolygon;
1707
+ const isEmpty = coordinates.length === 0;
1708
+ writeTwkbHeader(writer, context, 6 /* MultiPolygon */, isEmpty);
1709
+ if (!isEmpty) {
1710
+ const polygons = coordinates;
1711
+ writer.writeVarInt(polygons.length);
1712
+ const previousPoint = [0, 0, 0, 0];
1713
+ for (const polygonRings of polygons) {
1714
+ writer.writeVarInt(polygonRings.length);
1715
+ for (const ring of polygonRings) {
1716
+ writer.writeVarInt(ring.length);
1717
+ for (const point of ring) {
1718
+ writeTwkbPoint(writer, context, previousPoint, point);
1719
+ }
1720
+ }
1721
+ }
1722
+ }
1723
+ }
1724
+ function encodeGeometryCollection2(writer, context, geometryCollection) {
1725
+ const { geometries } = geometryCollection;
1726
+ const isEmpty = geometries.length === 0;
1727
+ writeTwkbHeader(writer, context, 7 /* GeometryCollection */, isEmpty);
1728
+ if (geometries.length > 0) {
1729
+ writer.writeVarInt(geometries.length);
1730
+ for (const geometry of geometries) {
1731
+ encodeGeometry(writer, geometry, context);
1732
+ }
1733
+ }
1734
+ }
1735
+ function writeTwkbHeader(writer, context, geometryType, isEmpty) {
1736
+ const type = (zigZagEncode(context.xy) << 4) + geometryType;
1737
+ let metadataHeader = context.hasZ || context.hasM ? 1 << 3 : 0;
1738
+ metadataHeader += isEmpty ? 1 << 4 : 0;
1739
+ writer.writeUInt8(type);
1740
+ writer.writeUInt8(metadataHeader);
1741
+ if (context.hasZ || context.hasM) {
1742
+ let extendedPrecision = 0;
1743
+ if (context.hasZ) {
1744
+ extendedPrecision |= 1;
1745
+ }
1746
+ if (context.hasM) {
1747
+ extendedPrecision |= 2;
1748
+ }
1749
+ writer.writeUInt8(extendedPrecision);
1750
+ }
1751
+ }
1752
+ function writeTwkbPoint(writer, context, point, previousPoint) {
1753
+ const x = point[0] * context.xyFactor;
1754
+ const y = point[1] * context.xyFactor;
1755
+ const z = point[2] * context.zFactor;
1756
+ const m = point[3] * context.mFactor;
1757
+ writer.writeVarInt(zigZagEncode(x - previousPoint[0]));
1758
+ writer.writeVarInt(zigZagEncode(y - previousPoint[1]));
1759
+ if (context.hasZ) {
1760
+ writer.writeVarInt(zigZagEncode(z - previousPoint[2]));
1761
+ }
1762
+ if (context.hasM) {
1763
+ writer.writeVarInt(zigZagEncode(m - previousPoint[3]));
1764
+ }
1765
+ previousPoint[0] = x;
1766
+ previousPoint[1] = y;
1767
+ previousPoint[2] = z;
1768
+ previousPoint[3] = m;
1769
+ }
1770
+ function zigZagEncode(value) {
1771
+ return value << 1 ^ value >> 31;
1772
+ }
1773
+ function getTwkbPrecision(xyPrecision, zPrecision, mPrecision) {
1774
+ return {
1775
+ xy: xyPrecision,
1776
+ z: zPrecision,
1777
+ m: mPrecision,
1778
+ xyFactor: Math.pow(10, xyPrecision),
1779
+ zFactor: Math.pow(10, zPrecision),
1780
+ mFactor: Math.pow(10, mPrecision)
1781
+ };
1782
+ }
1783
+
1784
+ // src/twkb-writer.ts
1785
+ var TWKBWriter = {
1786
+ name: "TWKB (Tiny Well Known Binary)",
1787
+ id: "twkb",
1788
+ module: "wkt",
1789
+ version: VERSION,
1790
+ extensions: ["twkb"],
1791
+ // @ts-expect-error not implemented yet
1792
+ encodeSync: async (data, options) => encodeTWKB,
1793
+ options: {
1794
+ twkb: {
1795
+ // hasZ: false,
1796
+ // hasM: false
1797
+ }
1798
+ }
1799
+ };