@loaders.gl/shapefile 3.3.0-alpha.1 → 3.3.0-alpha.11

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 (72) hide show
  1. package/dist/dbf-worker.js +1 -1
  2. package/dist/dist.min.js +47 -11
  3. package/dist/es5/bundle.js +0 -1
  4. package/dist/es5/bundle.js.map +1 -1
  5. package/dist/es5/dbf-loader.js +5 -16
  6. package/dist/es5/dbf-loader.js.map +1 -1
  7. package/dist/es5/index.js +6 -9
  8. package/dist/es5/index.js.map +1 -1
  9. package/dist/es5/lib/parsers/parse-dbf.js +69 -154
  10. package/dist/es5/lib/parsers/parse-dbf.js.map +1 -1
  11. package/dist/es5/lib/parsers/parse-shapefile.js +34 -148
  12. package/dist/es5/lib/parsers/parse-shapefile.js.map +1 -1
  13. package/dist/es5/lib/parsers/parse-shp-geometry.js +4 -57
  14. package/dist/es5/lib/parsers/parse-shp-geometry.js.map +1 -1
  15. package/dist/es5/lib/parsers/parse-shp-header.js +0 -3
  16. package/dist/es5/lib/parsers/parse-shp-header.js.map +1 -1
  17. package/dist/es5/lib/parsers/parse-shp.js +39 -98
  18. package/dist/es5/lib/parsers/parse-shp.js.map +1 -1
  19. package/dist/es5/lib/parsers/parse-shx.js +0 -4
  20. package/dist/es5/lib/parsers/parse-shx.js.map +1 -1
  21. package/dist/es5/lib/parsers/types.js.map +1 -1
  22. package/dist/es5/lib/streaming/binary-chunk-reader.js +39 -55
  23. package/dist/es5/lib/streaming/binary-chunk-reader.js.map +1 -1
  24. package/dist/es5/lib/streaming/binary-reader.js +11 -12
  25. package/dist/es5/lib/streaming/binary-reader.js.map +1 -1
  26. package/dist/es5/lib/streaming/zip-batch-iterators.js +1 -24
  27. package/dist/es5/lib/streaming/zip-batch-iterators.js.map +1 -1
  28. package/dist/es5/shapefile-loader.js +1 -3
  29. package/dist/es5/shapefile-loader.js.map +1 -1
  30. package/dist/es5/shp-loader.js +6 -17
  31. package/dist/es5/shp-loader.js.map +1 -1
  32. package/dist/es5/workers/dbf-worker.js +0 -2
  33. package/dist/es5/workers/dbf-worker.js.map +1 -1
  34. package/dist/es5/workers/shp-worker.js +0 -2
  35. package/dist/es5/workers/shp-worker.js.map +1 -1
  36. package/dist/esm/bundle.js +1 -1
  37. package/dist/esm/bundle.js.map +1 -1
  38. package/dist/esm/dbf-loader.js +6 -2
  39. package/dist/esm/dbf-loader.js.map +1 -1
  40. package/dist/esm/index.js.map +1 -1
  41. package/dist/esm/lib/parsers/parse-dbf.js +18 -58
  42. package/dist/esm/lib/parsers/parse-dbf.js.map +1 -1
  43. package/dist/esm/lib/parsers/parse-shapefile.js +12 -35
  44. package/dist/esm/lib/parsers/parse-shapefile.js.map +1 -1
  45. package/dist/esm/lib/parsers/parse-shp-geometry.js +3 -28
  46. package/dist/esm/lib/parsers/parse-shp-geometry.js.map +1 -1
  47. package/dist/esm/lib/parsers/parse-shp-header.js +1 -3
  48. package/dist/esm/lib/parsers/parse-shp-header.js.map +1 -1
  49. package/dist/esm/lib/parsers/parse-shp.js +2 -26
  50. package/dist/esm/lib/parsers/parse-shp.js.map +1 -1
  51. package/dist/esm/lib/parsers/parse-shx.js +1 -2
  52. package/dist/esm/lib/parsers/parse-shx.js.map +1 -1
  53. package/dist/esm/lib/parsers/types.js.map +1 -1
  54. package/dist/esm/lib/streaming/binary-chunk-reader.js +4 -19
  55. package/dist/esm/lib/streaming/binary-chunk-reader.js.map +1 -1
  56. package/dist/esm/lib/streaming/binary-reader.js +0 -5
  57. package/dist/esm/lib/streaming/binary-reader.js.map +1 -1
  58. package/dist/esm/lib/streaming/zip-batch-iterators.js +2 -5
  59. package/dist/esm/lib/streaming/zip-batch-iterators.js.map +1 -1
  60. package/dist/esm/shapefile-loader.js +3 -1
  61. package/dist/esm/shapefile-loader.js.map +1 -1
  62. package/dist/esm/shp-loader.js +6 -2
  63. package/dist/esm/shp-loader.js.map +1 -1
  64. package/dist/esm/workers/dbf-worker.js.map +1 -1
  65. package/dist/esm/workers/shp-worker.js.map +1 -1
  66. package/dist/lib/parsers/types.d.ts +7 -7
  67. package/dist/lib/parsers/types.d.ts.map +1 -1
  68. package/dist/lib/streaming/binary-chunk-reader.d.ts +1 -1
  69. package/dist/lib/streaming/binary-chunk-reader.d.ts.map +1 -1
  70. package/dist/shp-worker.js +1 -1
  71. package/package.json +5 -5
  72. package/src/lib/parsers/parse-dbf.ts +1 -1
@@ -1,65 +1,47 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
4
  Object.defineProperty(exports, "__esModule", {
6
5
  value: true
7
6
  });
8
7
  exports.parseRecord = parseRecord;
9
-
10
8
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
11
-
12
9
  var LITTLE_ENDIAN = true;
13
10
 
14
11
  function parseRecord(view, options) {
15
12
  var _ref = (options === null || options === void 0 ? void 0 : options.shp) || {},
16
- _ref$_maxDimensions = _ref._maxDimensions,
17
- _maxDimensions = _ref$_maxDimensions === void 0 ? 4 : _ref$_maxDimensions;
18
-
13
+ _ref$_maxDimensions = _ref._maxDimensions,
14
+ _maxDimensions = _ref$_maxDimensions === void 0 ? 4 : _ref$_maxDimensions;
19
15
  var offset = 0;
20
16
  var type = view.getInt32(offset, LITTLE_ENDIAN);
21
17
  offset += Int32Array.BYTES_PER_ELEMENT;
22
-
23
18
  switch (type) {
24
19
  case 0:
25
20
  return parseNull();
26
-
27
21
  case 1:
28
22
  return parsePoint(view, offset, Math.min(2, _maxDimensions));
29
-
30
23
  case 3:
31
24
  return parsePoly(view, offset, Math.min(2, _maxDimensions), 'LineString');
32
-
33
25
  case 5:
34
26
  return parsePoly(view, offset, Math.min(2, _maxDimensions), 'Polygon');
35
-
36
27
  case 8:
37
28
  return parseMultiPoint(view, offset, Math.min(2, _maxDimensions));
38
-
39
29
  case 11:
40
30
  return parsePoint(view, offset, Math.min(4, _maxDimensions));
41
-
42
31
  case 13:
43
32
  return parsePoly(view, offset, Math.min(4, _maxDimensions), 'LineString');
44
-
45
33
  case 15:
46
34
  return parsePoly(view, offset, Math.min(4, _maxDimensions), 'Polygon');
47
-
48
35
  case 18:
49
36
  return parseMultiPoint(view, offset, Math.min(4, _maxDimensions));
50
-
51
37
  case 21:
52
38
  return parsePoint(view, offset, Math.min(3, _maxDimensions));
53
-
54
39
  case 23:
55
40
  return parsePoly(view, offset, Math.min(3, _maxDimensions), 'LineString');
56
-
57
41
  case 25:
58
42
  return parsePoly(view, offset, Math.min(3, _maxDimensions), 'Polygon');
59
-
60
43
  case 28:
61
44
  return parseMultiPoint(view, offset, Math.min(3, _maxDimensions));
62
-
63
45
  default:
64
46
  throw new Error("unsupported shape type: ".concat(type));
65
47
  }
@@ -71,11 +53,8 @@ function parseNull() {
71
53
 
72
54
  function parsePoint(view, offset, dim) {
73
55
  var positions;
74
-
75
56
  var _parsePositions = parsePositions(view, offset, 1, dim);
76
-
77
57
  var _parsePositions2 = (0, _slicedToArray2.default)(_parsePositions, 2);
78
-
79
58
  positions = _parsePositions2[0];
80
59
  offset = _parsePositions2[1];
81
60
  return {
@@ -94,36 +73,25 @@ function parseMultiPoint(view, offset, dim) {
94
73
  var xyPositions = null;
95
74
  var mPositions = null;
96
75
  var zPositions = null;
97
-
98
76
  var _parsePositions3 = parsePositions(view, offset, nPoints, 2);
99
-
100
77
  var _parsePositions4 = (0, _slicedToArray2.default)(_parsePositions3, 2);
101
-
102
78
  xyPositions = _parsePositions4[0];
103
79
  offset = _parsePositions4[1];
104
-
105
80
  if (dim === 4) {
106
81
  offset += 2 * Float64Array.BYTES_PER_ELEMENT;
107
-
108
82
  var _parsePositions5 = parsePositions(view, offset, nPoints, 1);
109
-
110
83
  var _parsePositions6 = (0, _slicedToArray2.default)(_parsePositions5, 2);
111
-
112
84
  zPositions = _parsePositions6[0];
113
85
  offset = _parsePositions6[1];
114
86
  }
115
87
 
116
88
  if (dim >= 3) {
117
89
  offset += 2 * Float64Array.BYTES_PER_ELEMENT;
118
-
119
90
  var _parsePositions7 = parsePositions(view, offset, nPoints, 1);
120
-
121
91
  var _parsePositions8 = (0, _slicedToArray2.default)(_parsePositions7, 2);
122
-
123
92
  mPositions = _parsePositions8[0];
124
93
  offset = _parsePositions8[1];
125
94
  }
126
-
127
95
  var positions = concatPositions(xyPositions, mPositions, zPositions);
128
96
  return {
129
97
  positions: {
@@ -140,6 +108,7 @@ function parsePoly(view, offset, dim, type) {
140
108
  offset += Int32Array.BYTES_PER_ELEMENT;
141
109
  var nPoints = view.getInt32(offset, LITTLE_ENDIAN);
142
110
  offset += Int32Array.BYTES_PER_ELEMENT;
111
+
143
112
  var bufferOffset = view.byteOffset + offset;
144
113
  var bufferLength = nParts * Int32Array.BYTES_PER_ELEMENT;
145
114
  var ringIndices = new Int32Array(nParts + 1);
@@ -149,36 +118,25 @@ function parsePoly(view, offset, dim, type) {
149
118
  var xyPositions = null;
150
119
  var mPositions = null;
151
120
  var zPositions = null;
152
-
153
121
  var _parsePositions9 = parsePositions(view, offset, nPoints, 2);
154
-
155
122
  var _parsePositions10 = (0, _slicedToArray2.default)(_parsePositions9, 2);
156
-
157
123
  xyPositions = _parsePositions10[0];
158
124
  offset = _parsePositions10[1];
159
-
160
125
  if (dim === 4) {
161
126
  offset += 2 * Float64Array.BYTES_PER_ELEMENT;
162
-
163
127
  var _parsePositions11 = parsePositions(view, offset, nPoints, 1);
164
-
165
128
  var _parsePositions12 = (0, _slicedToArray2.default)(_parsePositions11, 2);
166
-
167
129
  zPositions = _parsePositions12[0];
168
130
  offset = _parsePositions12[1];
169
131
  }
170
132
 
171
133
  if (dim >= 3) {
172
134
  offset += 2 * Float64Array.BYTES_PER_ELEMENT;
173
-
174
135
  var _parsePositions13 = parsePositions(view, offset, nPoints, 1);
175
-
176
136
  var _parsePositions14 = (0, _slicedToArray2.default)(_parsePositions13, 2);
177
-
178
137
  mPositions = _parsePositions14[0];
179
138
  offset = _parsePositions14[1];
180
139
  }
181
-
182
140
  var positions = concatPositions(xyPositions, mPositions, zPositions);
183
141
 
184
142
  if (type === 'LineString') {
@@ -196,7 +154,6 @@ function parsePoly(view, offset, dim, type) {
196
154
  }
197
155
 
198
156
  var polygonIndices = [];
199
-
200
157
  for (var i = 1; i < ringIndices.length; i++) {
201
158
  var startRingIndex = ringIndices[i - 1];
202
159
  var endRingIndex = ringIndices[i];
@@ -207,7 +164,6 @@ function parsePoly(view, offset, dim, type) {
207
164
  polygonIndices.push(startRingIndex);
208
165
  }
209
166
  }
210
-
211
167
  polygonIndices.push(nPoints);
212
168
  return {
213
169
  type: type,
@@ -236,39 +192,31 @@ function concatPositions(xyPositions, mPositions, zPositions) {
236
192
  if (!(mPositions || zPositions)) {
237
193
  return xyPositions;
238
194
  }
239
-
240
195
  var arrayLength = xyPositions.length;
241
196
  var nDim = 2;
242
-
243
197
  if (zPositions && zPositions.length) {
244
198
  arrayLength += zPositions.length;
245
199
  nDim++;
246
200
  }
247
-
248
201
  if (mPositions && mPositions.length) {
249
202
  arrayLength += mPositions.length;
250
203
  nDim++;
251
204
  }
252
-
253
205
  var positions = new Float64Array(arrayLength);
254
-
255
206
  for (var i = 0; i < xyPositions.length / 2; i++) {
256
207
  positions[nDim * i] = xyPositions[i * 2];
257
208
  positions[nDim * i + 1] = xyPositions[i * 2 + 1];
258
209
  }
259
-
260
210
  if (zPositions && zPositions.length) {
261
211
  for (var _i = 0; _i < zPositions.length; _i++) {
262
212
  positions[nDim * _i + 2] = zPositions[_i];
263
213
  }
264
214
  }
265
-
266
215
  if (mPositions && mPositions.length) {
267
216
  for (var _i2 = 0; _i2 < mPositions.length; _i2++) {
268
217
  positions[nDim * _i2 + (nDim - 1)] = mPositions[_i2];
269
218
  }
270
219
  }
271
-
272
220
  return positions;
273
221
  }
274
222
 
@@ -278,12 +226,11 @@ function getWindingDirection(positions) {
278
226
 
279
227
  function getSignedArea(positions) {
280
228
  var area = 0;
281
- var nCoords = positions.length / 2 - 1;
282
229
 
230
+ var nCoords = positions.length / 2 - 1;
283
231
  for (var i = 0; i < nCoords; i++) {
284
232
  area += (positions[i * 2] + positions[(i + 1) * 2]) * (positions[i * 2 + 1] - positions[(i + 1) * 2 + 1]);
285
233
  }
286
-
287
234
  return area / 2;
288
235
  }
289
236
  //# sourceMappingURL=parse-shp-geometry.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/lib/parsers/parse-shp-geometry.ts"],"names":["LITTLE_ENDIAN","parseRecord","view","options","shp","_maxDimensions","offset","type","getInt32","Int32Array","BYTES_PER_ELEMENT","parseNull","parsePoint","Math","min","parsePoly","parseMultiPoint","Error","dim","positions","parsePositions","value","size","Float64Array","nPoints","xyPositions","mPositions","zPositions","concatPositions","nParts","bufferOffset","byteOffset","bufferLength","ringIndices","set","buffer","slice","pathIndices","polygonIndices","i","length","startRingIndex","endRingIndex","ring","subarray","sign","getWindingDirection","push","primitivePolygonIndices","Uint32Array","arrayLength","nDim","getSignedArea","area","nCoords"],"mappings":"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","sourcesContent":["import {BinaryGeometry, BinaryGeometryType} from '@loaders.gl/schema';\nimport {SHPLoaderOptions} from './types';\n\nconst LITTLE_ENDIAN = true;\n\n/**\n * Parse individual record\n *\n * @param view Record data\n * @return Binary Geometry Object\n */\n// eslint-disable-next-line complexity\nexport function parseRecord(view: DataView, options?: SHPLoaderOptions): BinaryGeometry | null {\n const {_maxDimensions = 4} = options?.shp || {};\n\n let offset = 0;\n const type: number = view.getInt32(offset, LITTLE_ENDIAN);\n offset += Int32Array.BYTES_PER_ELEMENT;\n\n switch (type) {\n case 0:\n // Null Shape\n return parseNull();\n case 1:\n // Point\n return parsePoint(view, offset, Math.min(2, _maxDimensions));\n case 3:\n // PolyLine\n return parsePoly(view, offset, Math.min(2, _maxDimensions), 'LineString');\n case 5:\n // Polygon\n return parsePoly(view, offset, Math.min(2, _maxDimensions), 'Polygon');\n case 8:\n // MultiPoint\n return parseMultiPoint(view, offset, Math.min(2, _maxDimensions));\n // GeometryZ can have 3 or 4 dimensions, since the M is not required to\n // exist\n case 11:\n // PointZ\n return parsePoint(view, offset, Math.min(4, _maxDimensions));\n case 13:\n // PolyLineZ\n return parsePoly(view, offset, Math.min(4, _maxDimensions), 'LineString');\n case 15:\n // PolygonZ\n return parsePoly(view, offset, Math.min(4, _maxDimensions), 'Polygon');\n case 18:\n // MultiPointZ\n return parseMultiPoint(view, offset, Math.min(4, _maxDimensions));\n case 21:\n // PointM\n return parsePoint(view, offset, Math.min(3, _maxDimensions));\n case 23:\n // PolyLineM\n return parsePoly(view, offset, Math.min(3, _maxDimensions), 'LineString');\n case 25:\n // PolygonM\n return parsePoly(view, offset, Math.min(3, _maxDimensions), 'Polygon');\n case 28:\n // MultiPointM\n return parseMultiPoint(view, offset, Math.min(3, _maxDimensions));\n default:\n throw new Error(`unsupported shape type: ${type}`);\n }\n}\n\n// TODO handle null\n/**\n * Parse Null geometry\n *\n * @return null\n */\nfunction parseNull(): null {\n return null;\n}\n\n/**\n * Parse point geometry\n *\n * @param view Geometry data\n * @param offset Offset in view\n * @param dim Dimension size\n */\nfunction parsePoint(view: DataView, offset: number, dim: number): BinaryGeometry {\n let positions: Float64Array;\n [positions, offset] = parsePositions(view, offset, 1, dim);\n\n return {\n positions: {value: positions, size: dim},\n type: 'Point'\n };\n}\n\n/**\n * Parse MultiPoint geometry\n *\n * @param view Geometry data\n * @param offset Offset in view\n * @param dim Input dimension\n * @return Binary geometry object\n */\nfunction parseMultiPoint(view: DataView, offset: number, dim: number): BinaryGeometry {\n // skip parsing box\n offset += 4 * Float64Array.BYTES_PER_ELEMENT;\n\n const nPoints = view.getInt32(offset, LITTLE_ENDIAN);\n offset += Int32Array.BYTES_PER_ELEMENT;\n\n let xyPositions: Float64Array | null = null;\n let mPositions: Float64Array | null = null;\n let zPositions: Float64Array | null = null;\n [xyPositions, offset] = parsePositions(view, offset, nPoints, 2);\n\n // Parse Z coordinates\n if (dim === 4) {\n // skip parsing range\n offset += 2 * Float64Array.BYTES_PER_ELEMENT;\n [zPositions, offset] = parsePositions(view, offset, nPoints, 1);\n }\n\n // Parse M coordinates\n if (dim >= 3) {\n // skip parsing range\n offset += 2 * Float64Array.BYTES_PER_ELEMENT;\n [mPositions, offset] = parsePositions(view, offset, nPoints, 1);\n }\n\n const positions = concatPositions(xyPositions, mPositions, zPositions);\n\n return {\n positions: {value: positions, size: dim},\n type: 'Point'\n };\n}\n\n/**\n * Polygon and PolyLine parsing\n *\n * @param view Geometry data\n * @param offset Offset in view\n * @param dim Input dimension\n * @param type Either 'Polygon' or 'Polyline'\n * @return Binary geometry object\n */\n// eslint-disable-next-line max-statements\nfunction parsePoly(\n view: DataView,\n offset: number,\n dim: number,\n type: BinaryGeometryType\n): BinaryGeometry {\n // skip parsing bounding box\n offset += 4 * Float64Array.BYTES_PER_ELEMENT;\n\n const nParts = view.getInt32(offset, LITTLE_ENDIAN);\n offset += Int32Array.BYTES_PER_ELEMENT;\n const nPoints = view.getInt32(offset, LITTLE_ENDIAN);\n offset += Int32Array.BYTES_PER_ELEMENT;\n\n // Create longer indices array by 1 because output format is expected to\n // include the last index as the total number of positions\n const bufferOffset = view.byteOffset + offset;\n const bufferLength = nParts * Int32Array.BYTES_PER_ELEMENT;\n const ringIndices = new Int32Array(nParts + 1);\n ringIndices.set(new Int32Array(view.buffer.slice(bufferOffset, bufferOffset + bufferLength)));\n ringIndices[nParts] = nPoints;\n offset += nParts * Int32Array.BYTES_PER_ELEMENT;\n\n let xyPositions: Float64Array | null = null;\n let mPositions: Float64Array | null = null;\n let zPositions: Float64Array | null = null;\n [xyPositions, offset] = parsePositions(view, offset, nPoints, 2);\n\n // Parse Z coordinates\n if (dim === 4) {\n // skip parsing range\n offset += 2 * Float64Array.BYTES_PER_ELEMENT;\n [zPositions, offset] = parsePositions(view, offset, nPoints, 1);\n }\n\n // Parse M coordinates\n if (dim >= 3) {\n // skip parsing range\n offset += 2 * Float64Array.BYTES_PER_ELEMENT;\n [mPositions, offset] = parsePositions(view, offset, nPoints, 1);\n }\n\n const positions = concatPositions(xyPositions, mPositions, zPositions);\n\n // parsePoly only accepts type = LineString or Polygon\n if (type === 'LineString') {\n return {\n type,\n positions: {value: positions, size: dim},\n pathIndices: {value: ringIndices, size: 1}\n };\n }\n\n // for every ring, determine sign of polygon\n // Use only 2D positions for ring calc\n const polygonIndices: number[] = [];\n for (let i = 1; i < ringIndices.length; i++) {\n const startRingIndex = ringIndices[i - 1];\n const endRingIndex = ringIndices[i];\n // @ts-ignore\n const ring = xyPositions.subarray(startRingIndex * 2, endRingIndex * 2);\n const sign = getWindingDirection(ring);\n\n // A positive sign implies clockwise\n // A clockwise ring is a filled ring\n if (sign > 0) {\n polygonIndices.push(startRingIndex);\n }\n }\n\n polygonIndices.push(nPoints);\n\n return {\n type,\n positions: {value: positions, size: dim},\n primitivePolygonIndices: {value: ringIndices, size: 1},\n // TODO: Dynamically choose Uint32Array over Uint16Array only when\n // necessary. I believe the implementation requires nPoints to be the\n // largest value in the array, so you should be able to use Uint32Array only\n // when nPoints > 65535.\n polygonIndices: {value: new Uint32Array(polygonIndices), size: 1}\n };\n}\n\n/**\n * Parse a contiguous block of positions into a Float64Array\n *\n * @param view Geometry data\n * @param offset Offset in view\n * @param nPoints Number of points\n * @param dim Input dimension\n * @return Data and offset\n */\nfunction parsePositions(\n view: DataView,\n offset: number,\n nPoints: number,\n dim: number\n): [Float64Array, number] {\n const bufferOffset = view.byteOffset + offset;\n const bufferLength = nPoints * dim * Float64Array.BYTES_PER_ELEMENT;\n return [\n new Float64Array(view.buffer.slice(bufferOffset, bufferOffset + bufferLength)),\n offset + bufferLength\n ];\n}\n\n/**\n * Concatenate and interleave positions arrays\n * xy positions are interleaved; mPositions, zPositions are their own arrays\n *\n * @param xyPositions 2d positions\n * @param mPositions M positions\n * @param zPositions Z positions\n * @return Combined interleaved positions\n */\n// eslint-disable-next-line complexity\nfunction concatPositions(\n xyPositions: Float64Array,\n mPositions: Float64Array | null,\n zPositions: Float64Array | null\n): Float64Array {\n if (!(mPositions || zPositions)) {\n return xyPositions;\n }\n\n let arrayLength = xyPositions.length;\n let nDim = 2;\n\n if (zPositions && zPositions.length) {\n arrayLength += zPositions.length;\n nDim++;\n }\n\n if (mPositions && mPositions.length) {\n arrayLength += mPositions.length;\n nDim++;\n }\n\n const positions = new Float64Array(arrayLength);\n for (let i = 0; i < xyPositions.length / 2; i++) {\n positions[nDim * i] = xyPositions[i * 2];\n positions[nDim * i + 1] = xyPositions[i * 2 + 1];\n }\n\n if (zPositions && zPositions.length) {\n for (let i = 0; i < zPositions.length; i++) {\n // If Z coordinates exist; used as third coord in positions array\n positions[nDim * i + 2] = zPositions[i];\n }\n }\n\n if (mPositions && mPositions.length) {\n for (let i = 0; i < mPositions.length; i++) {\n // M is always last, either 3rd or 4th depending on if Z exists\n positions[nDim * i + (nDim - 1)] = mPositions[i];\n }\n }\n\n return positions;\n}\n\n/**\n * Returns the direction of the polygon path\n * A positive number is clockwise.\n * A negative number is counter clockwise.\n *\n * @param positions\n * @return Sign of polygon ring\n */\nfunction getWindingDirection(positions: Float64Array): number {\n return Math.sign(getSignedArea(positions));\n}\n\n/**\n * Get signed area of flat typed array of 2d positions\n *\n * @param positions\n * @return Signed area of polygon ring\n */\nfunction getSignedArea(positions: Float64Array): number {\n let area = 0;\n\n // Rings are closed according to shapefile spec\n const nCoords = positions.length / 2 - 1;\n for (let i = 0; i < nCoords; i++) {\n area +=\n (positions[i * 2] + positions[(i + 1) * 2]) *\n (positions[i * 2 + 1] - positions[(i + 1) * 2 + 1]);\n }\n\n return area / 2;\n}\n"],"file":"parse-shp-geometry.js"}
1
+ {"version":3,"file":"parse-shp-geometry.js","names":["LITTLE_ENDIAN","parseRecord","view","options","shp","_maxDimensions","offset","type","getInt32","Int32Array","BYTES_PER_ELEMENT","parseNull","parsePoint","Math","min","parsePoly","parseMultiPoint","Error","dim","positions","parsePositions","value","size","Float64Array","nPoints","xyPositions","mPositions","zPositions","concatPositions","nParts","bufferOffset","byteOffset","bufferLength","ringIndices","set","buffer","slice","pathIndices","polygonIndices","i","length","startRingIndex","endRingIndex","ring","subarray","sign","getWindingDirection","push","primitivePolygonIndices","Uint32Array","arrayLength","nDim","getSignedArea","area","nCoords"],"sources":["../../../../src/lib/parsers/parse-shp-geometry.ts"],"sourcesContent":["import {BinaryGeometry, BinaryGeometryType} from '@loaders.gl/schema';\nimport {SHPLoaderOptions} from './types';\n\nconst LITTLE_ENDIAN = true;\n\n/**\n * Parse individual record\n *\n * @param view Record data\n * @return Binary Geometry Object\n */\n// eslint-disable-next-line complexity\nexport function parseRecord(view: DataView, options?: SHPLoaderOptions): BinaryGeometry | null {\n const {_maxDimensions = 4} = options?.shp || {};\n\n let offset = 0;\n const type: number = view.getInt32(offset, LITTLE_ENDIAN);\n offset += Int32Array.BYTES_PER_ELEMENT;\n\n switch (type) {\n case 0:\n // Null Shape\n return parseNull();\n case 1:\n // Point\n return parsePoint(view, offset, Math.min(2, _maxDimensions));\n case 3:\n // PolyLine\n return parsePoly(view, offset, Math.min(2, _maxDimensions), 'LineString');\n case 5:\n // Polygon\n return parsePoly(view, offset, Math.min(2, _maxDimensions), 'Polygon');\n case 8:\n // MultiPoint\n return parseMultiPoint(view, offset, Math.min(2, _maxDimensions));\n // GeometryZ can have 3 or 4 dimensions, since the M is not required to\n // exist\n case 11:\n // PointZ\n return parsePoint(view, offset, Math.min(4, _maxDimensions));\n case 13:\n // PolyLineZ\n return parsePoly(view, offset, Math.min(4, _maxDimensions), 'LineString');\n case 15:\n // PolygonZ\n return parsePoly(view, offset, Math.min(4, _maxDimensions), 'Polygon');\n case 18:\n // MultiPointZ\n return parseMultiPoint(view, offset, Math.min(4, _maxDimensions));\n case 21:\n // PointM\n return parsePoint(view, offset, Math.min(3, _maxDimensions));\n case 23:\n // PolyLineM\n return parsePoly(view, offset, Math.min(3, _maxDimensions), 'LineString');\n case 25:\n // PolygonM\n return parsePoly(view, offset, Math.min(3, _maxDimensions), 'Polygon');\n case 28:\n // MultiPointM\n return parseMultiPoint(view, offset, Math.min(3, _maxDimensions));\n default:\n throw new Error(`unsupported shape type: ${type}`);\n }\n}\n\n// TODO handle null\n/**\n * Parse Null geometry\n *\n * @return null\n */\nfunction parseNull(): null {\n return null;\n}\n\n/**\n * Parse point geometry\n *\n * @param view Geometry data\n * @param offset Offset in view\n * @param dim Dimension size\n */\nfunction parsePoint(view: DataView, offset: number, dim: number): BinaryGeometry {\n let positions: Float64Array;\n [positions, offset] = parsePositions(view, offset, 1, dim);\n\n return {\n positions: {value: positions, size: dim},\n type: 'Point'\n };\n}\n\n/**\n * Parse MultiPoint geometry\n *\n * @param view Geometry data\n * @param offset Offset in view\n * @param dim Input dimension\n * @return Binary geometry object\n */\nfunction parseMultiPoint(view: DataView, offset: number, dim: number): BinaryGeometry {\n // skip parsing box\n offset += 4 * Float64Array.BYTES_PER_ELEMENT;\n\n const nPoints = view.getInt32(offset, LITTLE_ENDIAN);\n offset += Int32Array.BYTES_PER_ELEMENT;\n\n let xyPositions: Float64Array | null = null;\n let mPositions: Float64Array | null = null;\n let zPositions: Float64Array | null = null;\n [xyPositions, offset] = parsePositions(view, offset, nPoints, 2);\n\n // Parse Z coordinates\n if (dim === 4) {\n // skip parsing range\n offset += 2 * Float64Array.BYTES_PER_ELEMENT;\n [zPositions, offset] = parsePositions(view, offset, nPoints, 1);\n }\n\n // Parse M coordinates\n if (dim >= 3) {\n // skip parsing range\n offset += 2 * Float64Array.BYTES_PER_ELEMENT;\n [mPositions, offset] = parsePositions(view, offset, nPoints, 1);\n }\n\n const positions = concatPositions(xyPositions, mPositions, zPositions);\n\n return {\n positions: {value: positions, size: dim},\n type: 'Point'\n };\n}\n\n/**\n * Polygon and PolyLine parsing\n *\n * @param view Geometry data\n * @param offset Offset in view\n * @param dim Input dimension\n * @param type Either 'Polygon' or 'Polyline'\n * @return Binary geometry object\n */\n// eslint-disable-next-line max-statements\nfunction parsePoly(\n view: DataView,\n offset: number,\n dim: number,\n type: BinaryGeometryType\n): BinaryGeometry {\n // skip parsing bounding box\n offset += 4 * Float64Array.BYTES_PER_ELEMENT;\n\n const nParts = view.getInt32(offset, LITTLE_ENDIAN);\n offset += Int32Array.BYTES_PER_ELEMENT;\n const nPoints = view.getInt32(offset, LITTLE_ENDIAN);\n offset += Int32Array.BYTES_PER_ELEMENT;\n\n // Create longer indices array by 1 because output format is expected to\n // include the last index as the total number of positions\n const bufferOffset = view.byteOffset + offset;\n const bufferLength = nParts * Int32Array.BYTES_PER_ELEMENT;\n const ringIndices = new Int32Array(nParts + 1);\n ringIndices.set(new Int32Array(view.buffer.slice(bufferOffset, bufferOffset + bufferLength)));\n ringIndices[nParts] = nPoints;\n offset += nParts * Int32Array.BYTES_PER_ELEMENT;\n\n let xyPositions: Float64Array | null = null;\n let mPositions: Float64Array | null = null;\n let zPositions: Float64Array | null = null;\n [xyPositions, offset] = parsePositions(view, offset, nPoints, 2);\n\n // Parse Z coordinates\n if (dim === 4) {\n // skip parsing range\n offset += 2 * Float64Array.BYTES_PER_ELEMENT;\n [zPositions, offset] = parsePositions(view, offset, nPoints, 1);\n }\n\n // Parse M coordinates\n if (dim >= 3) {\n // skip parsing range\n offset += 2 * Float64Array.BYTES_PER_ELEMENT;\n [mPositions, offset] = parsePositions(view, offset, nPoints, 1);\n }\n\n const positions = concatPositions(xyPositions, mPositions, zPositions);\n\n // parsePoly only accepts type = LineString or Polygon\n if (type === 'LineString') {\n return {\n type,\n positions: {value: positions, size: dim},\n pathIndices: {value: ringIndices, size: 1}\n };\n }\n\n // for every ring, determine sign of polygon\n // Use only 2D positions for ring calc\n const polygonIndices: number[] = [];\n for (let i = 1; i < ringIndices.length; i++) {\n const startRingIndex = ringIndices[i - 1];\n const endRingIndex = ringIndices[i];\n // @ts-ignore\n const ring = xyPositions.subarray(startRingIndex * 2, endRingIndex * 2);\n const sign = getWindingDirection(ring);\n\n // A positive sign implies clockwise\n // A clockwise ring is a filled ring\n if (sign > 0) {\n polygonIndices.push(startRingIndex);\n }\n }\n\n polygonIndices.push(nPoints);\n\n return {\n type,\n positions: {value: positions, size: dim},\n primitivePolygonIndices: {value: ringIndices, size: 1},\n // TODO: Dynamically choose Uint32Array over Uint16Array only when\n // necessary. I believe the implementation requires nPoints to be the\n // largest value in the array, so you should be able to use Uint32Array only\n // when nPoints > 65535.\n polygonIndices: {value: new Uint32Array(polygonIndices), size: 1}\n };\n}\n\n/**\n * Parse a contiguous block of positions into a Float64Array\n *\n * @param view Geometry data\n * @param offset Offset in view\n * @param nPoints Number of points\n * @param dim Input dimension\n * @return Data and offset\n */\nfunction parsePositions(\n view: DataView,\n offset: number,\n nPoints: number,\n dim: number\n): [Float64Array, number] {\n const bufferOffset = view.byteOffset + offset;\n const bufferLength = nPoints * dim * Float64Array.BYTES_PER_ELEMENT;\n return [\n new Float64Array(view.buffer.slice(bufferOffset, bufferOffset + bufferLength)),\n offset + bufferLength\n ];\n}\n\n/**\n * Concatenate and interleave positions arrays\n * xy positions are interleaved; mPositions, zPositions are their own arrays\n *\n * @param xyPositions 2d positions\n * @param mPositions M positions\n * @param zPositions Z positions\n * @return Combined interleaved positions\n */\n// eslint-disable-next-line complexity\nfunction concatPositions(\n xyPositions: Float64Array,\n mPositions: Float64Array | null,\n zPositions: Float64Array | null\n): Float64Array {\n if (!(mPositions || zPositions)) {\n return xyPositions;\n }\n\n let arrayLength = xyPositions.length;\n let nDim = 2;\n\n if (zPositions && zPositions.length) {\n arrayLength += zPositions.length;\n nDim++;\n }\n\n if (mPositions && mPositions.length) {\n arrayLength += mPositions.length;\n nDim++;\n }\n\n const positions = new Float64Array(arrayLength);\n for (let i = 0; i < xyPositions.length / 2; i++) {\n positions[nDim * i] = xyPositions[i * 2];\n positions[nDim * i + 1] = xyPositions[i * 2 + 1];\n }\n\n if (zPositions && zPositions.length) {\n for (let i = 0; i < zPositions.length; i++) {\n // If Z coordinates exist; used as third coord in positions array\n positions[nDim * i + 2] = zPositions[i];\n }\n }\n\n if (mPositions && mPositions.length) {\n for (let i = 0; i < mPositions.length; i++) {\n // M is always last, either 3rd or 4th depending on if Z exists\n positions[nDim * i + (nDim - 1)] = mPositions[i];\n }\n }\n\n return positions;\n}\n\n/**\n * Returns the direction of the polygon path\n * A positive number is clockwise.\n * A negative number is counter clockwise.\n *\n * @param positions\n * @return Sign of polygon ring\n */\nfunction getWindingDirection(positions: Float64Array): number {\n return Math.sign(getSignedArea(positions));\n}\n\n/**\n * Get signed area of flat typed array of 2d positions\n *\n * @param positions\n * @return Signed area of polygon ring\n */\nfunction getSignedArea(positions: Float64Array): number {\n let area = 0;\n\n // Rings are closed according to shapefile spec\n const nCoords = positions.length / 2 - 1;\n for (let i = 0; i < nCoords; i++) {\n area +=\n (positions[i * 2] + positions[(i + 1) * 2]) *\n (positions[i * 2 + 1] - positions[(i + 1) * 2 + 1]);\n }\n\n return area / 2;\n}\n"],"mappings":"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"}
@@ -25,15 +25,12 @@ function parseSHPHeader(headerView) {
25
25
  maxM: headerView.getFloat64(92, LITTLE_ENDIAN)
26
26
  }
27
27
  };
28
-
29
28
  if (header.magic !== SHP_MAGIC_NUMBER) {
30
29
  console.error("SHP file: bad magic number ".concat(header.magic));
31
30
  }
32
-
33
31
  if (header.version !== 1000) {
34
32
  console.error("SHP file: bad version ".concat(header.version));
35
33
  }
36
-
37
34
  return header;
38
35
  }
39
36
  //# sourceMappingURL=parse-shp-header.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/lib/parsers/parse-shp-header.ts"],"names":["LITTLE_ENDIAN","BIG_ENDIAN","SHP_MAGIC_NUMBER","parseSHPHeader","headerView","header","magic","getInt32","length","version","type","bbox","minX","getFloat64","minY","minZ","minM","maxX","maxY","maxZ","maxM","console","error"],"mappings":";;;;;;AAoBA,IAAMA,aAAa,GAAG,IAAtB;AACA,IAAMC,UAAU,GAAG,KAAnB;AACA,IAAMC,gBAAgB,GAAG,UAAzB;;AAQO,SAASC,cAAT,CAAwBC,UAAxB,EAAyD;AAG9D,MAAMC,MAAM,GAAG;AACbC,IAAAA,KAAK,EAAEF,UAAU,CAACG,QAAX,CAAoB,CAApB,EAAuBN,UAAvB,CADM;AAGbO,IAAAA,MAAM,EAAEJ,UAAU,CAACG,QAAX,CAAoB,EAApB,EAAwBN,UAAxB,IAAsC,CAHjC;AAIbQ,IAAAA,OAAO,EAAEL,UAAU,CAACG,QAAX,CAAoB,EAApB,EAAwBP,aAAxB,CAJI;AAKbU,IAAAA,IAAI,EAAEN,UAAU,CAACG,QAAX,CAAoB,EAApB,EAAwBP,aAAxB,CALO;AAMbW,IAAAA,IAAI,EAAE;AACJC,MAAAA,IAAI,EAAER,UAAU,CAACS,UAAX,CAAsB,EAAtB,EAA0Bb,aAA1B,CADF;AAEJc,MAAAA,IAAI,EAAEV,UAAU,CAACS,UAAX,CAAsB,EAAtB,EAA0Bb,aAA1B,CAFF;AAGJe,MAAAA,IAAI,EAAEX,UAAU,CAACS,UAAX,CAAsB,EAAtB,EAA0Bb,aAA1B,CAHF;AAIJgB,MAAAA,IAAI,EAAEZ,UAAU,CAACS,UAAX,CAAsB,EAAtB,EAA0Bb,aAA1B,CAJF;AAKJiB,MAAAA,IAAI,EAAEb,UAAU,CAACS,UAAX,CAAsB,EAAtB,EAA0Bb,aAA1B,CALF;AAMJkB,MAAAA,IAAI,EAAEd,UAAU,CAACS,UAAX,CAAsB,EAAtB,EAA0Bb,aAA1B,CANF;AAOJmB,MAAAA,IAAI,EAAEf,UAAU,CAACS,UAAX,CAAsB,EAAtB,EAA0Bb,aAA1B,CAPF;AAQJoB,MAAAA,IAAI,EAAEhB,UAAU,CAACS,UAAX,CAAsB,EAAtB,EAA0Bb,aAA1B;AARF;AANO,GAAf;;AAiBA,MAAIK,MAAM,CAACC,KAAP,KAAiBJ,gBAArB,EAAuC;AAErCmB,IAAAA,OAAO,CAACC,KAAR,sCAA4CjB,MAAM,CAACC,KAAnD;AACD;;AACD,MAAID,MAAM,CAACI,OAAP,KAAmB,IAAvB,EAA6B;AAE3BY,IAAAA,OAAO,CAACC,KAAR,iCAAuCjB,MAAM,CAACI,OAA9C;AACD;;AACD,SAAOJ,MAAP;AACD","sourcesContent":["export interface SHPHeader {\n /** SHP Magic number */\n magic: number;\n\n /** Number of bytes in file */\n length: number;\n version: number;\n type: number;\n bbox: {\n minX: number;\n minY: number;\n minZ: number;\n minM: number;\n maxX: number;\n maxY: number;\n maxZ: number;\n maxM: number;\n };\n}\n\nconst LITTLE_ENDIAN = true;\nconst BIG_ENDIAN = false;\nconst SHP_MAGIC_NUMBER = 0x0000270a;\n\n/**\n * Extract the binary header\n * Note: Also used by SHX\n * @param headerView\n * @returns SHPHeader\n */\nexport function parseSHPHeader(headerView: DataView): SHPHeader {\n // Note: The SHP format switches endianness between fields!\n // https://www.esri.com/library/whitepapers/pdfs/shapefile.pdf\n const header = {\n magic: headerView.getInt32(0, BIG_ENDIAN),\n // Length is stored as # of 2-byte words; multiply by 2 to get # of bytes\n length: headerView.getInt32(24, BIG_ENDIAN) * 2,\n version: headerView.getInt32(28, LITTLE_ENDIAN),\n type: headerView.getInt32(32, LITTLE_ENDIAN),\n bbox: {\n minX: headerView.getFloat64(36, LITTLE_ENDIAN),\n minY: headerView.getFloat64(44, LITTLE_ENDIAN),\n minZ: headerView.getFloat64(68, LITTLE_ENDIAN),\n minM: headerView.getFloat64(84, LITTLE_ENDIAN),\n maxX: headerView.getFloat64(52, LITTLE_ENDIAN),\n maxY: headerView.getFloat64(60, LITTLE_ENDIAN),\n maxZ: headerView.getFloat64(76, LITTLE_ENDIAN),\n maxM: headerView.getFloat64(92, LITTLE_ENDIAN)\n }\n };\n if (header.magic !== SHP_MAGIC_NUMBER) {\n // eslint-disable-next-line\n console.error(`SHP file: bad magic number ${header.magic}`);\n }\n if (header.version !== 1000) {\n // eslint-disable-next-line\n console.error(`SHP file: bad version ${header.version}`);\n }\n return header;\n}\n"],"file":"parse-shp-header.js"}
1
+ {"version":3,"file":"parse-shp-header.js","names":["LITTLE_ENDIAN","BIG_ENDIAN","SHP_MAGIC_NUMBER","parseSHPHeader","headerView","header","magic","getInt32","length","version","type","bbox","minX","getFloat64","minY","minZ","minM","maxX","maxY","maxZ","maxM","console","error"],"sources":["../../../../src/lib/parsers/parse-shp-header.ts"],"sourcesContent":["export interface SHPHeader {\n /** SHP Magic number */\n magic: number;\n\n /** Number of bytes in file */\n length: number;\n version: number;\n type: number;\n bbox: {\n minX: number;\n minY: number;\n minZ: number;\n minM: number;\n maxX: number;\n maxY: number;\n maxZ: number;\n maxM: number;\n };\n}\n\nconst LITTLE_ENDIAN = true;\nconst BIG_ENDIAN = false;\nconst SHP_MAGIC_NUMBER = 0x0000270a;\n\n/**\n * Extract the binary header\n * Note: Also used by SHX\n * @param headerView\n * @returns SHPHeader\n */\nexport function parseSHPHeader(headerView: DataView): SHPHeader {\n // Note: The SHP format switches endianness between fields!\n // https://www.esri.com/library/whitepapers/pdfs/shapefile.pdf\n const header = {\n magic: headerView.getInt32(0, BIG_ENDIAN),\n // Length is stored as # of 2-byte words; multiply by 2 to get # of bytes\n length: headerView.getInt32(24, BIG_ENDIAN) * 2,\n version: headerView.getInt32(28, LITTLE_ENDIAN),\n type: headerView.getInt32(32, LITTLE_ENDIAN),\n bbox: {\n minX: headerView.getFloat64(36, LITTLE_ENDIAN),\n minY: headerView.getFloat64(44, LITTLE_ENDIAN),\n minZ: headerView.getFloat64(68, LITTLE_ENDIAN),\n minM: headerView.getFloat64(84, LITTLE_ENDIAN),\n maxX: headerView.getFloat64(52, LITTLE_ENDIAN),\n maxY: headerView.getFloat64(60, LITTLE_ENDIAN),\n maxZ: headerView.getFloat64(76, LITTLE_ENDIAN),\n maxM: headerView.getFloat64(92, LITTLE_ENDIAN)\n }\n };\n if (header.magic !== SHP_MAGIC_NUMBER) {\n // eslint-disable-next-line\n console.error(`SHP file: bad magic number ${header.magic}`);\n }\n if (header.version !== 1000) {\n // eslint-disable-next-line\n console.error(`SHP file: bad version ${header.version}`);\n }\n return header;\n}\n"],"mappings":";;;;;;AAoBA,IAAMA,aAAa,GAAG,IAAI;AAC1B,IAAMC,UAAU,GAAG,KAAK;AACxB,IAAMC,gBAAgB,GAAG,UAAU;;AAQ5B,SAASC,cAAc,CAACC,UAAoB,EAAa;EAG9D,IAAMC,MAAM,GAAG;IACbC,KAAK,EAAEF,UAAU,CAACG,QAAQ,CAAC,CAAC,EAAEN,UAAU,CAAC;IAEzCO,MAAM,EAAEJ,UAAU,CAACG,QAAQ,CAAC,EAAE,EAAEN,UAAU,CAAC,GAAG,CAAC;IAC/CQ,OAAO,EAAEL,UAAU,CAACG,QAAQ,CAAC,EAAE,EAAEP,aAAa,CAAC;IAC/CU,IAAI,EAAEN,UAAU,CAACG,QAAQ,CAAC,EAAE,EAAEP,aAAa,CAAC;IAC5CW,IAAI,EAAE;MACJC,IAAI,EAAER,UAAU,CAACS,UAAU,CAAC,EAAE,EAAEb,aAAa,CAAC;MAC9Cc,IAAI,EAAEV,UAAU,CAACS,UAAU,CAAC,EAAE,EAAEb,aAAa,CAAC;MAC9Ce,IAAI,EAAEX,UAAU,CAACS,UAAU,CAAC,EAAE,EAAEb,aAAa,CAAC;MAC9CgB,IAAI,EAAEZ,UAAU,CAACS,UAAU,CAAC,EAAE,EAAEb,aAAa,CAAC;MAC9CiB,IAAI,EAAEb,UAAU,CAACS,UAAU,CAAC,EAAE,EAAEb,aAAa,CAAC;MAC9CkB,IAAI,EAAEd,UAAU,CAACS,UAAU,CAAC,EAAE,EAAEb,aAAa,CAAC;MAC9CmB,IAAI,EAAEf,UAAU,CAACS,UAAU,CAAC,EAAE,EAAEb,aAAa,CAAC;MAC9CoB,IAAI,EAAEhB,UAAU,CAACS,UAAU,CAAC,EAAE,EAAEb,aAAa;IAC/C;EACF,CAAC;EACD,IAAIK,MAAM,CAACC,KAAK,KAAKJ,gBAAgB,EAAE;IAErCmB,OAAO,CAACC,KAAK,sCAA+BjB,MAAM,CAACC,KAAK,EAAG;EAC7D;EACA,IAAID,MAAM,CAACI,OAAO,KAAK,IAAI,EAAE;IAE3BY,OAAO,CAACC,KAAK,iCAA0BjB,MAAM,CAACI,OAAO,EAAG;EAC1D;EACA,OAAOJ,MAAM;AACf"}
@@ -1,33 +1,22 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
4
  Object.defineProperty(exports, "__esModule", {
6
5
  value: true
7
6
  });
8
7
  exports.parseSHP = parseSHP;
9
8
  exports.parseSHPInBatches = parseSHPInBatches;
10
-
11
9
  var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
12
-
13
10
  var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
14
-
15
11
  var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
16
-
17
12
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
18
-
19
13
  var _awaitAsyncGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/awaitAsyncGenerator"));
20
-
21
14
  var _wrapAsyncGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/wrapAsyncGenerator"));
22
-
23
- var _asyncIterator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncIterator"));
24
-
25
15
  var _binaryChunkReader = _interopRequireDefault(require("../streaming/binary-chunk-reader"));
26
-
27
16
  var _parseShpHeader = require("./parse-shp-header");
28
-
29
17
  var _parseShpGeometry = require("./parse-shp-geometry");
30
-
18
+ function _asyncIterator(iterable) { var method, async, sync, retry = 2; for ("undefined" != typeof Symbol && (async = Symbol.asyncIterator, sync = Symbol.iterator); retry--;) { if (async && null != (method = iterable[async])) return method.call(iterable); if (sync && null != (method = iterable[sync])) return new AsyncFromSyncIterator(method.call(iterable)); async = "@@asyncIterator", sync = "@@iterator"; } throw new TypeError("Object is not async iterable"); }
19
+ function AsyncFromSyncIterator(s) { function AsyncFromSyncIteratorContinuation(r) { if (Object(r) !== r) return Promise.reject(new TypeError(r + " is not an object.")); var done = r.done; return Promise.resolve(r.value).then(function (value) { return { value: value, done: done }; }); } return AsyncFromSyncIterator = function AsyncFromSyncIterator(s) { this.s = s, this.n = s.next; }, AsyncFromSyncIterator.prototype = { s: null, n: null, next: function next() { return AsyncFromSyncIteratorContinuation(this.n.apply(this.s, arguments)); }, return: function _return(value) { var ret = this.s.return; return void 0 === ret ? Promise.resolve({ value: value, done: !0 }) : AsyncFromSyncIteratorContinuation(ret.apply(this.s, arguments)); }, throw: function _throw(value) { var thr = this.s.return; return void 0 === thr ? Promise.reject(value) : AsyncFromSyncIteratorContinuation(thr.apply(this.s, arguments)); } }, new AsyncFromSyncIterator(s); }
31
20
  var LITTLE_ENDIAN = true;
32
21
  var BIG_ENDIAN = false;
33
22
  var SHP_HEADER_SIZE = 100;
@@ -38,7 +27,6 @@ var STATE = {
38
27
  END: 2,
39
28
  ERROR: 3
40
29
  };
41
-
42
30
  var SHPParser = function () {
43
31
  function SHPParser(options) {
44
32
  (0, _classCallCheck2.default)(this, SHPParser);
@@ -58,7 +46,6 @@ var SHPParser = function () {
58
46
  });
59
47
  this.options = options;
60
48
  }
61
-
62
49
  (0, _createClass2.default)(SHPParser, [{
63
50
  key: "write",
64
51
  value: function write(arrayBuffer) {
@@ -70,7 +57,6 @@ var SHPParser = function () {
70
57
  value: function end() {
71
58
  this.binaryReader.end();
72
59
  this.state = parseState(this.state, this.result, this.binaryReader, this.options);
73
-
74
60
  if (this.state !== STATE.END) {
75
61
  this.state = STATE.ERROR;
76
62
  this.result.error = 'SHP incomplete file';
@@ -79,142 +65,107 @@ var SHPParser = function () {
79
65
  }]);
80
66
  return SHPParser;
81
67
  }();
82
-
83
68
  function parseSHP(arrayBuffer, options) {
84
69
  var shpParser = new SHPParser(options);
85
70
  shpParser.write(arrayBuffer);
86
71
  shpParser.end();
72
+
87
73
  return shpParser.result;
88
74
  }
89
75
 
90
76
  function parseSHPInBatches(_x, _x2) {
91
77
  return _parseSHPInBatches.apply(this, arguments);
92
78
  }
93
-
94
79
  function _parseSHPInBatches() {
95
80
  _parseSHPInBatches = (0, _wrapAsyncGenerator2.default)(_regenerator.default.mark(function _callee(asyncIterator, options) {
96
- var parser, headerReturned, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, _value, arrayBuffer;
97
-
81
+ var parser, headerReturned, _iteratorAbruptCompletion, _didIteratorError, _iteratorError, _iterator, _step, arrayBuffer;
98
82
  return _regenerator.default.wrap(function _callee$(_context) {
99
83
  while (1) {
100
84
  switch (_context.prev = _context.next) {
101
85
  case 0:
102
86
  parser = new SHPParser(options);
103
87
  headerReturned = false;
104
- _iteratorNormalCompletion = true;
88
+ _iteratorAbruptCompletion = false;
105
89
  _didIteratorError = false;
106
90
  _context.prev = 4;
107
- _iterator = (0, _asyncIterator2.default)(asyncIterator);
108
-
91
+ _iterator = _asyncIterator(asyncIterator);
109
92
  case 6:
110
93
  _context.next = 8;
111
94
  return (0, _awaitAsyncGenerator2.default)(_iterator.next());
112
-
113
95
  case 8:
114
- _step = _context.sent;
115
- _iteratorNormalCompletion = _step.done;
116
- _context.next = 12;
117
- return (0, _awaitAsyncGenerator2.default)(_step.value);
118
-
119
- case 12:
120
- _value = _context.sent;
121
-
122
- if (_iteratorNormalCompletion) {
123
- _context.next = 27;
96
+ if (!(_iteratorAbruptCompletion = !(_step = _context.sent).done)) {
97
+ _context.next = 22;
124
98
  break;
125
99
  }
126
-
127
- arrayBuffer = _value;
100
+ arrayBuffer = _step.value;
128
101
  parser.write(arrayBuffer);
129
-
130
102
  if (!(!headerReturned && parser.result.header)) {
131
- _context.next = 20;
103
+ _context.next = 15;
132
104
  break;
133
105
  }
134
-
135
106
  headerReturned = true;
136
- _context.next = 20;
107
+ _context.next = 15;
137
108
  return parser.result.header;
138
-
139
- case 20:
109
+ case 15:
140
110
  if (!(parser.result.geometries.length > 0)) {
141
- _context.next = 24;
111
+ _context.next = 19;
142
112
  break;
143
113
  }
144
-
145
- _context.next = 23;
114
+ _context.next = 18;
146
115
  return parser.result.geometries;
147
-
148
- case 23:
116
+ case 18:
149
117
  parser.result.geometries = [];
150
-
151
- case 24:
152
- _iteratorNormalCompletion = true;
118
+ case 19:
119
+ _iteratorAbruptCompletion = false;
153
120
  _context.next = 6;
154
121
  break;
155
-
156
- case 27:
157
- _context.next = 33;
122
+ case 22:
123
+ _context.next = 28;
158
124
  break;
159
-
160
- case 29:
161
- _context.prev = 29;
125
+ case 24:
126
+ _context.prev = 24;
162
127
  _context.t0 = _context["catch"](4);
163
128
  _didIteratorError = true;
164
129
  _iteratorError = _context.t0;
165
-
166
- case 33:
167
- _context.prev = 33;
168
- _context.prev = 34;
169
-
170
- if (!(!_iteratorNormalCompletion && _iterator.return != null)) {
171
- _context.next = 38;
130
+ case 28:
131
+ _context.prev = 28;
132
+ _context.prev = 29;
133
+ if (!(_iteratorAbruptCompletion && _iterator.return != null)) {
134
+ _context.next = 33;
172
135
  break;
173
136
  }
174
-
175
- _context.next = 38;
137
+ _context.next = 33;
176
138
  return (0, _awaitAsyncGenerator2.default)(_iterator.return());
177
-
178
- case 38:
179
- _context.prev = 38;
180
-
139
+ case 33:
140
+ _context.prev = 33;
181
141
  if (!_didIteratorError) {
182
- _context.next = 41;
142
+ _context.next = 36;
183
143
  break;
184
144
  }
185
-
186
145
  throw _iteratorError;
187
-
188
- case 41:
189
- return _context.finish(38);
190
-
191
- case 42:
146
+ case 36:
192
147
  return _context.finish(33);
193
-
194
- case 43:
148
+ case 37:
149
+ return _context.finish(28);
150
+ case 38:
195
151
  parser.end();
196
-
197
152
  if (!(parser.result.geometries.length > 0)) {
198
- _context.next = 47;
153
+ _context.next = 42;
199
154
  break;
200
155
  }
201
-
202
- _context.next = 47;
156
+ _context.next = 42;
203
157
  return parser.result.geometries;
204
-
205
- case 47:
158
+ case 42:
206
159
  return _context.abrupt("return");
207
-
208
- case 48:
160
+ case 43:
209
161
  case "end":
210
162
  return _context.stop();
211
163
  }
212
164
  }
213
- }, _callee, null, [[4, 29, 33, 43], [34,, 38, 42]]);
165
+ }, _callee, null, [[4, 24, 28, 38], [29,, 33, 37]]);
214
166
  }));
215
167
  return _parseSHPInBatches.apply(this, arguments);
216
168
  }
217
-
218
169
  function parseState(state, result, binaryReader, options) {
219
170
  while (true) {
220
171
  try {
@@ -222,14 +173,11 @@ function parseState(state, result, binaryReader, options) {
222
173
  case STATE.ERROR:
223
174
  case STATE.END:
224
175
  return state;
225
-
226
176
  case STATE.EXPECTING_HEADER:
227
177
  var dataView = binaryReader.getDataView(SHP_HEADER_SIZE);
228
-
229
178
  if (!dataView) {
230
179
  return state;
231
180
  }
232
-
233
181
  result.header = (0, _parseShpHeader.parseSHPHeader)(dataView);
234
182
  result.progress = {
235
183
  bytesUsed: 0,
@@ -239,23 +187,19 @@ function parseState(state, result, binaryReader, options) {
239
187
  result.currentIndex = 1;
240
188
  state = STATE.EXPECTING_RECORD;
241
189
  break;
242
-
243
190
  case STATE.EXPECTING_RECORD:
244
191
  while (binaryReader.hasAvailableBytes(SHP_RECORD_HEADER_SIZE)) {
245
192
  var _result$header;
246
-
247
193
  var recordHeaderView = binaryReader.getDataView(SHP_RECORD_HEADER_SIZE);
248
194
  var recordHeader = {
249
195
  recordNumber: recordHeaderView.getInt32(0, BIG_ENDIAN),
250
196
  byteLength: recordHeaderView.getInt32(4, BIG_ENDIAN) * 2,
251
197
  type: recordHeaderView.getInt32(8, LITTLE_ENDIAN)
252
198
  };
253
-
254
199
  if (!binaryReader.hasAvailableBytes(recordHeader.byteLength - 4)) {
255
200
  binaryReader.rewind(SHP_RECORD_HEADER_SIZE);
256
201
  return state;
257
202
  }
258
-
259
203
  var invalidRecord = recordHeader.byteLength < 4 || recordHeader.type !== ((_result$header = result.header) === null || _result$header === void 0 ? void 0 : _result$header.type) || recordHeader.recordNumber !== result.currentIndex;
260
204
 
261
205
  if (invalidRecord) {
@@ -269,13 +213,10 @@ function parseState(state, result, binaryReader, options) {
269
213
  result.progress.rows = result.currentIndex - 1;
270
214
  }
271
215
  }
272
-
273
216
  if (binaryReader.ended) {
274
217
  state = STATE.END;
275
218
  }
276
-
277
219
  return state;
278
-
279
220
  default:
280
221
  state = STATE.ERROR;
281
222
  result.error = "illegal parser state ".concat(state);