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

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
@@ -1,59 +1,70 @@
1
+ // loaders.gl, MIT license
2
+
1
3
  import type {
2
4
  TypedArray,
3
5
  BinaryGeometry,
4
6
  BinaryPointGeometry,
5
7
  BinaryLineGeometry,
6
- BinaryPolygonGeometry
8
+ BinaryPolygonGeometry,
9
+ Geometry
7
10
  } from '@loaders.gl/schema';
11
+ import {binaryToGeometry} from '@loaders.gl/gis';
12
+ import type {WKBLoaderOptions} from '../wkb-loader';
13
+
14
+ import {parseWKBHeader, WKBGeometryType} from './parse-wkb-header';
15
+
16
+ export function parseWKB(
17
+ arrayBuffer: ArrayBuffer,
18
+ options?: WKBLoaderOptions
19
+ ): BinaryGeometry | Geometry {
20
+ const binaryGeometry = parseWKBToBinary(arrayBuffer, options);
21
+ const shape = options?.wkb?.shape || 'binary-geometry';
22
+ switch (shape) {
23
+ case 'binary-geometry':
24
+ return binaryGeometry;
25
+ case 'geometry':
26
+ return binaryToGeometry(binaryGeometry);
27
+ default:
28
+ throw new Error(shape);
29
+ }
30
+ }
8
31
 
9
- const NUM_DIMENSIONS = {
10
- 0: 2, // 2D
11
- 1: 3, // 3D (Z)
12
- 2: 3, // 3D (M)
13
- 3: 4 // 4D (ZM)
14
- };
15
-
16
- export default function parseWKB(arrayBuffer: ArrayBuffer): BinaryGeometry {
17
- const view = new DataView(arrayBuffer);
18
- let offset = 0;
19
-
20
- // Check endianness of data
21
- const littleEndian = view.getUint8(offset) === 1;
22
- offset++;
32
+ export function parseWKBToBinary(
33
+ arrayBuffer: ArrayBuffer,
34
+ options?: WKBLoaderOptions
35
+ ): BinaryGeometry {
36
+ const dataView = new DataView(arrayBuffer);
23
37
 
24
- // 4-digit code representing dimension and type of geometry
25
- const geometryCode = view.getUint32(offset, littleEndian);
26
- offset += 4;
38
+ const wkbHeader = parseWKBHeader(dataView);
27
39
 
28
- const geometryType = geometryCode % 1000;
29
- const type = ((geometryCode - geometryType) / 1000) as 0 | 1 | 2 | 3;
30
- const dimension = NUM_DIMENSIONS[type];
40
+ const {geometryType, dimensions, littleEndian} = wkbHeader;
41
+ const offset = wkbHeader.byteOffset;
31
42
 
32
43
  switch (geometryType) {
33
- case 1:
34
- const point = parsePoint(view, offset, dimension, littleEndian);
44
+ case WKBGeometryType.Point:
45
+ const point = parsePoint(dataView, offset, dimensions, littleEndian);
35
46
  return point.geometry;
36
- case 2:
37
- const line = parseLineString(view, offset, dimension, littleEndian);
47
+ case WKBGeometryType.LineString:
48
+ const line = parseLineString(dataView, offset, dimensions, littleEndian);
38
49
  return line.geometry;
39
- case 3:
40
- const polygon = parsePolygon(view, offset, dimension, littleEndian);
50
+ case WKBGeometryType.Polygon:
51
+ const polygon = parsePolygon(dataView, offset, dimensions, littleEndian);
41
52
  return polygon.geometry;
42
- case 4:
43
- const multiPoint = parseMultiPoint(view, offset, dimension, littleEndian);
53
+ case WKBGeometryType.MultiPoint:
54
+ const multiPoint = parseMultiPoint(dataView, offset, dimensions, littleEndian);
44
55
  multiPoint.type = 'Point';
45
56
  return multiPoint;
46
- case 5:
47
- const multiLine = parseMultiLineString(view, offset, dimension, littleEndian);
57
+ case WKBGeometryType.MultiLineString:
58
+ const multiLine = parseMultiLineString(dataView, offset, dimensions, littleEndian);
48
59
  multiLine.type = 'LineString';
49
60
  return multiLine;
50
- case 6:
51
- const multiPolygon = parseMultiPolygon(view, offset, dimension, littleEndian);
61
+ case WKBGeometryType.MultiPolygon:
62
+ const multiPolygon = parseMultiPolygon(dataView, offset, dimensions, littleEndian);
52
63
  multiPolygon.type = 'Polygon';
53
64
  return multiPolygon;
54
- // case 7:
65
+ // case WKBGeometryType.GeometryCollection:
55
66
  // TODO: handle GeometryCollections
56
- // return parseGeometryCollection(view, offset, dimension, littleEndian);
67
+ // return parseGeometryCollection(dataView, offset, dimensions, littleEndian);
57
68
  default:
58
69
  throw new Error(`WKB: Unsupported geometry type: ${geometryType}`);
59
70
  }
@@ -61,14 +72,14 @@ export default function parseWKB(arrayBuffer: ArrayBuffer): BinaryGeometry {
61
72
 
62
73
  // Primitives; parse point and linear ring
63
74
  function parsePoint(
64
- view: DataView,
75
+ dataView: DataView,
65
76
  offset: number,
66
77
  dimension: number,
67
78
  littleEndian: boolean
68
79
  ): {geometry: BinaryPointGeometry; offset: number} {
69
80
  const positions = new Float64Array(dimension);
70
81
  for (let i = 0; i < dimension; i++) {
71
- positions[i] = view.getFloat64(offset, littleEndian);
82
+ positions[i] = dataView.getFloat64(offset, littleEndian);
72
83
  offset += 8;
73
84
  }
74
85
 
@@ -79,18 +90,18 @@ function parsePoint(
79
90
  }
80
91
 
81
92
  function parseLineString(
82
- view: DataView,
93
+ dataView: DataView,
83
94
  offset: number,
84
95
  dimension: number,
85
96
  littleEndian: boolean
86
97
  ): {geometry: BinaryLineGeometry; offset: number} {
87
- const nPoints = view.getUint32(offset, littleEndian);
98
+ const nPoints = dataView.getUint32(offset, littleEndian);
88
99
  offset += 4;
89
100
 
90
101
  // Instantiate array
91
102
  const positions = new Float64Array(nPoints * dimension);
92
103
  for (let i = 0; i < nPoints * dimension; i++) {
93
- positions[i] = view.getFloat64(offset, littleEndian);
104
+ positions[i] = dataView.getFloat64(offset, littleEndian);
94
105
  offset += 8;
95
106
  }
96
107
 
@@ -113,17 +124,17 @@ function parseLineString(
113
124
  const cumulativeSum = (sum: number) => (value: number) => (sum += value);
114
125
 
115
126
  function parsePolygon(
116
- view: DataView,
127
+ dataView: DataView,
117
128
  offset: number,
118
129
  dimension: number,
119
130
  littleEndian: boolean
120
131
  ): {geometry: BinaryPolygonGeometry; offset: number} {
121
- const nRings = view.getUint32(offset, littleEndian);
132
+ const nRings = dataView.getUint32(offset, littleEndian);
122
133
  offset += 4;
123
134
 
124
135
  const rings: TypedArray[] = [];
125
136
  for (let i = 0; i < nRings; i++) {
126
- const parsed = parseLineString(view, offset, dimension, littleEndian);
137
+ const parsed = parseLineString(dataView, offset, dimension, littleEndian);
127
138
  const {positions} = parsed.geometry;
128
139
  offset = parsed.offset;
129
140
  rings.push(positions.value);
@@ -152,28 +163,28 @@ function parsePolygon(
152
163
  }
153
164
 
154
165
  function parseMultiPoint(
155
- view: DataView,
166
+ dataView: DataView,
156
167
  offset: number,
157
168
  dimension: number,
158
169
  littleEndian: boolean
159
170
  ): BinaryPointGeometry {
160
- const nPoints = view.getUint32(offset, littleEndian);
171
+ const nPoints = dataView.getUint32(offset, littleEndian);
161
172
  offset += 4;
162
173
 
163
174
  const binaryPointGeometries: BinaryPointGeometry[] = [];
164
175
  for (let i = 0; i < nPoints; i++) {
165
176
  // Byte order for point
166
- const littleEndianPoint = view.getUint8(offset) === 1;
177
+ const littleEndianPoint = dataView.getUint8(offset) === 1;
167
178
  offset++;
168
179
 
169
180
  // Assert point type
170
- if (view.getUint32(offset, littleEndianPoint) % 1000 !== 1) {
181
+ if (dataView.getUint32(offset, littleEndianPoint) % 1000 !== 1) {
171
182
  throw new Error('WKB: Inner geometries of MultiPoint not of type Point');
172
183
  }
173
184
 
174
185
  offset += 4;
175
186
 
176
- const parsed = parsePoint(view, offset, dimension, littleEndianPoint);
187
+ const parsed = parsePoint(dataView, offset, dimension, littleEndianPoint);
177
188
  offset = parsed.offset;
178
189
  binaryPointGeometries.push(parsed.geometry);
179
190
  }
@@ -182,27 +193,27 @@ function parseMultiPoint(
182
193
  }
183
194
 
184
195
  function parseMultiLineString(
185
- view: DataView,
196
+ dataView: DataView,
186
197
  offset: number,
187
198
  dimension: number,
188
199
  littleEndian: boolean
189
200
  ): BinaryLineGeometry {
190
- const nLines = view.getUint32(offset, littleEndian);
201
+ const nLines = dataView.getUint32(offset, littleEndian);
191
202
  offset += 4;
192
203
 
193
204
  const binaryLineGeometries: BinaryLineGeometry[] = [];
194
205
  for (let i = 0; i < nLines; i++) {
195
206
  // Byte order for line
196
- const littleEndianLine = view.getUint8(offset) === 1;
207
+ const littleEndianLine = dataView.getUint8(offset) === 1;
197
208
  offset++;
198
209
 
199
210
  // Assert type LineString
200
- if (view.getUint32(offset, littleEndianLine) % 1000 !== 2) {
211
+ if (dataView.getUint32(offset, littleEndianLine) % 1000 !== 2) {
201
212
  throw new Error('WKB: Inner geometries of MultiLineString not of type LineString');
202
213
  }
203
214
  offset += 4;
204
215
 
205
- const parsed = parseLineString(view, offset, dimension, littleEndianLine);
216
+ const parsed = parseLineString(dataView, offset, dimension, littleEndianLine);
206
217
  offset = parsed.offset;
207
218
  binaryLineGeometries.push(parsed.geometry);
208
219
  }
@@ -211,27 +222,27 @@ function parseMultiLineString(
211
222
  }
212
223
 
213
224
  function parseMultiPolygon(
214
- view: DataView,
225
+ dataView: DataView,
215
226
  offset: number,
216
227
  dimension: number,
217
228
  littleEndian: boolean
218
229
  ): BinaryPolygonGeometry {
219
- const nPolygons = view.getUint32(offset, littleEndian);
230
+ const nPolygons = dataView.getUint32(offset, littleEndian);
220
231
  offset += 4;
221
232
 
222
233
  const binaryPolygonGeometries: BinaryPolygonGeometry[] = [];
223
234
  for (let i = 0; i < nPolygons; i++) {
224
235
  // Byte order for polygon
225
- const littleEndianPolygon = view.getUint8(offset) === 1;
236
+ const littleEndianPolygon = dataView.getUint8(offset) === 1;
226
237
  offset++;
227
238
 
228
239
  // Assert type Polygon
229
- if (view.getUint32(offset, littleEndianPolygon) % 1000 !== 3) {
240
+ if (dataView.getUint32(offset, littleEndianPolygon) % 1000 !== 3) {
230
241
  throw new Error('WKB: Inner geometries of MultiPolygon not of type Polygon');
231
242
  }
232
243
  offset += 4;
233
244
 
234
- const parsed = parsePolygon(view, offset, dimension, littleEndianPolygon);
245
+ const parsed = parsePolygon(dataView, offset, dimension, littleEndianPolygon);
235
246
  offset = parsed.offset;
236
247
  binaryPolygonGeometries.push(parsed.geometry);
237
248
  }
@@ -0,0 +1,147 @@
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
+ /* eslint-disable no-console */ // TODO switch to options.log
5
+
6
+ export type ParseWKTCRSOptions = {
7
+ sort?: boolean;
8
+ keywords?: string[];
9
+ raw?: boolean;
10
+ debug?: boolean;
11
+ };
12
+
13
+ export type WKTCRS = any;
14
+
15
+ /**
16
+ *
17
+ * @param wkt
18
+ * @param options
19
+ * @returns
20
+ */
21
+ export function parseWKTCRS(wkt: string, options?: ParseWKTCRSOptions): WKTCRS {
22
+ if (options?.debug) {
23
+ console.log('[wktcrs] parse starting with\n', wkt);
24
+ }
25
+
26
+ // move all keywords into first array item slot
27
+ // from PARAM[12345, 67890] to ["PARAM", 12345, 67890]
28
+ wkt = wkt.replace(/[A-Z][A-Z\d_]+\[/gi, (match) => `["${match.substr(0, match.length - 1)}",`);
29
+
30
+ // wrap variables in strings
31
+ // from [...,NORTH] to [...,"NORTH"]
32
+ wkt = wkt.replace(/, ?([A-Z][A-Z\d_]+[,\]])/gi, (match, p1) => {
33
+ const varname = p1.substr(0, p1.length - 1);
34
+ return ',' + `"${options?.raw ? 'raw:' : ''}${varname}"${p1[p1.length - 1]}`;
35
+ });
36
+
37
+ if (options?.raw) {
38
+ // replace all numbers with strings
39
+ wkt = wkt.replace(/, {0,2}(-?[\.\d]+)(?=,|\])/g, function (match, p1) {
40
+ return ',' + `"${options?.raw ? 'raw:' : ''}${p1}"`;
41
+ });
42
+ }
43
+
44
+ // str should now be valid JSON
45
+ if (options?.debug) {
46
+ console.log(`[wktcrs] json'd wkt: '${wkt}'`);
47
+ }
48
+
49
+ let data;
50
+ try {
51
+ data = JSON.parse(wkt);
52
+ } catch (error) {
53
+ console.error(`[wktcrs] failed to parse '${wkt}'`);
54
+ throw error;
55
+ }
56
+
57
+ if (options?.debug) {
58
+ console.log(`[wktcrs] json parsed: '${wkt}'`);
59
+ }
60
+
61
+ function process(data, parent) {
62
+ const kw = data[0];
63
+
64
+ // after removing the first element with .shift()
65
+ // data is now just an array of attributes
66
+
67
+ data.forEach(function (it) {
68
+ if (Array.isArray(it)) {
69
+ process(it, data);
70
+ }
71
+ });
72
+
73
+ const kwarr = `MULTIPLE_${kw}`;
74
+
75
+ if (kwarr in parent) {
76
+ parent[kwarr].push(data);
77
+ } else if (kw in parent) {
78
+ parent[kwarr] = [parent[kw], data];
79
+ delete parent[kw];
80
+ } else {
81
+ parent[kw] = data;
82
+ }
83
+ return parent;
84
+ }
85
+
86
+ const result = process(data, [data]);
87
+ if (options?.debug) {
88
+ console.log('[wktcrs] parse returning', result);
89
+ }
90
+
91
+ if (options?.sort) {
92
+ sort(result, options);
93
+ }
94
+
95
+ return result;
96
+ }
97
+
98
+ function sort(data: string[], options?: {keywords?: string[]}) {
99
+ const keys = Object.keys(data).filter((k) => !/\d+/.test(k));
100
+
101
+ const keywords: string[] = options?.keywords || [];
102
+ if (!options?.keywords) {
103
+ // try to find multiples
104
+ const counts = {};
105
+ if (Array.isArray(data)) {
106
+ data.forEach((it) => {
107
+ if (Array.isArray(it) && it.length >= 2 && typeof it[1] === 'string') {
108
+ const k = it[0];
109
+ if (!counts[k]) counts[k] = 0;
110
+ counts[k]++;
111
+ }
112
+ });
113
+ for (const k in counts) {
114
+ if (counts[k] > 0) keywords.push(k);
115
+ }
116
+ }
117
+ }
118
+
119
+ keys.forEach((key) => {
120
+ data[key] = sort(data[key]);
121
+ });
122
+
123
+ keywords.forEach((key) => {
124
+ const indices: number[] = [];
125
+ const params: string[] = [];
126
+
127
+ data.forEach((item, i) => {
128
+ if (Array.isArray(item) && item[0] === key) {
129
+ indices.push(i);
130
+ params.push(item);
131
+ }
132
+ });
133
+
134
+ params.sort((a, b) => {
135
+ a = a[1].toString();
136
+ b = b[1].toString();
137
+ return a < b ? -1 : a > b ? 1 : 0;
138
+ });
139
+
140
+ // replace in order
141
+ params.forEach((param, i) => {
142
+ data[indices[i]] = param;
143
+ });
144
+ });
145
+
146
+ return data;
147
+ }