@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
@@ -0,0 +1,256 @@
1
+ import { BinaryReader } from './utils/binary-reader';
2
+ import { WKBGeometryType } from './parse-wkb-header';
3
+ export function isTWKB(arrayBuffer) {
4
+ const binaryReader = new BinaryReader(arrayBuffer);
5
+ const type = binaryReader.readUInt8();
6
+ const geometryType = type & 0x0f;
7
+ if (geometryType < 1 || geometryType > 7) {
8
+ return false;
9
+ }
10
+ return true;
11
+ }
12
+ export function parseTWKBGeometry(arrayBuffer) {
13
+ const binaryReader = new BinaryReader(arrayBuffer);
14
+ const context = parseTWKBHeader(binaryReader);
15
+ if (context.hasSizeAttribute) {
16
+ binaryReader.readVarInt();
17
+ }
18
+ if (context.hasBoundingBox) {
19
+ let dimensions = 2;
20
+ if (context.hasZ) {
21
+ dimensions++;
22
+ }
23
+ if (context.hasM) {
24
+ dimensions++;
25
+ }
26
+ for (let i = 0; i < dimensions; i++) {
27
+ binaryReader.readVarInt();
28
+ binaryReader.readVarInt();
29
+ }
30
+ }
31
+ return parseGeometry(binaryReader, context, context.geometryType);
32
+ }
33
+ function parseTWKBHeader(binaryReader) {
34
+ const type = binaryReader.readUInt8();
35
+ const metadataHeader = binaryReader.readUInt8();
36
+ const geometryType = type & 0x0f;
37
+ const precision = zigZagDecode(type >> 4);
38
+ const hasExtendedPrecision = Boolean(metadataHeader >> 3 & 1);
39
+ let hasZ = false;
40
+ let hasM = false;
41
+ let zPrecision = 0;
42
+ let zPrecisionFactor = 1;
43
+ let mPrecision = 0;
44
+ let mPrecisionFactor = 1;
45
+ if (hasExtendedPrecision) {
46
+ const extendedPrecision = binaryReader.readUInt8();
47
+ hasZ = (extendedPrecision & 0x01) === 0x01;
48
+ hasM = (extendedPrecision & 0x02) === 0x02;
49
+ zPrecision = zigZagDecode((extendedPrecision & 0x1c) >> 2);
50
+ zPrecisionFactor = Math.pow(10, zPrecision);
51
+ mPrecision = zigZagDecode((extendedPrecision & 0xe0) >> 5);
52
+ mPrecisionFactor = Math.pow(10, mPrecision);
53
+ }
54
+ return {
55
+ geometryType,
56
+ precision,
57
+ precisionFactor: Math.pow(10, precision),
58
+ hasBoundingBox: Boolean(metadataHeader >> 0 & 1),
59
+ hasSizeAttribute: Boolean(metadataHeader >> 1 & 1),
60
+ hasIdList: Boolean(metadataHeader >> 2 & 1),
61
+ hasExtendedPrecision,
62
+ isEmpty: Boolean(metadataHeader >> 4 & 1),
63
+ hasZ,
64
+ hasM,
65
+ zPrecision,
66
+ zPrecisionFactor,
67
+ mPrecision,
68
+ mPrecisionFactor
69
+ };
70
+ }
71
+ function parseGeometry(binaryReader, context, geometryType) {
72
+ switch (geometryType) {
73
+ case WKBGeometryType.Point:
74
+ return parsePoint(binaryReader, context);
75
+ case WKBGeometryType.LineString:
76
+ return parseLineString(binaryReader, context);
77
+ case WKBGeometryType.Polygon:
78
+ return parsePolygon(binaryReader, context);
79
+ case WKBGeometryType.MultiPoint:
80
+ return parseMultiPoint(binaryReader, context);
81
+ case WKBGeometryType.MultiLineString:
82
+ return parseMultiLineString(binaryReader, context);
83
+ case WKBGeometryType.MultiPolygon:
84
+ return parseMultiPolygon(binaryReader, context);
85
+ case WKBGeometryType.GeometryCollection:
86
+ return parseGeometryCollection(binaryReader, context);
87
+ default:
88
+ throw new Error("GeometryType ".concat(geometryType, " not supported"));
89
+ }
90
+ }
91
+ function parsePoint(reader, context) {
92
+ if (context.isEmpty) {
93
+ return {
94
+ type: 'Point',
95
+ coordinates: []
96
+ };
97
+ }
98
+ return {
99
+ type: 'Point',
100
+ coordinates: readFirstPoint(reader, context)
101
+ };
102
+ }
103
+ function parseLineString(reader, context) {
104
+ if (context.isEmpty) {
105
+ return {
106
+ type: 'LineString',
107
+ coordinates: []
108
+ };
109
+ }
110
+ const pointCount = reader.readVarInt();
111
+ const previousPoint = makePreviousPoint(context);
112
+ const points = [];
113
+ for (let i = 0; i < pointCount; i++) {
114
+ points.push(parseNextPoint(reader, context, previousPoint));
115
+ }
116
+ return {
117
+ type: 'LineString',
118
+ coordinates: points
119
+ };
120
+ }
121
+ function parsePolygon(reader, context) {
122
+ if (context.isEmpty) {
123
+ return {
124
+ type: 'Polygon',
125
+ coordinates: []
126
+ };
127
+ }
128
+ const ringCount = reader.readVarInt();
129
+ const previousPoint = makePreviousPoint(context);
130
+ const exteriorRingLength = reader.readVarInt();
131
+ const exteriorRing = [];
132
+ for (let i = 0; i < exteriorRingLength; i++) {
133
+ exteriorRing.push(parseNextPoint(reader, context, previousPoint));
134
+ }
135
+ const polygon = [exteriorRing];
136
+ for (let i = 1; i < ringCount; i++) {
137
+ const interiorRingCount = reader.readVarInt();
138
+ const interiorRing = [];
139
+ for (let j = 0; j < interiorRingCount; j++) {
140
+ interiorRing.push(parseNextPoint(reader, context, previousPoint));
141
+ }
142
+ polygon.push(interiorRing);
143
+ }
144
+ return {
145
+ type: 'Polygon',
146
+ coordinates: polygon
147
+ };
148
+ }
149
+ function parseMultiPoint(reader, context) {
150
+ if (context.isEmpty) {
151
+ return {
152
+ type: 'MultiPoint',
153
+ coordinates: []
154
+ };
155
+ }
156
+ const previousPoint = makePreviousPoint(context);
157
+ const pointCount = reader.readVarInt();
158
+ const coordinates = [];
159
+ for (let i = 0; i < pointCount; i++) {
160
+ coordinates.push(parseNextPoint(reader, context, previousPoint));
161
+ }
162
+ return {
163
+ type: 'MultiPoint',
164
+ coordinates
165
+ };
166
+ }
167
+ function parseMultiLineString(reader, context) {
168
+ if (context.isEmpty) {
169
+ return {
170
+ type: 'MultiLineString',
171
+ coordinates: []
172
+ };
173
+ }
174
+ const previousPoint = makePreviousPoint(context);
175
+ const lineStringCount = reader.readVarInt();
176
+ const coordinates = [];
177
+ for (let i = 0; i < lineStringCount; i++) {
178
+ const pointCount = reader.readVarInt();
179
+ const lineString = [];
180
+ for (let j = 0; j < pointCount; j++) {
181
+ lineString.push(parseNextPoint(reader, context, previousPoint));
182
+ }
183
+ coordinates.push(lineString);
184
+ }
185
+ return {
186
+ type: 'MultiLineString',
187
+ coordinates
188
+ };
189
+ }
190
+ function parseMultiPolygon(reader, context) {
191
+ if (context.isEmpty) {
192
+ return {
193
+ type: 'MultiPolygon',
194
+ coordinates: []
195
+ };
196
+ }
197
+ const previousPoint = makePreviousPoint(context);
198
+ const polygonCount = reader.readVarInt();
199
+ const polygons = [];
200
+ for (let i = 0; i < polygonCount; i++) {
201
+ const ringCount = reader.readVarInt();
202
+ const exteriorPointCount = reader.readVarInt();
203
+ const exteriorRing = [];
204
+ for (let j = 0; j < exteriorPointCount; j++) {
205
+ exteriorRing.push(parseNextPoint(reader, context, previousPoint));
206
+ }
207
+ const polygon = exteriorRing ? [exteriorRing] : [];
208
+ for (let j = 1; j < ringCount; j++) {
209
+ const interiorRing = [];
210
+ const interiorRingLength = reader.readVarInt();
211
+ for (let k = 0; k < interiorRingLength; k++) {
212
+ interiorRing.push(parseNextPoint(reader, context, previousPoint));
213
+ }
214
+ polygon.push(interiorRing);
215
+ }
216
+ polygons.push(polygon);
217
+ }
218
+ return {
219
+ type: 'MultiPolygon',
220
+ coordinates: polygons
221
+ };
222
+ }
223
+ function parseGeometryCollection(reader, context) {
224
+ return {
225
+ type: 'GeometryCollection',
226
+ geometries: []
227
+ };
228
+ }
229
+ function zigZagDecode(value) {
230
+ return value >> 1 ^ -(value & 1);
231
+ }
232
+ function makePointCoordinates(x, y, z, m) {
233
+ return z !== undefined ? m !== undefined ? [x, y, z, m] : [x, y, z] : [x, y];
234
+ }
235
+ function makePreviousPoint(context) {
236
+ return makePointCoordinates(0, 0, context.hasZ ? 0 : undefined, context.hasM ? 0 : undefined);
237
+ }
238
+ function readFirstPoint(reader, context) {
239
+ const x = zigZagDecode(reader.readVarInt()) / context.precisionFactor;
240
+ const y = zigZagDecode(reader.readVarInt()) / context.precisionFactor;
241
+ const z = context.hasZ ? zigZagDecode(reader.readVarInt()) / context.zPrecisionFactor : undefined;
242
+ const m = context.hasM ? zigZagDecode(reader.readVarInt()) / context.mPrecisionFactor : undefined;
243
+ return makePointCoordinates(x, y, z, m);
244
+ }
245
+ function parseNextPoint(reader, context, previousPoint) {
246
+ previousPoint[0] += zigZagDecode(reader.readVarInt()) / context.precisionFactor;
247
+ previousPoint[1] += zigZagDecode(reader.readVarInt()) / context.precisionFactor;
248
+ if (context.hasZ) {
249
+ previousPoint[2] += zigZagDecode(reader.readVarInt()) / context.zPrecisionFactor;
250
+ }
251
+ if (context.hasM) {
252
+ previousPoint[3] += zigZagDecode(reader.readVarInt()) / context.mPrecisionFactor;
253
+ }
254
+ return previousPoint.slice();
255
+ }
256
+ //# sourceMappingURL=parse-twkb.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-twkb.js","names":["BinaryReader","WKBGeometryType","isTWKB","arrayBuffer","binaryReader","type","readUInt8","geometryType","parseTWKBGeometry","context","parseTWKBHeader","hasSizeAttribute","readVarInt","hasBoundingBox","dimensions","hasZ","hasM","i","parseGeometry","metadataHeader","precision","zigZagDecode","hasExtendedPrecision","Boolean","zPrecision","zPrecisionFactor","mPrecision","mPrecisionFactor","extendedPrecision","Math","pow","precisionFactor","hasIdList","isEmpty","Point","parsePoint","LineString","parseLineString","Polygon","parsePolygon","MultiPoint","parseMultiPoint","MultiLineString","parseMultiLineString","MultiPolygon","parseMultiPolygon","GeometryCollection","parseGeometryCollection","Error","concat","reader","coordinates","readFirstPoint","pointCount","previousPoint","makePreviousPoint","points","push","parseNextPoint","ringCount","exteriorRingLength","exteriorRing","polygon","interiorRingCount","interiorRing","j","lineStringCount","lineString","polygonCount","polygons","exteriorPointCount","interiorRingLength","k","geometries","value","makePointCoordinates","x","y","z","m","undefined","slice"],"sources":["../../../src/lib/parse-twkb.ts"],"sourcesContent":["// loaders.gl, MIT license\n// Forked from https://github.com/cschwarz/wkx under MIT license, Copyright (c) 2013 Christian Schwarz\n\nimport type {Geometry, GeometryCollection} from '@loaders.gl/schema';\nimport type {Point, LineString, Polygon} from '@loaders.gl/schema';\nimport type {MultiPoint, MultiLineString, MultiPolygon} from '@loaders.gl/schema';\nimport {BinaryReader} from './utils/binary-reader';\nimport {WKBGeometryType} from './parse-wkb-header';\n\n/**\n * Check if an array buffer might be a TWKB array buffer\n * @param arrayBuffer The array buffer to check\n * @returns false if this is definitely not a TWKB array buffer, true if it might be a TWKB array buffer\n */\nexport function isTWKB(arrayBuffer: ArrayBuffer): boolean {\n const binaryReader = new BinaryReader(arrayBuffer);\n\n const type = binaryReader.readUInt8();\n const geometryType = type & 0x0f;\n\n // Only geometry types 1 to 7 (point to geometry collection are currently defined)\n if (geometryType < 1 || geometryType > 7) {\n return false;\n }\n\n return true;\n}\n\n/** Passed around between parsing functions, extracted from the header */\ntype TWKBHeader = {\n geometryType: WKBGeometryType;\n\n hasBoundingBox: boolean;\n hasSizeAttribute: boolean;\n hasIdList: boolean;\n hasExtendedPrecision: boolean;\n isEmpty: boolean;\n\n precision: number;\n precisionFactor: number;\n\n hasZ: boolean;\n zPrecision: number;\n zPrecisionFactor: number;\n\n hasM: boolean;\n mPrecision: number;\n mPrecisionFactor: number;\n};\n\nexport function parseTWKBGeometry(arrayBuffer: ArrayBuffer): Geometry {\n const binaryReader = new BinaryReader(arrayBuffer);\n\n const context = parseTWKBHeader(binaryReader);\n\n if (context.hasSizeAttribute) {\n binaryReader.readVarInt();\n }\n\n if (context.hasBoundingBox) {\n let dimensions = 2;\n\n if (context.hasZ) {\n dimensions++;\n }\n if (context.hasM) {\n dimensions++;\n }\n\n // TODO why are we throwing away these datums?\n for (let i = 0; i < dimensions; i++) {\n binaryReader.readVarInt();\n binaryReader.readVarInt();\n }\n }\n\n return parseGeometry(binaryReader, context, context.geometryType);\n}\n\nfunction parseTWKBHeader(binaryReader: BinaryReader): TWKBHeader {\n const type = binaryReader.readUInt8();\n const metadataHeader = binaryReader.readUInt8();\n\n const geometryType = type & 0x0f;\n\n const precision = zigZagDecode(type >> 4);\n\n const hasExtendedPrecision = Boolean((metadataHeader >> 3) & 1);\n let hasZ = false;\n let hasM = false;\n let zPrecision = 0;\n let zPrecisionFactor = 1;\n let mPrecision = 0;\n let mPrecisionFactor = 1;\n\n if (hasExtendedPrecision) {\n const extendedPrecision = binaryReader.readUInt8();\n hasZ = (extendedPrecision & 0x01) === 0x01;\n hasM = (extendedPrecision & 0x02) === 0x02;\n\n zPrecision = zigZagDecode((extendedPrecision & 0x1c) >> 2);\n zPrecisionFactor = Math.pow(10, zPrecision);\n\n mPrecision = zigZagDecode((extendedPrecision & 0xe0) >> 5);\n mPrecisionFactor = Math.pow(10, mPrecision);\n }\n\n return {\n geometryType,\n\n precision,\n precisionFactor: Math.pow(10, precision),\n\n hasBoundingBox: Boolean((metadataHeader >> 0) & 1),\n hasSizeAttribute: Boolean((metadataHeader >> 1) & 1),\n hasIdList: Boolean((metadataHeader >> 2) & 1),\n hasExtendedPrecision,\n isEmpty: Boolean((metadataHeader >> 4) & 1),\n\n hasZ,\n hasM,\n zPrecision,\n zPrecisionFactor,\n mPrecision,\n mPrecisionFactor\n };\n}\n\nfunction parseGeometry(\n binaryReader: BinaryReader,\n context: TWKBHeader,\n geometryType: WKBGeometryType\n): Geometry {\n switch (geometryType) {\n case WKBGeometryType.Point:\n return parsePoint(binaryReader, context);\n case WKBGeometryType.LineString:\n return parseLineString(binaryReader, context);\n case WKBGeometryType.Polygon:\n return parsePolygon(binaryReader, context);\n case WKBGeometryType.MultiPoint:\n return parseMultiPoint(binaryReader, context);\n case WKBGeometryType.MultiLineString:\n return parseMultiLineString(binaryReader, context);\n case WKBGeometryType.MultiPolygon:\n return parseMultiPolygon(binaryReader, context);\n case WKBGeometryType.GeometryCollection:\n return parseGeometryCollection(binaryReader, context);\n default:\n throw new Error(`GeometryType ${geometryType} not supported`);\n }\n}\n\n// GEOMETRIES\n\nfunction parsePoint(reader: BinaryReader, context: TWKBHeader): Point {\n if (context.isEmpty) {\n return {type: 'Point', coordinates: []};\n }\n\n return {type: 'Point', coordinates: readFirstPoint(reader, context)};\n}\n\nfunction parseLineString(reader: BinaryReader, context: TWKBHeader): LineString {\n if (context.isEmpty) {\n return {type: 'LineString', coordinates: []};\n }\n\n const pointCount = reader.readVarInt();\n\n const previousPoint = makePreviousPoint(context);\n\n const points: number[][] = [];\n for (let i = 0; i < pointCount; i++) {\n points.push(parseNextPoint(reader, context, previousPoint));\n }\n\n return {type: 'LineString', coordinates: points};\n}\n\nfunction parsePolygon(reader: BinaryReader, context: TWKBHeader): Polygon {\n if (context.isEmpty) {\n return {type: 'Polygon', coordinates: []};\n }\n\n const ringCount = reader.readVarInt();\n\n const previousPoint = makePreviousPoint(context);\n\n const exteriorRingLength = reader.readVarInt();\n const exteriorRing: number[][] = [];\n\n for (let i = 0; i < exteriorRingLength; i++) {\n exteriorRing.push(parseNextPoint(reader, context, previousPoint));\n }\n\n const polygon: number[][][] = [exteriorRing];\n for (let i = 1; i < ringCount; i++) {\n const interiorRingCount = reader.readVarInt();\n\n const interiorRing: number[][] = [];\n for (let j = 0; j < interiorRingCount; j++) {\n interiorRing.push(parseNextPoint(reader, context, previousPoint));\n }\n\n polygon.push(interiorRing);\n }\n\n return {type: 'Polygon', coordinates: polygon};\n}\n\nfunction parseMultiPoint(reader: BinaryReader, context: TWKBHeader): MultiPoint {\n if (context.isEmpty) {\n return {type: 'MultiPoint', coordinates: []};\n }\n\n const previousPoint = makePreviousPoint(context);\n const pointCount = reader.readVarInt();\n\n const coordinates: number[][] = [];\n for (let i = 0; i < pointCount; i++) {\n coordinates.push(parseNextPoint(reader, context, previousPoint));\n }\n\n return {type: 'MultiPoint', coordinates};\n}\n\nfunction parseMultiLineString(reader: BinaryReader, context: TWKBHeader): MultiLineString {\n if (context.isEmpty) {\n return {type: 'MultiLineString', coordinates: []};\n }\n\n const previousPoint = makePreviousPoint(context);\n const lineStringCount = reader.readVarInt();\n\n const coordinates: number[][][] = [];\n for (let i = 0; i < lineStringCount; i++) {\n const pointCount = reader.readVarInt();\n\n const lineString: number[][] = [];\n for (let j = 0; j < pointCount; j++) {\n lineString.push(parseNextPoint(reader, context, previousPoint));\n }\n\n coordinates.push(lineString);\n }\n\n return {type: 'MultiLineString', coordinates};\n}\n\nfunction parseMultiPolygon(reader: BinaryReader, context: TWKBHeader): MultiPolygon {\n if (context.isEmpty) {\n return {type: 'MultiPolygon', coordinates: []};\n }\n\n const previousPoint = makePreviousPoint(context);\n const polygonCount = reader.readVarInt();\n\n const polygons: number[][][][] = [];\n for (let i = 0; i < polygonCount; i++) {\n const ringCount = reader.readVarInt();\n\n const exteriorPointCount = reader.readVarInt();\n\n const exteriorRing: number[][] = [];\n for (let j = 0; j < exteriorPointCount; j++) {\n exteriorRing.push(parseNextPoint(reader, context, previousPoint));\n }\n\n const polygon: number[][][] = exteriorRing ? [exteriorRing] : [];\n\n for (let j = 1; j < ringCount; j++) {\n const interiorRing: number[][] = [];\n\n const interiorRingLength = reader.readVarInt();\n\n for (let k = 0; k < interiorRingLength; k++) {\n interiorRing.push(parseNextPoint(reader, context, previousPoint));\n }\n\n polygon.push(interiorRing);\n }\n\n polygons.push(polygon);\n }\n\n return {type: 'MultiPolygon', coordinates: polygons};\n}\n\n/** Geometry collection not yet supported */\nfunction parseGeometryCollection(reader: BinaryReader, context: TWKBHeader): GeometryCollection {\n return {type: 'GeometryCollection', geometries: []};\n /**\n if (context.isEmpty) {\n return {type: 'GeometryCollection', geometries: []};\n }\n\n const geometryCount = reader.readVarInt();\n\n const geometries: Geometry[] = new Array(geometryCount);\n for (let i = 0; i < geometryCount; i++) {\n const geometry = parseGeometry(reader, context, geometryType);\n geometries.push(geometry);\n }\n\n return {type: 'GeometryCollection', geometries: []};\n */\n}\n\n// HELPERS\n\n/** \n * Maps negative values to positive values while going back and\n forth (0 = 0, -1 = 1, 1 = 2, -2 = 3, 2 = 4, -3 = 5, 3 = 6 ...)\n */\nfunction zigZagDecode(value: number): number {\n return (value >> 1) ^ -(value & 1);\n}\n\nfunction makePointCoordinates(x: number, y: number, z?: number, m?: number): number[] {\n return (z !== undefined ? (m !== undefined ? [x, y, z, m] : [x, y, z]) : [x, y]) as number[];\n}\n\nfunction makePreviousPoint(context: TWKBHeader): number[] {\n return makePointCoordinates(0, 0, context.hasZ ? 0 : undefined, context.hasM ? 0 : undefined);\n}\n\nfunction readFirstPoint(reader: BinaryReader, context: TWKBHeader): number[] {\n const x = zigZagDecode(reader.readVarInt()) / context.precisionFactor;\n const y = zigZagDecode(reader.readVarInt()) / context.precisionFactor;\n const z = context.hasZ ? zigZagDecode(reader.readVarInt()) / context.zPrecisionFactor : undefined;\n const m = context.hasM ? zigZagDecode(reader.readVarInt()) / context.mPrecisionFactor : undefined;\n return makePointCoordinates(x, y, z, m);\n}\n\n/**\n * Modifies previousPoint\n */\nfunction parseNextPoint(\n reader: BinaryReader,\n context: TWKBHeader,\n previousPoint: number[]\n): number[] {\n previousPoint[0] += zigZagDecode(reader.readVarInt()) / context.precisionFactor;\n previousPoint[1] += zigZagDecode(reader.readVarInt()) / context.precisionFactor;\n\n if (context.hasZ) {\n previousPoint[2] += zigZagDecode(reader.readVarInt()) / context.zPrecisionFactor;\n }\n if (context.hasM) {\n previousPoint[3] += zigZagDecode(reader.readVarInt()) / context.mPrecisionFactor;\n }\n\n // Copy the point\n return previousPoint.slice();\n}\n"],"mappings":"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"}
@@ -0,0 +1,105 @@
1
+ const EWKB_FLAG_Z = 0x80000000;
2
+ const EWKB_FLAG_M = 0x40000000;
3
+ const EWKB_FLAG_SRID = 0x20000000;
4
+ const MAX_SRID = 10000;
5
+ export let WKBGeometryType = function (WKBGeometryType) {
6
+ WKBGeometryType[WKBGeometryType["Point"] = 1] = "Point";
7
+ WKBGeometryType[WKBGeometryType["LineString"] = 2] = "LineString";
8
+ WKBGeometryType[WKBGeometryType["Polygon"] = 3] = "Polygon";
9
+ WKBGeometryType[WKBGeometryType["MultiPoint"] = 4] = "MultiPoint";
10
+ WKBGeometryType[WKBGeometryType["MultiLineString"] = 5] = "MultiLineString";
11
+ WKBGeometryType[WKBGeometryType["MultiPolygon"] = 6] = "MultiPolygon";
12
+ WKBGeometryType[WKBGeometryType["GeometryCollection"] = 7] = "GeometryCollection";
13
+ return WKBGeometryType;
14
+ }({});
15
+ export function isWKB(arrayBuffer) {
16
+ const dataView = new DataView(arrayBuffer);
17
+ let byteOffset = 0;
18
+ const endianness = dataView.getUint8(byteOffset);
19
+ byteOffset += 1;
20
+ if (endianness > 1) {
21
+ return false;
22
+ }
23
+ const littleEndian = endianness === 1;
24
+ const geometry = dataView.getUint32(byteOffset, littleEndian);
25
+ byteOffset += 4;
26
+ const geometryType = geometry & 0x07;
27
+ if (geometryType === 0 || geometryType > 7) {
28
+ return false;
29
+ }
30
+ const geometryFlags = geometry - geometryType;
31
+ if (geometryFlags === 0 || geometryFlags === 1000 || geometryFlags === 2000 || geometryFlags === 3000) {
32
+ return true;
33
+ }
34
+ if ((geometryFlags & ~(EWKB_FLAG_Z | EWKB_FLAG_M | EWKB_FLAG_SRID)) !== 0) {
35
+ return false;
36
+ }
37
+ if (geometryFlags & EWKB_FLAG_SRID) {
38
+ const srid = dataView.getUint32(byteOffset, littleEndian);
39
+ byteOffset += 4;
40
+ if (srid > MAX_SRID) {
41
+ return false;
42
+ }
43
+ }
44
+ return true;
45
+ }
46
+ export function parseWKBHeader(dataView, target) {
47
+ const wkbHeader = Object.assign(target || {}, {
48
+ type: 'wkb',
49
+ geometryType: 1,
50
+ dimensions: 2,
51
+ coordinates: 'xy',
52
+ littleEndian: true,
53
+ byteOffset: 0
54
+ });
55
+ wkbHeader.littleEndian = dataView.getUint8(wkbHeader.byteOffset) === 1;
56
+ wkbHeader.byteOffset++;
57
+ const geometryCode = dataView.getUint32(wkbHeader.byteOffset, wkbHeader.littleEndian);
58
+ wkbHeader.byteOffset += 4;
59
+ wkbHeader.geometryType = geometryCode & 0x7;
60
+ const isoType = (geometryCode - wkbHeader.geometryType) / 1000;
61
+ switch (isoType) {
62
+ case 0:
63
+ break;
64
+ case 1:
65
+ wkbHeader.type = 'iso-wkb';
66
+ wkbHeader.dimensions = 3;
67
+ wkbHeader.coordinates = 'xyz';
68
+ break;
69
+ case 2:
70
+ wkbHeader.type = 'iso-wkb';
71
+ wkbHeader.dimensions = 3;
72
+ wkbHeader.coordinates = 'xym';
73
+ break;
74
+ case 3:
75
+ wkbHeader.type = 'iso-wkb';
76
+ wkbHeader.dimensions = 4;
77
+ wkbHeader.coordinates = 'xyzm';
78
+ break;
79
+ default:
80
+ throw new Error("WKB: Unsupported iso-wkb type: ".concat(isoType));
81
+ }
82
+ const ewkbZ = geometryCode & EWKB_FLAG_Z;
83
+ const ewkbM = geometryCode & EWKB_FLAG_M;
84
+ const ewkbSRID = geometryCode & EWKB_FLAG_SRID;
85
+ if (ewkbZ && ewkbM) {
86
+ wkbHeader.type = 'ewkb';
87
+ wkbHeader.dimensions = 4;
88
+ wkbHeader.coordinates = 'xyzm';
89
+ } else if (ewkbZ) {
90
+ wkbHeader.type = 'ewkb';
91
+ wkbHeader.dimensions = 3;
92
+ wkbHeader.coordinates = 'xyz';
93
+ } else if (ewkbM) {
94
+ wkbHeader.type = 'ewkb';
95
+ wkbHeader.dimensions = 3;
96
+ wkbHeader.coordinates = 'xym';
97
+ }
98
+ if (ewkbSRID) {
99
+ wkbHeader.type = 'ewkb';
100
+ wkbHeader.srid = dataView.getUint32(wkbHeader.byteOffset, wkbHeader.littleEndian);
101
+ wkbHeader.byteOffset += 4;
102
+ }
103
+ return wkbHeader;
104
+ }
105
+ //# sourceMappingURL=parse-wkb-header.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-wkb-header.js","names":["EWKB_FLAG_Z","EWKB_FLAG_M","EWKB_FLAG_SRID","MAX_SRID","WKBGeometryType","isWKB","arrayBuffer","dataView","DataView","byteOffset","endianness","getUint8","littleEndian","geometry","getUint32","geometryType","geometryFlags","srid","parseWKBHeader","target","wkbHeader","Object","assign","type","dimensions","coordinates","geometryCode","isoType","Error","concat","ewkbZ","ewkbM","ewkbSRID"],"sources":["../../../src/lib/parse-wkb-header.ts"],"sourcesContent":["// loaders.gl, MIT license\n\nconst EWKB_FLAG_Z = 0x80000000;\nconst EWKB_FLAG_M = 0x40000000;\nconst EWKB_FLAG_SRID = 0x20000000;\n\nconst MAX_SRID = 10000; // TBD: Assume no more than 10K SRIDs are defined\n\n/**\n * Integer code for geometry types in WKB and related formats\n * Reference: https://en.wikipedia.org/wiki/Well-known_text_representation_of_geometry#Well-known_binary\n */\nexport enum WKBGeometryType {\n Point = 1,\n LineString = 2,\n Polygon = 3,\n MultiPoint = 4,\n MultiLineString = 5,\n MultiPolygon = 6,\n GeometryCollection = 7\n}\n\n/** Parsed WKB header */\nexport type WKBHeader = {\n /** WKB variant */\n type: 'wkb' | 'ewkb' | 'iso-wkb' | 'twkb';\n /** geometry type encoded in this WKB: point, line, polygon etc */\n geometryType: 1 | 2 | 3 | 4 | 5 | 6 | 7;\n /** Number of dimensions for coordinate data */\n dimensions: 2 | 3 | 4;\n /** Coordinate names, Z and M are controlled by flags */\n coordinates: 'xy' | 'xyz' | 'xym' | 'xyzm';\n srid?: number;\n /** true if binary data is stored as little endian */\n littleEndian: boolean;\n /** Offset to start of geometry */\n byteOffset: number;\n};\n\n/** Sanity checks that first to 5-9 bytes could represent a supported WKB dialect header */\nexport function isWKB(arrayBuffer: ArrayBuffer): boolean {\n const dataView = new DataView(arrayBuffer);\n let byteOffset = 0;\n\n const endianness = dataView.getUint8(byteOffset);\n byteOffset += 1;\n\n // Check valid endianness (only 0 or 1 are allowed)\n if (endianness > 1) {\n return false;\n }\n\n const littleEndian = endianness === 1;\n\n const geometry = dataView.getUint32(byteOffset, littleEndian);\n byteOffset += 4;\n\n // check valid geometry type (we don't support extension geometries)\n const geometryType = geometry & 0x07;\n if (geometryType === 0 || geometryType > 7) {\n return false;\n }\n\n const geometryFlags = geometry - geometryType;\n\n // Accept iso-wkb flags\n if (\n geometryFlags === 0 ||\n geometryFlags === 1000 ||\n geometryFlags === 2000 ||\n geometryFlags === 3000\n ) {\n return true;\n }\n\n // Accept ewkb flags but reject otherwise\n if ((geometryFlags & ~(EWKB_FLAG_Z | EWKB_FLAG_M | EWKB_FLAG_SRID)) !== 0) {\n return false;\n }\n\n if (geometryFlags & EWKB_FLAG_SRID) {\n const srid = dataView.getUint32(byteOffset, littleEndian);\n byteOffset += 4;\n\n if (srid > MAX_SRID) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Parses header and provides a byteOffset to start of geometry data\n * @param dataView\n * @param target optionally supply a WKBHeader object to avoid creating a new object for every call\n * @returns a header object describing the WKB data\n */\n// eslint-disable-next-line max-statements\nexport function parseWKBHeader(dataView: DataView, target?: WKBHeader): WKBHeader {\n const wkbHeader: WKBHeader = Object.assign(target || {}, {\n type: 'wkb',\n geometryType: 1,\n dimensions: 2,\n coordinates: 'xy',\n littleEndian: true,\n byteOffset: 0\n } as WKBHeader);\n\n // Check endianness of data\n wkbHeader.littleEndian = dataView.getUint8(wkbHeader.byteOffset) === 1;\n wkbHeader.byteOffset++;\n\n // 4-digit code representing dimension and type of geometry\n const geometryCode = dataView.getUint32(wkbHeader.byteOffset, wkbHeader.littleEndian);\n wkbHeader.byteOffset += 4;\n\n wkbHeader.geometryType = (geometryCode & 0x7) as 1 | 2 | 3 | 4 | 5 | 6 | 7;\n\n // Check if iso-wkb variant: iso-wkb adds 1000, 2000 or 3000 to the geometry code\n const isoType = (geometryCode - wkbHeader.geometryType) / 1000;\n switch (isoType) {\n case 0:\n break;\n case 1:\n wkbHeader.type = 'iso-wkb';\n wkbHeader.dimensions = 3;\n wkbHeader.coordinates = 'xyz';\n break;\n case 2:\n wkbHeader.type = 'iso-wkb';\n wkbHeader.dimensions = 3;\n wkbHeader.coordinates = 'xym';\n break;\n case 3:\n wkbHeader.type = 'iso-wkb';\n wkbHeader.dimensions = 4;\n wkbHeader.coordinates = 'xyzm';\n break;\n default:\n throw new Error(`WKB: Unsupported iso-wkb type: ${isoType}`);\n }\n\n // Check if EWKB variant. Uses bitmasks for Z&M dimensions as well as optional SRID field\n const ewkbZ = geometryCode & EWKB_FLAG_Z;\n const ewkbM = geometryCode & EWKB_FLAG_M;\n const ewkbSRID = geometryCode & EWKB_FLAG_SRID;\n\n if (ewkbZ && ewkbM) {\n wkbHeader.type = 'ewkb';\n wkbHeader.dimensions = 4;\n wkbHeader.coordinates = 'xyzm';\n } else if (ewkbZ) {\n wkbHeader.type = 'ewkb';\n wkbHeader.dimensions = 3;\n wkbHeader.coordinates = 'xyz';\n } else if (ewkbM) {\n wkbHeader.type = 'ewkb';\n wkbHeader.dimensions = 3;\n wkbHeader.coordinates = 'xym';\n }\n\n // If SRID present read four more bytes\n if (ewkbSRID) {\n wkbHeader.type = 'ewkb';\n // 4-digit code representing dimension and type of geometry\n wkbHeader.srid = dataView.getUint32(wkbHeader.byteOffset, wkbHeader.littleEndian);\n wkbHeader.byteOffset += 4;\n }\n\n return wkbHeader;\n}\n"],"mappings":"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"}
@@ -1,49 +1,57 @@
1
- const NUM_DIMENSIONS = {
2
- 0: 2,
3
- 1: 3,
4
- 2: 3,
5
- 3: 4
6
- };
7
- export default function parseWKB(arrayBuffer) {
8
- const view = new DataView(arrayBuffer);
9
- let offset = 0;
10
- const littleEndian = view.getUint8(offset) === 1;
11
- offset++;
12
- const geometryCode = view.getUint32(offset, littleEndian);
13
- offset += 4;
14
- const geometryType = geometryCode % 1000;
15
- const type = (geometryCode - geometryType) / 1000;
16
- const dimension = NUM_DIMENSIONS[type];
1
+ import { binaryToGeometry } from '@loaders.gl/gis';
2
+ import { parseWKBHeader, WKBGeometryType } from './parse-wkb-header';
3
+ export function parseWKB(arrayBuffer, options) {
4
+ var _options$wkb;
5
+ const binaryGeometry = parseWKBToBinary(arrayBuffer, options);
6
+ const shape = (options === null || options === void 0 ? void 0 : (_options$wkb = options.wkb) === null || _options$wkb === void 0 ? void 0 : _options$wkb.shape) || 'binary-geometry';
7
+ switch (shape) {
8
+ case 'binary-geometry':
9
+ return binaryGeometry;
10
+ case 'geometry':
11
+ return binaryToGeometry(binaryGeometry);
12
+ default:
13
+ throw new Error(shape);
14
+ }
15
+ }
16
+ export function parseWKBToBinary(arrayBuffer, options) {
17
+ const dataView = new DataView(arrayBuffer);
18
+ const wkbHeader = parseWKBHeader(dataView);
19
+ const {
20
+ geometryType,
21
+ dimensions,
22
+ littleEndian
23
+ } = wkbHeader;
24
+ const offset = wkbHeader.byteOffset;
17
25
  switch (geometryType) {
18
- case 1:
19
- const point = parsePoint(view, offset, dimension, littleEndian);
26
+ case WKBGeometryType.Point:
27
+ const point = parsePoint(dataView, offset, dimensions, littleEndian);
20
28
  return point.geometry;
21
- case 2:
22
- const line = parseLineString(view, offset, dimension, littleEndian);
29
+ case WKBGeometryType.LineString:
30
+ const line = parseLineString(dataView, offset, dimensions, littleEndian);
23
31
  return line.geometry;
24
- case 3:
25
- const polygon = parsePolygon(view, offset, dimension, littleEndian);
32
+ case WKBGeometryType.Polygon:
33
+ const polygon = parsePolygon(dataView, offset, dimensions, littleEndian);
26
34
  return polygon.geometry;
27
- case 4:
28
- const multiPoint = parseMultiPoint(view, offset, dimension, littleEndian);
35
+ case WKBGeometryType.MultiPoint:
36
+ const multiPoint = parseMultiPoint(dataView, offset, dimensions, littleEndian);
29
37
  multiPoint.type = 'Point';
30
38
  return multiPoint;
31
- case 5:
32
- const multiLine = parseMultiLineString(view, offset, dimension, littleEndian);
39
+ case WKBGeometryType.MultiLineString:
40
+ const multiLine = parseMultiLineString(dataView, offset, dimensions, littleEndian);
33
41
  multiLine.type = 'LineString';
34
42
  return multiLine;
35
- case 6:
36
- const multiPolygon = parseMultiPolygon(view, offset, dimension, littleEndian);
43
+ case WKBGeometryType.MultiPolygon:
44
+ const multiPolygon = parseMultiPolygon(dataView, offset, dimensions, littleEndian);
37
45
  multiPolygon.type = 'Polygon';
38
46
  return multiPolygon;
39
47
  default:
40
48
  throw new Error("WKB: Unsupported geometry type: ".concat(geometryType));
41
49
  }
42
50
  }
43
- function parsePoint(view, offset, dimension, littleEndian) {
51
+ function parsePoint(dataView, offset, dimension, littleEndian) {
44
52
  const positions = new Float64Array(dimension);
45
53
  for (let i = 0; i < dimension; i++) {
46
- positions[i] = view.getFloat64(offset, littleEndian);
54
+ positions[i] = dataView.getFloat64(offset, littleEndian);
47
55
  offset += 8;
48
56
  }
49
57
  return {
@@ -57,12 +65,12 @@ function parsePoint(view, offset, dimension, littleEndian) {
57
65
  offset
58
66
  };
59
67
  }
60
- function parseLineString(view, offset, dimension, littleEndian) {
61
- const nPoints = view.getUint32(offset, littleEndian);
68
+ function parseLineString(dataView, offset, dimension, littleEndian) {
69
+ const nPoints = dataView.getUint32(offset, littleEndian);
62
70
  offset += 4;
63
71
  const positions = new Float64Array(nPoints * dimension);
64
72
  for (let i = 0; i < nPoints * dimension; i++) {
65
- positions[i] = view.getFloat64(offset, littleEndian);
73
+ positions[i] = dataView.getFloat64(offset, littleEndian);
66
74
  offset += 8;
67
75
  }
68
76
  const pathIndices = [0];
@@ -85,12 +93,12 @@ function parseLineString(view, offset, dimension, littleEndian) {
85
93
  };
86
94
  }
87
95
  const cumulativeSum = sum => value => sum += value;
88
- function parsePolygon(view, offset, dimension, littleEndian) {
89
- const nRings = view.getUint32(offset, littleEndian);
96
+ function parsePolygon(dataView, offset, dimension, littleEndian) {
97
+ const nRings = dataView.getUint32(offset, littleEndian);
90
98
  offset += 4;
91
99
  const rings = [];
92
100
  for (let i = 0; i < nRings; i++) {
93
- const parsed = parseLineString(view, offset, dimension, littleEndian);
101
+ const parsed = parseLineString(dataView, offset, dimension, littleEndian);
94
102
  const {
95
103
  positions
96
104
  } = parsed.geometry;
@@ -123,52 +131,52 @@ function parsePolygon(view, offset, dimension, littleEndian) {
123
131
  offset
124
132
  };
125
133
  }
126
- function parseMultiPoint(view, offset, dimension, littleEndian) {
127
- const nPoints = view.getUint32(offset, littleEndian);
134
+ function parseMultiPoint(dataView, offset, dimension, littleEndian) {
135
+ const nPoints = dataView.getUint32(offset, littleEndian);
128
136
  offset += 4;
129
137
  const binaryPointGeometries = [];
130
138
  for (let i = 0; i < nPoints; i++) {
131
- const littleEndianPoint = view.getUint8(offset) === 1;
139
+ const littleEndianPoint = dataView.getUint8(offset) === 1;
132
140
  offset++;
133
- if (view.getUint32(offset, littleEndianPoint) % 1000 !== 1) {
141
+ if (dataView.getUint32(offset, littleEndianPoint) % 1000 !== 1) {
134
142
  throw new Error('WKB: Inner geometries of MultiPoint not of type Point');
135
143
  }
136
144
  offset += 4;
137
- const parsed = parsePoint(view, offset, dimension, littleEndianPoint);
145
+ const parsed = parsePoint(dataView, offset, dimension, littleEndianPoint);
138
146
  offset = parsed.offset;
139
147
  binaryPointGeometries.push(parsed.geometry);
140
148
  }
141
149
  return concatenateBinaryPointGeometries(binaryPointGeometries, dimension);
142
150
  }
143
- function parseMultiLineString(view, offset, dimension, littleEndian) {
144
- const nLines = view.getUint32(offset, littleEndian);
151
+ function parseMultiLineString(dataView, offset, dimension, littleEndian) {
152
+ const nLines = dataView.getUint32(offset, littleEndian);
145
153
  offset += 4;
146
154
  const binaryLineGeometries = [];
147
155
  for (let i = 0; i < nLines; i++) {
148
- const littleEndianLine = view.getUint8(offset) === 1;
156
+ const littleEndianLine = dataView.getUint8(offset) === 1;
149
157
  offset++;
150
- if (view.getUint32(offset, littleEndianLine) % 1000 !== 2) {
158
+ if (dataView.getUint32(offset, littleEndianLine) % 1000 !== 2) {
151
159
  throw new Error('WKB: Inner geometries of MultiLineString not of type LineString');
152
160
  }
153
161
  offset += 4;
154
- const parsed = parseLineString(view, offset, dimension, littleEndianLine);
162
+ const parsed = parseLineString(dataView, offset, dimension, littleEndianLine);
155
163
  offset = parsed.offset;
156
164
  binaryLineGeometries.push(parsed.geometry);
157
165
  }
158
166
  return concatenateBinaryLineGeometries(binaryLineGeometries, dimension);
159
167
  }
160
- function parseMultiPolygon(view, offset, dimension, littleEndian) {
161
- const nPolygons = view.getUint32(offset, littleEndian);
168
+ function parseMultiPolygon(dataView, offset, dimension, littleEndian) {
169
+ const nPolygons = dataView.getUint32(offset, littleEndian);
162
170
  offset += 4;
163
171
  const binaryPolygonGeometries = [];
164
172
  for (let i = 0; i < nPolygons; i++) {
165
- const littleEndianPolygon = view.getUint8(offset) === 1;
173
+ const littleEndianPolygon = dataView.getUint8(offset) === 1;
166
174
  offset++;
167
- if (view.getUint32(offset, littleEndianPolygon) % 1000 !== 3) {
175
+ if (dataView.getUint32(offset, littleEndianPolygon) % 1000 !== 3) {
168
176
  throw new Error('WKB: Inner geometries of MultiPolygon not of type Polygon');
169
177
  }
170
178
  offset += 4;
171
- const parsed = parsePolygon(view, offset, dimension, littleEndianPolygon);
179
+ const parsed = parsePolygon(dataView, offset, dimension, littleEndianPolygon);
172
180
  offset = parsed.offset;
173
181
  binaryPolygonGeometries.push(parsed.geometry);
174
182
  }