@loaders.gl/gis 3.0.13 → 3.0.14

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.
@@ -1,8 +1,8 @@
1
1
  "use strict";
2
2
 
3
- const moduleExports = require('./index');
3
+ var moduleExports = require('./index');
4
4
 
5
- const _global = typeof window === 'undefined' ? global : window;
5
+ var _global = typeof window === 'undefined' ? global : window;
6
6
 
7
7
  _global.loaders = _global.loaders || {};
8
8
  module.exports = Object.assign(_global.loaders, moduleExports);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/bundle.ts"],"names":["moduleExports","require","_global","window","global","loaders","module","exports","Object","assign"],"mappings":";;AACA,MAAMA,aAAa,GAAGC,OAAO,CAAC,SAAD,CAA7B;;AACA,MAAMC,OAAO,GAAG,OAAOC,MAAP,KAAkB,WAAlB,GAAgCC,MAAhC,GAAyCD,MAAzD;;AACAD,OAAO,CAACG,OAAR,GAAkBH,OAAO,CAACG,OAAR,IAAmB,EAArC;AACAC,MAAM,CAACC,OAAP,GAAiBC,MAAM,CAACC,MAAP,CAAcP,OAAO,CAACG,OAAtB,EAA+BL,aAA/B,CAAjB","sourcesContent":["// @ts-nocheck\nconst moduleExports = require('./index');\nconst _global = typeof window === 'undefined' ? global : window;\n_global.loaders = _global.loaders || {};\nmodule.exports = Object.assign(_global.loaders, moduleExports);\n"],"file":"bundle.js"}
1
+ {"version":3,"sources":["../../src/bundle.ts"],"names":["moduleExports","require","_global","window","global","loaders","module","exports","Object","assign"],"mappings":";;AACA,IAAMA,aAAa,GAAGC,OAAO,CAAC,SAAD,CAA7B;;AACA,IAAMC,OAAO,GAAG,OAAOC,MAAP,KAAkB,WAAlB,GAAgCC,MAAhC,GAAyCD,MAAzD;;AACAD,OAAO,CAACG,OAAR,GAAkBH,OAAO,CAACG,OAAR,IAAmB,EAArC;AACAC,MAAM,CAACC,OAAP,GAAiBC,MAAM,CAACC,MAAP,CAAcP,OAAO,CAACG,OAAtB,EAA+BL,aAA/B,CAAjB","sourcesContent":["// @ts-nocheck\nconst moduleExports = require('./index');\nconst _global = typeof window === 'undefined' ? global : window;\n_global.loaders = _global.loaders || {};\nmodule.exports = Object.assign(_global.loaders, moduleExports);\n"],"file":"bundle.js"}
package/dist/es5/index.js CHANGED
@@ -5,37 +5,37 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  Object.defineProperty(exports, "geojsonToBinary", {
7
7
  enumerable: true,
8
- get: function () {
8
+ get: function get() {
9
9
  return _geojsonToBinary.geojsonToBinary;
10
10
  }
11
11
  });
12
12
  Object.defineProperty(exports, "binaryToGeojson", {
13
13
  enumerable: true,
14
- get: function () {
14
+ get: function get() {
15
15
  return _binaryToGeojson.binaryToGeojson;
16
16
  }
17
17
  });
18
18
  Object.defineProperty(exports, "binaryToGeoJson", {
19
19
  enumerable: true,
20
- get: function () {
20
+ get: function get() {
21
21
  return _binaryToGeojson.binaryToGeoJson;
22
22
  }
23
23
  });
24
24
  Object.defineProperty(exports, "binaryToGeometry", {
25
25
  enumerable: true,
26
- get: function () {
26
+ get: function get() {
27
27
  return _binaryToGeojson.binaryToGeometry;
28
28
  }
29
29
  });
30
30
  Object.defineProperty(exports, "transformBinaryCoords", {
31
31
  enumerable: true,
32
- get: function () {
32
+ get: function get() {
33
33
  return _transform.transformBinaryCoords;
34
34
  }
35
35
  });
36
36
  Object.defineProperty(exports, "transformGeoJsonCoords", {
37
37
  enumerable: true,
38
- get: function () {
38
+ get: function get() {
39
39
  return _transform.transformGeoJsonCoords;
40
40
  }
41
41
  });
@@ -1,5 +1,7 @@
1
1
  "use strict";
2
2
 
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
3
5
  Object.defineProperty(exports, "__esModule", {
4
6
  value: true
5
7
  });
@@ -7,8 +9,20 @@ exports.binaryToGeojson = binaryToGeojson;
7
9
  exports.binaryToGeoJson = binaryToGeoJson;
8
10
  exports.binaryToGeometry = binaryToGeometry;
9
11
 
12
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
13
+
14
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
15
+
16
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
17
+
18
+ function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
19
+
20
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
21
+
22
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
23
+
10
24
  function binaryToGeojson(data, options) {
11
- const globalFeatureId = options === null || options === void 0 ? void 0 : options.globalFeatureId;
25
+ var globalFeatureId = options === null || options === void 0 ? void 0 : options.globalFeatureId;
12
26
 
13
27
  if (globalFeatureId !== undefined) {
14
28
  return getSingleFeature(data, globalFeatureId);
@@ -17,7 +31,9 @@ function binaryToGeojson(data, options) {
17
31
  return parseFeatures(data, options === null || options === void 0 ? void 0 : options.type);
18
32
  }
19
33
 
20
- function binaryToGeoJson(data, type, format = 'feature') {
34
+ function binaryToGeoJson(data, type) {
35
+ var format = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'feature';
36
+
21
37
  switch (format) {
22
38
  case 'feature':
23
39
  return parseFeatures(data, type);
@@ -31,37 +47,47 @@ function binaryToGeoJson(data, type, format = 'feature') {
31
47
  }
32
48
 
33
49
  function getSingleFeature(data, globalFeatureId) {
34
- const dataArray = normalizeInput(data);
50
+ var dataArray = normalizeInput(data);
35
51
 
36
- for (const data of dataArray) {
37
- let lastIndex = 0;
38
- let lastValue = data.featureIds.value[0];
52
+ var _iterator = _createForOfIteratorHelper(dataArray),
53
+ _step;
39
54
 
40
- for (let i = 0; i < data.featureIds.value.length; i++) {
41
- const currValue = data.featureIds.value[i];
55
+ try {
56
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
57
+ var _data = _step.value;
58
+ var lastIndex = 0;
59
+ var lastValue = _data.featureIds.value[0];
42
60
 
43
- if (currValue === lastValue) {
44
- continue;
45
- }
61
+ for (var i = 0; i < _data.featureIds.value.length; i++) {
62
+ var currValue = _data.featureIds.value[i];
46
63
 
47
- if (globalFeatureId === data.globalFeatureIds.value[lastIndex]) {
48
- return parseFeature(data, lastIndex, i);
49
- }
64
+ if (currValue === lastValue) {
65
+ continue;
66
+ }
50
67
 
51
- lastIndex = i;
52
- lastValue = currValue;
53
- }
68
+ if (globalFeatureId === _data.globalFeatureIds.value[lastIndex]) {
69
+ return parseFeature(_data, lastIndex, i);
70
+ }
71
+
72
+ lastIndex = i;
73
+ lastValue = currValue;
74
+ }
54
75
 
55
- if (globalFeatureId === data.globalFeatureIds.value[lastIndex]) {
56
- return parseFeature(data, lastIndex, data.featureIds.value.length);
76
+ if (globalFeatureId === _data.globalFeatureIds.value[lastIndex]) {
77
+ return parseFeature(_data, lastIndex, _data.featureIds.value.length);
78
+ }
57
79
  }
80
+ } catch (err) {
81
+ _iterator.e(err);
82
+ } finally {
83
+ _iterator.f();
58
84
  }
59
85
 
60
86
  throw new Error("featureId:".concat(globalFeatureId, " not found"));
61
87
  }
62
88
 
63
89
  function parseFeatures(data, type) {
64
- const dataArray = normalizeInput(data, type);
90
+ var dataArray = normalizeInput(data, type);
65
91
  return parseFeatureCollection(dataArray);
66
92
  }
67
93
 
@@ -77,20 +103,20 @@ function binaryToGeometry(data, startIndex, endIndex) {
77
103
  return polygonToGeoJson(data, startIndex, endIndex);
78
104
 
79
105
  default:
80
- const unexpectedInput = data;
106
+ var unexpectedInput = data;
81
107
  throw new Error("Unsupported geometry type: ".concat(unexpectedInput === null || unexpectedInput === void 0 ? void 0 : unexpectedInput.type));
82
108
  }
83
109
  }
84
110
 
85
111
  function normalizeInput(data, type) {
86
- const isHeterogeneousType = Boolean(data.points || data.lines || data.polygons);
112
+ var isHeterogeneousType = Boolean(data.points || data.lines || data.polygons);
87
113
 
88
114
  if (!isHeterogeneousType) {
89
115
  data.type = type || parseType(data);
90
116
  return [data];
91
117
  }
92
118
 
93
- const features = [];
119
+ var features = [];
94
120
 
95
121
  if (data.points) {
96
122
  data.points.type = 'Point';
@@ -111,138 +137,158 @@ function normalizeInput(data, type) {
111
137
  }
112
138
 
113
139
  function parseFeatureCollection(dataArray) {
114
- const features = [];
115
-
116
- for (const data of dataArray) {
117
- if (data.featureIds.value.length === 0) {
118
- continue;
119
- }
140
+ var features = [];
120
141
 
121
- let lastIndex = 0;
122
- let lastValue = data.featureIds.value[0];
142
+ var _iterator2 = _createForOfIteratorHelper(dataArray),
143
+ _step2;
123
144
 
124
- for (let i = 0; i < data.featureIds.value.length; i++) {
125
- const currValue = data.featureIds.value[i];
145
+ try {
146
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
147
+ var data = _step2.value;
126
148
 
127
- if (currValue === lastValue) {
149
+ if (data.featureIds.value.length === 0) {
128
150
  continue;
129
151
  }
130
152
 
131
- features.push(parseFeature(data, lastIndex, i));
132
- lastIndex = i;
133
- lastValue = currValue;
134
- }
153
+ var lastIndex = 0;
154
+ var lastValue = data.featureIds.value[0];
135
155
 
136
- features.push(parseFeature(data, lastIndex, data.featureIds.value.length));
156
+ for (var i = 0; i < data.featureIds.value.length; i++) {
157
+ var currValue = data.featureIds.value[i];
158
+
159
+ if (currValue === lastValue) {
160
+ continue;
161
+ }
162
+
163
+ features.push(parseFeature(data, lastIndex, i));
164
+ lastIndex = i;
165
+ lastValue = currValue;
166
+ }
167
+
168
+ features.push(parseFeature(data, lastIndex, data.featureIds.value.length));
169
+ }
170
+ } catch (err) {
171
+ _iterator2.e(err);
172
+ } finally {
173
+ _iterator2.f();
137
174
  }
138
175
 
139
176
  return features;
140
177
  }
141
178
 
142
179
  function parseFeature(data, startIndex, endIndex) {
143
- const geometry = binaryToGeometry(data, startIndex, endIndex);
144
- const properties = parseProperties(data, startIndex, endIndex);
145
- const fields = parseFields(data, startIndex, endIndex);
146
- return {
180
+ var geometry = binaryToGeometry(data, startIndex, endIndex);
181
+ var properties = parseProperties(data, startIndex, endIndex);
182
+ var fields = parseFields(data, startIndex, endIndex);
183
+ return _objectSpread({
147
184
  type: 'Feature',
148
- geometry,
149
- properties,
150
- ...fields
151
- };
185
+ geometry: geometry,
186
+ properties: properties
187
+ }, fields);
152
188
  }
153
189
 
154
- function parseFields(data, startIndex = 0, endIndex) {
190
+ function parseFields(data) {
191
+ var startIndex = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
192
+ var endIndex = arguments.length > 2 ? arguments[2] : undefined;
155
193
  return data.fields && data.fields[data.featureIds.value[startIndex]];
156
194
  }
157
195
 
158
- function parseProperties(data, startIndex = 0, endIndex) {
159
- const properties = Object.assign({}, data.properties[data.featureIds.value[startIndex]]);
196
+ function parseProperties(data) {
197
+ var startIndex = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
198
+ var endIndex = arguments.length > 2 ? arguments[2] : undefined;
199
+ var properties = Object.assign({}, data.properties[data.featureIds.value[startIndex]]);
160
200
 
161
- for (const key in data.numericProps) {
201
+ for (var key in data.numericProps) {
162
202
  properties[key] = data.numericProps[key].value[startIndex];
163
203
  }
164
204
 
165
205
  return properties;
166
206
  }
167
207
 
168
- function polygonToGeoJson(data, startIndex = -Infinity, endIndex = Infinity) {
169
- const {
170
- positions
171
- } = data;
172
- const polygonIndices = data.polygonIndices.value.filter(x => x >= startIndex && x <= endIndex);
173
- const primitivePolygonIndices = data.primitivePolygonIndices.value.filter(x => x >= startIndex && x <= endIndex);
174
- const multi = polygonIndices.length > 2;
208
+ function polygonToGeoJson(data) {
209
+ var startIndex = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : -Infinity;
210
+ var endIndex = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : Infinity;
211
+ var positions = data.positions;
212
+ var polygonIndices = data.polygonIndices.value.filter(function (x) {
213
+ return x >= startIndex && x <= endIndex;
214
+ });
215
+ var primitivePolygonIndices = data.primitivePolygonIndices.value.filter(function (x) {
216
+ return x >= startIndex && x <= endIndex;
217
+ });
218
+ var multi = polygonIndices.length > 2;
175
219
 
176
220
  if (!multi) {
177
- const coordinates = [];
221
+ var _coordinates = [];
222
+
223
+ for (var i = 0; i < primitivePolygonIndices.length - 1; i++) {
224
+ var startRingIndex = primitivePolygonIndices[i];
225
+ var endRingIndex = primitivePolygonIndices[i + 1];
226
+ var ringCoordinates = ringToGeoJson(positions, startRingIndex, endRingIndex);
178
227
 
179
- for (let i = 0; i < primitivePolygonIndices.length - 1; i++) {
180
- const startRingIndex = primitivePolygonIndices[i];
181
- const endRingIndex = primitivePolygonIndices[i + 1];
182
- const ringCoordinates = ringToGeoJson(positions, startRingIndex, endRingIndex);
183
- coordinates.push(ringCoordinates);
228
+ _coordinates.push(ringCoordinates);
184
229
  }
185
230
 
186
231
  return {
187
232
  type: 'Polygon',
188
- coordinates
233
+ coordinates: _coordinates
189
234
  };
190
235
  }
191
236
 
192
- const coordinates = [];
237
+ var coordinates = [];
193
238
 
194
- for (let i = 0; i < polygonIndices.length - 1; i++) {
195
- const startPolygonIndex = polygonIndices[i];
196
- const endPolygonIndex = polygonIndices[i + 1];
197
- const polygonCoordinates = polygonToGeoJson(data, startPolygonIndex, endPolygonIndex).coordinates;
239
+ for (var _i = 0; _i < polygonIndices.length - 1; _i++) {
240
+ var startPolygonIndex = polygonIndices[_i];
241
+ var endPolygonIndex = polygonIndices[_i + 1];
242
+ var polygonCoordinates = polygonToGeoJson(data, startPolygonIndex, endPolygonIndex).coordinates;
198
243
  coordinates.push(polygonCoordinates);
199
244
  }
200
245
 
201
246
  return {
202
247
  type: 'MultiPolygon',
203
- coordinates
248
+ coordinates: coordinates
204
249
  };
205
250
  }
206
251
 
207
- function lineStringToGeoJson(data, startIndex = -Infinity, endIndex = Infinity) {
208
- const {
209
- positions
210
- } = data;
211
- const pathIndices = data.pathIndices.value.filter(x => x >= startIndex && x <= endIndex);
212
- const multi = pathIndices.length > 2;
252
+ function lineStringToGeoJson(data) {
253
+ var startIndex = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : -Infinity;
254
+ var endIndex = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : Infinity;
255
+ var positions = data.positions;
256
+ var pathIndices = data.pathIndices.value.filter(function (x) {
257
+ return x >= startIndex && x <= endIndex;
258
+ });
259
+ var multi = pathIndices.length > 2;
213
260
 
214
261
  if (!multi) {
215
- const coordinates = ringToGeoJson(positions, pathIndices[0], pathIndices[1]);
262
+ var _coordinates2 = ringToGeoJson(positions, pathIndices[0], pathIndices[1]);
263
+
216
264
  return {
217
265
  type: 'LineString',
218
- coordinates
266
+ coordinates: _coordinates2
219
267
  };
220
268
  }
221
269
 
222
- const coordinates = [];
270
+ var coordinates = [];
223
271
 
224
- for (let i = 0; i < pathIndices.length - 1; i++) {
225
- const ringCoordinates = ringToGeoJson(positions, pathIndices[i], pathIndices[i + 1]);
272
+ for (var i = 0; i < pathIndices.length - 1; i++) {
273
+ var ringCoordinates = ringToGeoJson(positions, pathIndices[i], pathIndices[i + 1]);
226
274
  coordinates.push(ringCoordinates);
227
275
  }
228
276
 
229
277
  return {
230
278
  type: 'MultiLineString',
231
- coordinates
279
+ coordinates: coordinates
232
280
  };
233
281
  }
234
282
 
235
283
  function pointToGeoJson(data, startIndex, endIndex) {
236
- const {
237
- positions
238
- } = data;
239
- const coordinates = ringToGeoJson(positions, startIndex, endIndex);
240
- const multi = coordinates.length > 1;
284
+ var positions = data.positions;
285
+ var coordinates = ringToGeoJson(positions, startIndex, endIndex);
286
+ var multi = coordinates.length > 1;
241
287
 
242
288
  if (multi) {
243
289
  return {
244
290
  type: 'MultiPoint',
245
- coordinates
291
+ coordinates: coordinates
246
292
  };
247
293
  }
248
294
 
@@ -255,12 +301,12 @@ function pointToGeoJson(data, startIndex, endIndex) {
255
301
  function ringToGeoJson(positions, startIndex, endIndex) {
256
302
  startIndex = startIndex || 0;
257
303
  endIndex = endIndex || positions.value.length / positions.size;
258
- const ringCoordinates = [];
304
+ var ringCoordinates = [];
259
305
 
260
- for (let j = startIndex; j < endIndex; j++) {
261
- const coord = Array();
306
+ for (var j = startIndex; j < endIndex; j++) {
307
+ var coord = Array();
262
308
 
263
- for (let k = j * positions.size; k < (j + 1) * positions.size; k++) {
309
+ for (var k = j * positions.size; k < (j + 1) * positions.size; k++) {
264
310
  coord.push(Number(positions.value[k]));
265
311
  }
266
312
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/binary-to-geojson.ts"],"names":["binaryToGeojson","data","options","globalFeatureId","undefined","getSingleFeature","parseFeatures","type","binaryToGeoJson","format","binaryToGeometry","Error","dataArray","normalizeInput","lastIndex","lastValue","featureIds","value","i","length","currValue","globalFeatureIds","parseFeature","parseFeatureCollection","startIndex","endIndex","pointToGeoJson","lineStringToGeoJson","polygonToGeoJson","unexpectedInput","isHeterogeneousType","Boolean","points","lines","polygons","parseType","features","push","geometry","properties","parseProperties","fields","parseFields","Object","assign","key","numericProps","Infinity","positions","polygonIndices","filter","x","primitivePolygonIndices","multi","coordinates","startRingIndex","endRingIndex","ringCoordinates","ringToGeoJson","startPolygonIndex","endPolygonIndex","polygonCoordinates","pathIndices","size","j","coord","Array","k","Number"],"mappings":"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","sourcesContent":["import type {\n BinaryGeometry,\n BinaryFeatures,\n BinaryGeometryType,\n BinaryPointFeatures,\n BinaryLineFeatures,\n BinaryPolygonFeatures,\n BinaryAttribute\n} from '@loaders.gl/schema';\nimport type {Feature, Geometry, Position, GeoJsonProperties} from '@loaders.gl/schema';\nimport type {\n Point,\n MultiPoint,\n LineString,\n MultiLineString,\n Polygon,\n MultiPolygon\n} from '@loaders.gl/schema';\n\n// Note:L We do not handle GeometryCollection, define a limited Geometry type that always has coordinates.\n// type FeatureGeometry = Point | MultiPoint | LineString | MultiLineString | Polygon | MultiPolygon;\n\ntype BinaryToGeoJsonOptions = {\n type?: BinaryGeometryType;\n globalFeatureId?: number;\n};\n\n/**\n * Convert binary geometry representation to GeoJSON\n * @param data geometry data in binary representation\n * @param options\n * @param options.type Input data type: Point, LineString, or Polygon\n * @param options.featureId Global feature id. If specified, only a single feature is extracted\n * @return GeoJSON objects\n */\nexport function binaryToGeojson(\n data: BinaryFeatures,\n options?: BinaryToGeoJsonOptions\n): Feature[] | Feature {\n const globalFeatureId = options?.globalFeatureId;\n if (globalFeatureId !== undefined) {\n return getSingleFeature(data, globalFeatureId);\n }\n return parseFeatures(data, options?.type);\n}\n\n/** @deprecated use `binaryToGeojson` or `binaryToGeometry` instead */\nexport function binaryToGeoJson(\n data: BinaryGeometry | BinaryFeatures,\n type?: BinaryGeometryType,\n format: 'feature' | 'geometry' = 'feature'\n): Geometry | Feature[] {\n switch (format) {\n case 'feature':\n return parseFeatures(data as BinaryFeatures, type);\n case 'geometry':\n return binaryToGeometry(data as BinaryGeometry);\n default:\n throw new Error(format);\n }\n}\n\n/**\n * Return a single feature from a binary geometry representation as GeoJSON\n * @param data geometry data in binary representation\n * @return GeoJSON feature\n */\nfunction getSingleFeature(data: BinaryFeatures, globalFeatureId: number): Feature {\n const dataArray = normalizeInput(data);\n for (const data of dataArray) {\n let lastIndex = 0;\n let lastValue = data.featureIds.value[0];\n\n // Scan through data until we find matching feature\n for (let i = 0; i < data.featureIds.value.length; i++) {\n const currValue = data.featureIds.value[i];\n if (currValue === lastValue) {\n // eslint-disable-next-line no-continue\n continue;\n }\n if (globalFeatureId === data.globalFeatureIds.value[lastIndex]) {\n return parseFeature(data, lastIndex, i);\n }\n lastIndex = i;\n lastValue = currValue;\n }\n\n if (globalFeatureId === data.globalFeatureIds.value[lastIndex]) {\n return parseFeature(data, lastIndex, data.featureIds.value.length);\n }\n }\n\n throw new Error(`featureId:${globalFeatureId} not found`);\n}\n\nfunction parseFeatures(data: BinaryFeatures, type?: BinaryGeometryType): Feature[] {\n const dataArray = normalizeInput(data, type);\n return parseFeatureCollection(dataArray);\n}\n\n/** Parse input binary data and return a valid GeoJSON geometry object */\nexport function binaryToGeometry(\n data: BinaryGeometry,\n startIndex?: number,\n endIndex?: number\n): Geometry {\n switch (data.type) {\n case 'Point':\n return pointToGeoJson(data, startIndex, endIndex);\n case 'LineString':\n return lineStringToGeoJson(data, startIndex, endIndex);\n case 'Polygon':\n return polygonToGeoJson(data, startIndex, endIndex);\n default:\n const unexpectedInput: never = data;\n throw new Error(`Unsupported geometry type: ${(unexpectedInput as any)?.type}`);\n }\n}\n\ntype BinaryFeature = BinaryPointFeatures | BinaryLineFeatures | BinaryPolygonFeatures;\ntype BinaryFeaturesArray = BinaryFeature[];\n\n// Normalize features\n// Return an array of data objects, each of which have a type key\nfunction normalizeInput(data: BinaryFeatures, type?: BinaryGeometryType): BinaryFeaturesArray {\n const isHeterogeneousType = Boolean(data.points || data.lines || data.polygons);\n\n if (!isHeterogeneousType) {\n // @ts-expect-error This is a legacy check which allowed `data` to be an instance of the values\n // here. Aka the new data.points, data.lines, or data.polygons.\n data.type = type || parseType(data);\n return [data] as BinaryFeaturesArray;\n }\n\n const features: BinaryFeaturesArray = [];\n if (data.points) {\n data.points.type = 'Point';\n features.push(data.points);\n }\n if (data.lines) {\n data.lines.type = 'LineString';\n features.push(data.lines);\n }\n if (data.polygons) {\n data.polygons.type = 'Polygon';\n features.push(data.polygons);\n }\n\n return features;\n}\n\n/** Parse input binary data and return an array of GeoJSON Features */\nfunction parseFeatureCollection(dataArray): Feature[] {\n const features: Feature[] = [];\n for (const data of dataArray) {\n if (data.featureIds.value.length === 0) {\n // eslint-disable-next-line no-continue\n continue;\n }\n let lastIndex = 0;\n let lastValue = data.featureIds.value[0];\n\n // Need to deduce start, end indices of each feature\n for (let i = 0; i < data.featureIds.value.length; i++) {\n const currValue = data.featureIds.value[i];\n if (currValue === lastValue) {\n // eslint-disable-next-line no-continue\n continue;\n }\n\n features.push(parseFeature(data, lastIndex, i));\n lastIndex = i;\n lastValue = currValue;\n }\n\n // Last feature\n features.push(parseFeature(data, lastIndex, data.featureIds.value.length));\n }\n return features;\n}\n\n/** Parse input binary data and return a single GeoJSON Feature */\nfunction parseFeature(data, startIndex?: number, endIndex?: number): Feature {\n const geometry = binaryToGeometry(data, startIndex, endIndex);\n const properties = parseProperties(data, startIndex, endIndex);\n const fields = parseFields(data, startIndex, endIndex);\n return {type: 'Feature', geometry, properties, ...fields};\n}\n\n/** Parse input binary data and return an object of fields */\nfunction parseFields(data, startIndex: number = 0, endIndex?: number): GeoJsonProperties {\n return data.fields && data.fields[data.featureIds.value[startIndex]];\n}\n\n/** Parse input binary data and return an object of properties */\nfunction parseProperties(data, startIndex: number = 0, endIndex?: number): GeoJsonProperties {\n const properties = Object.assign({}, data.properties[data.featureIds.value[startIndex]]);\n for (const key in data.numericProps) {\n properties[key] = data.numericProps[key].value[startIndex];\n }\n return properties;\n}\n\n/** Parse binary data of type Polygon */\nfunction polygonToGeoJson(\n data,\n startIndex: number = -Infinity,\n endIndex: number = Infinity\n): Polygon | MultiPolygon {\n const {positions} = data;\n const polygonIndices = data.polygonIndices.value.filter((x) => x >= startIndex && x <= endIndex);\n const primitivePolygonIndices = data.primitivePolygonIndices.value.filter(\n (x) => x >= startIndex && x <= endIndex\n );\n const multi = polygonIndices.length > 2;\n\n // Polygon\n if (!multi) {\n const coordinates: Position[][] = [];\n for (let i = 0; i < primitivePolygonIndices.length - 1; i++) {\n const startRingIndex = primitivePolygonIndices[i];\n const endRingIndex = primitivePolygonIndices[i + 1];\n const ringCoordinates = ringToGeoJson(positions, startRingIndex, endRingIndex);\n coordinates.push(ringCoordinates);\n }\n\n return {type: 'Polygon', coordinates};\n }\n\n // MultiPolygon\n const coordinates: Position[][][] = [];\n for (let i = 0; i < polygonIndices.length - 1; i++) {\n const startPolygonIndex = polygonIndices[i];\n const endPolygonIndex = polygonIndices[i + 1];\n const polygonCoordinates = polygonToGeoJson(\n data,\n startPolygonIndex,\n endPolygonIndex\n ).coordinates;\n coordinates.push(polygonCoordinates as Position[][]);\n }\n\n return {type: 'MultiPolygon', coordinates};\n}\n\n/** Parse binary data of type LineString */\nfunction lineStringToGeoJson(\n data,\n startIndex: number = -Infinity,\n endIndex: number = Infinity\n): LineString | MultiLineString {\n const {positions} = data;\n const pathIndices = data.pathIndices.value.filter((x) => x >= startIndex && x <= endIndex);\n const multi = pathIndices.length > 2;\n\n if (!multi) {\n const coordinates = ringToGeoJson(positions, pathIndices[0], pathIndices[1]);\n return {type: 'LineString', coordinates};\n }\n\n const coordinates: Position[][] = [];\n for (let i = 0; i < pathIndices.length - 1; i++) {\n const ringCoordinates = ringToGeoJson(positions, pathIndices[i], pathIndices[i + 1]);\n coordinates.push(ringCoordinates);\n }\n\n return {type: 'MultiLineString', coordinates};\n}\n\n/** Parse binary data of type Point */\nfunction pointToGeoJson(data, startIndex, endIndex): Point | MultiPoint {\n const {positions} = data;\n const coordinates = ringToGeoJson(positions, startIndex, endIndex);\n const multi = coordinates.length > 1;\n\n if (multi) {\n return {type: 'MultiPoint', coordinates};\n }\n\n return {type: 'Point', coordinates: coordinates[0]};\n}\n\n/**\n * Parse a linear ring of positions to a GeoJSON linear ring\n *\n * @param positions Positions TypedArray\n * @param startIndex Start index to include in ring\n * @param endIndex End index to include in ring\n * @returns GeoJSON ring\n */\nfunction ringToGeoJson(\n positions: BinaryAttribute,\n startIndex?: number,\n endIndex?: number\n): Position[] {\n startIndex = startIndex || 0;\n endIndex = endIndex || positions.value.length / positions.size;\n\n const ringCoordinates: Position[] = [];\n for (let j = startIndex; j < endIndex; j++) {\n const coord = Array<number>();\n for (let k = j * positions.size; k < (j + 1) * positions.size; k++) {\n coord.push(Number(positions.value[k]));\n }\n ringCoordinates.push(coord);\n }\n return ringCoordinates;\n}\n\n// Deduce geometry type of data object\nfunction parseType(data) {\n if (data.pathIndices) {\n return 'LineString';\n }\n\n if (data.polygonIndices) {\n return 'Polygon';\n }\n\n return 'Point';\n}\n"],"file":"binary-to-geojson.js"}
1
+ {"version":3,"sources":["../../../src/lib/binary-to-geojson.ts"],"names":["binaryToGeojson","data","options","globalFeatureId","undefined","getSingleFeature","parseFeatures","type","binaryToGeoJson","format","binaryToGeometry","Error","dataArray","normalizeInput","lastIndex","lastValue","featureIds","value","i","length","currValue","globalFeatureIds","parseFeature","parseFeatureCollection","startIndex","endIndex","pointToGeoJson","lineStringToGeoJson","polygonToGeoJson","unexpectedInput","isHeterogeneousType","Boolean","points","lines","polygons","parseType","features","push","geometry","properties","parseProperties","fields","parseFields","Object","assign","key","numericProps","Infinity","positions","polygonIndices","filter","x","primitivePolygonIndices","multi","coordinates","startRingIndex","endRingIndex","ringCoordinates","ringToGeoJson","startPolygonIndex","endPolygonIndex","polygonCoordinates","pathIndices","size","j","coord","Array","k","Number"],"mappings":"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","sourcesContent":["import type {\n BinaryGeometry,\n BinaryFeatures,\n BinaryGeometryType,\n BinaryPointFeatures,\n BinaryLineFeatures,\n BinaryPolygonFeatures,\n BinaryAttribute\n} from '@loaders.gl/schema';\nimport type {Feature, Geometry, Position, GeoJsonProperties} from '@loaders.gl/schema';\nimport type {\n Point,\n MultiPoint,\n LineString,\n MultiLineString,\n Polygon,\n MultiPolygon\n} from '@loaders.gl/schema';\n\n// Note:L We do not handle GeometryCollection, define a limited Geometry type that always has coordinates.\n// type FeatureGeometry = Point | MultiPoint | LineString | MultiLineString | Polygon | MultiPolygon;\n\ntype BinaryToGeoJsonOptions = {\n type?: BinaryGeometryType;\n globalFeatureId?: number;\n};\n\n/**\n * Convert binary geometry representation to GeoJSON\n * @param data geometry data in binary representation\n * @param options\n * @param options.type Input data type: Point, LineString, or Polygon\n * @param options.featureId Global feature id. If specified, only a single feature is extracted\n * @return GeoJSON objects\n */\nexport function binaryToGeojson(\n data: BinaryFeatures,\n options?: BinaryToGeoJsonOptions\n): Feature[] | Feature {\n const globalFeatureId = options?.globalFeatureId;\n if (globalFeatureId !== undefined) {\n return getSingleFeature(data, globalFeatureId);\n }\n return parseFeatures(data, options?.type);\n}\n\n/** @deprecated use `binaryToGeojson` or `binaryToGeometry` instead */\nexport function binaryToGeoJson(\n data: BinaryGeometry | BinaryFeatures,\n type?: BinaryGeometryType,\n format: 'feature' | 'geometry' = 'feature'\n): Geometry | Feature[] {\n switch (format) {\n case 'feature':\n return parseFeatures(data as BinaryFeatures, type);\n case 'geometry':\n return binaryToGeometry(data as BinaryGeometry);\n default:\n throw new Error(format);\n }\n}\n\n/**\n * Return a single feature from a binary geometry representation as GeoJSON\n * @param data geometry data in binary representation\n * @return GeoJSON feature\n */\nfunction getSingleFeature(data: BinaryFeatures, globalFeatureId: number): Feature {\n const dataArray = normalizeInput(data);\n for (const data of dataArray) {\n let lastIndex = 0;\n let lastValue = data.featureIds.value[0];\n\n // Scan through data until we find matching feature\n for (let i = 0; i < data.featureIds.value.length; i++) {\n const currValue = data.featureIds.value[i];\n if (currValue === lastValue) {\n // eslint-disable-next-line no-continue\n continue;\n }\n if (globalFeatureId === data.globalFeatureIds.value[lastIndex]) {\n return parseFeature(data, lastIndex, i);\n }\n lastIndex = i;\n lastValue = currValue;\n }\n\n if (globalFeatureId === data.globalFeatureIds.value[lastIndex]) {\n return parseFeature(data, lastIndex, data.featureIds.value.length);\n }\n }\n\n throw new Error(`featureId:${globalFeatureId} not found`);\n}\n\nfunction parseFeatures(data: BinaryFeatures, type?: BinaryGeometryType): Feature[] {\n const dataArray = normalizeInput(data, type);\n return parseFeatureCollection(dataArray);\n}\n\n/** Parse input binary data and return a valid GeoJSON geometry object */\nexport function binaryToGeometry(\n data: BinaryGeometry,\n startIndex?: number,\n endIndex?: number\n): Geometry {\n switch (data.type) {\n case 'Point':\n return pointToGeoJson(data, startIndex, endIndex);\n case 'LineString':\n return lineStringToGeoJson(data, startIndex, endIndex);\n case 'Polygon':\n return polygonToGeoJson(data, startIndex, endIndex);\n default:\n const unexpectedInput: never = data;\n throw new Error(`Unsupported geometry type: ${(unexpectedInput as any)?.type}`);\n }\n}\n\ntype BinaryFeature = BinaryPointFeatures | BinaryLineFeatures | BinaryPolygonFeatures;\ntype BinaryFeaturesArray = BinaryFeature[];\n\n// Normalize features\n// Return an array of data objects, each of which have a type key\nfunction normalizeInput(data: BinaryFeatures, type?: BinaryGeometryType): BinaryFeaturesArray {\n const isHeterogeneousType = Boolean(data.points || data.lines || data.polygons);\n\n if (!isHeterogeneousType) {\n // @ts-expect-error This is a legacy check which allowed `data` to be an instance of the values\n // here. Aka the new data.points, data.lines, or data.polygons.\n data.type = type || parseType(data);\n return [data] as BinaryFeaturesArray;\n }\n\n const features: BinaryFeaturesArray = [];\n if (data.points) {\n data.points.type = 'Point';\n features.push(data.points);\n }\n if (data.lines) {\n data.lines.type = 'LineString';\n features.push(data.lines);\n }\n if (data.polygons) {\n data.polygons.type = 'Polygon';\n features.push(data.polygons);\n }\n\n return features;\n}\n\n/** Parse input binary data and return an array of GeoJSON Features */\nfunction parseFeatureCollection(dataArray): Feature[] {\n const features: Feature[] = [];\n for (const data of dataArray) {\n if (data.featureIds.value.length === 0) {\n // eslint-disable-next-line no-continue\n continue;\n }\n let lastIndex = 0;\n let lastValue = data.featureIds.value[0];\n\n // Need to deduce start, end indices of each feature\n for (let i = 0; i < data.featureIds.value.length; i++) {\n const currValue = data.featureIds.value[i];\n if (currValue === lastValue) {\n // eslint-disable-next-line no-continue\n continue;\n }\n\n features.push(parseFeature(data, lastIndex, i));\n lastIndex = i;\n lastValue = currValue;\n }\n\n // Last feature\n features.push(parseFeature(data, lastIndex, data.featureIds.value.length));\n }\n return features;\n}\n\n/** Parse input binary data and return a single GeoJSON Feature */\nfunction parseFeature(data, startIndex?: number, endIndex?: number): Feature {\n const geometry = binaryToGeometry(data, startIndex, endIndex);\n const properties = parseProperties(data, startIndex, endIndex);\n const fields = parseFields(data, startIndex, endIndex);\n return {type: 'Feature', geometry, properties, ...fields};\n}\n\n/** Parse input binary data and return an object of fields */\nfunction parseFields(data, startIndex: number = 0, endIndex?: number): GeoJsonProperties {\n return data.fields && data.fields[data.featureIds.value[startIndex]];\n}\n\n/** Parse input binary data and return an object of properties */\nfunction parseProperties(data, startIndex: number = 0, endIndex?: number): GeoJsonProperties {\n const properties = Object.assign({}, data.properties[data.featureIds.value[startIndex]]);\n for (const key in data.numericProps) {\n properties[key] = data.numericProps[key].value[startIndex];\n }\n return properties;\n}\n\n/** Parse binary data of type Polygon */\nfunction polygonToGeoJson(\n data,\n startIndex: number = -Infinity,\n endIndex: number = Infinity\n): Polygon | MultiPolygon {\n const {positions} = data;\n const polygonIndices = data.polygonIndices.value.filter((x) => x >= startIndex && x <= endIndex);\n const primitivePolygonIndices = data.primitivePolygonIndices.value.filter(\n (x) => x >= startIndex && x <= endIndex\n );\n const multi = polygonIndices.length > 2;\n\n // Polygon\n if (!multi) {\n const coordinates: Position[][] = [];\n for (let i = 0; i < primitivePolygonIndices.length - 1; i++) {\n const startRingIndex = primitivePolygonIndices[i];\n const endRingIndex = primitivePolygonIndices[i + 1];\n const ringCoordinates = ringToGeoJson(positions, startRingIndex, endRingIndex);\n coordinates.push(ringCoordinates);\n }\n\n return {type: 'Polygon', coordinates};\n }\n\n // MultiPolygon\n const coordinates: Position[][][] = [];\n for (let i = 0; i < polygonIndices.length - 1; i++) {\n const startPolygonIndex = polygonIndices[i];\n const endPolygonIndex = polygonIndices[i + 1];\n const polygonCoordinates = polygonToGeoJson(\n data,\n startPolygonIndex,\n endPolygonIndex\n ).coordinates;\n coordinates.push(polygonCoordinates as Position[][]);\n }\n\n return {type: 'MultiPolygon', coordinates};\n}\n\n/** Parse binary data of type LineString */\nfunction lineStringToGeoJson(\n data,\n startIndex: number = -Infinity,\n endIndex: number = Infinity\n): LineString | MultiLineString {\n const {positions} = data;\n const pathIndices = data.pathIndices.value.filter((x) => x >= startIndex && x <= endIndex);\n const multi = pathIndices.length > 2;\n\n if (!multi) {\n const coordinates = ringToGeoJson(positions, pathIndices[0], pathIndices[1]);\n return {type: 'LineString', coordinates};\n }\n\n const coordinates: Position[][] = [];\n for (let i = 0; i < pathIndices.length - 1; i++) {\n const ringCoordinates = ringToGeoJson(positions, pathIndices[i], pathIndices[i + 1]);\n coordinates.push(ringCoordinates);\n }\n\n return {type: 'MultiLineString', coordinates};\n}\n\n/** Parse binary data of type Point */\nfunction pointToGeoJson(data, startIndex, endIndex): Point | MultiPoint {\n const {positions} = data;\n const coordinates = ringToGeoJson(positions, startIndex, endIndex);\n const multi = coordinates.length > 1;\n\n if (multi) {\n return {type: 'MultiPoint', coordinates};\n }\n\n return {type: 'Point', coordinates: coordinates[0]};\n}\n\n/**\n * Parse a linear ring of positions to a GeoJSON linear ring\n *\n * @param positions Positions TypedArray\n * @param startIndex Start index to include in ring\n * @param endIndex End index to include in ring\n * @returns GeoJSON ring\n */\nfunction ringToGeoJson(\n positions: BinaryAttribute,\n startIndex?: number,\n endIndex?: number\n): Position[] {\n startIndex = startIndex || 0;\n endIndex = endIndex || positions.value.length / positions.size;\n\n const ringCoordinates: Position[] = [];\n for (let j = startIndex; j < endIndex; j++) {\n const coord = Array<number>();\n for (let k = j * positions.size; k < (j + 1) * positions.size; k++) {\n coord.push(Number(positions.value[k]));\n }\n ringCoordinates.push(coord);\n }\n return ringCoordinates;\n}\n\n// Deduce geometry type of data object\nfunction parseType(data) {\n if (data.pathIndices) {\n return 'LineString';\n }\n\n if (data.polygonIndices) {\n return 'Polygon';\n }\n\n return 'Point';\n}\n"],"file":"binary-to-geojson.js"}