@loaders.gl/shapefile 3.3.0-alpha.5 → 3.3.0-alpha.6
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.
- package/dist/dbf-worker.js +1 -1
- package/dist/dist.min.js +47 -11
- package/dist/es5/bundle.js +0 -1
- package/dist/es5/bundle.js.map +1 -1
- package/dist/es5/dbf-loader.js +5 -16
- package/dist/es5/dbf-loader.js.map +1 -1
- package/dist/es5/index.js +6 -9
- package/dist/es5/index.js.map +1 -1
- package/dist/es5/lib/parsers/parse-dbf.js +69 -154
- package/dist/es5/lib/parsers/parse-dbf.js.map +1 -1
- package/dist/es5/lib/parsers/parse-shapefile.js +34 -148
- package/dist/es5/lib/parsers/parse-shapefile.js.map +1 -1
- package/dist/es5/lib/parsers/parse-shp-geometry.js +4 -57
- package/dist/es5/lib/parsers/parse-shp-geometry.js.map +1 -1
- package/dist/es5/lib/parsers/parse-shp-header.js +0 -3
- package/dist/es5/lib/parsers/parse-shp-header.js.map +1 -1
- package/dist/es5/lib/parsers/parse-shp.js +39 -98
- package/dist/es5/lib/parsers/parse-shp.js.map +1 -1
- package/dist/es5/lib/parsers/parse-shx.js +0 -4
- package/dist/es5/lib/parsers/parse-shx.js.map +1 -1
- package/dist/es5/lib/parsers/types.js.map +1 -1
- package/dist/es5/lib/streaming/binary-chunk-reader.js +39 -55
- package/dist/es5/lib/streaming/binary-chunk-reader.js.map +1 -1
- package/dist/es5/lib/streaming/binary-reader.js +11 -12
- package/dist/es5/lib/streaming/binary-reader.js.map +1 -1
- package/dist/es5/lib/streaming/zip-batch-iterators.js +1 -24
- package/dist/es5/lib/streaming/zip-batch-iterators.js.map +1 -1
- package/dist/es5/shapefile-loader.js +1 -3
- package/dist/es5/shapefile-loader.js.map +1 -1
- package/dist/es5/shp-loader.js +6 -17
- package/dist/es5/shp-loader.js.map +1 -1
- package/dist/es5/workers/dbf-worker.js +0 -2
- package/dist/es5/workers/dbf-worker.js.map +1 -1
- package/dist/es5/workers/shp-worker.js +0 -2
- package/dist/es5/workers/shp-worker.js.map +1 -1
- package/dist/esm/bundle.js +1 -1
- package/dist/esm/bundle.js.map +1 -1
- package/dist/esm/dbf-loader.js +6 -2
- package/dist/esm/dbf-loader.js.map +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/lib/parsers/parse-dbf.js +18 -58
- package/dist/esm/lib/parsers/parse-dbf.js.map +1 -1
- package/dist/esm/lib/parsers/parse-shapefile.js +12 -35
- package/dist/esm/lib/parsers/parse-shapefile.js.map +1 -1
- package/dist/esm/lib/parsers/parse-shp-geometry.js +3 -28
- package/dist/esm/lib/parsers/parse-shp-geometry.js.map +1 -1
- package/dist/esm/lib/parsers/parse-shp-header.js +1 -3
- package/dist/esm/lib/parsers/parse-shp-header.js.map +1 -1
- package/dist/esm/lib/parsers/parse-shp.js +2 -26
- package/dist/esm/lib/parsers/parse-shp.js.map +1 -1
- package/dist/esm/lib/parsers/parse-shx.js +1 -2
- package/dist/esm/lib/parsers/parse-shx.js.map +1 -1
- package/dist/esm/lib/parsers/types.js.map +1 -1
- package/dist/esm/lib/streaming/binary-chunk-reader.js +4 -19
- package/dist/esm/lib/streaming/binary-chunk-reader.js.map +1 -1
- package/dist/esm/lib/streaming/binary-reader.js +0 -5
- package/dist/esm/lib/streaming/binary-reader.js.map +1 -1
- package/dist/esm/lib/streaming/zip-batch-iterators.js +2 -5
- package/dist/esm/lib/streaming/zip-batch-iterators.js.map +1 -1
- package/dist/esm/shapefile-loader.js +3 -1
- package/dist/esm/shapefile-loader.js.map +1 -1
- package/dist/esm/shp-loader.js +6 -2
- package/dist/esm/shp-loader.js.map +1 -1
- package/dist/esm/workers/dbf-worker.js.map +1 -1
- package/dist/esm/workers/shp-worker.js.map +1 -1
- package/dist/shp-worker.js +1 -1
- package/package.json +5 -5
|
@@ -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
|
-
|
|
17
|
-
|
|
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,"
|
|
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,
|
|
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
|
-
|
|
88
|
+
_iteratorAbruptCompletion = false;
|
|
105
89
|
_didIteratorError = false;
|
|
106
90
|
_context.prev = 4;
|
|
107
|
-
_iterator = (
|
|
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
|
-
|
|
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 =
|
|
103
|
+
_context.next = 15;
|
|
132
104
|
break;
|
|
133
105
|
}
|
|
134
|
-
|
|
135
106
|
headerReturned = true;
|
|
136
|
-
_context.next =
|
|
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 =
|
|
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
|
-
|
|
152
|
-
_iteratorNormalCompletion = true;
|
|
118
|
+
case 19:
|
|
119
|
+
_iteratorAbruptCompletion = false;
|
|
153
120
|
_context.next = 6;
|
|
154
121
|
break;
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
_context.next = 33;
|
|
122
|
+
case 22:
|
|
123
|
+
_context.next = 28;
|
|
158
124
|
break;
|
|
159
|
-
|
|
160
|
-
|
|
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
|
-
|
|
167
|
-
_context.prev =
|
|
168
|
-
|
|
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
|
-
|
|
179
|
-
_context.prev = 38;
|
|
180
|
-
|
|
139
|
+
case 33:
|
|
140
|
+
_context.prev = 33;
|
|
181
141
|
if (!_didIteratorError) {
|
|
182
|
-
_context.next =
|
|
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
|
-
|
|
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 =
|
|
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,
|
|
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);
|