@loaders.gl/wkt 4.0.0-alpha.9 → 4.0.0-beta.2

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 (231) hide show
  1. package/README.md +4 -1
  2. package/dist/dist.min.js +1449 -404
  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 +263 -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/lib/utils/version.js.map +1 -1
  39. package/dist/es5/twkb-loader.js +53 -0
  40. package/dist/es5/twkb-loader.js.map +1 -0
  41. package/dist/es5/twkb-writer.js +40 -0
  42. package/dist/es5/twkb-writer.js.map +1 -0
  43. package/dist/es5/wkb-loader.js +9 -9
  44. package/dist/es5/wkb-loader.js.map +1 -1
  45. package/dist/es5/wkb-writer.js +2 -3
  46. package/dist/es5/wkb-writer.js.map +1 -1
  47. package/dist/es5/wkt-crs-loader.js +47 -0
  48. package/dist/es5/wkt-crs-loader.js.map +1 -0
  49. package/dist/es5/wkt-crs-writer.js +49 -0
  50. package/dist/es5/wkt-crs-writer.js.map +1 -0
  51. package/dist/es5/wkt-loader.js +10 -6
  52. package/dist/es5/wkt-loader.js.map +1 -1
  53. package/dist/es5/wkt-writer.js +2 -3
  54. package/dist/es5/wkt-writer.js.map +1 -1
  55. package/dist/es5/workers/wkb-worker.js.map +1 -1
  56. package/dist/es5/workers/wkt-worker.js.map +1 -1
  57. package/dist/esm/hex-wkb-loader.js +37 -0
  58. package/dist/esm/hex-wkb-loader.js.map +1 -0
  59. package/dist/esm/index.js +10 -1
  60. package/dist/esm/index.js.map +1 -1
  61. package/dist/esm/lib/encode-twkb.js +180 -0
  62. package/dist/esm/lib/encode-twkb.js.map +1 -0
  63. package/dist/esm/lib/encode-wkb.js +4 -4
  64. package/dist/esm/lib/encode-wkb.js.map +1 -1
  65. package/dist/esm/lib/encode-wkt-crs.js +21 -0
  66. package/dist/esm/lib/encode-wkt-crs.js.map +1 -0
  67. package/dist/esm/lib/encode-wkt.js +1 -1
  68. package/dist/esm/lib/encode-wkt.js.map +1 -1
  69. package/dist/esm/lib/parse-hex-wkb.js +2 -0
  70. package/dist/esm/lib/parse-hex-wkb.js.map +1 -0
  71. package/dist/esm/lib/parse-twkb.js +256 -0
  72. package/dist/esm/lib/parse-twkb.js.map +1 -0
  73. package/dist/esm/lib/parse-wkb-header.js +105 -0
  74. package/dist/esm/lib/parse-wkb-header.js.map +1 -0
  75. package/dist/esm/lib/parse-wkb.js +59 -51
  76. package/dist/esm/lib/parse-wkb.js.map +1 -1
  77. package/dist/esm/lib/parse-wkt-crs.js +96 -0
  78. package/dist/esm/lib/parse-wkt-crs.js.map +1 -0
  79. package/dist/esm/lib/parse-wkt.js +204 -152
  80. package/dist/esm/lib/parse-wkt.js.map +1 -1
  81. package/dist/esm/lib/utils/base64-encoder.js +7 -0
  82. package/dist/esm/lib/utils/base64-encoder.js.map +1 -0
  83. package/dist/esm/lib/utils/binary-reader.js +67 -0
  84. package/dist/esm/lib/utils/binary-reader.js.map +1 -0
  85. package/dist/esm/lib/utils/binary-writer.js +1 -1
  86. package/dist/esm/lib/utils/binary-writer.js.map +1 -1
  87. package/dist/esm/lib/utils/hex-encoder.js +40 -0
  88. package/dist/esm/lib/utils/hex-encoder.js.map +1 -0
  89. package/dist/esm/lib/utils/hex-transcoder.js +34 -0
  90. package/dist/esm/lib/utils/hex-transcoder.js.map +1 -0
  91. package/dist/esm/lib/utils/version.js +1 -1
  92. package/dist/esm/lib/utils/version.js.map +1 -1
  93. package/dist/esm/twkb-loader.js +24 -0
  94. package/dist/esm/twkb-loader.js.map +1 -0
  95. package/dist/esm/twkb-writer.js +14 -0
  96. package/dist/esm/twkb-writer.js.map +1 -0
  97. package/dist/esm/wkb-loader.js +6 -4
  98. package/dist/esm/wkb-loader.js.map +1 -1
  99. package/dist/esm/wkb-writer.js +1 -1
  100. package/dist/esm/wkb-writer.js.map +1 -1
  101. package/dist/esm/wkt-crs-loader.js +19 -0
  102. package/dist/esm/wkt-crs-loader.js.map +1 -0
  103. package/dist/esm/wkt-crs-writer.js +19 -0
  104. package/dist/esm/wkt-crs-writer.js.map +1 -0
  105. package/dist/esm/wkt-loader.js +8 -3
  106. package/dist/esm/wkt-loader.js.map +1 -1
  107. package/dist/esm/wkt-writer.js +2 -2
  108. package/dist/esm/wkt-writer.js.map +1 -1
  109. package/dist/esm/workers/wkb-worker.js.map +1 -1
  110. package/dist/esm/workers/wkt-worker.js.map +1 -1
  111. package/dist/src/bundle.d.ts.map +1 -0
  112. package/dist/src/hex-wkb-loader.d.ts +17 -0
  113. package/dist/src/hex-wkb-loader.d.ts.map +1 -0
  114. package/dist/src/index.d.ts +15 -0
  115. package/dist/src/index.d.ts.map +1 -0
  116. package/dist/src/lib/encode-twkb.d.ts +6 -0
  117. package/dist/src/lib/encode-twkb.d.ts.map +1 -0
  118. package/dist/{lib → src/lib}/encode-wkb.d.ts +16 -3
  119. package/dist/src/lib/encode-wkb.d.ts.map +1 -0
  120. package/dist/src/lib/encode-wkt-crs.d.ts +10 -0
  121. package/dist/src/lib/encode-wkt-crs.d.ts.map +1 -0
  122. package/dist/{lib → src/lib}/encode-wkt.d.ts +1 -1
  123. package/dist/src/lib/encode-wkt.d.ts.map +1 -0
  124. package/dist/src/lib/parse-hex-wkb.d.ts +1 -0
  125. package/dist/src/lib/parse-hex-wkb.d.ts.map +1 -0
  126. package/dist/src/lib/parse-twkb.d.ts +9 -0
  127. package/dist/src/lib/parse-twkb.d.ts.map +1 -0
  128. package/dist/src/lib/parse-wkb-header.d.ts +39 -0
  129. package/dist/src/lib/parse-wkb-header.d.ts.map +1 -0
  130. package/dist/src/lib/parse-wkb.d.ts +5 -0
  131. package/dist/src/lib/parse-wkb.d.ts.map +1 -0
  132. package/dist/src/lib/parse-wkt-crs.d.ts +15 -0
  133. package/dist/src/lib/parse-wkt-crs.d.ts.map +1 -0
  134. package/dist/src/lib/parse-wkt.d.ts +30 -0
  135. package/dist/src/lib/parse-wkt.d.ts.map +1 -0
  136. package/dist/src/lib/utils/base64-encoder.d.ts +5 -0
  137. package/dist/src/lib/utils/base64-encoder.d.ts.map +1 -0
  138. package/dist/src/lib/utils/binary-reader.d.ts +18 -0
  139. package/dist/src/lib/utils/binary-reader.d.ts.map +1 -0
  140. package/dist/{lib → src/lib}/utils/binary-writer.d.ts +1 -1
  141. package/dist/src/lib/utils/binary-writer.d.ts.map +1 -0
  142. package/dist/src/lib/utils/hex-encoder.d.ts +15 -0
  143. package/dist/src/lib/utils/hex-encoder.d.ts.map +1 -0
  144. package/dist/src/lib/utils/hex-transcoder.d.ts +15 -0
  145. package/dist/src/lib/utils/hex-transcoder.d.ts.map +1 -0
  146. package/dist/src/lib/utils/version.d.ts.map +1 -0
  147. package/dist/src/twkb-loader.d.ts +16 -0
  148. package/dist/src/twkb-loader.d.ts.map +1 -0
  149. package/dist/src/twkb-writer.d.ts +7 -0
  150. package/dist/src/twkb-writer.d.ts.map +1 -0
  151. package/dist/src/wkb-loader.d.ts +16 -0
  152. package/dist/src/wkb-loader.d.ts.map +1 -0
  153. package/dist/src/wkb-writer.d.ts +7 -0
  154. package/dist/src/wkb-writer.d.ts.map +1 -0
  155. package/dist/src/wkt-crs-loader.d.ts +12 -0
  156. package/dist/src/wkt-crs-loader.d.ts.map +1 -0
  157. package/dist/src/wkt-crs-writer.d.ts +13 -0
  158. package/dist/src/wkt-crs-writer.d.ts.map +1 -0
  159. package/dist/src/wkt-loader.d.ts +18 -0
  160. package/dist/src/wkt-loader.d.ts.map +1 -0
  161. package/dist/src/wkt-writer.d.ts +10 -0
  162. package/dist/src/wkt-writer.d.ts.map +1 -0
  163. package/dist/{workers → src/workers}/wkb-worker.d.ts.map +1 -1
  164. package/dist/{workers → src/workers}/wkt-worker.d.ts.map +1 -1
  165. package/dist/tsconfig.tsbuildinfo +1 -0
  166. package/dist/wkt-worker.js +230 -186
  167. package/package.json +4 -4
  168. package/src/hex-wkb-loader.ts +61 -0
  169. package/src/index.ts +22 -1
  170. package/src/lib/encode-twkb.ts +304 -0
  171. package/src/lib/encode-wkb.ts +5 -5
  172. package/src/lib/encode-wkt-crs.ts +39 -0
  173. package/src/lib/encode-wkt.ts +3 -2
  174. package/src/lib/parse-hex-wkb.ts +0 -0
  175. package/src/lib/parse-twkb.ts +356 -0
  176. package/src/lib/parse-wkb-header.ts +172 -0
  177. package/src/lib/parse-wkb.ts +69 -58
  178. package/src/lib/parse-wkt-crs.ts +147 -0
  179. package/src/lib/parse-wkt.ts +275 -174
  180. package/src/lib/utils/base64-encoder.ts +153 -0
  181. package/src/lib/utils/binary-reader.ts +72 -0
  182. package/src/lib/utils/binary-writer.ts +1 -1
  183. package/src/lib/utils/hex-encoder.ts +58 -0
  184. package/src/lib/utils/hex-transcoder.ts +50 -0
  185. package/src/twkb-loader.ts +42 -0
  186. package/src/twkb-writer.ts +25 -0
  187. package/src/wkb-loader.ts +19 -8
  188. package/src/wkb-writer.ts +6 -4
  189. package/src/wkt-crs-loader.ts +33 -0
  190. package/src/wkt-crs-writer.ts +37 -0
  191. package/src/wkt-loader.ts +22 -6
  192. package/src/wkt-writer.ts +12 -5
  193. package/src/workers/wkb-worker.ts +2 -0
  194. package/src/workers/wkt-worker.ts +2 -0
  195. package/dist/bundle.d.ts.map +0 -1
  196. package/dist/bundle.js +0 -5
  197. package/dist/index.d.ts +0 -5
  198. package/dist/index.d.ts.map +0 -1
  199. package/dist/index.js +0 -13
  200. package/dist/lib/encode-wkb.d.ts.map +0 -1
  201. package/dist/lib/encode-wkb.js +0 -295
  202. package/dist/lib/encode-wkt.d.ts.map +0 -1
  203. package/dist/lib/encode-wkt.js +0 -46
  204. package/dist/lib/parse-wkb.d.ts +0 -3
  205. package/dist/lib/parse-wkb.d.ts.map +0 -1
  206. package/dist/lib/parse-wkb.js +0 -236
  207. package/dist/lib/parse-wkt.d.ts +0 -8
  208. package/dist/lib/parse-wkt.d.ts.map +0 -1
  209. package/dist/lib/parse-wkt.js +0 -227
  210. package/dist/lib/utils/binary-writer.d.ts.map +0 -1
  211. package/dist/lib/utils/binary-writer.js +0 -120
  212. package/dist/lib/utils/version.d.ts.map +0 -1
  213. package/dist/lib/utils/version.js +0 -7
  214. package/dist/wkb-loader.d.ts +0 -39
  215. package/dist/wkb-loader.d.ts.map +0 -1
  216. package/dist/wkb-loader.js +0 -34
  217. package/dist/wkb-writer.d.ts +0 -6
  218. package/dist/wkb-writer.d.ts.map +0 -1
  219. package/dist/wkb-writer.js +0 -26
  220. package/dist/wkt-loader.d.ts +0 -10
  221. package/dist/wkt-loader.d.ts.map +0 -1
  222. package/dist/wkt-loader.js +0 -33
  223. package/dist/wkt-writer.d.ts +0 -6
  224. package/dist/wkt-writer.d.ts.map +0 -1
  225. package/dist/wkt-writer.js +0 -23
  226. package/dist/workers/wkb-worker.js +0 -5
  227. package/dist/workers/wkt-worker.js +0 -5
  228. /package/dist/{bundle.d.ts → src/bundle.d.ts} +0 -0
  229. /package/dist/{lib → src/lib}/utils/version.d.ts +0 -0
  230. /package/dist/{workers → src/workers}/wkb-worker.d.ts +0 -0
  231. /package/dist/{workers → src/workers}/wkt-worker.d.ts +0 -0
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@loaders.gl/wkt",
3
3
  "description": "Loader and Writer for the WKT (Well Known Text) Format",
4
- "version": "4.0.0-alpha.9",
4
+ "version": "4.0.0-beta.2",
5
5
  "license": "MIT",
6
6
  "publishConfig": {
7
7
  "access": "public"
@@ -35,8 +35,8 @@
35
35
  "fuzzer": "^0.2.1"
36
36
  },
37
37
  "dependencies": {
38
- "@loaders.gl/loader-utils": "4.0.0-alpha.9",
39
- "@loaders.gl/schema": "4.0.0-alpha.9"
38
+ "@loaders.gl/loader-utils": "4.0.0-beta.2",
39
+ "@loaders.gl/schema": "4.0.0-beta.2"
40
40
  },
41
- "gitHead": "03ff81ab468f20f3bddeec787aa88d477a7e1c72"
41
+ "gitHead": "79c2033f755e88e11bc30a04428e3666b177b8fc"
42
42
  }
@@ -0,0 +1,61 @@
1
+ // loaders.gl, MIT license
2
+
3
+ import type {LoaderWithParser} from '@loaders.gl/loader-utils';
4
+ import {BinaryGeometry} from '@loaders.gl/schema';
5
+
6
+ import type {WKBLoaderOptions} from './wkb-loader';
7
+ import {WKBLoader} from './wkb-loader';
8
+ import {VERSION} from './lib/utils/version';
9
+ import {decodeHex} from './lib/utils/hex-transcoder';
10
+
11
+ export type HexWKBLoaderOptions = WKBLoaderOptions;
12
+
13
+ /**
14
+ * Worker loader for Hex-encoded WKB (Well-Known Binary)
15
+ */
16
+ export const HexWKBLoader: LoaderWithParser<BinaryGeometry, never, HexWKBLoaderOptions> = {
17
+ name: 'Hexadecimal WKB',
18
+ id: 'wkb',
19
+ module: 'wkt',
20
+ version: VERSION,
21
+ worker: true,
22
+ category: 'geometry',
23
+ extensions: ['wkb'],
24
+ mimeTypes: [],
25
+ options: WKBLoader.options,
26
+ text: true,
27
+ testText: isHexWKB,
28
+ // TODO - encoding here seems wasteful - extend hex transcoder?
29
+ parse: async (arrayBuffer: ArrayBuffer) => parseHexWKB(new TextDecoder().decode(arrayBuffer)),
30
+ parseTextSync: parseHexWKB
31
+ };
32
+
33
+ function parseHexWKB(text: string, options?: HexWKBLoaderOptions): BinaryGeometry {
34
+ const uint8Array = decodeHex(text);
35
+ const binaryGeometry = WKBLoader.parseSync?.(uint8Array.buffer, options);
36
+ // @ts-expect-error
37
+ return binaryGeometry;
38
+ }
39
+
40
+ /**
41
+ * Check if string is a valid Well-known binary (WKB) in HEX format
42
+ * https://en.wikipedia.org/wiki/Well-known_text_representation_of_geometry
43
+ *
44
+ * @param str input string
45
+ * @returns true if string is a valid WKB in HEX format
46
+ */
47
+ export function isHexWKB(string: string | null): boolean {
48
+ if (!string) {
49
+ return false;
50
+ }
51
+ // check if the length of the string is even and is at least 10 characters long
52
+ if (string.length < 10 || string.length % 2 !== 0) {
53
+ return false;
54
+ }
55
+ // check if first two characters are 00 or 01
56
+ if (!string.startsWith('00') && !string.startsWith('01')) {
57
+ return false;
58
+ }
59
+ // check if the rest of the string is a valid hex
60
+ return /^[0-9a-fA-F]+$/.test(string.slice(2));
61
+ }
package/src/index.ts CHANGED
@@ -1,4 +1,25 @@
1
- export {WKBLoader, WKBWorkerLoader} from './wkb-loader';
1
+ // loaders.gl, MIT license
2
+
3
+ export {WKTCRSLoader} from './wkt-crs-loader';
4
+ export {WKTCRSWriter} from './wkt-crs-writer';
5
+
2
6
  export {WKTLoader, WKTWorkerLoader} from './wkt-loader';
3
7
  export {WKTWriter} from './wkt-writer';
8
+
9
+ export {WKBLoader, WKBWorkerLoader} from './wkb-loader';
4
10
  export {WKBWriter} from './wkb-writer';
11
+
12
+ export {HexWKBLoader} from './hex-wkb-loader';
13
+
14
+ export {TWKBLoader} from './twkb-loader';
15
+ export {TWKBWriter} from './twkb-writer';
16
+
17
+ // EXPERIMENTAL APIs
18
+ export {isWKT} from './lib/parse-wkt';
19
+
20
+ export {isWKB, parseWKBHeader} from './lib/parse-wkb-header';
21
+ export type {WKBHeader} from './lib/parse-wkb-header';
22
+
23
+ export {isTWKB} from './lib/parse-twkb';
24
+
25
+ export {encodeHex, decodeHex} from './lib/utils/hex-transcoder';
@@ -0,0 +1,304 @@
1
+ // loaders.gl, MIT license
2
+ // Forked from https://github.com/cschwarz/wkx under MIT license, Copyright (c) 2013 Christian Schwarz
3
+
4
+ import type {Point, MultiPoint, LineString} from '@loaders.gl/schema';
5
+ import type {
6
+ MultiLineString,
7
+ Polygon,
8
+ MultiPolygon,
9
+ GeometryCollection,
10
+ Geometry
11
+ } from '@loaders.gl/schema';
12
+
13
+ import {BinaryWriter} from './utils/binary-writer';
14
+ import {WKBGeometryType} from './parse-wkb-header';
15
+
16
+ type TWKBPrecision = {
17
+ xy: number;
18
+ z: number;
19
+ m: number;
20
+ xyFactor: number;
21
+ zFactor: number;
22
+ mFactor: number;
23
+ };
24
+
25
+ type TWKBEncoderContext = TWKBPrecision & {
26
+ hasZ?: boolean;
27
+ hasM?: boolean;
28
+ };
29
+
30
+ export function encodeTWKB(
31
+ geometry: Geometry,
32
+ options?: {hasZ?: boolean; hasM?: boolean}
33
+ ): ArrayBuffer {
34
+ const writer = new BinaryWriter(0, true);
35
+
36
+ const context: TWKBEncoderContext = {
37
+ ...getTwkbPrecision(5, 0, 0),
38
+ hasZ: options?.hasZ,
39
+ hasM: options?.hasM
40
+ };
41
+
42
+ encodeGeometry(writer, geometry, context);
43
+
44
+ // TODO - we need to slice it?
45
+ return writer.arrayBuffer;
46
+ }
47
+
48
+ function encodeGeometry(writer: BinaryWriter, geometry: Geometry, context: TWKBEncoderContext) {
49
+ switch (geometry.type) {
50
+ case 'Point':
51
+ return encodePoint(writer, context, geometry);
52
+ case 'LineString':
53
+ return encodeLineString(writer, context, geometry);
54
+ case 'Polygon':
55
+ return encodePolygon(writer, context, geometry);
56
+ case 'MultiPoint':
57
+ return encodeMultiPoint(writer, context, geometry);
58
+ case 'MultiLineString':
59
+ return encodeMultiLineString(writer, context, geometry);
60
+ case 'MultiPolygon':
61
+ return encodeMultiPolygon(writer, context, geometry);
62
+ case 'GeometryCollection':
63
+ return encodeGeometryCollection(writer, context, geometry);
64
+ default:
65
+ throw new Error('unsupported geometry type');
66
+ }
67
+ }
68
+
69
+ function encodePoint(writer: BinaryWriter, context: TWKBEncoderContext, point: Point): void {
70
+ const isEmpty =
71
+ point.coordinates.length === 0 || point[0] === 'undefined' || point[1] === 'undefined';
72
+
73
+ writeTwkbHeader(writer, context, WKBGeometryType.Point, isEmpty);
74
+
75
+ if (!isEmpty) {
76
+ const previousPoint = [0, 0, 0, 0];
77
+ writeTwkbPoint(writer, context, point.coordinates, previousPoint);
78
+ }
79
+ }
80
+
81
+ function encodeLineString(
82
+ writer: BinaryWriter,
83
+ context: TWKBEncoderContext,
84
+ lineString: LineString
85
+ ): ArrayBuffer {
86
+ const points = lineString.coordinates;
87
+ const isEmpty = points.length === 0;
88
+
89
+ writeTwkbHeader(writer, context, WKBGeometryType.LineString, isEmpty);
90
+
91
+ if (!isEmpty) {
92
+ writer.writeVarInt(points.length);
93
+ const previousPoint = [0, 0, 0, 0];
94
+ for (const point of points) {
95
+ writeTwkbPoint(writer, context, point, previousPoint);
96
+ }
97
+ }
98
+
99
+ return writer.arrayBuffer;
100
+ }
101
+
102
+ function encodePolygon(
103
+ writer: BinaryWriter,
104
+ context: TWKBEncoderContext,
105
+ polygon: Polygon
106
+ ): ArrayBuffer {
107
+ const polygonRings = polygon.coordinates;
108
+
109
+ const isEmpty = polygonRings.length === 0;
110
+
111
+ writeTwkbHeader(writer, context, WKBGeometryType.Polygon, isEmpty);
112
+
113
+ if (!isEmpty) {
114
+ writer.writeVarInt(polygonRings.length);
115
+
116
+ const previousPoint = [0, 0, 0, 0];
117
+ for (const ring of polygonRings) {
118
+ writer.writeVarInt(ring.length);
119
+ for (const point of ring) {
120
+ writeTwkbPoint(writer, context, previousPoint, point);
121
+ }
122
+ }
123
+ }
124
+
125
+ return writer.arrayBuffer;
126
+ }
127
+
128
+ function encodeMultiPoint(
129
+ writer: BinaryWriter,
130
+ context: TWKBEncoderContext,
131
+ multiPoint: MultiPoint
132
+ ): void {
133
+ const points = multiPoint.coordinates;
134
+ const isEmpty = points.length === 0;
135
+
136
+ writeTwkbHeader(writer, context, WKBGeometryType.MultiPoint, isEmpty);
137
+
138
+ if (!isEmpty) {
139
+ writer.writeVarInt(points.length);
140
+
141
+ const previousPoint = [0, 0, 0, 0];
142
+ for (let i = 0; i < points.length; i++) {
143
+ writeTwkbPoint(writer, context, previousPoint, points[i]);
144
+ }
145
+ }
146
+ }
147
+
148
+ function encodeMultiLineString(
149
+ writer: BinaryWriter,
150
+ context: TWKBEncoderContext,
151
+ multiLineStrings: MultiLineString
152
+ ): ArrayBuffer {
153
+ const lineStrings = multiLineStrings.coordinates;
154
+ const isEmpty = lineStrings.length === 0;
155
+
156
+ writeTwkbHeader(writer, context, WKBGeometryType.MultiLineString, isEmpty);
157
+
158
+ if (!isEmpty) {
159
+ writer.writeVarInt(lineStrings.length);
160
+
161
+ const previousPoint = [0, 0, 0, 0];
162
+ for (const lineString of lineStrings) {
163
+ writer.writeVarInt(lineString.length);
164
+
165
+ for (const point of lineString) {
166
+ writeTwkbPoint(writer, context, previousPoint, point);
167
+ }
168
+ }
169
+ }
170
+
171
+ return writer.arrayBuffer;
172
+ }
173
+
174
+ function encodeMultiPolygon(
175
+ writer: BinaryWriter,
176
+ context: TWKBEncoderContext,
177
+ multiPolygon: MultiPolygon
178
+ ): void {
179
+ const {coordinates} = multiPolygon;
180
+ const isEmpty = coordinates.length === 0;
181
+
182
+ writeTwkbHeader(writer, context, WKBGeometryType.MultiPolygon, isEmpty);
183
+
184
+ if (!isEmpty) {
185
+ const polygons = coordinates;
186
+ writer.writeVarInt(polygons.length);
187
+
188
+ const previousPoint = [0, 0, 0, 0];
189
+
190
+ for (const polygonRings of polygons) {
191
+ writer.writeVarInt(polygonRings.length);
192
+ for (const ring of polygonRings) {
193
+ writer.writeVarInt(ring.length);
194
+ for (const point of ring) {
195
+ writeTwkbPoint(writer, context, previousPoint, point);
196
+ }
197
+ }
198
+ }
199
+ }
200
+ }
201
+
202
+ function encodeGeometryCollection(
203
+ writer: BinaryWriter,
204
+ context: TWKBEncoderContext,
205
+ geometryCollection: GeometryCollection
206
+ ): void {
207
+ const {geometries} = geometryCollection;
208
+ const isEmpty = geometries.length === 0;
209
+
210
+ writeTwkbHeader(writer, context, WKBGeometryType.GeometryCollection, isEmpty);
211
+
212
+ if (geometries.length > 0) {
213
+ writer.writeVarInt(geometries.length);
214
+ for (const geometry of geometries) {
215
+ encodeGeometry(writer, geometry, context);
216
+ }
217
+ }
218
+ }
219
+
220
+ /**
221
+ *
222
+ * @param writer
223
+ * @param context
224
+ * @param geometryType
225
+ * @param isEmpty
226
+ */
227
+ function writeTwkbHeader(
228
+ writer: BinaryWriter,
229
+ context: TWKBEncoderContext,
230
+ geometryType: WKBGeometryType,
231
+ isEmpty: boolean
232
+ ) {
233
+ const type = (zigZagEncode(context.xy) << 4) + geometryType;
234
+ let metadataHeader = context.hasZ || context.hasM ? 1 << 3 : 0;
235
+ metadataHeader += isEmpty ? 1 << 4 : 0;
236
+
237
+ writer.writeUInt8(type);
238
+ writer.writeUInt8(metadataHeader);
239
+
240
+ if (context.hasZ || context.hasM) {
241
+ let extendedPrecision = 0;
242
+ if (context.hasZ) {
243
+ extendedPrecision |= 0x1;
244
+ }
245
+ if (context.hasM) {
246
+ extendedPrecision |= 0x2;
247
+ }
248
+ writer.writeUInt8(extendedPrecision);
249
+ }
250
+ }
251
+
252
+ /**
253
+ * Write one point to array buffer. ZigZagEncoding the delta fdrom the previous point. Mutates previousPoint.
254
+ * @param writer
255
+ * @param context
256
+ * @param previousPoint - Mutated by this function
257
+ * @param point
258
+ */
259
+ function writeTwkbPoint(
260
+ writer: BinaryWriter,
261
+ context: TWKBEncoderContext,
262
+ point: number[],
263
+ previousPoint: number[]
264
+ ): void {
265
+ const x = point[0] * context.xyFactor;
266
+ const y = point[1] * context.xyFactor;
267
+ const z = point[2] * context.zFactor;
268
+ const m = point[3] * context.mFactor;
269
+
270
+ writer.writeVarInt(zigZagEncode(x - previousPoint[0]));
271
+ writer.writeVarInt(zigZagEncode(y - previousPoint[1]));
272
+ if (context.hasZ) {
273
+ writer.writeVarInt(zigZagEncode(z - previousPoint[2]));
274
+ }
275
+ if (context.hasM) {
276
+ writer.writeVarInt(zigZagEncode(m - previousPoint[3]));
277
+ }
278
+
279
+ previousPoint[0] = x;
280
+ previousPoint[1] = y;
281
+ previousPoint[2] = z;
282
+ previousPoint[3] = m;
283
+ }
284
+
285
+ // HELPERS
286
+
287
+ function zigZagEncode(value: number): number {
288
+ return (value << 1) ^ (value >> 31);
289
+ }
290
+
291
+ function getTwkbPrecision(
292
+ xyPrecision: number,
293
+ zPrecision: number,
294
+ mPrecision: number
295
+ ): TWKBPrecision {
296
+ return {
297
+ xy: xyPrecision,
298
+ z: zPrecision,
299
+ m: mPrecision,
300
+ xyFactor: Math.pow(10, xyPrecision),
301
+ zFactor: Math.pow(10, zPrecision),
302
+ mFactor: Math.pow(10, mPrecision)
303
+ };
304
+ }
@@ -14,13 +14,13 @@ import type {
14
14
  GeometryCollection
15
15
  } from '@loaders.gl/schema';
16
16
 
17
- import BinaryWriter from './utils/binary-writer';
17
+ import {BinaryWriter} from './utils/binary-writer';
18
18
 
19
19
  /**
20
20
  * Integer code for geometry type
21
21
  * Reference: https://en.wikipedia.org/wiki/Well-known_text_representation_of_geometry#Well-known_binary
22
22
  */
23
- enum WKB {
23
+ export enum WKB {
24
24
  Point = 1,
25
25
  LineString = 2,
26
26
  Polygon = 3,
@@ -33,7 +33,7 @@ enum WKB {
33
33
  /**
34
34
  * Options for encodeWKB
35
35
  */
36
- interface WKBOptions {
36
+ type WKBOptions = {
37
37
  /** Does the GeoJSON input have Z values? */
38
38
  hasZ?: boolean;
39
39
 
@@ -42,14 +42,14 @@ interface WKBOptions {
42
42
 
43
43
  /** Spatial reference for input GeoJSON */
44
44
  srid?: any;
45
- }
45
+ };
46
46
 
47
47
  /**
48
48
  * Encodes a GeoJSON object into WKB
49
49
  * @param geojson A GeoJSON Feature or Geometry
50
50
  * @returns string
51
51
  */
52
- export default function encodeWKB(
52
+ export function encodeWKB(
53
53
  geometry: Geometry | Feature,
54
54
  options: WKBOptions | {wkb: WKBOptions} = {}
55
55
  ): ArrayBuffer {
@@ -0,0 +1,39 @@
1
+ // loaders.gl, MIT license
2
+ // parse-wkt-crs was forked from https://github.com/DanielJDufour/wkt-crs under Creative Commons CC0 1.0 license.
3
+
4
+ import type {WKTCRS} from './parse-wkt-crs';
5
+
6
+ export type EncodeWKTCRSOptions = {
7
+ debug?: boolean;
8
+ };
9
+
10
+ /**
11
+ * convert JSON representation of Well-Known Text
12
+ * back to standard Well-Known Text
13
+ */
14
+ export function encodeWKTCRS(wkt: WKTCRS, options?: EncodeWKTCRSOptions): string {
15
+ if (Array.isArray(wkt) && wkt.length === 1 && Array.isArray(wkt[0])) {
16
+ wkt = wkt[0]; // ignore first extra wrapper array
17
+ }
18
+
19
+ const [kw, ...attrs] = wkt;
20
+ const str = `${kw}[${attrs
21
+ .map((attr) => {
22
+ if (Array.isArray(attr)) {
23
+ return encodeWKTCRS(attr, options);
24
+ } else if (typeof attr === 'number') {
25
+ return attr.toString();
26
+ } else if (typeof attr === 'string') {
27
+ // can't automatically convert all caps to varibale
28
+ // because EPSG is string in AUTHORITY["EPSG", ...]
29
+ if (attr.startsWith('raw:')) {
30
+ // convert "raw:NORTH" to NORTH
31
+ return attr.replace('raw:', '');
32
+ }
33
+ return `"${attr}"`;
34
+ }
35
+ throw new Error(`[wktcrs] unexpected attribute "${attr}"`);
36
+ })
37
+ .join(',')}]`;
38
+ return str;
39
+ }
@@ -1,5 +1,6 @@
1
+ // loaders.gl, MIT license
1
2
  // Fork of https://github.com/mapbox/wellknown under ISC license (MIT/BSD-2-clause equivalent)
2
- // eslint-disable-next-line import/no-unresolved
3
+
3
4
  import type {Feature, Geometry} from '@loaders.gl/schema';
4
5
 
5
6
  /**
@@ -7,7 +8,7 @@ import type {Feature, Geometry} from '@loaders.gl/schema';
7
8
  * @param geojson
8
9
  * @returns string
9
10
  */
10
- export default function encodeWKT(geometry: Geometry | Feature): string {
11
+ export function encodeWKT(geometry: Geometry | Feature): string {
11
12
  if (geometry.type === 'Feature') {
12
13
  geometry = geometry.geometry;
13
14
  }
File without changes