@loaders.gl/wkt 4.0.0-alpha.24 → 4.0.0-alpha.25

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 (215) hide show
  1. package/README.md +4 -1
  2. package/dist/dist.min.js +1447 -406
  3. package/dist/es5/hex-wkb-loader.js +64 -0
  4. package/dist/es5/hex-wkb-loader.js.map +1 -0
  5. package/dist/es5/index.js +76 -1
  6. package/dist/es5/index.js.map +1 -1
  7. package/dist/es5/lib/encode-twkb.js +269 -0
  8. package/dist/es5/lib/encode-twkb.js.map +1 -0
  9. package/dist/es5/lib/encode-wkb.js +12 -10
  10. package/dist/es5/lib/encode-wkb.js.map +1 -1
  11. package/dist/es5/lib/encode-wkt-crs.js +32 -0
  12. package/dist/es5/lib/encode-wkt-crs.js.map +1 -0
  13. package/dist/es5/lib/encode-wkt.js +1 -1
  14. package/dist/es5/lib/encode-wkt.js.map +1 -1
  15. package/dist/es5/lib/parse-hex-wkb.js +2 -0
  16. package/dist/es5/lib/parse-hex-wkb.js.map +1 -0
  17. package/dist/es5/lib/parse-twkb.js +259 -0
  18. package/dist/es5/lib/parse-twkb.js.map +1 -0
  19. package/dist/es5/lib/parse-wkb-header.js +114 -0
  20. package/dist/es5/lib/parse-wkb-header.js.map +1 -0
  21. package/dist/es5/lib/parse-wkb.js +59 -52
  22. package/dist/es5/lib/parse-wkb.js.map +1 -1
  23. package/dist/es5/lib/parse-wkt-crs.js +106 -0
  24. package/dist/es5/lib/parse-wkt-crs.js.map +1 -0
  25. package/dist/es5/lib/parse-wkt.js +210 -153
  26. package/dist/es5/lib/parse-wkt.js.map +1 -1
  27. package/dist/es5/lib/utils/base64-encoder.js +26 -0
  28. package/dist/es5/lib/utils/base64-encoder.js.map +1 -0
  29. package/dist/es5/lib/utils/binary-reader.js +98 -0
  30. package/dist/es5/lib/utils/binary-reader.js.map +1 -0
  31. package/dist/es5/lib/utils/binary-writer.js +2 -2
  32. package/dist/es5/lib/utils/binary-writer.js.map +1 -1
  33. package/dist/es5/lib/utils/hex-encoder.js +63 -0
  34. package/dist/es5/lib/utils/hex-encoder.js.map +1 -0
  35. package/dist/es5/lib/utils/hex-transcoder.js +41 -0
  36. package/dist/es5/lib/utils/hex-transcoder.js.map +1 -0
  37. package/dist/es5/lib/utils/version.js +1 -1
  38. package/dist/es5/twkb-loader.js +53 -0
  39. package/dist/es5/twkb-loader.js.map +1 -0
  40. package/dist/es5/twkb-writer.js +40 -0
  41. package/dist/es5/twkb-writer.js.map +1 -0
  42. package/dist/es5/wkb-loader.js +8 -4
  43. package/dist/es5/wkb-loader.js.map +1 -1
  44. package/dist/es5/wkb-writer.js +2 -3
  45. package/dist/es5/wkb-writer.js.map +1 -1
  46. package/dist/es5/wkt-crs-loader.js +47 -0
  47. package/dist/es5/wkt-crs-loader.js.map +1 -0
  48. package/dist/es5/wkt-crs-writer.js +49 -0
  49. package/dist/es5/wkt-crs-writer.js.map +1 -0
  50. package/dist/es5/wkt-loader.js +10 -6
  51. package/dist/es5/wkt-loader.js.map +1 -1
  52. package/dist/es5/wkt-writer.js +2 -3
  53. package/dist/es5/wkt-writer.js.map +1 -1
  54. package/dist/es5/workers/wkb-worker.js.map +1 -1
  55. package/dist/es5/workers/wkt-worker.js.map +1 -1
  56. package/dist/esm/hex-wkb-loader.js +37 -0
  57. package/dist/esm/hex-wkb-loader.js.map +1 -0
  58. package/dist/esm/index.js +10 -1
  59. package/dist/esm/index.js.map +1 -1
  60. package/dist/esm/lib/encode-twkb.js +180 -0
  61. package/dist/esm/lib/encode-twkb.js.map +1 -0
  62. package/dist/esm/lib/encode-wkb.js +4 -4
  63. package/dist/esm/lib/encode-wkb.js.map +1 -1
  64. package/dist/esm/lib/encode-wkt-crs.js +21 -0
  65. package/dist/esm/lib/encode-wkt-crs.js.map +1 -0
  66. package/dist/esm/lib/encode-wkt.js +1 -1
  67. package/dist/esm/lib/encode-wkt.js.map +1 -1
  68. package/dist/esm/lib/parse-hex-wkb.js +2 -0
  69. package/dist/esm/lib/parse-hex-wkb.js.map +1 -0
  70. package/dist/esm/lib/parse-twkb.js +252 -0
  71. package/dist/esm/lib/parse-twkb.js.map +1 -0
  72. package/dist/esm/lib/parse-wkb-header.js +105 -0
  73. package/dist/esm/lib/parse-wkb-header.js.map +1 -0
  74. package/dist/esm/lib/parse-wkb.js +59 -51
  75. package/dist/esm/lib/parse-wkb.js.map +1 -1
  76. package/dist/esm/lib/parse-wkt-crs.js +96 -0
  77. package/dist/esm/lib/parse-wkt-crs.js.map +1 -0
  78. package/dist/esm/lib/parse-wkt.js +204 -152
  79. package/dist/esm/lib/parse-wkt.js.map +1 -1
  80. package/dist/esm/lib/utils/base64-encoder.js +7 -0
  81. package/dist/esm/lib/utils/base64-encoder.js.map +1 -0
  82. package/dist/esm/lib/utils/binary-reader.js +67 -0
  83. package/dist/esm/lib/utils/binary-reader.js.map +1 -0
  84. package/dist/esm/lib/utils/binary-writer.js +1 -1
  85. package/dist/esm/lib/utils/binary-writer.js.map +1 -1
  86. package/dist/esm/lib/utils/hex-encoder.js +40 -0
  87. package/dist/esm/lib/utils/hex-encoder.js.map +1 -0
  88. package/dist/esm/lib/utils/hex-transcoder.js +34 -0
  89. package/dist/esm/lib/utils/hex-transcoder.js.map +1 -0
  90. package/dist/esm/lib/utils/version.js +1 -1
  91. package/dist/esm/twkb-loader.js +24 -0
  92. package/dist/esm/twkb-loader.js.map +1 -0
  93. package/dist/esm/twkb-writer.js +14 -0
  94. package/dist/esm/twkb-writer.js.map +1 -0
  95. package/dist/esm/wkb-loader.js +6 -2
  96. package/dist/esm/wkb-loader.js.map +1 -1
  97. package/dist/esm/wkb-writer.js +1 -1
  98. package/dist/esm/wkb-writer.js.map +1 -1
  99. package/dist/esm/wkt-crs-loader.js +19 -0
  100. package/dist/esm/wkt-crs-loader.js.map +1 -0
  101. package/dist/esm/wkt-crs-writer.js +19 -0
  102. package/dist/esm/wkt-crs-writer.js.map +1 -0
  103. package/dist/esm/wkt-loader.js +8 -3
  104. package/dist/esm/wkt-loader.js.map +1 -1
  105. package/dist/esm/wkt-writer.js +2 -2
  106. package/dist/esm/wkt-writer.js.map +1 -1
  107. package/dist/esm/workers/wkb-worker.js.map +1 -1
  108. package/dist/esm/workers/wkt-worker.js.map +1 -1
  109. package/dist/src/bundle.d.ts.map +1 -0
  110. package/dist/src/hex-wkb-loader.d.ts +17 -0
  111. package/dist/src/hex-wkb-loader.d.ts.map +1 -0
  112. package/dist/src/index.d.ts +15 -0
  113. package/dist/src/index.d.ts.map +1 -0
  114. package/dist/src/lib/encode-twkb.d.ts +6 -0
  115. package/dist/src/lib/encode-twkb.d.ts.map +1 -0
  116. package/dist/{lib → src/lib}/encode-wkb.d.ts +16 -3
  117. package/dist/src/lib/encode-wkb.d.ts.map +1 -0
  118. package/dist/src/lib/encode-wkt-crs.d.ts +10 -0
  119. package/dist/src/lib/encode-wkt-crs.d.ts.map +1 -0
  120. package/dist/{lib → src/lib}/encode-wkt.d.ts +1 -1
  121. package/dist/src/lib/encode-wkt.d.ts.map +1 -0
  122. package/dist/src/lib/parse-hex-wkb.d.ts +1 -0
  123. package/dist/src/lib/parse-hex-wkb.d.ts.map +1 -0
  124. package/dist/src/lib/parse-twkb.d.ts +9 -0
  125. package/dist/src/lib/parse-twkb.d.ts.map +1 -0
  126. package/dist/src/lib/parse-wkb-header.d.ts +39 -0
  127. package/dist/src/lib/parse-wkb-header.d.ts.map +1 -0
  128. package/dist/src/lib/parse-wkb.d.ts +5 -0
  129. package/dist/src/lib/parse-wkb.d.ts.map +1 -0
  130. package/dist/src/lib/parse-wkt-crs.d.ts +15 -0
  131. package/dist/src/lib/parse-wkt-crs.d.ts.map +1 -0
  132. package/dist/src/lib/parse-wkt.d.ts +30 -0
  133. package/dist/src/lib/parse-wkt.d.ts.map +1 -0
  134. package/dist/src/lib/utils/base64-encoder.d.ts +5 -0
  135. package/dist/src/lib/utils/base64-encoder.d.ts.map +1 -0
  136. package/dist/src/lib/utils/binary-reader.d.ts +18 -0
  137. package/dist/src/lib/utils/binary-reader.d.ts.map +1 -0
  138. package/dist/{lib → src/lib}/utils/binary-writer.d.ts +1 -1
  139. package/dist/src/lib/utils/binary-writer.d.ts.map +1 -0
  140. package/dist/src/lib/utils/hex-encoder.d.ts +15 -0
  141. package/dist/src/lib/utils/hex-encoder.d.ts.map +1 -0
  142. package/dist/src/lib/utils/hex-transcoder.d.ts +15 -0
  143. package/dist/src/lib/utils/hex-transcoder.d.ts.map +1 -0
  144. package/dist/src/lib/utils/version.d.ts.map +1 -0
  145. package/dist/src/twkb-loader.d.ts +16 -0
  146. package/dist/src/twkb-loader.d.ts.map +1 -0
  147. package/dist/src/twkb-writer.d.ts +7 -0
  148. package/dist/src/twkb-writer.d.ts.map +1 -0
  149. package/dist/src/wkb-loader.d.ts +16 -0
  150. package/dist/src/wkb-loader.d.ts.map +1 -0
  151. package/dist/src/wkb-writer.d.ts +7 -0
  152. package/dist/src/wkb-writer.d.ts.map +1 -0
  153. package/dist/src/wkt-crs-loader.d.ts +12 -0
  154. package/dist/src/wkt-crs-loader.d.ts.map +1 -0
  155. package/dist/src/wkt-crs-writer.d.ts +13 -0
  156. package/dist/src/wkt-crs-writer.d.ts.map +1 -0
  157. package/dist/src/wkt-loader.d.ts +18 -0
  158. package/dist/src/wkt-loader.d.ts.map +1 -0
  159. package/dist/src/wkt-writer.d.ts +10 -0
  160. package/dist/src/wkt-writer.d.ts.map +1 -0
  161. package/dist/{workers → src/workers}/wkb-worker.d.ts.map +1 -1
  162. package/dist/{workers → src/workers}/wkt-worker.d.ts.map +1 -1
  163. package/dist/tsconfig.tsbuildinfo +1 -0
  164. package/dist/wkt-worker.js +222 -183
  165. package/package.json +4 -4
  166. package/src/hex-wkb-loader.ts +61 -0
  167. package/src/index.ts +22 -1
  168. package/src/lib/encode-twkb.ts +304 -0
  169. package/src/lib/encode-wkb.ts +5 -5
  170. package/src/lib/encode-wkt-crs.ts +39 -0
  171. package/src/lib/encode-wkt.ts +3 -2
  172. package/src/lib/parse-hex-wkb.ts +0 -0
  173. package/src/lib/parse-twkb.ts +351 -0
  174. package/src/lib/parse-wkb-header.ts +172 -0
  175. package/src/lib/parse-wkb.ts +69 -58
  176. package/src/lib/parse-wkt-crs.ts +147 -0
  177. package/src/lib/parse-wkt.ts +275 -174
  178. package/src/lib/utils/base64-encoder.ts +153 -0
  179. package/src/lib/utils/binary-reader.ts +72 -0
  180. package/src/lib/utils/binary-writer.ts +1 -1
  181. package/src/lib/utils/hex-encoder.ts +58 -0
  182. package/src/lib/utils/hex-transcoder.ts +50 -0
  183. package/src/twkb-loader.ts +42 -0
  184. package/src/twkb-writer.ts +25 -0
  185. package/src/wkb-loader.ts +17 -5
  186. package/src/wkb-writer.ts +6 -4
  187. package/src/wkt-crs-loader.ts +33 -0
  188. package/src/wkt-crs-writer.ts +37 -0
  189. package/src/wkt-loader.ts +20 -6
  190. package/src/wkt-writer.ts +12 -5
  191. package/src/workers/wkb-worker.ts +2 -0
  192. package/src/workers/wkt-worker.ts +2 -0
  193. package/dist/bundle.d.ts.map +0 -1
  194. package/dist/index.d.ts +0 -5
  195. package/dist/index.d.ts.map +0 -1
  196. package/dist/lib/encode-wkb.d.ts.map +0 -1
  197. package/dist/lib/encode-wkt.d.ts.map +0 -1
  198. package/dist/lib/parse-wkb.d.ts +0 -3
  199. package/dist/lib/parse-wkb.d.ts.map +0 -1
  200. package/dist/lib/parse-wkt.d.ts +0 -8
  201. package/dist/lib/parse-wkt.d.ts.map +0 -1
  202. package/dist/lib/utils/binary-writer.d.ts.map +0 -1
  203. package/dist/lib/utils/version.d.ts.map +0 -1
  204. package/dist/wkb-loader.d.ts +0 -11
  205. package/dist/wkb-loader.d.ts.map +0 -1
  206. package/dist/wkb-writer.d.ts +0 -6
  207. package/dist/wkb-writer.d.ts.map +0 -1
  208. package/dist/wkt-loader.d.ts +0 -11
  209. package/dist/wkt-loader.d.ts.map +0 -1
  210. package/dist/wkt-writer.d.ts +0 -6
  211. package/dist/wkt-writer.d.ts.map +0 -1
  212. /package/dist/{bundle.d.ts → src/bundle.d.ts} +0 -0
  213. /package/dist/{lib → src/lib}/utils/version.d.ts +0 -0
  214. /package/dist/{workers → src/workers}/wkb-worker.d.ts +0 -0
  215. /package/dist/{workers → src/workers}/wkt-worker.d.ts +0 -0
package/dist/dist.min.js CHANGED
@@ -21,47 +21,767 @@
21
21
  }
22
22
  });
23
23
 
24
+ // src/lib/parse-wkt-crs.ts
25
+ function parseWKTCRS(wkt, options) {
26
+ if (options?.debug) {
27
+ console.log("[wktcrs] parse starting with\n", wkt);
28
+ }
29
+ wkt = wkt.replace(/[A-Z][A-Z\d_]+\[/gi, (match) => `["${match.substr(0, match.length - 1)}",`);
30
+ wkt = wkt.replace(/, ?([A-Z][A-Z\d_]+[,\]])/gi, (match, p1) => {
31
+ const varname = p1.substr(0, p1.length - 1);
32
+ return `,"${options?.raw ? "raw:" : ""}${varname}"${p1[p1.length - 1]}`;
33
+ });
34
+ if (options?.raw) {
35
+ wkt = wkt.replace(/, {0,2}(-?[\.\d]+)(?=,|\])/g, function(match, p1) {
36
+ return `,"${options?.raw ? "raw:" : ""}${p1}"`;
37
+ });
38
+ }
39
+ if (options?.debug) {
40
+ console.log(`[wktcrs] json'd wkt: '${wkt}'`);
41
+ }
42
+ let data;
43
+ try {
44
+ data = JSON.parse(wkt);
45
+ } catch (error) {
46
+ console.error(`[wktcrs] failed to parse '${wkt}'`);
47
+ throw error;
48
+ }
49
+ if (options?.debug) {
50
+ console.log(`[wktcrs] json parsed: '${wkt}'`);
51
+ }
52
+ function process(data2, parent) {
53
+ const kw = data2[0];
54
+ data2.forEach(function(it) {
55
+ if (Array.isArray(it)) {
56
+ process(it, data2);
57
+ }
58
+ });
59
+ const kwarr = `MULTIPLE_${kw}`;
60
+ if (kwarr in parent) {
61
+ parent[kwarr].push(data2);
62
+ } else if (kw in parent) {
63
+ parent[kwarr] = [parent[kw], data2];
64
+ delete parent[kw];
65
+ } else {
66
+ parent[kw] = data2;
67
+ }
68
+ return parent;
69
+ }
70
+ const result = process(data, [data]);
71
+ if (options?.debug) {
72
+ console.log("[wktcrs] parse returning", result);
73
+ }
74
+ if (options?.sort) {
75
+ sort(result, options);
76
+ }
77
+ return result;
78
+ }
79
+ function sort(data, options) {
80
+ const keys = Object.keys(data).filter((k) => !/\d+/.test(k));
81
+ const keywords = options?.keywords || [];
82
+ if (!options?.keywords) {
83
+ const counts = {};
84
+ if (Array.isArray(data)) {
85
+ data.forEach((it) => {
86
+ if (Array.isArray(it) && it.length >= 2 && typeof it[1] === "string") {
87
+ const k = it[0];
88
+ if (!counts[k])
89
+ counts[k] = 0;
90
+ counts[k]++;
91
+ }
92
+ });
93
+ for (const k in counts) {
94
+ if (counts[k] > 0)
95
+ keywords.push(k);
96
+ }
97
+ }
98
+ }
99
+ keys.forEach((key) => {
100
+ data[key] = sort(data[key]);
101
+ });
102
+ keywords.forEach((key) => {
103
+ const indices = [];
104
+ const params = [];
105
+ data.forEach((item, i) => {
106
+ if (Array.isArray(item) && item[0] === key) {
107
+ indices.push(i);
108
+ params.push(item);
109
+ }
110
+ });
111
+ params.sort((a, b) => {
112
+ a = a[1].toString();
113
+ b = b[1].toString();
114
+ return a < b ? -1 : a > b ? 1 : 0;
115
+ });
116
+ params.forEach((param, i) => {
117
+ data[indices[i]] = param;
118
+ });
119
+ });
120
+ return data;
121
+ }
122
+ var init_parse_wkt_crs = __esm({
123
+ "src/lib/parse-wkt-crs.ts"() {
124
+ }
125
+ });
126
+
127
+ // src/wkt-crs-loader.ts
128
+ var WKTCRSLoader;
129
+ var init_wkt_crs_loader = __esm({
130
+ "src/wkt-crs-loader.ts"() {
131
+ init_version();
132
+ init_parse_wkt_crs();
133
+ WKTCRSLoader = {
134
+ name: "WKT CRS (Well-Known Text Coordinate Reference System)",
135
+ id: "wkt-crs",
136
+ module: "wkt-crs",
137
+ version: VERSION,
138
+ worker: true,
139
+ extensions: [],
140
+ mimeTypes: ["text/plain"],
141
+ category: "json",
142
+ text: true,
143
+ options: {
144
+ "wkt-crs": {}
145
+ },
146
+ parse: async (arrayBuffer, options) => parseWKTCRS(new TextDecoder().decode(arrayBuffer), options?.["wkt-crs"]),
147
+ parseTextSync: (string, options) => parseWKTCRS(string, options?.["wkt-crs"])
148
+ };
149
+ }
150
+ });
151
+
152
+ // src/lib/encode-wkt-crs.ts
153
+ function encodeWKTCRS(wkt, options) {
154
+ if (Array.isArray(wkt) && wkt.length === 1 && Array.isArray(wkt[0])) {
155
+ wkt = wkt[0];
156
+ }
157
+ const [kw, ...attrs] = wkt;
158
+ const str = `${kw}[${attrs.map((attr) => {
159
+ if (Array.isArray(attr)) {
160
+ return encodeWKTCRS(attr, options);
161
+ } else if (typeof attr === "number") {
162
+ return attr.toString();
163
+ } else if (typeof attr === "string") {
164
+ if (attr.startsWith("raw:")) {
165
+ return attr.replace("raw:", "");
166
+ }
167
+ return `"${attr}"`;
168
+ }
169
+ throw new Error(`[wktcrs] unexpected attribute "${attr}"`);
170
+ }).join(",")}]`;
171
+ return str;
172
+ }
173
+ var init_encode_wkt_crs = __esm({
174
+ "src/lib/encode-wkt-crs.ts"() {
175
+ }
176
+ });
177
+
178
+ // src/wkt-crs-writer.ts
179
+ var WKTCRSWriter;
180
+ var init_wkt_crs_writer = __esm({
181
+ "src/wkt-crs-writer.ts"() {
182
+ init_version();
183
+ init_encode_wkt_crs();
184
+ WKTCRSWriter = {
185
+ name: "WKT CRS (Well-Known Text Coordinate Reference System)",
186
+ id: "wkt-crs",
187
+ module: "wkt-crs",
188
+ version: VERSION,
189
+ worker: true,
190
+ extensions: [],
191
+ mimeTypes: ["text/plain"],
192
+ text: true,
193
+ options: {
194
+ "wkt-crs": {}
195
+ },
196
+ encode: async (wktcrs, options) => new TextEncoder().encode(encodeWKTCRS(wktcrs, options?.["wkt-crs"])),
197
+ encodeSync: (wktcrs, options) => new TextEncoder().encode(encodeWKTCRS(wktcrs, options?.["wkt-crs"])),
198
+ encodeTextSync: (wktcrs, options) => encodeWKTCRS(wktcrs, options?.["wkt-crs"])
199
+ };
200
+ }
201
+ });
202
+
203
+ // src/lib/parse-wkt.ts
204
+ function isWKT(input) {
205
+ return WKT_MAGIC_STRINGS.some((magicString) => input.startsWith(magicString));
206
+ }
207
+ function parseWKT(input, options) {
208
+ return parseWKTToGeometry(input, options);
209
+ }
210
+ function parseWKTToGeometry(input, options) {
211
+ const parts = input.split(";");
212
+ let _ = parts.pop();
213
+ const srid = (parts.shift() || "").split("=").pop();
214
+ const state = { parts, _, i: 0 };
215
+ const geometry = parseGeometry(state);
216
+ return options?.wkt?.crs ? addCRS(geometry, srid) : geometry;
217
+ }
218
+ function parseGeometry(state) {
219
+ return parsePoint(state) || parseLineString(state) || parsePolygon(state) || parseMultiPoint(state) || parseMultiLineString(state) || parseMultiPolygon(state) || parseGeometryCollection(state);
220
+ }
221
+ function addCRS(obj, srid) {
222
+ if (obj && srid?.match(/\d+/)) {
223
+ const crs = {
224
+ type: "name",
225
+ properties: {
226
+ name: "urn:ogc:def:crs:EPSG::" + srid
227
+ }
228
+ };
229
+ obj.crs = crs;
230
+ }
231
+ return obj;
232
+ }
233
+ function parsePoint(state) {
234
+ if (!$(/^(POINT(\sz)?)/i, state)) {
235
+ return null;
236
+ }
237
+ white(state);
238
+ if (!$(/^(\()/, state)) {
239
+ return null;
240
+ }
241
+ const c = coords(state);
242
+ if (!c) {
243
+ return null;
244
+ }
245
+ white(state);
246
+ if (!$(/^(\))/, state)) {
247
+ return null;
248
+ }
249
+ return {
250
+ type: "Point",
251
+ coordinates: c[0]
252
+ };
253
+ }
254
+ function parseMultiPoint(state) {
255
+ if (!$(/^(MULTIPOINT)/i, state)) {
256
+ return null;
257
+ }
258
+ white(state);
259
+ const newCoordsFormat = state._?.substring(state._?.indexOf("(") + 1, state._.length - 1).replace(/\(/g, "").replace(/\)/g, "");
260
+ state._ = "MULTIPOINT (" + newCoordsFormat + ")";
261
+ const c = multicoords(state);
262
+ if (!c) {
263
+ return null;
264
+ }
265
+ white(state);
266
+ return {
267
+ type: "MultiPoint",
268
+ coordinates: c
269
+ };
270
+ }
271
+ function parseLineString(state) {
272
+ if (!$(/^(LINESTRING(\sz)?)/i, state)) {
273
+ return null;
274
+ }
275
+ white(state);
276
+ if (!$(/^(\()/, state)) {
277
+ return null;
278
+ }
279
+ const c = coords(state);
280
+ if (!c) {
281
+ return null;
282
+ }
283
+ if (!$(/^(\))/, state)) {
284
+ return null;
285
+ }
286
+ return {
287
+ type: "LineString",
288
+ coordinates: c
289
+ };
290
+ }
291
+ function parseMultiLineString(state) {
292
+ if (!$(/^(MULTILINESTRING)/i, state))
293
+ return null;
294
+ white(state);
295
+ const c = multicoords(state);
296
+ if (!c) {
297
+ return null;
298
+ }
299
+ white(state);
300
+ return {
301
+ type: "MultiLineString",
302
+ coordinates: c
303
+ };
304
+ }
305
+ function parsePolygon(state) {
306
+ if (!$(/^(POLYGON(\sz)?)/i, state)) {
307
+ return null;
308
+ }
309
+ white(state);
310
+ const c = multicoords(state);
311
+ if (!c) {
312
+ return null;
313
+ }
314
+ return {
315
+ type: "Polygon",
316
+ coordinates: c
317
+ };
318
+ }
319
+ function parseMultiPolygon(state) {
320
+ if (!$(/^(MULTIPOLYGON)/i, state)) {
321
+ return null;
322
+ }
323
+ white(state);
324
+ const c = multicoords(state);
325
+ if (!c) {
326
+ return null;
327
+ }
328
+ return {
329
+ type: "MultiPolygon",
330
+ coordinates: c
331
+ };
332
+ }
333
+ function parseGeometryCollection(state) {
334
+ const geometries = [];
335
+ let geometry;
336
+ if (!$(/^(GEOMETRYCOLLECTION)/i, state)) {
337
+ return null;
338
+ }
339
+ white(state);
340
+ if (!$(/^(\()/, state)) {
341
+ return null;
342
+ }
343
+ while (geometry = parseGeometry(state)) {
344
+ geometries.push(geometry);
345
+ white(state);
346
+ $(/^(,)/, state);
347
+ white(state);
348
+ }
349
+ if (!$(/^(\))/, state)) {
350
+ return null;
351
+ }
352
+ return {
353
+ type: "GeometryCollection",
354
+ geometries
355
+ };
356
+ }
357
+ function multicoords(state) {
358
+ white(state);
359
+ let depth = 0;
360
+ const rings = [];
361
+ const stack = [rings];
362
+ let pointer = rings;
363
+ let elem;
364
+ while (elem = $(/^(\()/, state) || $(/^(\))/, state) || $(/^(,)/, state) || $(tuples, state)) {
365
+ if (elem === "(") {
366
+ stack.push(pointer);
367
+ pointer = [];
368
+ stack[stack.length - 1].push(pointer);
369
+ depth++;
370
+ } else if (elem === ")") {
371
+ if (pointer.length === 0)
372
+ return null;
373
+ pointer = stack.pop();
374
+ if (!pointer)
375
+ return null;
376
+ depth--;
377
+ if (depth === 0)
378
+ break;
379
+ } else if (elem === ",") {
380
+ pointer = [];
381
+ stack[stack.length - 1].push(pointer);
382
+ } else if (!elem.split(/\s/g).some(isNaN)) {
383
+ Array.prototype.push.apply(pointer, elem.split(/\s/g).map(parseFloat));
384
+ } else {
385
+ return null;
386
+ }
387
+ white(state);
388
+ }
389
+ if (depth !== 0)
390
+ return null;
391
+ return rings;
392
+ }
393
+ function coords(state) {
394
+ const list = [];
395
+ let item;
396
+ let pt;
397
+ while (pt = $(tuples, state) || $(/^(,)/, state)) {
398
+ if (pt === ",") {
399
+ list.push(item);
400
+ item = [];
401
+ } else if (!pt.split(/\s/g).some(isNaN)) {
402
+ if (!item)
403
+ item = [];
404
+ Array.prototype.push.apply(item, pt.split(/\s/g).map(parseFloat));
405
+ }
406
+ white(state);
407
+ }
408
+ if (item)
409
+ list.push(item);
410
+ else
411
+ return null;
412
+ return list.length ? list : null;
413
+ }
414
+ function $(regexp, state) {
415
+ const match = state._?.substring(state.i).match(regexp);
416
+ if (!match)
417
+ return null;
418
+ else {
419
+ state.i += match[0].length;
420
+ return match[0];
421
+ }
422
+ }
423
+ function white(state) {
424
+ $(/^\s*/, state);
425
+ }
426
+ var numberRegexp, tuples, WKT_MAGIC_STRINGS;
427
+ var init_parse_wkt = __esm({
428
+ "src/lib/parse-wkt.ts"() {
429
+ numberRegexp = /[-+]?([0-9]*\.[0-9]+|[0-9]+)([eE][-+]?[0-9]+)?/;
430
+ tuples = new RegExp("^" + numberRegexp.source + "(\\s" + numberRegexp.source + "){1,}");
431
+ WKT_MAGIC_STRINGS = [
432
+ "POINT(",
433
+ "LINESTRING(",
434
+ "POLYGON(",
435
+ "MULTIPOINT(",
436
+ "MULTILINESTRING(",
437
+ "MULTIPOLYGON(",
438
+ "GEOMETRYCOLLECTION("
439
+ ];
440
+ }
441
+ });
442
+
443
+ // src/wkt-loader.ts
444
+ var WKTWorkerLoader, WKTLoader;
445
+ var init_wkt_loader = __esm({
446
+ "src/wkt-loader.ts"() {
447
+ init_version();
448
+ init_parse_wkt();
449
+ init_parse_wkt();
450
+ WKTWorkerLoader = {
451
+ name: "WKT (Well-Known Text)",
452
+ id: "wkt",
453
+ module: "wkt",
454
+ version: VERSION,
455
+ worker: true,
456
+ extensions: ["wkt"],
457
+ mimeTypes: ["text/plain"],
458
+ category: "geometry",
459
+ text: true,
460
+ tests: WKT_MAGIC_STRINGS,
461
+ testText: isWKT,
462
+ options: {
463
+ wkt: {
464
+ crs: true
465
+ }
466
+ }
467
+ };
468
+ WKTLoader = {
469
+ ...WKTWorkerLoader,
470
+ parse: async (arrayBuffer, options) => parseWKT(new TextDecoder().decode(arrayBuffer), options),
471
+ parseTextSync: parseWKT
472
+ };
473
+ }
474
+ });
475
+
476
+ // src/lib/encode-wkt.ts
477
+ function encodeWKT(geometry) {
478
+ if (geometry.type === "Feature") {
479
+ geometry = geometry.geometry;
480
+ }
481
+ switch (geometry.type) {
482
+ case "Point":
483
+ return `POINT ${wrapParens(pairWKT(geometry.coordinates))}`;
484
+ case "LineString":
485
+ return `LINESTRING ${wrapParens(ringWKT(geometry.coordinates))}`;
486
+ case "Polygon":
487
+ return `POLYGON ${wrapParens(ringsWKT(geometry.coordinates))}`;
488
+ case "MultiPoint":
489
+ return `MULTIPOINT ${wrapParens(ringWKT(geometry.coordinates))}`;
490
+ case "MultiPolygon":
491
+ return `MULTIPOLYGON ${wrapParens(multiRingsWKT(geometry.coordinates))}`;
492
+ case "MultiLineString":
493
+ return `MULTILINESTRING ${wrapParens(ringsWKT(geometry.coordinates))}`;
494
+ case "GeometryCollection":
495
+ return `GEOMETRYCOLLECTION ${wrapParens(geometry.geometries.map(encodeWKT).join(", "))}`;
496
+ default:
497
+ throw new Error("stringify requires a valid GeoJSON Feature or geometry object as input");
498
+ }
499
+ }
500
+ function pairWKT(c) {
501
+ return c.join(" ");
502
+ }
503
+ function ringWKT(r) {
504
+ return r.map(pairWKT).join(", ");
505
+ }
506
+ function ringsWKT(r) {
507
+ return r.map(ringWKT).map(wrapParens).join(", ");
508
+ }
509
+ function multiRingsWKT(r) {
510
+ return r.map(ringsWKT).map(wrapParens).join(", ");
511
+ }
512
+ function wrapParens(s) {
513
+ return `(${s})`;
514
+ }
515
+ var init_encode_wkt = __esm({
516
+ "src/lib/encode-wkt.ts"() {
517
+ }
518
+ });
519
+
520
+ // src/wkt-writer.ts
521
+ var WKTWriter;
522
+ var init_wkt_writer = __esm({
523
+ "src/wkt-writer.ts"() {
524
+ init_version();
525
+ init_encode_wkt();
526
+ WKTWriter = {
527
+ name: "WKT (Well Known Text)",
528
+ id: "wkt",
529
+ module: "wkt",
530
+ version: VERSION,
531
+ extensions: ["wkt"],
532
+ encodeSync: encodeWKT,
533
+ options: {
534
+ wkt: {}
535
+ }
536
+ };
537
+ }
538
+ });
539
+
540
+ // ../gis/src/lib/binary-to-geojson.ts
541
+ function binaryToGeometry(data, startIndex, endIndex) {
542
+ switch (data.type) {
543
+ case "Point":
544
+ return pointToGeoJson(data, startIndex, endIndex);
545
+ case "LineString":
546
+ return lineStringToGeoJson(data, startIndex, endIndex);
547
+ case "Polygon":
548
+ return polygonToGeoJson(data, startIndex, endIndex);
549
+ default:
550
+ const unexpectedInput = data;
551
+ throw new Error(`Unsupported geometry type: ${unexpectedInput?.type}`);
552
+ }
553
+ }
554
+ function polygonToGeoJson(data, startIndex = -Infinity, endIndex = Infinity) {
555
+ const { positions } = data;
556
+ const polygonIndices = data.polygonIndices.value.filter((x) => x >= startIndex && x <= endIndex);
557
+ const primitivePolygonIndices = data.primitivePolygonIndices.value.filter((x) => x >= startIndex && x <= endIndex);
558
+ const multi = polygonIndices.length > 2;
559
+ if (!multi) {
560
+ const coordinates2 = [];
561
+ for (let i = 0; i < primitivePolygonIndices.length - 1; i++) {
562
+ const startRingIndex = primitivePolygonIndices[i];
563
+ const endRingIndex = primitivePolygonIndices[i + 1];
564
+ const ringCoordinates = ringToGeoJson(positions, startRingIndex, endRingIndex);
565
+ coordinates2.push(ringCoordinates);
566
+ }
567
+ return { type: "Polygon", coordinates: coordinates2 };
568
+ }
569
+ const coordinates = [];
570
+ for (let i = 0; i < polygonIndices.length - 1; i++) {
571
+ const startPolygonIndex = polygonIndices[i];
572
+ const endPolygonIndex = polygonIndices[i + 1];
573
+ const polygonCoordinates = polygonToGeoJson(data, startPolygonIndex, endPolygonIndex).coordinates;
574
+ coordinates.push(polygonCoordinates);
575
+ }
576
+ return { type: "MultiPolygon", coordinates };
577
+ }
578
+ function lineStringToGeoJson(data, startIndex = -Infinity, endIndex = Infinity) {
579
+ const { positions } = data;
580
+ const pathIndices = data.pathIndices.value.filter((x) => x >= startIndex && x <= endIndex);
581
+ const multi = pathIndices.length > 2;
582
+ if (!multi) {
583
+ const coordinates2 = ringToGeoJson(positions, pathIndices[0], pathIndices[1]);
584
+ return { type: "LineString", coordinates: coordinates2 };
585
+ }
586
+ const coordinates = [];
587
+ for (let i = 0; i < pathIndices.length - 1; i++) {
588
+ const ringCoordinates = ringToGeoJson(positions, pathIndices[i], pathIndices[i + 1]);
589
+ coordinates.push(ringCoordinates);
590
+ }
591
+ return { type: "MultiLineString", coordinates };
592
+ }
593
+ function pointToGeoJson(data, startIndex, endIndex) {
594
+ const { positions } = data;
595
+ const coordinates = ringToGeoJson(positions, startIndex, endIndex);
596
+ const multi = coordinates.length > 1;
597
+ if (multi) {
598
+ return { type: "MultiPoint", coordinates };
599
+ }
600
+ return { type: "Point", coordinates: coordinates[0] };
601
+ }
602
+ function ringToGeoJson(positions, startIndex, endIndex) {
603
+ startIndex = startIndex || 0;
604
+ endIndex = endIndex || positions.value.length / positions.size;
605
+ const ringCoordinates = [];
606
+ for (let j = startIndex; j < endIndex; j++) {
607
+ const coord = Array();
608
+ for (let k = j * positions.size; k < (j + 1) * positions.size; k++) {
609
+ coord.push(Number(positions.value[k]));
610
+ }
611
+ ringCoordinates.push(coord);
612
+ }
613
+ return ringCoordinates;
614
+ }
615
+ var init_binary_to_geojson = __esm({
616
+ "../gis/src/lib/binary-to-geojson.ts"() {
617
+ }
618
+ });
619
+
620
+ // ../gis/src/index.ts
621
+ var init_src = __esm({
622
+ "../gis/src/index.ts"() {
623
+ init_binary_to_geojson();
624
+ }
625
+ });
626
+
627
+ // src/lib/parse-wkb-header.ts
628
+ function isWKB(arrayBuffer) {
629
+ const dataView = new DataView(arrayBuffer);
630
+ let byteOffset = 0;
631
+ const endianness = dataView.getUint8(byteOffset);
632
+ byteOffset += 1;
633
+ if (endianness > 1) {
634
+ return false;
635
+ }
636
+ const littleEndian = endianness === 1;
637
+ const geometry = dataView.getUint32(byteOffset, littleEndian);
638
+ byteOffset += 4;
639
+ const geometryType = geometry & 7;
640
+ if (geometryType === 0 || geometryType > 7) {
641
+ return false;
642
+ }
643
+ const geometryFlags = geometry - geometryType;
644
+ if (geometryFlags === 0 || geometryFlags === 1e3 || geometryFlags === 2e3 || geometryFlags === 3e3) {
645
+ return true;
646
+ }
647
+ if ((geometryFlags & ~(EWKB_FLAG_Z | EWKB_FLAG_M | EWKB_FLAG_SRID)) !== 0) {
648
+ return false;
649
+ }
650
+ if (geometryFlags & EWKB_FLAG_SRID) {
651
+ const srid = dataView.getUint32(byteOffset, littleEndian);
652
+ byteOffset += 4;
653
+ if (srid > MAX_SRID) {
654
+ return false;
655
+ }
656
+ }
657
+ return true;
658
+ }
659
+ function parseWKBHeader(dataView, target) {
660
+ const wkbHeader = Object.assign(target || {}, {
661
+ type: "wkb",
662
+ geometryType: 1,
663
+ dimensions: 2,
664
+ coordinates: "xy",
665
+ littleEndian: true,
666
+ byteOffset: 0
667
+ });
668
+ wkbHeader.littleEndian = dataView.getUint8(wkbHeader.byteOffset) === 1;
669
+ wkbHeader.byteOffset++;
670
+ const geometryCode = dataView.getUint32(wkbHeader.byteOffset, wkbHeader.littleEndian);
671
+ wkbHeader.byteOffset += 4;
672
+ wkbHeader.geometryType = geometryCode & 7;
673
+ const isoType = (geometryCode - wkbHeader.geometryType) / 1e3;
674
+ switch (isoType) {
675
+ case 0:
676
+ break;
677
+ case 1:
678
+ wkbHeader.type = "iso-wkb";
679
+ wkbHeader.dimensions = 3;
680
+ wkbHeader.coordinates = "xyz";
681
+ break;
682
+ case 2:
683
+ wkbHeader.type = "iso-wkb";
684
+ wkbHeader.dimensions = 3;
685
+ wkbHeader.coordinates = "xym";
686
+ break;
687
+ case 3:
688
+ wkbHeader.type = "iso-wkb";
689
+ wkbHeader.dimensions = 4;
690
+ wkbHeader.coordinates = "xyzm";
691
+ break;
692
+ default:
693
+ throw new Error(`WKB: Unsupported iso-wkb type: ${isoType}`);
694
+ }
695
+ const ewkbZ = geometryCode & EWKB_FLAG_Z;
696
+ const ewkbM = geometryCode & EWKB_FLAG_M;
697
+ const ewkbSRID = geometryCode & EWKB_FLAG_SRID;
698
+ if (ewkbZ && ewkbM) {
699
+ wkbHeader.type = "ewkb";
700
+ wkbHeader.dimensions = 4;
701
+ wkbHeader.coordinates = "xyzm";
702
+ } else if (ewkbZ) {
703
+ wkbHeader.type = "ewkb";
704
+ wkbHeader.dimensions = 3;
705
+ wkbHeader.coordinates = "xyz";
706
+ } else if (ewkbM) {
707
+ wkbHeader.type = "ewkb";
708
+ wkbHeader.dimensions = 3;
709
+ wkbHeader.coordinates = "xym";
710
+ }
711
+ if (ewkbSRID) {
712
+ wkbHeader.type = "ewkb";
713
+ wkbHeader.srid = dataView.getUint32(wkbHeader.byteOffset, wkbHeader.littleEndian);
714
+ wkbHeader.byteOffset += 4;
715
+ }
716
+ return wkbHeader;
717
+ }
718
+ var EWKB_FLAG_Z, EWKB_FLAG_M, EWKB_FLAG_SRID, MAX_SRID, WKBGeometryType;
719
+ var init_parse_wkb_header = __esm({
720
+ "src/lib/parse-wkb-header.ts"() {
721
+ EWKB_FLAG_Z = 2147483648;
722
+ EWKB_FLAG_M = 1073741824;
723
+ EWKB_FLAG_SRID = 536870912;
724
+ MAX_SRID = 1e4;
725
+ (function(WKBGeometryType2) {
726
+ WKBGeometryType2[WKBGeometryType2["Point"] = 1] = "Point";
727
+ WKBGeometryType2[WKBGeometryType2["LineString"] = 2] = "LineString";
728
+ WKBGeometryType2[WKBGeometryType2["Polygon"] = 3] = "Polygon";
729
+ WKBGeometryType2[WKBGeometryType2["MultiPoint"] = 4] = "MultiPoint";
730
+ WKBGeometryType2[WKBGeometryType2["MultiLineString"] = 5] = "MultiLineString";
731
+ WKBGeometryType2[WKBGeometryType2["MultiPolygon"] = 6] = "MultiPolygon";
732
+ WKBGeometryType2[WKBGeometryType2["GeometryCollection"] = 7] = "GeometryCollection";
733
+ })(WKBGeometryType || (WKBGeometryType = {}));
734
+ }
735
+ });
736
+
24
737
  // src/lib/parse-wkb.ts
25
- function parseWKB(arrayBuffer) {
26
- const view = new DataView(arrayBuffer);
27
- let offset = 0;
28
- const littleEndian = view.getUint8(offset) === 1;
29
- offset++;
30
- const geometryCode = view.getUint32(offset, littleEndian);
31
- offset += 4;
32
- const geometryType = geometryCode % 1e3;
33
- const type = (geometryCode - geometryType) / 1e3;
34
- const dimension = NUM_DIMENSIONS[type];
738
+ function parseWKB(arrayBuffer, options) {
739
+ const binaryGeometry = parseWKBToBinary(arrayBuffer, options);
740
+ const shape = options?.wkb?.shape || "binary-geometry";
741
+ switch (shape) {
742
+ case "binary-geometry":
743
+ return binaryGeometry;
744
+ case "geometry":
745
+ return binaryToGeometry(binaryGeometry);
746
+ default:
747
+ throw new Error(shape);
748
+ }
749
+ }
750
+ function parseWKBToBinary(arrayBuffer, options) {
751
+ const dataView = new DataView(arrayBuffer);
752
+ const wkbHeader = parseWKBHeader(dataView);
753
+ const { geometryType, dimensions, littleEndian } = wkbHeader;
754
+ const offset = wkbHeader.byteOffset;
35
755
  switch (geometryType) {
36
- case 1:
37
- const point = parsePoint(view, offset, dimension, littleEndian);
756
+ case WKBGeometryType.Point:
757
+ const point = parsePoint2(dataView, offset, dimensions, littleEndian);
38
758
  return point.geometry;
39
- case 2:
40
- const line = parseLineString(view, offset, dimension, littleEndian);
759
+ case WKBGeometryType.LineString:
760
+ const line = parseLineString2(dataView, offset, dimensions, littleEndian);
41
761
  return line.geometry;
42
- case 3:
43
- const polygon = parsePolygon(view, offset, dimension, littleEndian);
762
+ case WKBGeometryType.Polygon:
763
+ const polygon = parsePolygon2(dataView, offset, dimensions, littleEndian);
44
764
  return polygon.geometry;
45
- case 4:
46
- const multiPoint = parseMultiPoint(view, offset, dimension, littleEndian);
765
+ case WKBGeometryType.MultiPoint:
766
+ const multiPoint = parseMultiPoint2(dataView, offset, dimensions, littleEndian);
47
767
  multiPoint.type = "Point";
48
768
  return multiPoint;
49
- case 5:
50
- const multiLine = parseMultiLineString(view, offset, dimension, littleEndian);
769
+ case WKBGeometryType.MultiLineString:
770
+ const multiLine = parseMultiLineString2(dataView, offset, dimensions, littleEndian);
51
771
  multiLine.type = "LineString";
52
772
  return multiLine;
53
- case 6:
54
- const multiPolygon = parseMultiPolygon(view, offset, dimension, littleEndian);
773
+ case WKBGeometryType.MultiPolygon:
774
+ const multiPolygon = parseMultiPolygon2(dataView, offset, dimensions, littleEndian);
55
775
  multiPolygon.type = "Polygon";
56
776
  return multiPolygon;
57
777
  default:
58
778
  throw new Error(`WKB: Unsupported geometry type: ${geometryType}`);
59
779
  }
60
780
  }
61
- function parsePoint(view, offset, dimension, littleEndian) {
781
+ function parsePoint2(dataView, offset, dimension, littleEndian) {
62
782
  const positions = new Float64Array(dimension);
63
783
  for (let i = 0; i < dimension; i++) {
64
- positions[i] = view.getFloat64(offset, littleEndian);
784
+ positions[i] = dataView.getFloat64(offset, littleEndian);
65
785
  offset += 8;
66
786
  }
67
787
  return {
@@ -69,12 +789,12 @@
69
789
  offset
70
790
  };
71
791
  }
72
- function parseLineString(view, offset, dimension, littleEndian) {
73
- const nPoints = view.getUint32(offset, littleEndian);
792
+ function parseLineString2(dataView, offset, dimension, littleEndian) {
793
+ const nPoints = dataView.getUint32(offset, littleEndian);
74
794
  offset += 4;
75
795
  const positions = new Float64Array(nPoints * dimension);
76
796
  for (let i = 0; i < nPoints * dimension; i++) {
77
- positions[i] = view.getFloat64(offset, littleEndian);
797
+ positions[i] = dataView.getFloat64(offset, littleEndian);
78
798
  offset += 8;
79
799
  }
80
800
  const pathIndices = [0];
@@ -90,12 +810,12 @@
90
810
  offset
91
811
  };
92
812
  }
93
- function parsePolygon(view, offset, dimension, littleEndian) {
94
- const nRings = view.getUint32(offset, littleEndian);
813
+ function parsePolygon2(dataView, offset, dimension, littleEndian) {
814
+ const nRings = dataView.getUint32(offset, littleEndian);
95
815
  offset += 4;
96
816
  const rings = [];
97
817
  for (let i = 0; i < nRings; i++) {
98
- const parsed = parseLineString(view, offset, dimension, littleEndian);
818
+ const parsed = parseLineString2(dataView, offset, dimension, littleEndian);
99
819
  const { positions } = parsed.geometry;
100
820
  offset = parsed.offset;
101
821
  rings.push(positions.value);
@@ -120,52 +840,52 @@
120
840
  offset
121
841
  };
122
842
  }
123
- function parseMultiPoint(view, offset, dimension, littleEndian) {
124
- const nPoints = view.getUint32(offset, littleEndian);
843
+ function parseMultiPoint2(dataView, offset, dimension, littleEndian) {
844
+ const nPoints = dataView.getUint32(offset, littleEndian);
125
845
  offset += 4;
126
846
  const binaryPointGeometries = [];
127
847
  for (let i = 0; i < nPoints; i++) {
128
- const littleEndianPoint = view.getUint8(offset) === 1;
848
+ const littleEndianPoint = dataView.getUint8(offset) === 1;
129
849
  offset++;
130
- if (view.getUint32(offset, littleEndianPoint) % 1e3 !== 1) {
850
+ if (dataView.getUint32(offset, littleEndianPoint) % 1e3 !== 1) {
131
851
  throw new Error("WKB: Inner geometries of MultiPoint not of type Point");
132
852
  }
133
853
  offset += 4;
134
- const parsed = parsePoint(view, offset, dimension, littleEndianPoint);
854
+ const parsed = parsePoint2(dataView, offset, dimension, littleEndianPoint);
135
855
  offset = parsed.offset;
136
856
  binaryPointGeometries.push(parsed.geometry);
137
857
  }
138
858
  return concatenateBinaryPointGeometries(binaryPointGeometries, dimension);
139
859
  }
140
- function parseMultiLineString(view, offset, dimension, littleEndian) {
141
- const nLines = view.getUint32(offset, littleEndian);
860
+ function parseMultiLineString2(dataView, offset, dimension, littleEndian) {
861
+ const nLines = dataView.getUint32(offset, littleEndian);
142
862
  offset += 4;
143
863
  const binaryLineGeometries = [];
144
864
  for (let i = 0; i < nLines; i++) {
145
- const littleEndianLine = view.getUint8(offset) === 1;
865
+ const littleEndianLine = dataView.getUint8(offset) === 1;
146
866
  offset++;
147
- if (view.getUint32(offset, littleEndianLine) % 1e3 !== 2) {
867
+ if (dataView.getUint32(offset, littleEndianLine) % 1e3 !== 2) {
148
868
  throw new Error("WKB: Inner geometries of MultiLineString not of type LineString");
149
869
  }
150
870
  offset += 4;
151
- const parsed = parseLineString(view, offset, dimension, littleEndianLine);
871
+ const parsed = parseLineString2(dataView, offset, dimension, littleEndianLine);
152
872
  offset = parsed.offset;
153
873
  binaryLineGeometries.push(parsed.geometry);
154
874
  }
155
875
  return concatenateBinaryLineGeometries(binaryLineGeometries, dimension);
156
876
  }
157
- function parseMultiPolygon(view, offset, dimension, littleEndian) {
158
- const nPolygons = view.getUint32(offset, littleEndian);
877
+ function parseMultiPolygon2(dataView, offset, dimension, littleEndian) {
878
+ const nPolygons = dataView.getUint32(offset, littleEndian);
159
879
  offset += 4;
160
880
  const binaryPolygonGeometries = [];
161
881
  for (let i = 0; i < nPolygons; i++) {
162
- const littleEndianPolygon = view.getUint8(offset) === 1;
882
+ const littleEndianPolygon = dataView.getUint8(offset) === 1;
163
883
  offset++;
164
- if (view.getUint32(offset, littleEndianPolygon) % 1e3 !== 3) {
884
+ if (dataView.getUint32(offset, littleEndianPolygon) % 1e3 !== 3) {
165
885
  throw new Error("WKB: Inner geometries of MultiPolygon not of type Polygon");
166
886
  }
167
887
  offset += 4;
168
- const parsed = parsePolygon(view, offset, dimension, littleEndianPolygon);
888
+ const parsed = parsePolygon2(dataView, offset, dimension, littleEndianPolygon);
169
889
  offset = parsed.offset;
170
890
  binaryPolygonGeometries.push(parsed.geometry);
171
891
  }
@@ -194,374 +914,77 @@
194
914
  const polygons = [];
195
915
  const primitivePolygons = [];
196
916
  for (const binaryPolygon of binaryPolygonGeometries) {
197
- const { positions, primitivePolygonIndices: primitivePolygonIndices2 } = binaryPolygon;
198
- polygons.push(positions.value);
199
- primitivePolygons.push(primitivePolygonIndices2.value);
200
- }
201
- const concatenatedPositions = new Float64Array(concatTypedArrays(polygons).buffer);
202
- const polygonIndices = polygons.map((p) => p.length / dimension).map(cumulativeSum(0));
203
- polygonIndices.unshift(0);
204
- const primitivePolygonIndices = [0];
205
- for (const primitivePolygon of primitivePolygons) {
206
- primitivePolygonIndices.push(...primitivePolygon.filter((x) => x > 0).map((x) => x + primitivePolygonIndices[primitivePolygonIndices.length - 1]));
207
- }
208
- return {
209
- type: "Polygon",
210
- positions: { value: concatenatedPositions, size: dimension },
211
- polygonIndices: { value: new Uint16Array(polygonIndices), size: 1 },
212
- primitivePolygonIndices: { value: new Uint16Array(primitivePolygonIndices), size: 1 }
213
- };
214
- }
215
- function concatTypedArrays(arrays) {
216
- let byteLength = 0;
217
- for (let i = 0; i < arrays.length; ++i) {
218
- byteLength += arrays[i].byteLength;
219
- }
220
- const buffer = new Uint8Array(byteLength);
221
- let byteOffset = 0;
222
- for (let i = 0; i < arrays.length; ++i) {
223
- const data = new Uint8Array(arrays[i].buffer);
224
- byteLength = data.length;
225
- for (let j = 0; j < byteLength; ++j) {
226
- buffer[byteOffset++] = data[j];
227
- }
228
- }
229
- return buffer;
230
- }
231
- var NUM_DIMENSIONS, cumulativeSum;
232
- var init_parse_wkb = __esm({
233
- "src/lib/parse-wkb.ts"() {
234
- NUM_DIMENSIONS = {
235
- 0: 2,
236
- 1: 3,
237
- 2: 3,
238
- 3: 4
239
- };
240
- cumulativeSum = (sum) => (value) => sum += value;
241
- }
242
- });
243
-
244
- // src/wkb-loader.ts
245
- var WKBWorkerLoader, WKBLoader;
246
- var init_wkb_loader = __esm({
247
- "src/wkb-loader.ts"() {
248
- init_version();
249
- init_parse_wkb();
250
- WKBWorkerLoader = {
251
- name: "WKB",
252
- id: "wkb",
253
- module: "wkt",
254
- version: VERSION,
255
- worker: true,
256
- category: "geometry",
257
- extensions: ["wkb"],
258
- mimeTypes: [],
259
- options: {
260
- wkb: {}
261
- }
262
- };
263
- WKBLoader = {
264
- ...WKBWorkerLoader,
265
- parse: async (arrayBuffer) => parseWKB(arrayBuffer),
266
- parseSync: parseWKB
267
- };
268
- }
269
- });
270
-
271
- // src/lib/parse-wkt.ts
272
- function parseWKT(input) {
273
- const parts = input.split(";");
274
- let _ = parts.pop();
275
- const srid = (parts.shift() || "").split("=").pop();
276
- let i = 0;
277
- function $(re) {
278
- const match = _.substring(i).match(re);
279
- if (!match)
280
- return null;
281
- else {
282
- i += match[0].length;
283
- return match[0];
284
- }
285
- }
286
- function crs(obj) {
287
- if (obj && srid.match(/\d+/)) {
288
- obj.crs = {
289
- type: "name",
290
- properties: {
291
- name: "urn:ogc:def:crs:EPSG::" + srid
292
- }
293
- };
294
- }
295
- return obj;
296
- }
297
- function white() {
298
- $(/^\s*/);
299
- }
300
- function multicoords() {
301
- white();
302
- let depth = 0;
303
- const rings = [];
304
- const stack = [rings];
305
- let pointer = rings;
306
- let elem;
307
- while (elem = $(/^(\()/) || $(/^(\))/) || $(/^(,)/) || $(tuples)) {
308
- if (elem === "(") {
309
- stack.push(pointer);
310
- pointer = [];
311
- stack[stack.length - 1].push(pointer);
312
- depth++;
313
- } else if (elem === ")") {
314
- if (pointer.length === 0)
315
- return null;
316
- pointer = stack.pop();
317
- if (!pointer)
318
- return null;
319
- depth--;
320
- if (depth === 0)
321
- break;
322
- } else if (elem === ",") {
323
- pointer = [];
324
- stack[stack.length - 1].push(pointer);
325
- } else if (!elem.split(/\s/g).some(isNaN)) {
326
- Array.prototype.push.apply(pointer, elem.split(/\s/g).map(parseFloat));
327
- } else {
328
- return null;
329
- }
330
- white();
331
- }
332
- if (depth !== 0)
333
- return null;
334
- return rings;
335
- }
336
- function coords() {
337
- const list = [];
338
- let item;
339
- let pt;
340
- while (pt = $(tuples) || $(/^(,)/)) {
341
- if (pt === ",") {
342
- list.push(item);
343
- item = [];
344
- } else if (!pt.split(/\s/g).some(isNaN)) {
345
- if (!item)
346
- item = [];
347
- Array.prototype.push.apply(item, pt.split(/\s/g).map(parseFloat));
348
- }
349
- white();
350
- }
351
- if (item)
352
- list.push(item);
353
- else
354
- return null;
355
- return list.length ? list : null;
356
- }
357
- function point() {
358
- if (!$(/^(point(\sz)?)/i))
359
- return null;
360
- white();
361
- if (!$(/^(\()/))
362
- return null;
363
- const c = coords();
364
- if (!c)
365
- return null;
366
- white();
367
- if (!$(/^(\))/))
368
- return null;
369
- return {
370
- type: "Point",
371
- coordinates: c[0]
372
- };
373
- }
374
- function multipoint() {
375
- if (!$(/^(multipoint)/i))
376
- return null;
377
- white();
378
- const newCoordsFormat = _.substring(_.indexOf("(") + 1, _.length - 1).replace(/\(/g, "").replace(/\)/g, "");
379
- _ = "MULTIPOINT (" + newCoordsFormat + ")";
380
- const c = multicoords();
381
- if (!c)
382
- return null;
383
- white();
384
- return {
385
- type: "MultiPoint",
386
- coordinates: c
387
- };
388
- }
389
- function multilinestring() {
390
- if (!$(/^(multilinestring)/i))
391
- return null;
392
- white();
393
- const c = multicoords();
394
- if (!c)
395
- return null;
396
- white();
397
- return {
398
- type: "MultiLineString",
399
- coordinates: c
400
- };
401
- }
402
- function linestring() {
403
- if (!$(/^(linestring(\sz)?)/i))
404
- return null;
405
- white();
406
- if (!$(/^(\()/))
407
- return null;
408
- const c = coords();
409
- if (!c)
410
- return null;
411
- if (!$(/^(\))/))
412
- return null;
413
- return {
414
- type: "LineString",
415
- coordinates: c
416
- };
417
- }
418
- function polygon() {
419
- if (!$(/^(polygon(\sz)?)/i))
420
- return null;
421
- white();
422
- const c = multicoords();
423
- if (!c)
424
- return null;
425
- return {
426
- type: "Polygon",
427
- coordinates: c
428
- };
429
- }
430
- function multipolygon() {
431
- if (!$(/^(multipolygon)/i))
432
- return null;
433
- white();
434
- const c = multicoords();
435
- if (!c)
436
- return null;
437
- return {
438
- type: "MultiPolygon",
439
- coordinates: c
440
- };
441
- }
442
- function geometrycollection() {
443
- const geometries = [];
444
- let geometry;
445
- if (!$(/^(geometrycollection)/i))
446
- return null;
447
- white();
448
- if (!$(/^(\()/))
449
- return null;
450
- while (geometry = root()) {
451
- geometries.push(geometry);
452
- white();
453
- $(/^(,)/);
454
- white();
455
- }
456
- if (!$(/^(\))/))
457
- return null;
458
- return {
459
- type: "GeometryCollection",
460
- geometries
461
- };
462
- }
463
- function root() {
464
- return point() || linestring() || polygon() || multipoint() || multilinestring() || multipolygon() || geometrycollection();
465
- }
466
- return crs(root());
467
- }
468
- var numberRegexp, tuples;
469
- var init_parse_wkt = __esm({
470
- "src/lib/parse-wkt.ts"() {
471
- numberRegexp = /[-+]?([0-9]*\.[0-9]+|[0-9]+)([eE][-+]?[0-9]+)?/;
472
- tuples = new RegExp("^" + numberRegexp.source + "(\\s" + numberRegexp.source + "){1,}");
473
- }
474
- });
475
-
476
- // src/wkt-loader.ts
477
- var WKTWorkerLoader, WKTLoader;
478
- var init_wkt_loader = __esm({
479
- "src/wkt-loader.ts"() {
480
- init_version();
481
- init_parse_wkt();
482
- WKTWorkerLoader = {
483
- name: "WKT (Well-Known Text)",
484
- id: "wkt",
485
- module: "wkt",
486
- version: VERSION,
487
- worker: true,
488
- extensions: ["wkt"],
489
- mimeTypes: ["text/plain"],
490
- category: "geometry",
491
- text: true,
492
- options: {
493
- wkt: {}
494
- }
495
- };
496
- WKTLoader = {
497
- ...WKTWorkerLoader,
498
- parse: async (arrayBuffer) => parseWKT(new TextDecoder().decode(arrayBuffer)),
499
- parseTextSync: parseWKT
500
- };
501
- }
502
- });
503
-
504
- // src/lib/encode-wkt.ts
505
- function encodeWKT(geometry) {
506
- if (geometry.type === "Feature") {
507
- geometry = geometry.geometry;
508
- }
509
- switch (geometry.type) {
510
- case "Point":
511
- return `POINT ${wrapParens(pairWKT(geometry.coordinates))}`;
512
- case "LineString":
513
- return `LINESTRING ${wrapParens(ringWKT(geometry.coordinates))}`;
514
- case "Polygon":
515
- return `POLYGON ${wrapParens(ringsWKT(geometry.coordinates))}`;
516
- case "MultiPoint":
517
- return `MULTIPOINT ${wrapParens(ringWKT(geometry.coordinates))}`;
518
- case "MultiPolygon":
519
- return `MULTIPOLYGON ${wrapParens(multiRingsWKT(geometry.coordinates))}`;
520
- case "MultiLineString":
521
- return `MULTILINESTRING ${wrapParens(ringsWKT(geometry.coordinates))}`;
522
- case "GeometryCollection":
523
- return `GEOMETRYCOLLECTION ${wrapParens(geometry.geometries.map(encodeWKT).join(", "))}`;
524
- default:
525
- throw new Error("stringify requires a valid GeoJSON Feature or geometry object as input");
526
- }
527
- }
528
- function pairWKT(c) {
529
- return c.join(" ");
530
- }
531
- function ringWKT(r) {
532
- return r.map(pairWKT).join(", ");
533
- }
534
- function ringsWKT(r) {
535
- return r.map(ringWKT).map(wrapParens).join(", ");
536
- }
537
- function multiRingsWKT(r) {
538
- return r.map(ringsWKT).map(wrapParens).join(", ");
917
+ const { positions, primitivePolygonIndices: primitivePolygonIndices2 } = binaryPolygon;
918
+ polygons.push(positions.value);
919
+ primitivePolygons.push(primitivePolygonIndices2.value);
920
+ }
921
+ const concatenatedPositions = new Float64Array(concatTypedArrays(polygons).buffer);
922
+ const polygonIndices = polygons.map((p) => p.length / dimension).map(cumulativeSum(0));
923
+ polygonIndices.unshift(0);
924
+ const primitivePolygonIndices = [0];
925
+ for (const primitivePolygon of primitivePolygons) {
926
+ primitivePolygonIndices.push(...primitivePolygon.filter((x) => x > 0).map((x) => x + primitivePolygonIndices[primitivePolygonIndices.length - 1]));
927
+ }
928
+ return {
929
+ type: "Polygon",
930
+ positions: { value: concatenatedPositions, size: dimension },
931
+ polygonIndices: { value: new Uint16Array(polygonIndices), size: 1 },
932
+ primitivePolygonIndices: { value: new Uint16Array(primitivePolygonIndices), size: 1 }
933
+ };
539
934
  }
540
- function wrapParens(s) {
541
- return `(${s})`;
935
+ function concatTypedArrays(arrays) {
936
+ let byteLength = 0;
937
+ for (let i = 0; i < arrays.length; ++i) {
938
+ byteLength += arrays[i].byteLength;
939
+ }
940
+ const buffer = new Uint8Array(byteLength);
941
+ let byteOffset = 0;
942
+ for (let i = 0; i < arrays.length; ++i) {
943
+ const data = new Uint8Array(arrays[i].buffer);
944
+ byteLength = data.length;
945
+ for (let j = 0; j < byteLength; ++j) {
946
+ buffer[byteOffset++] = data[j];
947
+ }
948
+ }
949
+ return buffer;
542
950
  }
543
- var init_encode_wkt = __esm({
544
- "src/lib/encode-wkt.ts"() {
951
+ var cumulativeSum;
952
+ var init_parse_wkb = __esm({
953
+ "src/lib/parse-wkb.ts"() {
954
+ init_src();
955
+ init_parse_wkb_header();
956
+ cumulativeSum = (sum) => (value) => sum += value;
545
957
  }
546
958
  });
547
959
 
548
- // src/wkt-writer.ts
549
- var WKTWriter;
550
- var init_wkt_writer = __esm({
551
- "src/wkt-writer.ts"() {
960
+ // src/wkb-loader.ts
961
+ var WKBWorkerLoader, WKBLoader;
962
+ var init_wkb_loader = __esm({
963
+ "src/wkb-loader.ts"() {
552
964
  init_version();
553
- init_encode_wkt();
554
- WKTWriter = {
555
- name: "WKT (Well Known Text)",
556
- id: "wkt",
965
+ init_parse_wkb();
966
+ init_parse_wkb_header();
967
+ WKBWorkerLoader = {
968
+ name: "WKB",
969
+ id: "wkb",
557
970
  module: "wkt",
558
971
  version: VERSION,
559
- extensions: ["wkt"],
560
- encode: encodeWKT,
972
+ worker: true,
973
+ category: "geometry",
974
+ extensions: ["wkb"],
975
+ mimeTypes: [],
976
+ tests: [isWKB],
561
977
  options: {
562
- wkt: {}
978
+ wkb: {
979
+ shape: "binary-geometry"
980
+ }
563
981
  }
564
982
  };
983
+ WKBLoader = {
984
+ ...WKBWorkerLoader,
985
+ parse: async (arrayBuffer) => parseWKB(arrayBuffer),
986
+ parseSync: parseWKB
987
+ };
565
988
  }
566
989
  });
567
990
 
@@ -958,29 +1381,647 @@
958
1381
  }
959
1382
  });
960
1383
 
1384
+ // src/lib/utils/hex-transcoder.ts
1385
+ function encodeHex(array) {
1386
+ const length = array.length;
1387
+ let string = "";
1388
+ let i = 0;
1389
+ while (i < length) {
1390
+ string += encodeLookup[array[i++]];
1391
+ }
1392
+ return string;
1393
+ }
1394
+ function decodeHex(string) {
1395
+ const sizeof = string.length >> 1;
1396
+ const length = sizeof << 1;
1397
+ const array = new Uint8Array(sizeof);
1398
+ let n = 0;
1399
+ let i = 0;
1400
+ while (i < length) {
1401
+ array[n++] = decodeLookup[string.charCodeAt(i++)] << 4 | decodeLookup[string.charCodeAt(i++)];
1402
+ }
1403
+ return array;
1404
+ }
1405
+ var alphabet, encodeLookup, decodeLookup;
1406
+ var init_hex_transcoder = __esm({
1407
+ "src/lib/utils/hex-transcoder.ts"() {
1408
+ alphabet = "0123456789abcdef";
1409
+ encodeLookup = [];
1410
+ decodeLookup = [];
1411
+ for (let i = 0; i < 256; i++) {
1412
+ encodeLookup[i] = alphabet[i >> 4 & 15] + alphabet[i & 15];
1413
+ if (i < 16) {
1414
+ if (i < 10) {
1415
+ decodeLookup[48 + i] = i;
1416
+ } else {
1417
+ decodeLookup[97 - 10 + i] = i;
1418
+ }
1419
+ }
1420
+ }
1421
+ }
1422
+ });
1423
+
1424
+ // src/hex-wkb-loader.ts
1425
+ function parseHexWKB(text, options) {
1426
+ const uint8Array = decodeHex(text);
1427
+ const binaryGeometry = WKBLoader.parseSync?.(uint8Array.buffer, options);
1428
+ return binaryGeometry;
1429
+ }
1430
+ function isHexWKB(string) {
1431
+ if (!string) {
1432
+ return false;
1433
+ }
1434
+ if (string.length < 10 || string.length % 2 !== 0) {
1435
+ return false;
1436
+ }
1437
+ if (!string.startsWith("00") && !string.startsWith("01")) {
1438
+ return false;
1439
+ }
1440
+ return /^[0-9a-fA-F]+$/.test(string.slice(2));
1441
+ }
1442
+ var HexWKBLoader;
1443
+ var init_hex_wkb_loader = __esm({
1444
+ "src/hex-wkb-loader.ts"() {
1445
+ init_wkb_loader();
1446
+ init_version();
1447
+ init_hex_transcoder();
1448
+ HexWKBLoader = {
1449
+ name: "Hexadecimal WKB",
1450
+ id: "wkb",
1451
+ module: "wkt",
1452
+ version: VERSION,
1453
+ worker: true,
1454
+ category: "geometry",
1455
+ extensions: ["wkb"],
1456
+ mimeTypes: [],
1457
+ options: WKBLoader.options,
1458
+ text: true,
1459
+ testText: isHexWKB,
1460
+ parse: async (arrayBuffer) => parseHexWKB(new TextDecoder().decode(arrayBuffer)),
1461
+ parseTextSync: parseHexWKB
1462
+ };
1463
+ }
1464
+ });
1465
+
1466
+ // src/lib/utils/binary-reader.ts
1467
+ var BinaryReader;
1468
+ var init_binary_reader = __esm({
1469
+ "src/lib/utils/binary-reader.ts"() {
1470
+ BinaryReader = class {
1471
+ constructor(arrayBuffer, isBigEndian = false) {
1472
+ this.arrayBuffer = arrayBuffer;
1473
+ this.dataView = new DataView(arrayBuffer);
1474
+ this.byteOffset = 0;
1475
+ this.littleEndian = !isBigEndian;
1476
+ }
1477
+ readUInt8() {
1478
+ const value = this.dataView.getUint8(this.byteOffset);
1479
+ this.byteOffset += 1;
1480
+ return value;
1481
+ }
1482
+ readUInt16() {
1483
+ const value = this.dataView.getUint16(this.byteOffset, this.littleEndian);
1484
+ this.byteOffset += 2;
1485
+ return value;
1486
+ }
1487
+ readUInt32() {
1488
+ const value = this.dataView.getUint32(this.byteOffset, this.littleEndian);
1489
+ this.byteOffset += 4;
1490
+ return value;
1491
+ }
1492
+ readInt8() {
1493
+ const value = this.dataView.getInt8(this.byteOffset);
1494
+ this.byteOffset += 1;
1495
+ return value;
1496
+ }
1497
+ readInt16() {
1498
+ const value = this.dataView.getInt16(this.byteOffset, this.littleEndian);
1499
+ this.byteOffset += 2;
1500
+ return value;
1501
+ }
1502
+ readInt32() {
1503
+ const value = this.dataView.getInt32(this.byteOffset, this.littleEndian);
1504
+ this.byteOffset += 4;
1505
+ return value;
1506
+ }
1507
+ readFloat() {
1508
+ const value = this.dataView.getFloat32(this.byteOffset, this.littleEndian);
1509
+ this.byteOffset += 4;
1510
+ return value;
1511
+ }
1512
+ readDouble() {
1513
+ const value = this.dataView.getFloat64(this.byteOffset, this.littleEndian);
1514
+ this.byteOffset += 8;
1515
+ return value;
1516
+ }
1517
+ readVarInt() {
1518
+ let result = 0;
1519
+ let bytesRead = 0;
1520
+ let nextByte;
1521
+ do {
1522
+ nextByte = this.dataView.getUint8(this.byteOffset + bytesRead);
1523
+ result += (nextByte & 127) << 7 * bytesRead;
1524
+ bytesRead++;
1525
+ } while (nextByte >= 128);
1526
+ this.byteOffset += bytesRead;
1527
+ return result;
1528
+ }
1529
+ };
1530
+ }
1531
+ });
1532
+
1533
+ // src/lib/parse-twkb.ts
1534
+ function isTWKB(arrayBuffer) {
1535
+ const binaryReader = new BinaryReader(arrayBuffer);
1536
+ const type = binaryReader.readUInt8();
1537
+ const geometryType = type & 15;
1538
+ if (geometryType < 1 || geometryType > 7) {
1539
+ return false;
1540
+ }
1541
+ return true;
1542
+ }
1543
+ function parseTWKBGeometry(arrayBuffer) {
1544
+ const binaryReader = new BinaryReader(arrayBuffer);
1545
+ const type = binaryReader.readUInt8();
1546
+ const metadataHeader = binaryReader.readUInt8();
1547
+ const geometryType = type & 15;
1548
+ const precision = zigZagDecode(type >> 4);
1549
+ const hasExtendedPrecision = Boolean(metadataHeader >> 3 & 1);
1550
+ let hasZ = false;
1551
+ let hasM = false;
1552
+ let zPrecision = 0;
1553
+ let zPrecisionFactor = 1;
1554
+ let mPrecision = 0;
1555
+ let mPrecisionFactor = 1;
1556
+ if (hasExtendedPrecision) {
1557
+ const extendedPrecision = binaryReader.readUInt8();
1558
+ hasZ = (extendedPrecision & 1) === 1;
1559
+ hasM = (extendedPrecision & 2) === 2;
1560
+ zPrecision = zigZagDecode((extendedPrecision & 28) >> 2);
1561
+ zPrecisionFactor = Math.pow(10, zPrecision);
1562
+ mPrecision = zigZagDecode((extendedPrecision & 224) >> 5);
1563
+ mPrecisionFactor = Math.pow(10, mPrecision);
1564
+ }
1565
+ const context = {
1566
+ precision,
1567
+ precisionFactor: Math.pow(10, precision),
1568
+ hasBoundingBox: Boolean(metadataHeader >> 0 & 1),
1569
+ hasSizeAttribute: Boolean(metadataHeader >> 1 & 1),
1570
+ hasIdList: Boolean(metadataHeader >> 2 & 1),
1571
+ hasExtendedPrecision,
1572
+ isEmpty: Boolean(metadataHeader >> 4 & 1),
1573
+ hasZ,
1574
+ hasM,
1575
+ zPrecision,
1576
+ zPrecisionFactor,
1577
+ mPrecision,
1578
+ mPrecisionFactor
1579
+ };
1580
+ if (context.hasSizeAttribute) {
1581
+ binaryReader.readVarInt();
1582
+ }
1583
+ if (context.hasBoundingBox) {
1584
+ let dimensions = 2;
1585
+ if (context.hasZ) {
1586
+ dimensions++;
1587
+ }
1588
+ if (context.hasM) {
1589
+ dimensions++;
1590
+ }
1591
+ for (let i = 0; i < dimensions; i++) {
1592
+ binaryReader.readVarInt();
1593
+ binaryReader.readVarInt();
1594
+ }
1595
+ }
1596
+ return parseGeometry2(binaryReader, context, geometryType);
1597
+ }
1598
+ function parseGeometry2(binaryReader, context, geometryType) {
1599
+ switch (geometryType) {
1600
+ case WKBGeometryType.Point:
1601
+ return parsePoint3(binaryReader, context);
1602
+ case WKBGeometryType.LineString:
1603
+ return parseLineString3(binaryReader, context);
1604
+ case WKBGeometryType.Polygon:
1605
+ return parsePolygon3(binaryReader, context);
1606
+ case WKBGeometryType.MultiPoint:
1607
+ return parseMultiPoint3(binaryReader, context);
1608
+ case WKBGeometryType.MultiLineString:
1609
+ return parseMultiLineString3(binaryReader, context);
1610
+ case WKBGeometryType.MultiPolygon:
1611
+ return parseMultiPolygon3(binaryReader, context);
1612
+ case WKBGeometryType.GeometryCollection:
1613
+ return parseGeometryCollection2(binaryReader, context);
1614
+ default:
1615
+ throw new Error(`GeometryType ${geometryType} not supported`);
1616
+ }
1617
+ }
1618
+ function parsePoint3(reader, context) {
1619
+ if (context.isEmpty) {
1620
+ return { type: "Point", coordinates: [] };
1621
+ }
1622
+ return { type: "Point", coordinates: readFirstPoint(reader, context) };
1623
+ }
1624
+ function parseLineString3(reader, context) {
1625
+ if (context.isEmpty) {
1626
+ return { type: "LineString", coordinates: [] };
1627
+ }
1628
+ const pointCount = reader.readVarInt();
1629
+ const previousPoint = makePreviousPoint(context);
1630
+ const points = [];
1631
+ for (let i = 0; i < pointCount; i++) {
1632
+ points.push(parseNextPoint(reader, context, previousPoint));
1633
+ }
1634
+ return { type: "LineString", coordinates: points };
1635
+ }
1636
+ function parsePolygon3(reader, context) {
1637
+ if (context.isEmpty) {
1638
+ return { type: "Polygon", coordinates: [] };
1639
+ }
1640
+ const ringCount = reader.readVarInt();
1641
+ const previousPoint = makePreviousPoint(context);
1642
+ const exteriorRingLength = reader.readVarInt();
1643
+ const exteriorRing = [];
1644
+ for (let i = 0; i < exteriorRingLength; i++) {
1645
+ exteriorRing.push(parseNextPoint(reader, context, previousPoint));
1646
+ }
1647
+ const polygon = [exteriorRing];
1648
+ for (let i = 1; i < ringCount; i++) {
1649
+ const interiorRingCount = reader.readVarInt();
1650
+ const interiorRing = [];
1651
+ for (let j = 0; j < interiorRingCount; j++) {
1652
+ interiorRing.push(parseNextPoint(reader, context, previousPoint));
1653
+ }
1654
+ polygon.push(interiorRing);
1655
+ }
1656
+ return { type: "Polygon", coordinates: polygon };
1657
+ }
1658
+ function parseMultiPoint3(reader, context) {
1659
+ if (context.isEmpty) {
1660
+ return { type: "MultiPoint", coordinates: [] };
1661
+ }
1662
+ const previousPoint = makePreviousPoint(context);
1663
+ const pointCount = reader.readVarInt();
1664
+ const coordinates = [];
1665
+ for (let i = 0; i < pointCount; i++) {
1666
+ coordinates.push(parseNextPoint(reader, context, previousPoint));
1667
+ }
1668
+ return { type: "MultiPoint", coordinates };
1669
+ }
1670
+ function parseMultiLineString3(reader, context) {
1671
+ if (context.isEmpty) {
1672
+ return { type: "MultiLineString", coordinates: [] };
1673
+ }
1674
+ const previousPoint = makePreviousPoint(context);
1675
+ const lineStringCount = reader.readVarInt();
1676
+ const coordinates = [];
1677
+ for (let i = 0; i < lineStringCount; i++) {
1678
+ const pointCount = reader.readVarInt();
1679
+ const lineString = [];
1680
+ for (let j = 0; j < pointCount; j++) {
1681
+ lineString.push(parseNextPoint(reader, context, previousPoint));
1682
+ }
1683
+ coordinates.push(lineString);
1684
+ }
1685
+ return { type: "MultiLineString", coordinates };
1686
+ }
1687
+ function parseMultiPolygon3(reader, context) {
1688
+ if (context.isEmpty) {
1689
+ return { type: "MultiPolygon", coordinates: [] };
1690
+ }
1691
+ const previousPoint = makePreviousPoint(context);
1692
+ const polygonCount = reader.readVarInt();
1693
+ const polygons = [];
1694
+ for (let i = 0; i < polygonCount; i++) {
1695
+ const ringCount = reader.readVarInt();
1696
+ const exteriorPointCount = reader.readVarInt();
1697
+ const exteriorRing = [];
1698
+ for (let j = 0; j < exteriorPointCount; j++) {
1699
+ exteriorRing.push(parseNextPoint(reader, context, previousPoint));
1700
+ }
1701
+ const polygon = exteriorRing ? [exteriorRing] : [];
1702
+ for (let j = 1; j < ringCount; j++) {
1703
+ const interiorRing = [];
1704
+ const interiorRingLength = reader.readVarInt();
1705
+ for (let k = 0; k < interiorRingLength; k++) {
1706
+ interiorRing.push(parseNextPoint(reader, context, previousPoint));
1707
+ }
1708
+ polygon.push(interiorRing);
1709
+ }
1710
+ polygons.push(polygon);
1711
+ }
1712
+ return { type: "MultiPolygon", coordinates: polygons };
1713
+ }
1714
+ function parseGeometryCollection2(reader, context) {
1715
+ return { type: "GeometryCollection", geometries: [] };
1716
+ }
1717
+ function zigZagDecode(value) {
1718
+ return value >> 1 ^ -(value & 1);
1719
+ }
1720
+ function makePointCoordinates(x, y, z, m) {
1721
+ return z !== void 0 ? m !== void 0 ? [x, y, z, m] : [x, y, z] : [x, y];
1722
+ }
1723
+ function makePreviousPoint(context) {
1724
+ return makePointCoordinates(0, 0, context.hasZ ? 0 : void 0, context.hasM ? 0 : void 0);
1725
+ }
1726
+ function readFirstPoint(reader, context) {
1727
+ const x = zigZagDecode(reader.readVarInt()) / context.precisionFactor;
1728
+ const y = zigZagDecode(reader.readVarInt()) / context.precisionFactor;
1729
+ const z = context.hasZ ? zigZagDecode(reader.readVarInt()) / context.zPrecisionFactor : void 0;
1730
+ const m = context.hasM ? zigZagDecode(reader.readVarInt()) / context.mPrecisionFactor : void 0;
1731
+ return makePointCoordinates(x, y, z, m);
1732
+ }
1733
+ function parseNextPoint(reader, context, previousPoint) {
1734
+ previousPoint[0] += zigZagDecode(reader.readVarInt()) / context.precisionFactor;
1735
+ previousPoint[1] += zigZagDecode(reader.readVarInt()) / context.precisionFactor;
1736
+ if (context.hasZ) {
1737
+ previousPoint[2] += zigZagDecode(reader.readVarInt()) / context.zPrecisionFactor;
1738
+ }
1739
+ if (context.hasM) {
1740
+ previousPoint[3] += zigZagDecode(reader.readVarInt()) / context.mPrecisionFactor;
1741
+ }
1742
+ return previousPoint.slice();
1743
+ }
1744
+ var init_parse_twkb = __esm({
1745
+ "src/lib/parse-twkb.ts"() {
1746
+ init_binary_reader();
1747
+ init_parse_wkb_header();
1748
+ }
1749
+ });
1750
+
1751
+ // src/twkb-loader.ts
1752
+ var TWKBWorkerLoader, TWKBLoader;
1753
+ var init_twkb_loader = __esm({
1754
+ "src/twkb-loader.ts"() {
1755
+ init_version();
1756
+ init_parse_twkb();
1757
+ TWKBWorkerLoader = {
1758
+ name: "TWKB (Tiny Well-Known Binary)",
1759
+ id: "twkb",
1760
+ module: "wkt",
1761
+ version: VERSION,
1762
+ worker: true,
1763
+ category: "geometry",
1764
+ extensions: ["twkb"],
1765
+ mimeTypes: [],
1766
+ tests: [isTWKB],
1767
+ options: {
1768
+ wkb: {
1769
+ shape: "binary-geometry"
1770
+ }
1771
+ }
1772
+ };
1773
+ TWKBLoader = {
1774
+ ...TWKBWorkerLoader,
1775
+ parse: async (arrayBuffer) => parseTWKBGeometry(arrayBuffer),
1776
+ parseSync: parseTWKBGeometry
1777
+ };
1778
+ }
1779
+ });
1780
+
1781
+ // src/lib/encode-twkb.ts
1782
+ function encodeTWKB(geometry, options) {
1783
+ const writer = new BinaryWriter(0, true);
1784
+ const context = {
1785
+ ...getTwkbPrecision(5, 0, 0),
1786
+ hasZ: options?.hasZ,
1787
+ hasM: options?.hasM
1788
+ };
1789
+ encodeGeometry(writer, geometry, context);
1790
+ return writer.arrayBuffer;
1791
+ }
1792
+ function encodeGeometry(writer, geometry, context) {
1793
+ switch (geometry.type) {
1794
+ case "Point":
1795
+ return encodePoint2(writer, context, geometry);
1796
+ case "LineString":
1797
+ return encodeLineString2(writer, context, geometry);
1798
+ case "Polygon":
1799
+ return encodePolygon2(writer, context, geometry);
1800
+ case "MultiPoint":
1801
+ return encodeMultiPoint2(writer, context, geometry);
1802
+ case "MultiLineString":
1803
+ return encodeMultiLineString2(writer, context, geometry);
1804
+ case "MultiPolygon":
1805
+ return encodeMultiPolygon2(writer, context, geometry);
1806
+ case "GeometryCollection":
1807
+ return encodeGeometryCollection2(writer, context, geometry);
1808
+ default:
1809
+ throw new Error("unsupported geometry type");
1810
+ }
1811
+ }
1812
+ function encodePoint2(writer, context, point) {
1813
+ const isEmpty = point.coordinates.length === 0 || point[0] === "undefined" || point[1] === "undefined";
1814
+ writeTwkbHeader(writer, context, WKBGeometryType.Point, isEmpty);
1815
+ if (!isEmpty) {
1816
+ const previousPoint = [0, 0, 0, 0];
1817
+ writeTwkbPoint(writer, context, point.coordinates, previousPoint);
1818
+ }
1819
+ }
1820
+ function encodeLineString2(writer, context, lineString) {
1821
+ const points = lineString.coordinates;
1822
+ const isEmpty = points.length === 0;
1823
+ writeTwkbHeader(writer, context, WKBGeometryType.LineString, isEmpty);
1824
+ if (!isEmpty) {
1825
+ writer.writeVarInt(points.length);
1826
+ const previousPoint = [0, 0, 0, 0];
1827
+ for (const point of points) {
1828
+ writeTwkbPoint(writer, context, point, previousPoint);
1829
+ }
1830
+ }
1831
+ return writer.arrayBuffer;
1832
+ }
1833
+ function encodePolygon2(writer, context, polygon) {
1834
+ const polygonRings = polygon.coordinates;
1835
+ const isEmpty = polygonRings.length === 0;
1836
+ writeTwkbHeader(writer, context, WKBGeometryType.Polygon, isEmpty);
1837
+ if (!isEmpty) {
1838
+ writer.writeVarInt(polygonRings.length);
1839
+ const previousPoint = [0, 0, 0, 0];
1840
+ for (const ring of polygonRings) {
1841
+ writer.writeVarInt(ring.length);
1842
+ for (const point of ring) {
1843
+ writeTwkbPoint(writer, context, previousPoint, point);
1844
+ }
1845
+ }
1846
+ }
1847
+ return writer.arrayBuffer;
1848
+ }
1849
+ function encodeMultiPoint2(writer, context, multiPoint) {
1850
+ const points = multiPoint.coordinates;
1851
+ const isEmpty = points.length === 0;
1852
+ writeTwkbHeader(writer, context, WKBGeometryType.MultiPoint, isEmpty);
1853
+ if (!isEmpty) {
1854
+ writer.writeVarInt(points.length);
1855
+ const previousPoint = [0, 0, 0, 0];
1856
+ for (let i = 0; i < points.length; i++) {
1857
+ writeTwkbPoint(writer, context, previousPoint, points[i]);
1858
+ }
1859
+ }
1860
+ }
1861
+ function encodeMultiLineString2(writer, context, multiLineStrings) {
1862
+ const lineStrings = multiLineStrings.coordinates;
1863
+ const isEmpty = lineStrings.length === 0;
1864
+ writeTwkbHeader(writer, context, WKBGeometryType.MultiLineString, isEmpty);
1865
+ if (!isEmpty) {
1866
+ writer.writeVarInt(lineStrings.length);
1867
+ const previousPoint = [0, 0, 0, 0];
1868
+ for (const lineString of lineStrings) {
1869
+ writer.writeVarInt(lineString.length);
1870
+ for (const point of lineString) {
1871
+ writeTwkbPoint(writer, context, previousPoint, point);
1872
+ }
1873
+ }
1874
+ }
1875
+ return writer.arrayBuffer;
1876
+ }
1877
+ function encodeMultiPolygon2(writer, context, multiPolygon) {
1878
+ const { coordinates } = multiPolygon;
1879
+ const isEmpty = coordinates.length === 0;
1880
+ writeTwkbHeader(writer, context, WKBGeometryType.MultiPolygon, isEmpty);
1881
+ if (!isEmpty) {
1882
+ const polygons = coordinates;
1883
+ writer.writeVarInt(polygons.length);
1884
+ const previousPoint = [0, 0, 0, 0];
1885
+ for (const polygonRings of polygons) {
1886
+ writer.writeVarInt(polygonRings.length);
1887
+ for (const ring of polygonRings) {
1888
+ writer.writeVarInt(ring.length);
1889
+ for (const point of ring) {
1890
+ writeTwkbPoint(writer, context, previousPoint, point);
1891
+ }
1892
+ }
1893
+ }
1894
+ }
1895
+ }
1896
+ function encodeGeometryCollection2(writer, context, geometryCollection) {
1897
+ const { geometries } = geometryCollection;
1898
+ const isEmpty = geometries.length === 0;
1899
+ writeTwkbHeader(writer, context, WKBGeometryType.GeometryCollection, isEmpty);
1900
+ if (geometries.length > 0) {
1901
+ writer.writeVarInt(geometries.length);
1902
+ for (const geometry of geometries) {
1903
+ encodeGeometry(writer, geometry, context);
1904
+ }
1905
+ }
1906
+ }
1907
+ function writeTwkbHeader(writer, context, geometryType, isEmpty) {
1908
+ const type = (zigZagEncode(context.xy) << 4) + geometryType;
1909
+ let metadataHeader = context.hasZ || context.hasM ? 1 << 3 : 0;
1910
+ metadataHeader += isEmpty ? 1 << 4 : 0;
1911
+ writer.writeUInt8(type);
1912
+ writer.writeUInt8(metadataHeader);
1913
+ if (context.hasZ || context.hasM) {
1914
+ let extendedPrecision = 0;
1915
+ if (context.hasZ) {
1916
+ extendedPrecision |= 1;
1917
+ }
1918
+ if (context.hasM) {
1919
+ extendedPrecision |= 2;
1920
+ }
1921
+ writer.writeUInt8(extendedPrecision);
1922
+ }
1923
+ }
1924
+ function writeTwkbPoint(writer, context, point, previousPoint) {
1925
+ const x = point[0] * context.xyFactor;
1926
+ const y = point[1] * context.xyFactor;
1927
+ const z = point[2] * context.zFactor;
1928
+ const m = point[3] * context.mFactor;
1929
+ writer.writeVarInt(zigZagEncode(x - previousPoint[0]));
1930
+ writer.writeVarInt(zigZagEncode(y - previousPoint[1]));
1931
+ if (context.hasZ) {
1932
+ writer.writeVarInt(zigZagEncode(z - previousPoint[2]));
1933
+ }
1934
+ if (context.hasM) {
1935
+ writer.writeVarInt(zigZagEncode(m - previousPoint[3]));
1936
+ }
1937
+ previousPoint[0] = x;
1938
+ previousPoint[1] = y;
1939
+ previousPoint[2] = z;
1940
+ previousPoint[3] = m;
1941
+ }
1942
+ function zigZagEncode(value) {
1943
+ return value << 1 ^ value >> 31;
1944
+ }
1945
+ function getTwkbPrecision(xyPrecision, zPrecision, mPrecision) {
1946
+ return {
1947
+ xy: xyPrecision,
1948
+ z: zPrecision,
1949
+ m: mPrecision,
1950
+ xyFactor: Math.pow(10, xyPrecision),
1951
+ zFactor: Math.pow(10, zPrecision),
1952
+ mFactor: Math.pow(10, mPrecision)
1953
+ };
1954
+ }
1955
+ var init_encode_twkb = __esm({
1956
+ "src/lib/encode-twkb.ts"() {
1957
+ init_binary_writer();
1958
+ init_parse_wkb_header();
1959
+ }
1960
+ });
1961
+
1962
+ // src/twkb-writer.ts
1963
+ var TWKBWriter;
1964
+ var init_twkb_writer = __esm({
1965
+ "src/twkb-writer.ts"() {
1966
+ init_version();
1967
+ init_encode_twkb();
1968
+ TWKBWriter = {
1969
+ name: "TWKB (Tiny Well Known Binary)",
1970
+ id: "twkb",
1971
+ module: "wkt",
1972
+ version: VERSION,
1973
+ extensions: ["twkb"],
1974
+ encodeSync: async (data, options) => encodeTWKB,
1975
+ options: {
1976
+ twkb: {}
1977
+ }
1978
+ };
1979
+ }
1980
+ });
1981
+
961
1982
  // src/index.ts
962
1983
  var src_exports = {};
963
1984
  __export(src_exports, {
1985
+ HexWKBLoader: () => HexWKBLoader,
1986
+ TWKBLoader: () => TWKBLoader,
1987
+ TWKBWriter: () => TWKBWriter,
964
1988
  WKBLoader: () => WKBLoader,
965
1989
  WKBWorkerLoader: () => WKBWorkerLoader,
966
1990
  WKBWriter: () => WKBWriter,
1991
+ WKTCRSLoader: () => WKTCRSLoader,
1992
+ WKTCRSWriter: () => WKTCRSWriter,
967
1993
  WKTLoader: () => WKTLoader,
968
1994
  WKTWorkerLoader: () => WKTWorkerLoader,
969
- WKTWriter: () => WKTWriter
1995
+ WKTWriter: () => WKTWriter,
1996
+ decodeHex: () => decodeHex,
1997
+ encodeHex: () => encodeHex,
1998
+ isTWKB: () => isTWKB,
1999
+ isWKB: () => isWKB,
2000
+ isWKT: () => isWKT,
2001
+ parseWKBHeader: () => parseWKBHeader
970
2002
  });
971
- var init_src = __esm({
2003
+ var init_src2 = __esm({
972
2004
  "src/index.ts"() {
973
- init_wkb_loader();
2005
+ init_wkt_crs_loader();
2006
+ init_wkt_crs_writer();
974
2007
  init_wkt_loader();
975
2008
  init_wkt_writer();
2009
+ init_wkb_loader();
976
2010
  init_wkb_writer();
2011
+ init_hex_wkb_loader();
2012
+ init_twkb_loader();
2013
+ init_twkb_writer();
2014
+ init_parse_wkt();
2015
+ init_parse_wkb_header();
2016
+ init_parse_twkb();
2017
+ init_hex_transcoder();
977
2018
  }
978
2019
  });
979
2020
 
980
2021
  // src/bundle.ts
981
2022
  var require_bundle = __commonJS({
982
2023
  "src/bundle.ts"(exports, module) {
983
- var moduleExports = (init_src(), src_exports);
2024
+ var moduleExports = (init_src2(), src_exports);
984
2025
  globalThis.loaders = globalThis.loaders || {};
985
2026
  module.exports = Object.assign(globalThis.loaders, moduleExports);
986
2027
  }