@loaders.gl/geopackage 3.4.0-alpha.2 → 3.4.0-alpha.4

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 +1 @@
1
- {"version":3,"file":"geopackage-loader.js","names":["VERSION","GeoPackageLoader","id","name","module","version","extensions","mimeTypes","category","parse","parseGeoPackage","options","geopackage","sqlJsCDN","DEFAULT_SQLJS_CDN","gis","format"],"sources":["../../src/geopackage-loader.ts"],"sourcesContent":["import type {LoaderWithParser, LoaderOptions} from '@loaders.gl/loader-utils';\nimport parseGeoPackage, {DEFAULT_SQLJS_CDN} from './lib/parse-geopackage';\n\n// __VERSION__ is injected by babel-plugin-version-inline\n// @ts-ignore TS2304: Cannot find name '__VERSION__'.\n// const VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'latest';\nconst VERSION = 'latest';\n\nexport type GeoPackageLoaderOptions = LoaderOptions & {\n geopackage?: {\n // Use null in Node\n sqlJsCDN: string | null;\n };\n gis?: {\n reproject?: boolean;\n _targetCrs?: string;\n format?: 'geojson' | 'tables';\n };\n};\n\n/** Geopackage loader */\nexport const GeoPackageLoader: LoaderWithParser = {\n id: 'geopackage',\n name: 'GeoPackage',\n module: 'geopackage',\n version: VERSION,\n extensions: ['gpkg'],\n mimeTypes: ['application/geopackage+sqlite3'],\n category: 'geometry',\n parse: parseGeoPackage,\n options: {\n geopackage: {\n sqlJsCDN: DEFAULT_SQLJS_CDN\n },\n gis: {\n format: 'tables'\n }\n }\n};\n"],"mappings":";;;;;;;AACA;AAA0E;AAAA;AAK1E,IAAMA,OAAO,GAAG,QAAQ;AAejB,IAAMC,gBAAkC,GAAG;EAChDC,EAAE,EAAE,YAAY;EAChBC,IAAI,EAAE,YAAY;EAClBC,MAAM,EAAE,YAAY;EACpBC,OAAO,EAAEL,OAAO;EAChBM,UAAU,EAAE,CAAC,MAAM,CAAC;EACpBC,SAAS,EAAE,CAAC,gCAAgC,CAAC;EAC7CC,QAAQ,EAAE,UAAU;EACpBC,KAAK,EAAEC,wBAAe;EACtBC,OAAO,EAAE;IACPC,UAAU,EAAE;MACVC,QAAQ,EAAEC;IACZ,CAAC;IACDC,GAAG,EAAE;MACHC,MAAM,EAAE;IACV;EACF;AACF,CAAC;AAAC"}
1
+ {"version":3,"file":"geopackage-loader.js","names":["_parseGeopackage","_interopRequireWildcard","require","_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","obj","__esModule","_typeof","default","cache","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","prototype","hasOwnProperty","call","desc","set","VERSION","GeoPackageLoader","id","name","module","version","extensions","mimeTypes","category","parse","parseGeoPackage","options","geopackage","sqlJsCDN","DEFAULT_SQLJS_CDN","gis","format","exports"],"sources":["../../src/geopackage-loader.ts"],"sourcesContent":["import type {LoaderWithParser, LoaderOptions} from '@loaders.gl/loader-utils';\nimport parseGeoPackage, {DEFAULT_SQLJS_CDN} from './lib/parse-geopackage';\n\n// __VERSION__ is injected by babel-plugin-version-inline\n// @ts-ignore TS2304: Cannot find name '__VERSION__'.\n// const VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'latest';\nconst VERSION = 'latest';\n\nexport type GeoPackageLoaderOptions = LoaderOptions & {\n geopackage?: {\n // Use null in Node\n sqlJsCDN: string | null;\n };\n gis?: {\n reproject?: boolean;\n _targetCrs?: string;\n format?: 'geojson' | 'tables';\n };\n};\n\n/** Geopackage loader */\nexport const GeoPackageLoader: LoaderWithParser = {\n id: 'geopackage',\n name: 'GeoPackage',\n module: 'geopackage',\n version: VERSION,\n extensions: ['gpkg'],\n mimeTypes: ['application/geopackage+sqlite3'],\n category: 'geometry',\n parse: parseGeoPackage,\n options: {\n geopackage: {\n sqlJsCDN: DEFAULT_SQLJS_CDN\n },\n gis: {\n format: 'tables'\n }\n }\n};\n"],"mappings":";;;;;;;AACA,IAAAA,gBAAA,GAAAC,uBAAA,CAAAC,OAAA;AAA0E,SAAAC,yBAAAC,WAAA,eAAAC,OAAA,kCAAAC,iBAAA,OAAAD,OAAA,QAAAE,gBAAA,OAAAF,OAAA,YAAAF,wBAAA,YAAAA,yBAAAC,WAAA,WAAAA,WAAA,GAAAG,gBAAA,GAAAD,iBAAA,KAAAF,WAAA;AAAA,SAAAH,wBAAAO,GAAA,EAAAJ,WAAA,SAAAA,WAAA,IAAAI,GAAA,IAAAA,GAAA,CAAAC,UAAA,WAAAD,GAAA,QAAAA,GAAA,aAAAE,OAAA,CAAAF,GAAA,yBAAAA,GAAA,4BAAAG,OAAA,EAAAH,GAAA,UAAAI,KAAA,GAAAT,wBAAA,CAAAC,WAAA,OAAAQ,KAAA,IAAAA,KAAA,CAAAC,GAAA,CAAAL,GAAA,YAAAI,KAAA,CAAAE,GAAA,CAAAN,GAAA,SAAAO,MAAA,WAAAC,qBAAA,GAAAC,MAAA,CAAAC,cAAA,IAAAD,MAAA,CAAAE,wBAAA,WAAAC,GAAA,IAAAZ,GAAA,QAAAY,GAAA,kBAAAH,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAf,GAAA,EAAAY,GAAA,SAAAI,IAAA,GAAAR,qBAAA,GAAAC,MAAA,CAAAE,wBAAA,CAAAX,GAAA,EAAAY,GAAA,cAAAI,IAAA,KAAAA,IAAA,CAAAV,GAAA,IAAAU,IAAA,CAAAC,GAAA,KAAAR,MAAA,CAAAC,cAAA,CAAAH,MAAA,EAAAK,GAAA,EAAAI,IAAA,YAAAT,MAAA,CAAAK,GAAA,IAAAZ,GAAA,CAAAY,GAAA,SAAAL,MAAA,CAAAJ,OAAA,GAAAH,GAAA,MAAAI,KAAA,IAAAA,KAAA,CAAAa,GAAA,CAAAjB,GAAA,EAAAO,MAAA,YAAAA,MAAA;AAK1E,IAAMW,OAAO,GAAG,QAAQ;AAejB,IAAMC,gBAAkC,GAAG;EAChDC,EAAE,EAAE,YAAY;EAChBC,IAAI,EAAE,YAAY;EAClBC,MAAM,EAAE,YAAY;EACpBC,OAAO,EAAEL,OAAO;EAChBM,UAAU,EAAE,CAAC,MAAM,CAAC;EACpBC,SAAS,EAAE,CAAC,gCAAgC,CAAC;EAC7CC,QAAQ,EAAE,UAAU;EACpBC,KAAK,EAAEC,wBAAe;EACtBC,OAAO,EAAE;IACPC,UAAU,EAAE;MACVC,QAAQ,EAAEC;IACZ,CAAC;IACDC,GAAG,EAAE;MACHC,MAAM,EAAE;IACV;EACF;AACF,CAAC;AAACC,OAAA,CAAAhB,gBAAA,GAAAA,gBAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../src/index.ts"],"sourcesContent":["export {GeoPackageLoader} from './geopackage-loader';\n"],"mappings":";;;;;;;;;;;AAAA"}
1
+ {"version":3,"file":"index.js","names":["_geopackageLoader","require"],"sources":["../../src/index.ts"],"sourcesContent":["export {GeoPackageLoader} from './geopackage-loader';\n"],"mappings":";;;;;;;;;;;AAAA,IAAAA,iBAAA,GAAAC,OAAA"}
@@ -16,9 +16,8 @@ var _gis = require("@loaders.gl/gis");
16
16
  var _proj = require("@math.gl/proj4");
17
17
  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; } } }; }
18
18
  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); }
19
- 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; }
19
+ 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; }
20
20
  var DEFAULT_SQLJS_CDN = 'https://cdnjs.cloudflare.com/ajax/libs/sql.js/1.5.0/';
21
-
22
21
  exports.DEFAULT_SQLJS_CDN = DEFAULT_SQLJS_CDN;
23
22
  var ENVELOPE_BYTE_LENGTHS = {
24
23
  0: 0,
@@ -30,7 +29,6 @@ var ENVELOPE_BYTE_LENGTHS = {
30
29
  6: 0,
31
30
  7: 0
32
31
  };
33
-
34
32
  var SQL_TYPE_MAPPING = {
35
33
  BOOLEAN: _schema.Bool,
36
34
  TINYINT: _schema.Int8,
@@ -61,50 +59,48 @@ function _parseGeoPackage() {
61
59
  _parseGeoPackage = (0, _asyncToGenerator2.default)(_regenerator.default.mark(function _callee(arrayBuffer, options) {
62
60
  var _ref2, _ref2$sqlJsCDN, sqlJsCDN, _ref3, _ref3$reproject, reproject, _ref3$_targetCrs, _targetCrs, _ref3$format, format, db, tables, projections, outputTables, _iterator3, _step3, table, tableName;
63
61
  return _regenerator.default.wrap(function _callee$(_context) {
64
- while (1) {
65
- switch (_context.prev = _context.next) {
66
- case 0:
67
- _ref2 = (options === null || options === void 0 ? void 0 : options.geopackage) || {}, _ref2$sqlJsCDN = _ref2.sqlJsCDN, sqlJsCDN = _ref2$sqlJsCDN === void 0 ? DEFAULT_SQLJS_CDN : _ref2$sqlJsCDN;
68
- _ref3 = (options === null || options === void 0 ? void 0 : options.gis) || {}, _ref3$reproject = _ref3.reproject, reproject = _ref3$reproject === void 0 ? false : _ref3$reproject, _ref3$_targetCrs = _ref3._targetCrs, _targetCrs = _ref3$_targetCrs === void 0 ? 'WGS84' : _ref3$_targetCrs, _ref3$format = _ref3.format, format = _ref3$format === void 0 ? 'tables' : _ref3$format;
69
- _context.next = 4;
70
- return loadDatabase(arrayBuffer, sqlJsCDN);
71
- case 4:
72
- db = _context.sent;
73
- tables = listVectorTables(db);
74
- projections = getProjections(db);
75
- outputTables = {
76
- shape: 'tables',
77
- tables: []
78
- };
79
- _iterator3 = _createForOfIteratorHelper(tables);
80
- try {
81
- for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
82
- table = _step3.value;
83
- tableName = table.table_name;
84
- outputTables.tables.push({
85
- name: tableName,
86
- table: getVectorTable(db, tableName, projections, {
87
- reproject: reproject,
88
- _targetCrs: _targetCrs
89
- })
90
- });
91
- }
92
- } catch (err) {
93
- _iterator3.e(err);
94
- } finally {
95
- _iterator3.f();
62
+ while (1) switch (_context.prev = _context.next) {
63
+ case 0:
64
+ _ref2 = (options === null || options === void 0 ? void 0 : options.geopackage) || {}, _ref2$sqlJsCDN = _ref2.sqlJsCDN, sqlJsCDN = _ref2$sqlJsCDN === void 0 ? DEFAULT_SQLJS_CDN : _ref2$sqlJsCDN;
65
+ _ref3 = (options === null || options === void 0 ? void 0 : options.gis) || {}, _ref3$reproject = _ref3.reproject, reproject = _ref3$reproject === void 0 ? false : _ref3$reproject, _ref3$_targetCrs = _ref3._targetCrs, _targetCrs = _ref3$_targetCrs === void 0 ? 'WGS84' : _ref3$_targetCrs, _ref3$format = _ref3.format, format = _ref3$format === void 0 ? 'tables' : _ref3$format;
66
+ _context.next = 4;
67
+ return loadDatabase(arrayBuffer, sqlJsCDN);
68
+ case 4:
69
+ db = _context.sent;
70
+ tables = listVectorTables(db);
71
+ projections = getProjections(db);
72
+ outputTables = {
73
+ shape: 'tables',
74
+ tables: []
75
+ };
76
+ _iterator3 = _createForOfIteratorHelper(tables);
77
+ try {
78
+ for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
79
+ table = _step3.value;
80
+ tableName = table.table_name;
81
+ outputTables.tables.push({
82
+ name: tableName,
83
+ table: getVectorTable(db, tableName, projections, {
84
+ reproject: reproject,
85
+ _targetCrs: _targetCrs
86
+ })
87
+ });
96
88
  }
97
- if (!(format === 'geojson')) {
98
- _context.next = 12;
99
- break;
100
- }
101
- return _context.abrupt("return", formatTablesAsGeojson(outputTables));
102
- case 12:
103
- return _context.abrupt("return", outputTables);
104
- case 13:
105
- case "end":
106
- return _context.stop();
107
- }
89
+ } catch (err) {
90
+ _iterator3.e(err);
91
+ } finally {
92
+ _iterator3.f();
93
+ }
94
+ if (!(format === 'geojson')) {
95
+ _context.next = 12;
96
+ break;
97
+ }
98
+ return _context.abrupt("return", formatTablesAsGeojson(outputTables));
99
+ case 12:
100
+ return _context.abrupt("return", outputTables);
101
+ case 13:
102
+ case "end":
103
+ return _context.stop();
108
104
  }
109
105
  }, _callee);
110
106
  }));
@@ -117,41 +113,38 @@ function _loadDatabase() {
117
113
  _loadDatabase = (0, _asyncToGenerator2.default)(_regenerator.default.mark(function _callee2(arrayBuffer, sqlJsCDN) {
118
114
  var SQL;
119
115
  return _regenerator.default.wrap(function _callee2$(_context2) {
120
- while (1) {
121
- switch (_context2.prev = _context2.next) {
122
- case 0:
123
- if (!sqlJsCDN) {
124
- _context2.next = 6;
125
- break;
126
- }
127
- _context2.next = 3;
128
- return (0, _sql.default)({
129
- locateFile: function locateFile(file) {
130
- return "".concat(sqlJsCDN).concat(file);
131
- }
132
- });
133
- case 3:
134
- SQL = _context2.sent;
135
- _context2.next = 9;
116
+ while (1) switch (_context2.prev = _context2.next) {
117
+ case 0:
118
+ if (!sqlJsCDN) {
119
+ _context2.next = 6;
136
120
  break;
137
- case 6:
138
- _context2.next = 8;
139
- return (0, _sql.default)();
140
- case 8:
141
- SQL = _context2.sent;
142
- case 9:
143
- return _context2.abrupt("return", new SQL.Database(new Uint8Array(arrayBuffer)));
144
- case 10:
145
- case "end":
146
- return _context2.stop();
147
- }
121
+ }
122
+ _context2.next = 3;
123
+ return (0, _sql.default)({
124
+ locateFile: function locateFile(file) {
125
+ return "".concat(sqlJsCDN).concat(file);
126
+ }
127
+ });
128
+ case 3:
129
+ SQL = _context2.sent;
130
+ _context2.next = 9;
131
+ break;
132
+ case 6:
133
+ _context2.next = 8;
134
+ return (0, _sql.default)();
135
+ case 8:
136
+ SQL = _context2.sent;
137
+ case 9:
138
+ return _context2.abrupt("return", new SQL.Database(new Uint8Array(arrayBuffer)));
139
+ case 10:
140
+ case "end":
141
+ return _context2.stop();
148
142
  }
149
143
  }, _callee2);
150
144
  }));
151
145
  return _loadDatabase.apply(this, arguments);
152
146
  }
153
147
  function listVectorTables(db) {
154
-
155
148
  var stmt = db.prepare("SELECT * FROM gpkg_contents WHERE data_type='features';");
156
149
  var vectorTablesInfo = [];
157
150
  while (stmt.step()) {
@@ -160,14 +153,12 @@ function listVectorTables(db) {
160
153
  }
161
154
  return vectorTablesInfo;
162
155
  }
163
-
164
156
  function getVectorTable(db, tableName, projections, _ref) {
165
157
  var reproject = _ref.reproject,
166
158
  _targetCrs = _ref._targetCrs;
167
159
  var dataColumns = getDataColumns(db, tableName);
168
160
  var geomColumn = getGeometryColumn(db, tableName);
169
161
  var featureIdColumn = getFeatureIdName(db, tableName);
170
-
171
162
  var _db$exec$ = db.exec("SELECT * FROM `".concat(tableName, "`;"))[0],
172
163
  columns = _db$exec$.columns,
173
164
  values = _db$exec$.values;
@@ -185,8 +176,7 @@ function getVectorTable(db, tableName, projections, _ref) {
185
176
  try {
186
177
  for (_iterator.s(); !(_step = _iterator.n()).done;) {
187
178
  var row = _step.value;
188
- var geojsonFeature = constructGeoJsonFeature(columns, row, geomColumn,
189
- dataColumns, featureIdColumn);
179
+ var geojsonFeature = constructGeoJsonFeature(columns, row, geomColumn, dataColumns, featureIdColumn);
190
180
  geojsonFeatures.push(geojsonFeature);
191
181
  }
192
182
  } catch (err) {
@@ -208,7 +198,6 @@ function getVectorTable(db, tableName, projections, _ref) {
208
198
  shape: 'object-row-table'
209
199
  };
210
200
  }
211
-
212
201
  function getProjections(db) {
213
202
  var stmt = db.prepare('SELECT * FROM gpkg_spatial_ref_sys;');
214
203
  var projectionMapping = {};
@@ -220,11 +209,9 @@ function getProjections(db) {
220
209
  }
221
210
  return projectionMapping;
222
211
  }
223
-
224
212
  function constructGeoJsonFeature(columns, row, geomColumn, dataColumns, featureIdColumn) {
225
213
  var idIdx = columns.indexOf(featureIdColumn);
226
214
  var id = row[idIdx];
227
-
228
215
  var geomColumnIdx = columns.indexOf(geomColumn.column_name);
229
216
  var geometry = parseGeometry(row[geomColumnIdx].buffer);
230
217
  var properties = {};
@@ -252,13 +239,10 @@ function constructGeoJsonFeature(columns, row, geomColumn, dataColumns, featureI
252
239
  properties: properties
253
240
  };
254
241
  }
255
-
256
242
  function getGeopackageVersion(db) {
257
243
  var textDecoder = new TextDecoder();
258
-
259
244
  var applicationIdQuery = db.exec('PRAGMA application_id;')[0];
260
245
  var applicationId = applicationIdQuery.values[0][0];
261
-
262
246
  var buffer = new ArrayBuffer(4);
263
247
  var view = new DataView(buffer);
264
248
  view.setInt32(0, Number(applicationId));
@@ -269,15 +253,13 @@ function getGeopackageVersion(db) {
269
253
  if (versionString === 'GP11') {
270
254
  return '1.1';
271
255
  }
272
-
273
256
  var userVersionQuery = db.exec('PRAGMA user_version;')[0];
274
257
  var userVersionInt = userVersionQuery.values[0][0];
275
- if (userVersionInt && userVersionInt < 10300) {
258
+ if (userVersionInt && typeof userVersionInt === 'number' && userVersionInt < 10300) {
276
259
  return '1.2';
277
260
  }
278
261
  return null;
279
262
  }
280
-
281
263
  function getFeatureIdName(db, tableName) {
282
264
  var stmt = db.prepare("PRAGMA table_info(`".concat(tableName, "`)"));
283
265
  while (stmt.step()) {
@@ -288,29 +270,22 @@ function getFeatureIdName(db, tableName) {
288
270
  return name;
289
271
  }
290
272
  }
291
-
292
273
  return null;
293
274
  }
294
-
295
275
  function parseGeometry(arrayBuffer) {
296
276
  var view = new DataView(arrayBuffer);
297
277
  var _parseGeometryBitFlag = parseGeometryBitFlags(view.getUint8(3)),
298
278
  envelopeLength = _parseGeometryBitFlag.envelopeLength,
299
279
  emptyGeometry = _parseGeometryBitFlag.emptyGeometry;
300
-
301
280
  if (emptyGeometry) {
302
281
  return null;
303
282
  }
304
-
305
283
  var wkbOffset = 8 + envelopeLength;
306
-
307
284
  var binaryGeometry = _wkt.WKBLoader.parseSync(arrayBuffer.slice(wkbOffset));
308
285
  return (0, _gis.binaryToGeometry)(binaryGeometry);
309
286
  }
310
-
311
287
  function parseGeometryBitFlags(byte) {
312
288
  var envelopeValue = (byte & 14) / 2;
313
-
314
289
  var envelopeLength = ENVELOPE_BYTE_LENGTHS[envelopeValue];
315
290
  return {
316
291
  littleEndian: Boolean(byte & 1),
@@ -319,18 +294,15 @@ function parseGeometryBitFlags(byte) {
319
294
  extendedGeometryType: Boolean(byte & 32)
320
295
  };
321
296
  }
322
-
323
297
  function getGeometryColumn(db, tableName) {
324
298
  var stmt = db.prepare('SELECT * FROM gpkg_geometry_columns WHERE table_name=:tableName;');
325
299
  stmt.bind({
326
300
  ':tableName': tableName
327
301
  });
328
-
329
302
  stmt.step();
330
303
  var geometryColumn = stmt.getAsObject();
331
304
  return geometryColumn;
332
305
  }
333
-
334
306
  function getDataColumns(db, tableName) {
335
307
  var stmt;
336
308
  try {
@@ -344,7 +316,6 @@ function getDataColumns(db, tableName) {
344
316
  stmt.bind({
345
317
  ':tableName': tableName
346
318
  });
347
-
348
319
  var result = {};
349
320
  while (stmt.step()) {
350
321
  var column = stmt.getAsObject();
@@ -354,7 +325,6 @@ function getDataColumns(db, tableName) {
354
325
  }
355
326
  return result;
356
327
  }
357
-
358
328
  function getArrowSchema(db, tableName) {
359
329
  var stmt = db.prepare("PRAGMA table_info(`".concat(tableName, "`)"));
360
330
  var fields = [];
@@ -1 +1 @@
1
- {"version":3,"file":"parse-geopackage.js","names":["DEFAULT_SQLJS_CDN","ENVELOPE_BYTE_LENGTHS","SQL_TYPE_MAPPING","BOOLEAN","Bool","TINYINT","Int8","SMALLINT","Int16","MEDIUMINT","Int32","INT","INTEGER","FLOAT","Float32","DOUBLE","Float64","REAL","TEXT","Utf8","BLOB","Binary","DATE","DATETIME","GEOMETRY","POINT","LINESTRING","POLYGON","MULTIPOINT","MULTILINESTRING","MULTIPOLYGON","GEOMETRYCOLLECTION","parseGeoPackage","arrayBuffer","options","geopackage","sqlJsCDN","gis","reproject","_targetCrs","format","loadDatabase","db","tables","listVectorTables","projections","getProjections","outputTables","shape","table","tableName","table_name","push","name","getVectorTable","formatTablesAsGeojson","initSqlJs","locateFile","file","SQL","Database","Uint8Array","stmt","prepare","vectorTablesInfo","step","vectorTableInfo","getAsObject","dataColumns","getDataColumns","geomColumn","getGeometryColumn","featureIdColumn","getFeatureIdName","exec","columns","values","projection","geomColumnProjStr","srs_id","Proj4Projection","from","to","geojsonFeatures","row","geojsonFeature","constructGeoJsonFeature","schema","getArrowSchema","data","transformGeoJsonCoords","project","projectionMapping","srsInfo","definition","idIdx","indexOf","id","geomColumnIdx","column_name","geometry","parseGeometry","buffer","properties","Object","entries","key","value","idx","i","length","columnName","type","getGeopackageVersion","textDecoder","TextDecoder","applicationIdQuery","applicationId","ArrayBuffer","view","DataView","setInt32","Number","versionString","decode","userVersionQuery","userVersionInt","pragmaTableInfo","pk","parseGeometryBitFlags","getUint8","envelopeLength","emptyGeometry","wkbOffset","binaryGeometry","WKBLoader","parseSync","slice","binaryToGeometry","byte","envelopeValue","littleEndian","Boolean","extendedGeometryType","bind","geometryColumn","error","message","includes","result","column","fields","notnull","schemaType","field","Field","Schema","geojsonMap"],"sources":["../../../src/lib/parse-geopackage.ts"],"sourcesContent":["/* eslint-disable camelcase, @typescript-eslint/no-use-before-define */\nimport type {GeoPackageLoaderOptions} from '../geopackage-loader';\nimport initSqlJs, {SqlJsStatic, Database, Statement} from 'sql.js';\nimport {WKBLoader} from '@loaders.gl/wkt';\nimport {\n Schema,\n Field,\n Geometry,\n DataType,\n Bool,\n Utf8,\n Float64,\n Int32,\n Int8,\n Int16,\n Float32,\n Binary,\n Tables,\n ObjectRowTable,\n Feature\n} from '@loaders.gl/schema';\nimport {binaryToGeometry, transformGeoJsonCoords} from '@loaders.gl/gis';\nimport {Proj4Projection} from '@math.gl/proj4';\nimport {\n GeometryColumnsRow,\n ContentsRow,\n SpatialRefSysRow,\n ProjectionMapping,\n GeometryBitFlags,\n DataColumnsRow,\n DataColumnsMapping,\n PragmaTableInfoRow,\n SQLiteTypes,\n GeoPackageGeometryTypes\n} from './types';\n\n// We pin to the same version as sql.js that we use.\n// As of March 2022, versions 1.6.0, 1.6.1, and 1.6.2 of sql.js appeared not to work.\nexport const DEFAULT_SQLJS_CDN = 'https://cdnjs.cloudflare.com/ajax/libs/sql.js/1.5.0/';\n\n// https://www.geopackage.org/spec121/#flags_layout\nconst ENVELOPE_BYTE_LENGTHS = {\n 0: 0,\n 1: 32,\n 2: 48,\n 3: 48,\n 4: 64,\n // values 5-7 are invalid and _should_ never show up\n 5: 0,\n 6: 0,\n 7: 0\n};\n\n// Documentation: https://www.geopackage.org/spec130/index.html#table_column_data_types\nconst SQL_TYPE_MAPPING: {[type in SQLiteTypes | GeoPackageGeometryTypes]: typeof DataType} = {\n BOOLEAN: Bool,\n TINYINT: Int8,\n SMALLINT: Int16,\n MEDIUMINT: Int32,\n INT: Int32,\n INTEGER: Int32,\n FLOAT: Float32,\n DOUBLE: Float64,\n REAL: Float64,\n TEXT: Utf8,\n BLOB: Binary,\n DATE: Utf8,\n DATETIME: Utf8,\n GEOMETRY: Binary,\n POINT: Binary,\n LINESTRING: Binary,\n POLYGON: Binary,\n MULTIPOINT: Binary,\n MULTILINESTRING: Binary,\n MULTIPOLYGON: Binary,\n GEOMETRYCOLLECTION: Binary\n};\n\nexport default async function parseGeoPackage(\n arrayBuffer: ArrayBuffer,\n options?: GeoPackageLoaderOptions\n): Promise<Tables<ObjectRowTable> | Record<string, Feature[]>> {\n const {sqlJsCDN = DEFAULT_SQLJS_CDN} = options?.geopackage || {};\n const {reproject = false, _targetCrs = 'WGS84', format = 'tables'} = options?.gis || {};\n\n const db = await loadDatabase(arrayBuffer, sqlJsCDN);\n const tables = listVectorTables(db);\n const projections = getProjections(db);\n\n // Mapping from tableName to geojson feature collection\n const outputTables: Tables<ObjectRowTable> = {\n shape: 'tables',\n tables: []\n };\n\n for (const table of tables) {\n const {table_name: tableName} = table;\n outputTables.tables.push({\n name: tableName,\n table: getVectorTable(db, tableName, projections, {\n reproject,\n _targetCrs\n })\n });\n }\n\n if (format === 'geojson') {\n return formatTablesAsGeojson(outputTables);\n }\n\n return outputTables;\n}\n\n/**\n * Initialize SQL.js and create database\n *\n * @param arrayBuffer input bytes\n * @return SQL.js database object\n */\nasync function loadDatabase(arrayBuffer: ArrayBuffer, sqlJsCDN: string | null): Promise<Database> {\n // In Node, `locateFile` must not be passed\n let SQL: SqlJsStatic;\n if (sqlJsCDN) {\n SQL = await initSqlJs({\n locateFile: (file) => `${sqlJsCDN}${file}`\n });\n } else {\n SQL = await initSqlJs();\n }\n return new SQL.Database(new Uint8Array(arrayBuffer));\n}\n\n/**\n * Find all vector tables in GeoPackage\n * This queries the `gpkg_contents` table to find a list of vector tables\n *\n * @param db GeoPackage to query\n * @return list of table references\n */\nfunction listVectorTables(db: Database): ContentsRow[] {\n // The gpkg_contents table can have at least three categorical values for\n // data_type.\n // - 'features' refers to a vector geometry table\n // (https://www.geopackage.org/spec121/#_contents_2)\n // - 'tiles' refers to a raster table\n // (https://www.geopackage.org/spec121/#_contents_3)\n // - 'attributes' refers to a data table with no geometry\n // (https://www.geopackage.org/spec121/#_contents_4).\n\n // We hard code 'features' because for now we don't support raster data or pure attribute data\n // eslint-disable-next-line quotes\n const stmt = db.prepare(\"SELECT * FROM gpkg_contents WHERE data_type='features';\");\n\n const vectorTablesInfo: ContentsRow[] = [];\n while (stmt.step()) {\n const vectorTableInfo = stmt.getAsObject() as unknown as ContentsRow;\n vectorTablesInfo.push(vectorTableInfo);\n }\n\n return vectorTablesInfo;\n}\n\n/**\n * Load geometries from vector table\n *\n * @param db GeoPackage object\n * @param tableName name of vector table to query\n * @param projections keys are srs_id values, values are WKT strings\n * @returns Array of GeoJSON Feature objects\n */\nfunction getVectorTable(\n db: Database,\n tableName: string,\n projections: ProjectionMapping,\n {reproject, _targetCrs}: {reproject: boolean; _targetCrs: string}\n): ObjectRowTable {\n const dataColumns = getDataColumns(db, tableName);\n const geomColumn = getGeometryColumn(db, tableName);\n const featureIdColumn = getFeatureIdName(db, tableName);\n\n // Get vector features from table\n // Don't think it's possible to parameterize the table name in SQLite?\n const {columns, values} = db.exec(`SELECT * FROM \\`${tableName}\\`;`)[0];\n\n let projection;\n if (reproject) {\n const geomColumnProjStr = projections[geomColumn.srs_id];\n projection = new Proj4Projection({\n from: geomColumnProjStr,\n to: _targetCrs\n });\n }\n\n const geojsonFeatures: object[] = [];\n for (const row of values) {\n const geojsonFeature = constructGeoJsonFeature(\n columns,\n row,\n geomColumn,\n // @ts-ignore\n dataColumns,\n featureIdColumn\n );\n geojsonFeatures.push(geojsonFeature);\n }\n\n const schema = getArrowSchema(db, tableName);\n if (projection) {\n return {\n data: transformGeoJsonCoords(geojsonFeatures, projection.project),\n schema,\n shape: 'object-row-table'\n };\n }\n\n return {data: geojsonFeatures, schema, shape: 'object-row-table'};\n}\n\n/**\n * Find all projections defined in GeoPackage\n * This queries the gpkg_spatial_ref_sys table\n * @param db GeoPackage object\n * @returns mapping from srid to WKT projection string\n */\nfunction getProjections(db: Database): ProjectionMapping {\n // Query gpkg_spatial_ref_sys to get srid: srtext mappings\n const stmt = db.prepare('SELECT * FROM gpkg_spatial_ref_sys;');\n\n const projectionMapping: ProjectionMapping = {};\n while (stmt.step()) {\n const srsInfo = stmt.getAsObject() as unknown as SpatialRefSysRow;\n const {srs_id, definition} = srsInfo;\n projectionMapping[srs_id] = definition;\n }\n\n return projectionMapping;\n}\n\n/**\n * Construct single GeoJSON feature given row's data\n * @param columns array of ordered column identifiers\n * @param row array of ordered values representing row's data\n * @param geomColumn geometry column metadata\n * @param dataColumns mapping from table column names to property name\n * @returns GeoJSON Feature object\n */\nfunction constructGeoJsonFeature(\n columns: string[],\n row: any[],\n geomColumn: GeometryColumnsRow,\n dataColumns: DataColumnsMapping,\n featureIdColumn: string\n): Feature<Geometry | null> {\n // Find feature id\n const idIdx = columns.indexOf(featureIdColumn);\n const id = row[idIdx];\n\n // Parse geometry columns to geojson\n const geomColumnIdx = columns.indexOf(geomColumn.column_name);\n const geometry = parseGeometry(row[geomColumnIdx].buffer);\n\n const properties = {};\n if (dataColumns) {\n for (const [key, value] of Object.entries(dataColumns)) {\n const idx = columns.indexOf(key);\n // @ts-ignore TODO - Check what happens if null?\n properties[value] = row[idx];\n }\n } else {\n // Put all columns except for the feature id and geometry in properties\n for (let i = 0; i < columns.length; i++) {\n if (i === idIdx || i === geomColumnIdx) {\n // eslint-disable-next-line no-continue\n continue;\n }\n\n const columnName = columns[i];\n properties[columnName] = row[i];\n }\n }\n\n return {\n id,\n type: 'Feature',\n geometry,\n properties\n };\n}\n\n/**\n * Get GeoPackage version from database\n * @param db database\n * @returns version string. One of '1.0', '1.1', '1.2'\n */\n\n// @ts-ignore\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nfunction getGeopackageVersion(db: Database): string | null {\n const textDecoder = new TextDecoder();\n\n // Read application id from SQLite metadata\n const applicationIdQuery = db.exec('PRAGMA application_id;')[0];\n const applicationId = applicationIdQuery.values[0][0];\n\n // Convert 4-byte signed int32 application id to text\n const buffer = new ArrayBuffer(4);\n const view = new DataView(buffer);\n view.setInt32(0, Number(applicationId));\n const versionString = textDecoder.decode(buffer);\n\n if (versionString === 'GP10') {\n return '1.0';\n }\n\n if (versionString === 'GP11') {\n return '1.1';\n }\n\n // If versionString is GPKG, then read user_version\n const userVersionQuery = db.exec('PRAGMA user_version;')[0];\n const userVersionInt = userVersionQuery.values[0][0];\n\n if (userVersionInt && userVersionInt < 10300) {\n return '1.2';\n }\n\n return null;\n}\n\n/**\n * Find name of feature id column in table\n * The feature ID is the primary key of the table.\n * http://www.geopackage.org/spec121/#feature_user_tables\n *\n * @param db database\n * @param tableName name of table\n * @return name of feature id column\n */\nfunction getFeatureIdName(db: Database, tableName: string): string | null {\n // Again, not possible to parameterize table name?\n const stmt = db.prepare(`PRAGMA table_info(\\`${tableName}\\`)`);\n\n while (stmt.step()) {\n const pragmaTableInfo = stmt.getAsObject() as unknown as PragmaTableInfoRow;\n const {name, pk} = pragmaTableInfo;\n if (pk) {\n return name;\n }\n }\n\n // Is it guaranteed for there always to be at least one primary key column in the table?\n return null;\n}\n\n/**\n * Parse geometry buffer\n * GeoPackage vector geometries are slightly extended past the WKB standard\n * See: https://www.geopackage.org/spec121/#gpb_format\n *\n * @param arrayBuffer geometry buffer\n * @return GeoJSON geometry (in original CRS)\n */\nfunction parseGeometry(arrayBuffer: ArrayBuffer): Geometry | null {\n const view = new DataView(arrayBuffer);\n const {envelopeLength, emptyGeometry} = parseGeometryBitFlags(view.getUint8(3));\n\n // A Feature object has a member with the name \"geometry\". The value of the\n // geometry member SHALL be either a Geometry object as defined above or, in\n // the case that the Feature is unlocated, a JSON null value.\n /** @see https://tools.ietf.org/html/rfc7946#section-3.2 */\n if (emptyGeometry) {\n return null;\n }\n\n // Do I need to find the srid here? Is it necessarily the same for every\n // geometry in a table?\n // const srid = view.getInt32(4, littleEndian);\n\n // 2 byte magic, 1 byte version, 1 byte flags, 4 byte int32 srid\n const wkbOffset = 8 + envelopeLength;\n\n // Loaders should not depend on `core` and the context passed to the main loader doesn't include a\n // `parseSync` option, so instead we call parseSync directly on WKBLoader\n const binaryGeometry = WKBLoader.parseSync(arrayBuffer.slice(wkbOffset));\n\n return binaryToGeometry(binaryGeometry);\n}\n\n/**\n * Parse geometry header flags\n * https://www.geopackage.org/spec121/#flags_layout\n *\n * @param byte uint8 number representing flags\n * @return object representing information from bit flags\n */\nfunction parseGeometryBitFlags(byte: number): GeometryBitFlags {\n // Are header values little endian?\n const envelopeValue = (byte & 0b00001110) / 2;\n\n // TODO: Not sure the best way to handle this. Throw an error if envelopeValue outside 0-7?\n const envelopeLength = ENVELOPE_BYTE_LENGTHS[envelopeValue] as number;\n\n return {\n littleEndian: Boolean(byte & 0b00000001),\n envelopeLength,\n emptyGeometry: Boolean(byte & 0b00010000),\n extendedGeometryType: Boolean(byte & 0b00100000)\n };\n}\n\n/**\n * Find geometry column in given vector table\n *\n * @param db GeoPackage object\n * @param tableName Name of vector table\n * @returns Array of geometry column definitions\n */\nfunction getGeometryColumn(db: Database, tableName: string): GeometryColumnsRow {\n const stmt = db.prepare('SELECT * FROM gpkg_geometry_columns WHERE table_name=:tableName;');\n stmt.bind({':tableName': tableName});\n\n // > Requirement 30\n // > A feature table SHALL have only one geometry column.\n // https://www.geopackage.org/spec121/#feature_user_tables\n // So we should need one and only one step, given that we use the WHERE clause in the SQL query\n // above\n stmt.step();\n const geometryColumn = stmt.getAsObject() as unknown as GeometryColumnsRow;\n return geometryColumn;\n}\n\n/**\n * Find property columns in given vector table\n * @param db GeoPackage object\n * @param tableName Name of vector table\n * @returns Mapping from table column names to property name\n */\nfunction getDataColumns(db: Database, tableName: string): DataColumnsMapping | null {\n // gpkg_data_columns is not required to exist\n // https://www.geopackage.org/spec121/#extension_schema\n let stmt: Statement;\n try {\n stmt = db.prepare('SELECT * FROM gpkg_data_columns WHERE table_name=:tableName;');\n } catch (error) {\n if ((error as Error).message.includes('no such table')) {\n return null;\n }\n\n throw error;\n }\n\n stmt.bind({':tableName': tableName});\n\n // Convert DataColumnsRow object this to a key-value {column_name: name}\n const result: DataColumnsMapping = {};\n while (stmt.step()) {\n const column = stmt.getAsObject() as unknown as DataColumnsRow;\n const {column_name, name} = column;\n result[column_name] = name || null;\n }\n\n return result;\n}\n\n/**\n * Get arrow schema\n * @param db GeoPackage object\n * @param tableName table name\n * @returns Arrow-like Schema\n */\nfunction getArrowSchema(db: Database, tableName: string): Schema {\n const stmt = db.prepare(`PRAGMA table_info(\\`${tableName}\\`)`);\n\n const fields: Field[] = [];\n while (stmt.step()) {\n const pragmaTableInfo = stmt.getAsObject() as unknown as PragmaTableInfoRow;\n const {name, type, notnull} = pragmaTableInfo;\n const schemaType = SQL_TYPE_MAPPING[type] && new SQL_TYPE_MAPPING[type]();\n const field = new Field(name, schemaType, !notnull);\n fields.push(field);\n }\n\n return new Schema(fields);\n}\n\nfunction formatTablesAsGeojson(tables: Tables<ObjectRowTable>): Record<string, Feature[]> {\n const geojsonMap = {};\n for (const table of tables.tables) {\n geojsonMap[table.name] = table.table.data;\n }\n\n return geojsonMap;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"parse-geopackage.js","names":["_sql","_interopRequireDefault","require","_wkt","_schema","_gis","_proj","_createForOfIteratorHelper","o","allowArrayLike","it","Symbol","iterator","Array","isArray","_unsupportedIterableToArray","length","i","F","s","n","done","value","e","_e","f","TypeError","normalCompletion","didErr","err","call","step","next","_e2","return","minLen","_arrayLikeToArray","Object","prototype","toString","slice","constructor","name","from","test","arr","len","arr2","DEFAULT_SQLJS_CDN","exports","ENVELOPE_BYTE_LENGTHS","SQL_TYPE_MAPPING","BOOLEAN","Bool","TINYINT","Int8","SMALLINT","Int16","MEDIUMINT","Int32","INT","INTEGER","FLOAT","Float32","DOUBLE","Float64","REAL","TEXT","Utf8","BLOB","Binary","DATE","DATETIME","GEOMETRY","POINT","LINESTRING","POLYGON","MULTIPOINT","MULTILINESTRING","MULTIPOLYGON","GEOMETRYCOLLECTION","parseGeoPackage","_x","_x2","_parseGeoPackage","apply","arguments","_asyncToGenerator2","default","_regenerator","mark","_callee","arrayBuffer","options","_ref2","_ref2$sqlJsCDN","sqlJsCDN","_ref3","_ref3$reproject","reproject","_ref3$_targetCrs","_targetCrs","_ref3$format","format","db","tables","projections","outputTables","_iterator3","_step3","table","tableName","wrap","_callee$","_context","prev","geopackage","gis","loadDatabase","sent","listVectorTables","getProjections","shape","table_name","push","getVectorTable","abrupt","formatTablesAsGeojson","stop","_x3","_x4","_loadDatabase","_callee2","SQL","_callee2$","_context2","initSqlJs","locateFile","file","concat","Database","Uint8Array","stmt","prepare","vectorTablesInfo","vectorTableInfo","getAsObject","_ref","dataColumns","getDataColumns","geomColumn","getGeometryColumn","featureIdColumn","getFeatureIdName","_db$exec$","exec","columns","values","projection","geomColumnProjStr","srs_id","Proj4Projection","to","geojsonFeatures","_iterator","_step","row","geojsonFeature","constructGeoJsonFeature","schema","getArrowSchema","data","transformGeoJsonCoords","project","projectionMapping","srsInfo","definition","idIdx","indexOf","id","geomColumnIdx","column_name","geometry","parseGeometry","buffer","properties","_i","_Object$entries","entries","_Object$entries$_i","_slicedToArray2","key","idx","columnName","type","getGeopackageVersion","textDecoder","TextDecoder","applicationIdQuery","applicationId","ArrayBuffer","view","DataView","setInt32","Number","versionString","decode","userVersionQuery","userVersionInt","pragmaTableInfo","pk","_parseGeometryBitFlag","parseGeometryBitFlags","getUint8","envelopeLength","emptyGeometry","wkbOffset","binaryGeometry","WKBLoader","parseSync","binaryToGeometry","byte","envelopeValue","littleEndian","Boolean","extendedGeometryType","bind","geometryColumn","error","message","includes","result","column","fields","notnull","schemaType","field","Field","Schema","geojsonMap","_iterator2","_step2"],"sources":["../../../src/lib/parse-geopackage.ts"],"sourcesContent":["/* eslint-disable camelcase, @typescript-eslint/no-use-before-define */\nimport type {GeoPackageLoaderOptions} from '../geopackage-loader';\nimport initSqlJs, {SqlJsStatic, Database, Statement} from 'sql.js';\nimport {WKBLoader} from '@loaders.gl/wkt';\nimport {\n Schema,\n Field,\n Geometry,\n DataType,\n Bool,\n Utf8,\n Float64,\n Int32,\n Int8,\n Int16,\n Float32,\n Binary,\n Tables,\n ObjectRowTable,\n Feature\n} from '@loaders.gl/schema';\nimport {binaryToGeometry, transformGeoJsonCoords} from '@loaders.gl/gis';\nimport {Proj4Projection} from '@math.gl/proj4';\nimport {\n GeometryColumnsRow,\n ContentsRow,\n SpatialRefSysRow,\n ProjectionMapping,\n GeometryBitFlags,\n DataColumnsRow,\n DataColumnsMapping,\n PragmaTableInfoRow,\n SQLiteTypes,\n GeoPackageGeometryTypes\n} from './types';\n\n// We pin to the same version as sql.js that we use.\n// As of March 2022, versions 1.6.0, 1.6.1, and 1.6.2 of sql.js appeared not to work.\nexport const DEFAULT_SQLJS_CDN = 'https://cdnjs.cloudflare.com/ajax/libs/sql.js/1.5.0/';\n\n// https://www.geopackage.org/spec121/#flags_layout\nconst ENVELOPE_BYTE_LENGTHS = {\n 0: 0,\n 1: 32,\n 2: 48,\n 3: 48,\n 4: 64,\n // values 5-7 are invalid and _should_ never show up\n 5: 0,\n 6: 0,\n 7: 0\n};\n\n// Documentation: https://www.geopackage.org/spec130/index.html#table_column_data_types\nconst SQL_TYPE_MAPPING: {[type in SQLiteTypes | GeoPackageGeometryTypes]: typeof DataType} = {\n BOOLEAN: Bool,\n TINYINT: Int8,\n SMALLINT: Int16,\n MEDIUMINT: Int32,\n INT: Int32,\n INTEGER: Int32,\n FLOAT: Float32,\n DOUBLE: Float64,\n REAL: Float64,\n TEXT: Utf8,\n BLOB: Binary,\n DATE: Utf8,\n DATETIME: Utf8,\n GEOMETRY: Binary,\n POINT: Binary,\n LINESTRING: Binary,\n POLYGON: Binary,\n MULTIPOINT: Binary,\n MULTILINESTRING: Binary,\n MULTIPOLYGON: Binary,\n GEOMETRYCOLLECTION: Binary\n};\n\nexport default async function parseGeoPackage(\n arrayBuffer: ArrayBuffer,\n options?: GeoPackageLoaderOptions\n): Promise<Tables<ObjectRowTable> | Record<string, Feature[]>> {\n const {sqlJsCDN = DEFAULT_SQLJS_CDN} = options?.geopackage || {};\n const {reproject = false, _targetCrs = 'WGS84', format = 'tables'} = options?.gis || {};\n\n const db = await loadDatabase(arrayBuffer, sqlJsCDN);\n const tables = listVectorTables(db);\n const projections = getProjections(db);\n\n // Mapping from tableName to geojson feature collection\n const outputTables: Tables<ObjectRowTable> = {\n shape: 'tables',\n tables: []\n };\n\n for (const table of tables) {\n const {table_name: tableName} = table;\n outputTables.tables.push({\n name: tableName,\n table: getVectorTable(db, tableName, projections, {\n reproject,\n _targetCrs\n })\n });\n }\n\n if (format === 'geojson') {\n return formatTablesAsGeojson(outputTables);\n }\n\n return outputTables;\n}\n\n/**\n * Initialize SQL.js and create database\n *\n * @param arrayBuffer input bytes\n * @return SQL.js database object\n */\nasync function loadDatabase(arrayBuffer: ArrayBuffer, sqlJsCDN: string | null): Promise<Database> {\n // In Node, `locateFile` must not be passed\n let SQL: SqlJsStatic;\n if (sqlJsCDN) {\n SQL = await initSqlJs({\n locateFile: (file) => `${sqlJsCDN}${file}`\n });\n } else {\n SQL = await initSqlJs();\n }\n return new SQL.Database(new Uint8Array(arrayBuffer));\n}\n\n/**\n * Find all vector tables in GeoPackage\n * This queries the `gpkg_contents` table to find a list of vector tables\n *\n * @param db GeoPackage to query\n * @return list of table references\n */\nfunction listVectorTables(db: Database): ContentsRow[] {\n // The gpkg_contents table can have at least three categorical values for\n // data_type.\n // - 'features' refers to a vector geometry table\n // (https://www.geopackage.org/spec121/#_contents_2)\n // - 'tiles' refers to a raster table\n // (https://www.geopackage.org/spec121/#_contents_3)\n // - 'attributes' refers to a data table with no geometry\n // (https://www.geopackage.org/spec121/#_contents_4).\n\n // We hard code 'features' because for now we don't support raster data or pure attribute data\n // eslint-disable-next-line quotes\n const stmt = db.prepare(\"SELECT * FROM gpkg_contents WHERE data_type='features';\");\n\n const vectorTablesInfo: ContentsRow[] = [];\n while (stmt.step()) {\n const vectorTableInfo = stmt.getAsObject() as unknown as ContentsRow;\n vectorTablesInfo.push(vectorTableInfo);\n }\n\n return vectorTablesInfo;\n}\n\n/**\n * Load geometries from vector table\n *\n * @param db GeoPackage object\n * @param tableName name of vector table to query\n * @param projections keys are srs_id values, values are WKT strings\n * @returns Array of GeoJSON Feature objects\n */\nfunction getVectorTable(\n db: Database,\n tableName: string,\n projections: ProjectionMapping,\n {reproject, _targetCrs}: {reproject: boolean; _targetCrs: string}\n): ObjectRowTable {\n const dataColumns = getDataColumns(db, tableName);\n const geomColumn = getGeometryColumn(db, tableName);\n const featureIdColumn = getFeatureIdName(db, tableName);\n\n // Get vector features from table\n // Don't think it's possible to parameterize the table name in SQLite?\n const {columns, values} = db.exec(`SELECT * FROM \\`${tableName}\\`;`)[0];\n\n let projection;\n if (reproject) {\n const geomColumnProjStr = projections[geomColumn.srs_id];\n projection = new Proj4Projection({\n from: geomColumnProjStr,\n to: _targetCrs\n });\n }\n\n const geojsonFeatures: object[] = [];\n for (const row of values) {\n const geojsonFeature = constructGeoJsonFeature(\n columns,\n row,\n geomColumn,\n // @ts-ignore\n dataColumns,\n featureIdColumn\n );\n geojsonFeatures.push(geojsonFeature);\n }\n\n const schema = getArrowSchema(db, tableName);\n if (projection) {\n return {\n data: transformGeoJsonCoords(geojsonFeatures, projection.project),\n schema,\n shape: 'object-row-table'\n };\n }\n\n return {data: geojsonFeatures, schema, shape: 'object-row-table'};\n}\n\n/**\n * Find all projections defined in GeoPackage\n * This queries the gpkg_spatial_ref_sys table\n * @param db GeoPackage object\n * @returns mapping from srid to WKT projection string\n */\nfunction getProjections(db: Database): ProjectionMapping {\n // Query gpkg_spatial_ref_sys to get srid: srtext mappings\n const stmt = db.prepare('SELECT * FROM gpkg_spatial_ref_sys;');\n\n const projectionMapping: ProjectionMapping = {};\n while (stmt.step()) {\n const srsInfo = stmt.getAsObject() as unknown as SpatialRefSysRow;\n const {srs_id, definition} = srsInfo;\n projectionMapping[srs_id] = definition;\n }\n\n return projectionMapping;\n}\n\n/**\n * Construct single GeoJSON feature given row's data\n * @param columns array of ordered column identifiers\n * @param row array of ordered values representing row's data\n * @param geomColumn geometry column metadata\n * @param dataColumns mapping from table column names to property name\n * @returns GeoJSON Feature object\n */\nfunction constructGeoJsonFeature(\n columns: string[],\n row: any[],\n geomColumn: GeometryColumnsRow,\n dataColumns: DataColumnsMapping,\n featureIdColumn: string\n): Feature<Geometry | null> {\n // Find feature id\n const idIdx = columns.indexOf(featureIdColumn);\n const id = row[idIdx];\n\n // Parse geometry columns to geojson\n const geomColumnIdx = columns.indexOf(geomColumn.column_name);\n const geometry = parseGeometry(row[geomColumnIdx].buffer);\n\n const properties = {};\n if (dataColumns) {\n for (const [key, value] of Object.entries(dataColumns)) {\n const idx = columns.indexOf(key);\n // @ts-ignore TODO - Check what happens if null?\n properties[value] = row[idx];\n }\n } else {\n // Put all columns except for the feature id and geometry in properties\n for (let i = 0; i < columns.length; i++) {\n if (i === idIdx || i === geomColumnIdx) {\n // eslint-disable-next-line no-continue\n continue;\n }\n\n const columnName = columns[i];\n properties[columnName] = row[i];\n }\n }\n\n return {\n id,\n type: 'Feature',\n geometry,\n properties\n };\n}\n\n/**\n * Get GeoPackage version from database\n * @param db database\n * @returns version string. One of '1.0', '1.1', '1.2'\n */\n\n// @ts-ignore\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nfunction getGeopackageVersion(db: Database): string | null {\n const textDecoder = new TextDecoder();\n\n // Read application id from SQLite metadata\n const applicationIdQuery = db.exec('PRAGMA application_id;')[0];\n const applicationId = applicationIdQuery.values[0][0];\n\n // Convert 4-byte signed int32 application id to text\n const buffer = new ArrayBuffer(4);\n const view = new DataView(buffer);\n view.setInt32(0, Number(applicationId));\n const versionString = textDecoder.decode(buffer);\n\n if (versionString === 'GP10') {\n return '1.0';\n }\n\n if (versionString === 'GP11') {\n return '1.1';\n }\n\n // If versionString is GPKG, then read user_version\n const userVersionQuery = db.exec('PRAGMA user_version;')[0];\n const userVersionInt = userVersionQuery.values[0][0];\n\n if (userVersionInt && typeof userVersionInt === 'number' && userVersionInt < 10300) {\n return '1.2';\n }\n\n return null;\n}\n\n/**\n * Find name of feature id column in table\n * The feature ID is the primary key of the table.\n * http://www.geopackage.org/spec121/#feature_user_tables\n *\n * @param db database\n * @param tableName name of table\n * @return name of feature id column\n */\nfunction getFeatureIdName(db: Database, tableName: string): string | null {\n // Again, not possible to parameterize table name?\n const stmt = db.prepare(`PRAGMA table_info(\\`${tableName}\\`)`);\n\n while (stmt.step()) {\n const pragmaTableInfo = stmt.getAsObject() as unknown as PragmaTableInfoRow;\n const {name, pk} = pragmaTableInfo;\n if (pk) {\n return name;\n }\n }\n\n // Is it guaranteed for there always to be at least one primary key column in the table?\n return null;\n}\n\n/**\n * Parse geometry buffer\n * GeoPackage vector geometries are slightly extended past the WKB standard\n * See: https://www.geopackage.org/spec121/#gpb_format\n *\n * @param arrayBuffer geometry buffer\n * @return GeoJSON geometry (in original CRS)\n */\nfunction parseGeometry(arrayBuffer: ArrayBuffer): Geometry | null {\n const view = new DataView(arrayBuffer);\n const {envelopeLength, emptyGeometry} = parseGeometryBitFlags(view.getUint8(3));\n\n // A Feature object has a member with the name \"geometry\". The value of the\n // geometry member SHALL be either a Geometry object as defined above or, in\n // the case that the Feature is unlocated, a JSON null value.\n /** @see https://tools.ietf.org/html/rfc7946#section-3.2 */\n if (emptyGeometry) {\n return null;\n }\n\n // Do I need to find the srid here? Is it necessarily the same for every\n // geometry in a table?\n // const srid = view.getInt32(4, littleEndian);\n\n // 2 byte magic, 1 byte version, 1 byte flags, 4 byte int32 srid\n const wkbOffset = 8 + envelopeLength;\n\n // Loaders should not depend on `core` and the context passed to the main loader doesn't include a\n // `parseSync` option, so instead we call parseSync directly on WKBLoader\n const binaryGeometry = WKBLoader.parseSync(arrayBuffer.slice(wkbOffset));\n\n return binaryToGeometry(binaryGeometry);\n}\n\n/**\n * Parse geometry header flags\n * https://www.geopackage.org/spec121/#flags_layout\n *\n * @param byte uint8 number representing flags\n * @return object representing information from bit flags\n */\nfunction parseGeometryBitFlags(byte: number): GeometryBitFlags {\n // Are header values little endian?\n const envelopeValue = (byte & 0b00001110) / 2;\n\n // TODO: Not sure the best way to handle this. Throw an error if envelopeValue outside 0-7?\n const envelopeLength = ENVELOPE_BYTE_LENGTHS[envelopeValue] as number;\n\n return {\n littleEndian: Boolean(byte & 0b00000001),\n envelopeLength,\n emptyGeometry: Boolean(byte & 0b00010000),\n extendedGeometryType: Boolean(byte & 0b00100000)\n };\n}\n\n/**\n * Find geometry column in given vector table\n *\n * @param db GeoPackage object\n * @param tableName Name of vector table\n * @returns Array of geometry column definitions\n */\nfunction getGeometryColumn(db: Database, tableName: string): GeometryColumnsRow {\n const stmt = db.prepare('SELECT * FROM gpkg_geometry_columns WHERE table_name=:tableName;');\n stmt.bind({':tableName': tableName});\n\n // > Requirement 30\n // > A feature table SHALL have only one geometry column.\n // https://www.geopackage.org/spec121/#feature_user_tables\n // So we should need one and only one step, given that we use the WHERE clause in the SQL query\n // above\n stmt.step();\n const geometryColumn = stmt.getAsObject() as unknown as GeometryColumnsRow;\n return geometryColumn;\n}\n\n/**\n * Find property columns in given vector table\n * @param db GeoPackage object\n * @param tableName Name of vector table\n * @returns Mapping from table column names to property name\n */\nfunction getDataColumns(db: Database, tableName: string): DataColumnsMapping | null {\n // gpkg_data_columns is not required to exist\n // https://www.geopackage.org/spec121/#extension_schema\n let stmt: Statement;\n try {\n stmt = db.prepare('SELECT * FROM gpkg_data_columns WHERE table_name=:tableName;');\n } catch (error) {\n if ((error as Error).message.includes('no such table')) {\n return null;\n }\n\n throw error;\n }\n\n stmt.bind({':tableName': tableName});\n\n // Convert DataColumnsRow object this to a key-value {column_name: name}\n const result: DataColumnsMapping = {};\n while (stmt.step()) {\n const column = stmt.getAsObject() as unknown as DataColumnsRow;\n const {column_name, name} = column;\n result[column_name] = name || null;\n }\n\n return result;\n}\n\n/**\n * Get arrow schema\n * @param db GeoPackage object\n * @param tableName table name\n * @returns Arrow-like Schema\n */\nfunction getArrowSchema(db: Database, tableName: string): Schema {\n const stmt = db.prepare(`PRAGMA table_info(\\`${tableName}\\`)`);\n\n const fields: Field[] = [];\n while (stmt.step()) {\n const pragmaTableInfo = stmt.getAsObject() as unknown as PragmaTableInfoRow;\n const {name, type, notnull} = pragmaTableInfo;\n const schemaType = SQL_TYPE_MAPPING[type] && new SQL_TYPE_MAPPING[type]();\n const field = new Field(name, schemaType, !notnull);\n fields.push(field);\n }\n\n return new Schema(fields);\n}\n\nfunction formatTablesAsGeojson(tables: Tables<ObjectRowTable>): Record<string, Feature[]> {\n const geojsonMap = {};\n for (const table of tables.tables) {\n geojsonMap[table.name] = table.table.data;\n }\n\n return geojsonMap;\n}\n"],"mappings":"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"}
@@ -1,4 +1,3 @@
1
-
2
1
  const moduleExports = require('./index');
3
2
  globalThis.loaders = globalThis.loaders || {};
4
3
  module.exports = Object.assign(globalThis.loaders, moduleExports);
@@ -1 +1 @@
1
- {"version":3,"file":"bundle.js","names":["moduleExports","require","globalThis","loaders","module","exports","Object","assign"],"sources":["../../src/bundle.ts"],"sourcesContent":["// @ts-nocheck\nconst moduleExports = require('./index');\nglobalThis.loaders = globalThis.loaders || {};\nmodule.exports = Object.assign(globalThis.loaders, moduleExports);\n"],"mappings":";AACA,MAAMA,aAAa,GAAGC,OAAO,CAAC,SAAS,CAAC;AACxCC,UAAU,CAACC,OAAO,GAAGD,UAAU,CAACC,OAAO,IAAI,CAAC,CAAC;AAC7CC,MAAM,CAACC,OAAO,GAAGC,MAAM,CAACC,MAAM,CAACL,UAAU,CAACC,OAAO,EAAEH,aAAa,CAAC"}
1
+ {"version":3,"file":"bundle.js","names":["moduleExports","require","globalThis","loaders","module","exports","Object","assign"],"sources":["../../src/bundle.ts"],"sourcesContent":["// @ts-nocheck\nconst moduleExports = require('./index');\nglobalThis.loaders = globalThis.loaders || {};\nmodule.exports = Object.assign(globalThis.loaders, moduleExports);\n"],"mappings":"AACA,MAAMA,aAAa,GAAGC,OAAO,CAAC,SAAS,CAAC;AACxCC,UAAU,CAACC,OAAO,GAAGD,UAAU,CAACC,OAAO,IAAI,CAAC,CAAC;AAC7CC,MAAM,CAACC,OAAO,GAAGC,MAAM,CAACC,MAAM,CAACL,UAAU,CAACC,OAAO,EAAEH,aAAa,CAAC"}
@@ -1,5 +1,4 @@
1
1
  import parseGeoPackage, { DEFAULT_SQLJS_CDN } from './lib/parse-geopackage';
2
-
3
2
  const VERSION = 'latest';
4
3
  export const GeoPackageLoader = {
5
4
  id: 'geopackage',
@@ -1 +1 @@
1
- {"version":3,"file":"geopackage-loader.js","names":["parseGeoPackage","DEFAULT_SQLJS_CDN","VERSION","GeoPackageLoader","id","name","module","version","extensions","mimeTypes","category","parse","options","geopackage","sqlJsCDN","gis","format"],"sources":["../../src/geopackage-loader.ts"],"sourcesContent":["import type {LoaderWithParser, LoaderOptions} from '@loaders.gl/loader-utils';\nimport parseGeoPackage, {DEFAULT_SQLJS_CDN} from './lib/parse-geopackage';\n\n// __VERSION__ is injected by babel-plugin-version-inline\n// @ts-ignore TS2304: Cannot find name '__VERSION__'.\n// const VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'latest';\nconst VERSION = 'latest';\n\nexport type GeoPackageLoaderOptions = LoaderOptions & {\n geopackage?: {\n // Use null in Node\n sqlJsCDN: string | null;\n };\n gis?: {\n reproject?: boolean;\n _targetCrs?: string;\n format?: 'geojson' | 'tables';\n };\n};\n\n/** Geopackage loader */\nexport const GeoPackageLoader: LoaderWithParser = {\n id: 'geopackage',\n name: 'GeoPackage',\n module: 'geopackage',\n version: VERSION,\n extensions: ['gpkg'],\n mimeTypes: ['application/geopackage+sqlite3'],\n category: 'geometry',\n parse: parseGeoPackage,\n options: {\n geopackage: {\n sqlJsCDN: DEFAULT_SQLJS_CDN\n },\n gis: {\n format: 'tables'\n }\n }\n};\n"],"mappings":"AACA,OAAOA,eAAe,IAAGC,iBAAiB,QAAO,wBAAwB;;AAKzE,MAAMC,OAAO,GAAG,QAAQ;AAexB,OAAO,MAAMC,gBAAkC,GAAG;EAChDC,EAAE,EAAE,YAAY;EAChBC,IAAI,EAAE,YAAY;EAClBC,MAAM,EAAE,YAAY;EACpBC,OAAO,EAAEL,OAAO;EAChBM,UAAU,EAAE,CAAC,MAAM,CAAC;EACpBC,SAAS,EAAE,CAAC,gCAAgC,CAAC;EAC7CC,QAAQ,EAAE,UAAU;EACpBC,KAAK,EAAEX,eAAe;EACtBY,OAAO,EAAE;IACPC,UAAU,EAAE;MACVC,QAAQ,EAAEb;IACZ,CAAC;IACDc,GAAG,EAAE;MACHC,MAAM,EAAE;IACV;EACF;AACF,CAAC"}
1
+ {"version":3,"file":"geopackage-loader.js","names":["parseGeoPackage","DEFAULT_SQLJS_CDN","VERSION","GeoPackageLoader","id","name","module","version","extensions","mimeTypes","category","parse","options","geopackage","sqlJsCDN","gis","format"],"sources":["../../src/geopackage-loader.ts"],"sourcesContent":["import type {LoaderWithParser, LoaderOptions} from '@loaders.gl/loader-utils';\nimport parseGeoPackage, {DEFAULT_SQLJS_CDN} from './lib/parse-geopackage';\n\n// __VERSION__ is injected by babel-plugin-version-inline\n// @ts-ignore TS2304: Cannot find name '__VERSION__'.\n// const VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'latest';\nconst VERSION = 'latest';\n\nexport type GeoPackageLoaderOptions = LoaderOptions & {\n geopackage?: {\n // Use null in Node\n sqlJsCDN: string | null;\n };\n gis?: {\n reproject?: boolean;\n _targetCrs?: string;\n format?: 'geojson' | 'tables';\n };\n};\n\n/** Geopackage loader */\nexport const GeoPackageLoader: LoaderWithParser = {\n id: 'geopackage',\n name: 'GeoPackage',\n module: 'geopackage',\n version: VERSION,\n extensions: ['gpkg'],\n mimeTypes: ['application/geopackage+sqlite3'],\n category: 'geometry',\n parse: parseGeoPackage,\n options: {\n geopackage: {\n sqlJsCDN: DEFAULT_SQLJS_CDN\n },\n gis: {\n format: 'tables'\n }\n }\n};\n"],"mappings":"AACA,OAAOA,eAAe,IAAGC,iBAAiB,QAAO,wBAAwB;AAKzE,MAAMC,OAAO,GAAG,QAAQ;AAexB,OAAO,MAAMC,gBAAkC,GAAG;EAChDC,EAAE,EAAE,YAAY;EAChBC,IAAI,EAAE,YAAY;EAClBC,MAAM,EAAE,YAAY;EACpBC,OAAO,EAAEL,OAAO;EAChBM,UAAU,EAAE,CAAC,MAAM,CAAC;EACpBC,SAAS,EAAE,CAAC,gCAAgC,CAAC;EAC7CC,QAAQ,EAAE,UAAU;EACpBC,KAAK,EAAEX,eAAe;EACtBY,OAAO,EAAE;IACPC,UAAU,EAAE;MACVC,QAAQ,EAAEb;IACZ,CAAC;IACDc,GAAG,EAAE;MACHC,MAAM,EAAE;IACV;EACF;AACF,CAAC"}
@@ -1,12 +1,9 @@
1
-
2
-
3
1
  import initSqlJs from 'sql.js';
4
2
  import { WKBLoader } from '@loaders.gl/wkt';
5
3
  import { Schema, Field, Bool, Utf8, Float64, Int32, Int8, Int16, Float32, Binary } from '@loaders.gl/schema';
6
4
  import { binaryToGeometry, transformGeoJsonCoords } from '@loaders.gl/gis';
7
5
  import { Proj4Projection } from '@math.gl/proj4';
8
6
  export const DEFAULT_SQLJS_CDN = 'https://cdnjs.cloudflare.com/ajax/libs/sql.js/1.5.0/';
9
-
10
7
  const ENVELOPE_BYTE_LENGTHS = {
11
8
  0: 0,
12
9
  1: 32,
@@ -17,7 +14,6 @@ const ENVELOPE_BYTE_LENGTHS = {
17
14
  6: 0,
18
15
  7: 0
19
16
  };
20
-
21
17
  const SQL_TYPE_MAPPING = {
22
18
  BOOLEAN: Bool,
23
19
  TINYINT: Int8,
@@ -53,7 +49,6 @@ export default async function parseGeoPackage(arrayBuffer, options) {
53
49
  const db = await loadDatabase(arrayBuffer, sqlJsCDN);
54
50
  const tables = listVectorTables(db);
55
51
  const projections = getProjections(db);
56
-
57
52
  const outputTables = {
58
53
  shape: 'tables',
59
54
  tables: []
@@ -75,7 +70,6 @@ export default async function parseGeoPackage(arrayBuffer, options) {
75
70
  }
76
71
  return outputTables;
77
72
  }
78
-
79
73
  async function loadDatabase(arrayBuffer, sqlJsCDN) {
80
74
  let SQL;
81
75
  if (sqlJsCDN) {
@@ -87,9 +81,7 @@ async function loadDatabase(arrayBuffer, sqlJsCDN) {
87
81
  }
88
82
  return new SQL.Database(new Uint8Array(arrayBuffer));
89
83
  }
90
-
91
84
  function listVectorTables(db) {
92
-
93
85
  const stmt = db.prepare("SELECT * FROM gpkg_contents WHERE data_type='features';");
94
86
  const vectorTablesInfo = [];
95
87
  while (stmt.step()) {
@@ -98,7 +90,6 @@ function listVectorTables(db) {
98
90
  }
99
91
  return vectorTablesInfo;
100
92
  }
101
-
102
93
  function getVectorTable(db, tableName, projections, _ref) {
103
94
  let {
104
95
  reproject,
@@ -107,7 +98,6 @@ function getVectorTable(db, tableName, projections, _ref) {
107
98
  const dataColumns = getDataColumns(db, tableName);
108
99
  const geomColumn = getGeometryColumn(db, tableName);
109
100
  const featureIdColumn = getFeatureIdName(db, tableName);
110
-
111
101
  const {
112
102
  columns,
113
103
  values
@@ -122,8 +112,7 @@ function getVectorTable(db, tableName, projections, _ref) {
122
112
  }
123
113
  const geojsonFeatures = [];
124
114
  for (const row of values) {
125
- const geojsonFeature = constructGeoJsonFeature(columns, row, geomColumn,
126
- dataColumns, featureIdColumn);
115
+ const geojsonFeature = constructGeoJsonFeature(columns, row, geomColumn, dataColumns, featureIdColumn);
127
116
  geojsonFeatures.push(geojsonFeature);
128
117
  }
129
118
  const schema = getArrowSchema(db, tableName);
@@ -140,7 +129,6 @@ function getVectorTable(db, tableName, projections, _ref) {
140
129
  shape: 'object-row-table'
141
130
  };
142
131
  }
143
-
144
132
  function getProjections(db) {
145
133
  const stmt = db.prepare('SELECT * FROM gpkg_spatial_ref_sys;');
146
134
  const projectionMapping = {};
@@ -154,11 +142,9 @@ function getProjections(db) {
154
142
  }
155
143
  return projectionMapping;
156
144
  }
157
-
158
145
  function constructGeoJsonFeature(columns, row, geomColumn, dataColumns, featureIdColumn) {
159
146
  const idIdx = columns.indexOf(featureIdColumn);
160
147
  const id = row[idIdx];
161
-
162
148
  const geomColumnIdx = columns.indexOf(geomColumn.column_name);
163
149
  const geometry = parseGeometry(row[geomColumnIdx].buffer);
164
150
  const properties = {};
@@ -183,13 +169,10 @@ function constructGeoJsonFeature(columns, row, geomColumn, dataColumns, featureI
183
169
  properties
184
170
  };
185
171
  }
186
-
187
172
  function getGeopackageVersion(db) {
188
173
  const textDecoder = new TextDecoder();
189
-
190
174
  const applicationIdQuery = db.exec('PRAGMA application_id;')[0];
191
175
  const applicationId = applicationIdQuery.values[0][0];
192
-
193
176
  const buffer = new ArrayBuffer(4);
194
177
  const view = new DataView(buffer);
195
178
  view.setInt32(0, Number(applicationId));
@@ -200,15 +183,13 @@ function getGeopackageVersion(db) {
200
183
  if (versionString === 'GP11') {
201
184
  return '1.1';
202
185
  }
203
-
204
186
  const userVersionQuery = db.exec('PRAGMA user_version;')[0];
205
187
  const userVersionInt = userVersionQuery.values[0][0];
206
- if (userVersionInt && userVersionInt < 10300) {
188
+ if (userVersionInt && typeof userVersionInt === 'number' && userVersionInt < 10300) {
207
189
  return '1.2';
208
190
  }
209
191
  return null;
210
192
  }
211
-
212
193
  function getFeatureIdName(db, tableName) {
213
194
  const stmt = db.prepare("PRAGMA table_info(`".concat(tableName, "`)"));
214
195
  while (stmt.step()) {
@@ -221,30 +202,23 @@ function getFeatureIdName(db, tableName) {
221
202
  return name;
222
203
  }
223
204
  }
224
-
225
205
  return null;
226
206
  }
227
-
228
207
  function parseGeometry(arrayBuffer) {
229
208
  const view = new DataView(arrayBuffer);
230
209
  const {
231
210
  envelopeLength,
232
211
  emptyGeometry
233
212
  } = parseGeometryBitFlags(view.getUint8(3));
234
-
235
213
  if (emptyGeometry) {
236
214
  return null;
237
215
  }
238
-
239
216
  const wkbOffset = 8 + envelopeLength;
240
-
241
217
  const binaryGeometry = WKBLoader.parseSync(arrayBuffer.slice(wkbOffset));
242
218
  return binaryToGeometry(binaryGeometry);
243
219
  }
244
-
245
220
  function parseGeometryBitFlags(byte) {
246
221
  const envelopeValue = (byte & 0b00001110) / 2;
247
-
248
222
  const envelopeLength = ENVELOPE_BYTE_LENGTHS[envelopeValue];
249
223
  return {
250
224
  littleEndian: Boolean(byte & 0b00000001),
@@ -253,18 +227,15 @@ function parseGeometryBitFlags(byte) {
253
227
  extendedGeometryType: Boolean(byte & 0b00100000)
254
228
  };
255
229
  }
256
-
257
230
  function getGeometryColumn(db, tableName) {
258
231
  const stmt = db.prepare('SELECT * FROM gpkg_geometry_columns WHERE table_name=:tableName;');
259
232
  stmt.bind({
260
233
  ':tableName': tableName
261
234
  });
262
-
263
235
  stmt.step();
264
236
  const geometryColumn = stmt.getAsObject();
265
237
  return geometryColumn;
266
238
  }
267
-
268
239
  function getDataColumns(db, tableName) {
269
240
  let stmt;
270
241
  try {
@@ -278,7 +249,6 @@ function getDataColumns(db, tableName) {
278
249
  stmt.bind({
279
250
  ':tableName': tableName
280
251
  });
281
-
282
252
  const result = {};
283
253
  while (stmt.step()) {
284
254
  const column = stmt.getAsObject();
@@ -290,7 +260,6 @@ function getDataColumns(db, tableName) {
290
260
  }
291
261
  return result;
292
262
  }
293
-
294
263
  function getArrowSchema(db, tableName) {
295
264
  const stmt = db.prepare("PRAGMA table_info(`".concat(tableName, "`)"));
296
265
  const fields = [];
@@ -1 +1 @@
1
- {"version":3,"file":"parse-geopackage.js","names":["initSqlJs","WKBLoader","Schema","Field","Bool","Utf8","Float64","Int32","Int8","Int16","Float32","Binary","binaryToGeometry","transformGeoJsonCoords","Proj4Projection","DEFAULT_SQLJS_CDN","ENVELOPE_BYTE_LENGTHS","SQL_TYPE_MAPPING","BOOLEAN","TINYINT","SMALLINT","MEDIUMINT","INT","INTEGER","FLOAT","DOUBLE","REAL","TEXT","BLOB","DATE","DATETIME","GEOMETRY","POINT","LINESTRING","POLYGON","MULTIPOINT","MULTILINESTRING","MULTIPOLYGON","GEOMETRYCOLLECTION","parseGeoPackage","arrayBuffer","options","sqlJsCDN","geopackage","reproject","_targetCrs","format","gis","db","loadDatabase","tables","listVectorTables","projections","getProjections","outputTables","shape","table","table_name","tableName","push","name","getVectorTable","formatTablesAsGeojson","SQL","locateFile","file","Database","Uint8Array","stmt","prepare","vectorTablesInfo","step","vectorTableInfo","getAsObject","dataColumns","getDataColumns","geomColumn","getGeometryColumn","featureIdColumn","getFeatureIdName","columns","values","exec","projection","geomColumnProjStr","srs_id","from","to","geojsonFeatures","row","geojsonFeature","constructGeoJsonFeature","schema","getArrowSchema","data","project","projectionMapping","srsInfo","definition","idIdx","indexOf","id","geomColumnIdx","column_name","geometry","parseGeometry","buffer","properties","key","value","Object","entries","idx","i","length","columnName","type","getGeopackageVersion","textDecoder","TextDecoder","applicationIdQuery","applicationId","ArrayBuffer","view","DataView","setInt32","Number","versionString","decode","userVersionQuery","userVersionInt","pragmaTableInfo","pk","envelopeLength","emptyGeometry","parseGeometryBitFlags","getUint8","wkbOffset","binaryGeometry","parseSync","slice","byte","envelopeValue","littleEndian","Boolean","extendedGeometryType","bind","geometryColumn","error","message","includes","result","column","fields","notnull","schemaType","field","geojsonMap"],"sources":["../../../src/lib/parse-geopackage.ts"],"sourcesContent":["/* eslint-disable camelcase, @typescript-eslint/no-use-before-define */\nimport type {GeoPackageLoaderOptions} from '../geopackage-loader';\nimport initSqlJs, {SqlJsStatic, Database, Statement} from 'sql.js';\nimport {WKBLoader} from '@loaders.gl/wkt';\nimport {\n Schema,\n Field,\n Geometry,\n DataType,\n Bool,\n Utf8,\n Float64,\n Int32,\n Int8,\n Int16,\n Float32,\n Binary,\n Tables,\n ObjectRowTable,\n Feature\n} from '@loaders.gl/schema';\nimport {binaryToGeometry, transformGeoJsonCoords} from '@loaders.gl/gis';\nimport {Proj4Projection} from '@math.gl/proj4';\nimport {\n GeometryColumnsRow,\n ContentsRow,\n SpatialRefSysRow,\n ProjectionMapping,\n GeometryBitFlags,\n DataColumnsRow,\n DataColumnsMapping,\n PragmaTableInfoRow,\n SQLiteTypes,\n GeoPackageGeometryTypes\n} from './types';\n\n// We pin to the same version as sql.js that we use.\n// As of March 2022, versions 1.6.0, 1.6.1, and 1.6.2 of sql.js appeared not to work.\nexport const DEFAULT_SQLJS_CDN = 'https://cdnjs.cloudflare.com/ajax/libs/sql.js/1.5.0/';\n\n// https://www.geopackage.org/spec121/#flags_layout\nconst ENVELOPE_BYTE_LENGTHS = {\n 0: 0,\n 1: 32,\n 2: 48,\n 3: 48,\n 4: 64,\n // values 5-7 are invalid and _should_ never show up\n 5: 0,\n 6: 0,\n 7: 0\n};\n\n// Documentation: https://www.geopackage.org/spec130/index.html#table_column_data_types\nconst SQL_TYPE_MAPPING: {[type in SQLiteTypes | GeoPackageGeometryTypes]: typeof DataType} = {\n BOOLEAN: Bool,\n TINYINT: Int8,\n SMALLINT: Int16,\n MEDIUMINT: Int32,\n INT: Int32,\n INTEGER: Int32,\n FLOAT: Float32,\n DOUBLE: Float64,\n REAL: Float64,\n TEXT: Utf8,\n BLOB: Binary,\n DATE: Utf8,\n DATETIME: Utf8,\n GEOMETRY: Binary,\n POINT: Binary,\n LINESTRING: Binary,\n POLYGON: Binary,\n MULTIPOINT: Binary,\n MULTILINESTRING: Binary,\n MULTIPOLYGON: Binary,\n GEOMETRYCOLLECTION: Binary\n};\n\nexport default async function parseGeoPackage(\n arrayBuffer: ArrayBuffer,\n options?: GeoPackageLoaderOptions\n): Promise<Tables<ObjectRowTable> | Record<string, Feature[]>> {\n const {sqlJsCDN = DEFAULT_SQLJS_CDN} = options?.geopackage || {};\n const {reproject = false, _targetCrs = 'WGS84', format = 'tables'} = options?.gis || {};\n\n const db = await loadDatabase(arrayBuffer, sqlJsCDN);\n const tables = listVectorTables(db);\n const projections = getProjections(db);\n\n // Mapping from tableName to geojson feature collection\n const outputTables: Tables<ObjectRowTable> = {\n shape: 'tables',\n tables: []\n };\n\n for (const table of tables) {\n const {table_name: tableName} = table;\n outputTables.tables.push({\n name: tableName,\n table: getVectorTable(db, tableName, projections, {\n reproject,\n _targetCrs\n })\n });\n }\n\n if (format === 'geojson') {\n return formatTablesAsGeojson(outputTables);\n }\n\n return outputTables;\n}\n\n/**\n * Initialize SQL.js and create database\n *\n * @param arrayBuffer input bytes\n * @return SQL.js database object\n */\nasync function loadDatabase(arrayBuffer: ArrayBuffer, sqlJsCDN: string | null): Promise<Database> {\n // In Node, `locateFile` must not be passed\n let SQL: SqlJsStatic;\n if (sqlJsCDN) {\n SQL = await initSqlJs({\n locateFile: (file) => `${sqlJsCDN}${file}`\n });\n } else {\n SQL = await initSqlJs();\n }\n return new SQL.Database(new Uint8Array(arrayBuffer));\n}\n\n/**\n * Find all vector tables in GeoPackage\n * This queries the `gpkg_contents` table to find a list of vector tables\n *\n * @param db GeoPackage to query\n * @return list of table references\n */\nfunction listVectorTables(db: Database): ContentsRow[] {\n // The gpkg_contents table can have at least three categorical values for\n // data_type.\n // - 'features' refers to a vector geometry table\n // (https://www.geopackage.org/spec121/#_contents_2)\n // - 'tiles' refers to a raster table\n // (https://www.geopackage.org/spec121/#_contents_3)\n // - 'attributes' refers to a data table with no geometry\n // (https://www.geopackage.org/spec121/#_contents_4).\n\n // We hard code 'features' because for now we don't support raster data or pure attribute data\n // eslint-disable-next-line quotes\n const stmt = db.prepare(\"SELECT * FROM gpkg_contents WHERE data_type='features';\");\n\n const vectorTablesInfo: ContentsRow[] = [];\n while (stmt.step()) {\n const vectorTableInfo = stmt.getAsObject() as unknown as ContentsRow;\n vectorTablesInfo.push(vectorTableInfo);\n }\n\n return vectorTablesInfo;\n}\n\n/**\n * Load geometries from vector table\n *\n * @param db GeoPackage object\n * @param tableName name of vector table to query\n * @param projections keys are srs_id values, values are WKT strings\n * @returns Array of GeoJSON Feature objects\n */\nfunction getVectorTable(\n db: Database,\n tableName: string,\n projections: ProjectionMapping,\n {reproject, _targetCrs}: {reproject: boolean; _targetCrs: string}\n): ObjectRowTable {\n const dataColumns = getDataColumns(db, tableName);\n const geomColumn = getGeometryColumn(db, tableName);\n const featureIdColumn = getFeatureIdName(db, tableName);\n\n // Get vector features from table\n // Don't think it's possible to parameterize the table name in SQLite?\n const {columns, values} = db.exec(`SELECT * FROM \\`${tableName}\\`;`)[0];\n\n let projection;\n if (reproject) {\n const geomColumnProjStr = projections[geomColumn.srs_id];\n projection = new Proj4Projection({\n from: geomColumnProjStr,\n to: _targetCrs\n });\n }\n\n const geojsonFeatures: object[] = [];\n for (const row of values) {\n const geojsonFeature = constructGeoJsonFeature(\n columns,\n row,\n geomColumn,\n // @ts-ignore\n dataColumns,\n featureIdColumn\n );\n geojsonFeatures.push(geojsonFeature);\n }\n\n const schema = getArrowSchema(db, tableName);\n if (projection) {\n return {\n data: transformGeoJsonCoords(geojsonFeatures, projection.project),\n schema,\n shape: 'object-row-table'\n };\n }\n\n return {data: geojsonFeatures, schema, shape: 'object-row-table'};\n}\n\n/**\n * Find all projections defined in GeoPackage\n * This queries the gpkg_spatial_ref_sys table\n * @param db GeoPackage object\n * @returns mapping from srid to WKT projection string\n */\nfunction getProjections(db: Database): ProjectionMapping {\n // Query gpkg_spatial_ref_sys to get srid: srtext mappings\n const stmt = db.prepare('SELECT * FROM gpkg_spatial_ref_sys;');\n\n const projectionMapping: ProjectionMapping = {};\n while (stmt.step()) {\n const srsInfo = stmt.getAsObject() as unknown as SpatialRefSysRow;\n const {srs_id, definition} = srsInfo;\n projectionMapping[srs_id] = definition;\n }\n\n return projectionMapping;\n}\n\n/**\n * Construct single GeoJSON feature given row's data\n * @param columns array of ordered column identifiers\n * @param row array of ordered values representing row's data\n * @param geomColumn geometry column metadata\n * @param dataColumns mapping from table column names to property name\n * @returns GeoJSON Feature object\n */\nfunction constructGeoJsonFeature(\n columns: string[],\n row: any[],\n geomColumn: GeometryColumnsRow,\n dataColumns: DataColumnsMapping,\n featureIdColumn: string\n): Feature<Geometry | null> {\n // Find feature id\n const idIdx = columns.indexOf(featureIdColumn);\n const id = row[idIdx];\n\n // Parse geometry columns to geojson\n const geomColumnIdx = columns.indexOf(geomColumn.column_name);\n const geometry = parseGeometry(row[geomColumnIdx].buffer);\n\n const properties = {};\n if (dataColumns) {\n for (const [key, value] of Object.entries(dataColumns)) {\n const idx = columns.indexOf(key);\n // @ts-ignore TODO - Check what happens if null?\n properties[value] = row[idx];\n }\n } else {\n // Put all columns except for the feature id and geometry in properties\n for (let i = 0; i < columns.length; i++) {\n if (i === idIdx || i === geomColumnIdx) {\n // eslint-disable-next-line no-continue\n continue;\n }\n\n const columnName = columns[i];\n properties[columnName] = row[i];\n }\n }\n\n return {\n id,\n type: 'Feature',\n geometry,\n properties\n };\n}\n\n/**\n * Get GeoPackage version from database\n * @param db database\n * @returns version string. One of '1.0', '1.1', '1.2'\n */\n\n// @ts-ignore\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nfunction getGeopackageVersion(db: Database): string | null {\n const textDecoder = new TextDecoder();\n\n // Read application id from SQLite metadata\n const applicationIdQuery = db.exec('PRAGMA application_id;')[0];\n const applicationId = applicationIdQuery.values[0][0];\n\n // Convert 4-byte signed int32 application id to text\n const buffer = new ArrayBuffer(4);\n const view = new DataView(buffer);\n view.setInt32(0, Number(applicationId));\n const versionString = textDecoder.decode(buffer);\n\n if (versionString === 'GP10') {\n return '1.0';\n }\n\n if (versionString === 'GP11') {\n return '1.1';\n }\n\n // If versionString is GPKG, then read user_version\n const userVersionQuery = db.exec('PRAGMA user_version;')[0];\n const userVersionInt = userVersionQuery.values[0][0];\n\n if (userVersionInt && userVersionInt < 10300) {\n return '1.2';\n }\n\n return null;\n}\n\n/**\n * Find name of feature id column in table\n * The feature ID is the primary key of the table.\n * http://www.geopackage.org/spec121/#feature_user_tables\n *\n * @param db database\n * @param tableName name of table\n * @return name of feature id column\n */\nfunction getFeatureIdName(db: Database, tableName: string): string | null {\n // Again, not possible to parameterize table name?\n const stmt = db.prepare(`PRAGMA table_info(\\`${tableName}\\`)`);\n\n while (stmt.step()) {\n const pragmaTableInfo = stmt.getAsObject() as unknown as PragmaTableInfoRow;\n const {name, pk} = pragmaTableInfo;\n if (pk) {\n return name;\n }\n }\n\n // Is it guaranteed for there always to be at least one primary key column in the table?\n return null;\n}\n\n/**\n * Parse geometry buffer\n * GeoPackage vector geometries are slightly extended past the WKB standard\n * See: https://www.geopackage.org/spec121/#gpb_format\n *\n * @param arrayBuffer geometry buffer\n * @return GeoJSON geometry (in original CRS)\n */\nfunction parseGeometry(arrayBuffer: ArrayBuffer): Geometry | null {\n const view = new DataView(arrayBuffer);\n const {envelopeLength, emptyGeometry} = parseGeometryBitFlags(view.getUint8(3));\n\n // A Feature object has a member with the name \"geometry\". The value of the\n // geometry member SHALL be either a Geometry object as defined above or, in\n // the case that the Feature is unlocated, a JSON null value.\n /** @see https://tools.ietf.org/html/rfc7946#section-3.2 */\n if (emptyGeometry) {\n return null;\n }\n\n // Do I need to find the srid here? Is it necessarily the same for every\n // geometry in a table?\n // const srid = view.getInt32(4, littleEndian);\n\n // 2 byte magic, 1 byte version, 1 byte flags, 4 byte int32 srid\n const wkbOffset = 8 + envelopeLength;\n\n // Loaders should not depend on `core` and the context passed to the main loader doesn't include a\n // `parseSync` option, so instead we call parseSync directly on WKBLoader\n const binaryGeometry = WKBLoader.parseSync(arrayBuffer.slice(wkbOffset));\n\n return binaryToGeometry(binaryGeometry);\n}\n\n/**\n * Parse geometry header flags\n * https://www.geopackage.org/spec121/#flags_layout\n *\n * @param byte uint8 number representing flags\n * @return object representing information from bit flags\n */\nfunction parseGeometryBitFlags(byte: number): GeometryBitFlags {\n // Are header values little endian?\n const envelopeValue = (byte & 0b00001110) / 2;\n\n // TODO: Not sure the best way to handle this. Throw an error if envelopeValue outside 0-7?\n const envelopeLength = ENVELOPE_BYTE_LENGTHS[envelopeValue] as number;\n\n return {\n littleEndian: Boolean(byte & 0b00000001),\n envelopeLength,\n emptyGeometry: Boolean(byte & 0b00010000),\n extendedGeometryType: Boolean(byte & 0b00100000)\n };\n}\n\n/**\n * Find geometry column in given vector table\n *\n * @param db GeoPackage object\n * @param tableName Name of vector table\n * @returns Array of geometry column definitions\n */\nfunction getGeometryColumn(db: Database, tableName: string): GeometryColumnsRow {\n const stmt = db.prepare('SELECT * FROM gpkg_geometry_columns WHERE table_name=:tableName;');\n stmt.bind({':tableName': tableName});\n\n // > Requirement 30\n // > A feature table SHALL have only one geometry column.\n // https://www.geopackage.org/spec121/#feature_user_tables\n // So we should need one and only one step, given that we use the WHERE clause in the SQL query\n // above\n stmt.step();\n const geometryColumn = stmt.getAsObject() as unknown as GeometryColumnsRow;\n return geometryColumn;\n}\n\n/**\n * Find property columns in given vector table\n * @param db GeoPackage object\n * @param tableName Name of vector table\n * @returns Mapping from table column names to property name\n */\nfunction getDataColumns(db: Database, tableName: string): DataColumnsMapping | null {\n // gpkg_data_columns is not required to exist\n // https://www.geopackage.org/spec121/#extension_schema\n let stmt: Statement;\n try {\n stmt = db.prepare('SELECT * FROM gpkg_data_columns WHERE table_name=:tableName;');\n } catch (error) {\n if ((error as Error).message.includes('no such table')) {\n return null;\n }\n\n throw error;\n }\n\n stmt.bind({':tableName': tableName});\n\n // Convert DataColumnsRow object this to a key-value {column_name: name}\n const result: DataColumnsMapping = {};\n while (stmt.step()) {\n const column = stmt.getAsObject() as unknown as DataColumnsRow;\n const {column_name, name} = column;\n result[column_name] = name || null;\n }\n\n return result;\n}\n\n/**\n * Get arrow schema\n * @param db GeoPackage object\n * @param tableName table name\n * @returns Arrow-like Schema\n */\nfunction getArrowSchema(db: Database, tableName: string): Schema {\n const stmt = db.prepare(`PRAGMA table_info(\\`${tableName}\\`)`);\n\n const fields: Field[] = [];\n while (stmt.step()) {\n const pragmaTableInfo = stmt.getAsObject() as unknown as PragmaTableInfoRow;\n const {name, type, notnull} = pragmaTableInfo;\n const schemaType = SQL_TYPE_MAPPING[type] && new SQL_TYPE_MAPPING[type]();\n const field = new Field(name, schemaType, !notnull);\n fields.push(field);\n }\n\n return new Schema(fields);\n}\n\nfunction formatTablesAsGeojson(tables: Tables<ObjectRowTable>): Record<string, Feature[]> {\n const geojsonMap = {};\n for (const table of tables.tables) {\n geojsonMap[table.name] = table.table.data;\n }\n\n return geojsonMap;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"parse-geopackage.js","names":["initSqlJs","WKBLoader","Schema","Field","Bool","Utf8","Float64","Int32","Int8","Int16","Float32","Binary","binaryToGeometry","transformGeoJsonCoords","Proj4Projection","DEFAULT_SQLJS_CDN","ENVELOPE_BYTE_LENGTHS","SQL_TYPE_MAPPING","BOOLEAN","TINYINT","SMALLINT","MEDIUMINT","INT","INTEGER","FLOAT","DOUBLE","REAL","TEXT","BLOB","DATE","DATETIME","GEOMETRY","POINT","LINESTRING","POLYGON","MULTIPOINT","MULTILINESTRING","MULTIPOLYGON","GEOMETRYCOLLECTION","parseGeoPackage","arrayBuffer","options","sqlJsCDN","geopackage","reproject","_targetCrs","format","gis","db","loadDatabase","tables","listVectorTables","projections","getProjections","outputTables","shape","table","table_name","tableName","push","name","getVectorTable","formatTablesAsGeojson","SQL","locateFile","file","concat","Database","Uint8Array","stmt","prepare","vectorTablesInfo","step","vectorTableInfo","getAsObject","_ref","dataColumns","getDataColumns","geomColumn","getGeometryColumn","featureIdColumn","getFeatureIdName","columns","values","exec","projection","geomColumnProjStr","srs_id","from","to","geojsonFeatures","row","geojsonFeature","constructGeoJsonFeature","schema","getArrowSchema","data","project","projectionMapping","srsInfo","definition","idIdx","indexOf","id","geomColumnIdx","column_name","geometry","parseGeometry","buffer","properties","key","value","Object","entries","idx","i","length","columnName","type","getGeopackageVersion","textDecoder","TextDecoder","applicationIdQuery","applicationId","ArrayBuffer","view","DataView","setInt32","Number","versionString","decode","userVersionQuery","userVersionInt","pragmaTableInfo","pk","envelopeLength","emptyGeometry","parseGeometryBitFlags","getUint8","wkbOffset","binaryGeometry","parseSync","slice","byte","envelopeValue","littleEndian","Boolean","extendedGeometryType","bind","geometryColumn","error","message","includes","result","column","fields","notnull","schemaType","field","geojsonMap"],"sources":["../../../src/lib/parse-geopackage.ts"],"sourcesContent":["/* eslint-disable camelcase, @typescript-eslint/no-use-before-define */\nimport type {GeoPackageLoaderOptions} from '../geopackage-loader';\nimport initSqlJs, {SqlJsStatic, Database, Statement} from 'sql.js';\nimport {WKBLoader} from '@loaders.gl/wkt';\nimport {\n Schema,\n Field,\n Geometry,\n DataType,\n Bool,\n Utf8,\n Float64,\n Int32,\n Int8,\n Int16,\n Float32,\n Binary,\n Tables,\n ObjectRowTable,\n Feature\n} from '@loaders.gl/schema';\nimport {binaryToGeometry, transformGeoJsonCoords} from '@loaders.gl/gis';\nimport {Proj4Projection} from '@math.gl/proj4';\nimport {\n GeometryColumnsRow,\n ContentsRow,\n SpatialRefSysRow,\n ProjectionMapping,\n GeometryBitFlags,\n DataColumnsRow,\n DataColumnsMapping,\n PragmaTableInfoRow,\n SQLiteTypes,\n GeoPackageGeometryTypes\n} from './types';\n\n// We pin to the same version as sql.js that we use.\n// As of March 2022, versions 1.6.0, 1.6.1, and 1.6.2 of sql.js appeared not to work.\nexport const DEFAULT_SQLJS_CDN = 'https://cdnjs.cloudflare.com/ajax/libs/sql.js/1.5.0/';\n\n// https://www.geopackage.org/spec121/#flags_layout\nconst ENVELOPE_BYTE_LENGTHS = {\n 0: 0,\n 1: 32,\n 2: 48,\n 3: 48,\n 4: 64,\n // values 5-7 are invalid and _should_ never show up\n 5: 0,\n 6: 0,\n 7: 0\n};\n\n// Documentation: https://www.geopackage.org/spec130/index.html#table_column_data_types\nconst SQL_TYPE_MAPPING: {[type in SQLiteTypes | GeoPackageGeometryTypes]: typeof DataType} = {\n BOOLEAN: Bool,\n TINYINT: Int8,\n SMALLINT: Int16,\n MEDIUMINT: Int32,\n INT: Int32,\n INTEGER: Int32,\n FLOAT: Float32,\n DOUBLE: Float64,\n REAL: Float64,\n TEXT: Utf8,\n BLOB: Binary,\n DATE: Utf8,\n DATETIME: Utf8,\n GEOMETRY: Binary,\n POINT: Binary,\n LINESTRING: Binary,\n POLYGON: Binary,\n MULTIPOINT: Binary,\n MULTILINESTRING: Binary,\n MULTIPOLYGON: Binary,\n GEOMETRYCOLLECTION: Binary\n};\n\nexport default async function parseGeoPackage(\n arrayBuffer: ArrayBuffer,\n options?: GeoPackageLoaderOptions\n): Promise<Tables<ObjectRowTable> | Record<string, Feature[]>> {\n const {sqlJsCDN = DEFAULT_SQLJS_CDN} = options?.geopackage || {};\n const {reproject = false, _targetCrs = 'WGS84', format = 'tables'} = options?.gis || {};\n\n const db = await loadDatabase(arrayBuffer, sqlJsCDN);\n const tables = listVectorTables(db);\n const projections = getProjections(db);\n\n // Mapping from tableName to geojson feature collection\n const outputTables: Tables<ObjectRowTable> = {\n shape: 'tables',\n tables: []\n };\n\n for (const table of tables) {\n const {table_name: tableName} = table;\n outputTables.tables.push({\n name: tableName,\n table: getVectorTable(db, tableName, projections, {\n reproject,\n _targetCrs\n })\n });\n }\n\n if (format === 'geojson') {\n return formatTablesAsGeojson(outputTables);\n }\n\n return outputTables;\n}\n\n/**\n * Initialize SQL.js and create database\n *\n * @param arrayBuffer input bytes\n * @return SQL.js database object\n */\nasync function loadDatabase(arrayBuffer: ArrayBuffer, sqlJsCDN: string | null): Promise<Database> {\n // In Node, `locateFile` must not be passed\n let SQL: SqlJsStatic;\n if (sqlJsCDN) {\n SQL = await initSqlJs({\n locateFile: (file) => `${sqlJsCDN}${file}`\n });\n } else {\n SQL = await initSqlJs();\n }\n return new SQL.Database(new Uint8Array(arrayBuffer));\n}\n\n/**\n * Find all vector tables in GeoPackage\n * This queries the `gpkg_contents` table to find a list of vector tables\n *\n * @param db GeoPackage to query\n * @return list of table references\n */\nfunction listVectorTables(db: Database): ContentsRow[] {\n // The gpkg_contents table can have at least three categorical values for\n // data_type.\n // - 'features' refers to a vector geometry table\n // (https://www.geopackage.org/spec121/#_contents_2)\n // - 'tiles' refers to a raster table\n // (https://www.geopackage.org/spec121/#_contents_3)\n // - 'attributes' refers to a data table with no geometry\n // (https://www.geopackage.org/spec121/#_contents_4).\n\n // We hard code 'features' because for now we don't support raster data or pure attribute data\n // eslint-disable-next-line quotes\n const stmt = db.prepare(\"SELECT * FROM gpkg_contents WHERE data_type='features';\");\n\n const vectorTablesInfo: ContentsRow[] = [];\n while (stmt.step()) {\n const vectorTableInfo = stmt.getAsObject() as unknown as ContentsRow;\n vectorTablesInfo.push(vectorTableInfo);\n }\n\n return vectorTablesInfo;\n}\n\n/**\n * Load geometries from vector table\n *\n * @param db GeoPackage object\n * @param tableName name of vector table to query\n * @param projections keys are srs_id values, values are WKT strings\n * @returns Array of GeoJSON Feature objects\n */\nfunction getVectorTable(\n db: Database,\n tableName: string,\n projections: ProjectionMapping,\n {reproject, _targetCrs}: {reproject: boolean; _targetCrs: string}\n): ObjectRowTable {\n const dataColumns = getDataColumns(db, tableName);\n const geomColumn = getGeometryColumn(db, tableName);\n const featureIdColumn = getFeatureIdName(db, tableName);\n\n // Get vector features from table\n // Don't think it's possible to parameterize the table name in SQLite?\n const {columns, values} = db.exec(`SELECT * FROM \\`${tableName}\\`;`)[0];\n\n let projection;\n if (reproject) {\n const geomColumnProjStr = projections[geomColumn.srs_id];\n projection = new Proj4Projection({\n from: geomColumnProjStr,\n to: _targetCrs\n });\n }\n\n const geojsonFeatures: object[] = [];\n for (const row of values) {\n const geojsonFeature = constructGeoJsonFeature(\n columns,\n row,\n geomColumn,\n // @ts-ignore\n dataColumns,\n featureIdColumn\n );\n geojsonFeatures.push(geojsonFeature);\n }\n\n const schema = getArrowSchema(db, tableName);\n if (projection) {\n return {\n data: transformGeoJsonCoords(geojsonFeatures, projection.project),\n schema,\n shape: 'object-row-table'\n };\n }\n\n return {data: geojsonFeatures, schema, shape: 'object-row-table'};\n}\n\n/**\n * Find all projections defined in GeoPackage\n * This queries the gpkg_spatial_ref_sys table\n * @param db GeoPackage object\n * @returns mapping from srid to WKT projection string\n */\nfunction getProjections(db: Database): ProjectionMapping {\n // Query gpkg_spatial_ref_sys to get srid: srtext mappings\n const stmt = db.prepare('SELECT * FROM gpkg_spatial_ref_sys;');\n\n const projectionMapping: ProjectionMapping = {};\n while (stmt.step()) {\n const srsInfo = stmt.getAsObject() as unknown as SpatialRefSysRow;\n const {srs_id, definition} = srsInfo;\n projectionMapping[srs_id] = definition;\n }\n\n return projectionMapping;\n}\n\n/**\n * Construct single GeoJSON feature given row's data\n * @param columns array of ordered column identifiers\n * @param row array of ordered values representing row's data\n * @param geomColumn geometry column metadata\n * @param dataColumns mapping from table column names to property name\n * @returns GeoJSON Feature object\n */\nfunction constructGeoJsonFeature(\n columns: string[],\n row: any[],\n geomColumn: GeometryColumnsRow,\n dataColumns: DataColumnsMapping,\n featureIdColumn: string\n): Feature<Geometry | null> {\n // Find feature id\n const idIdx = columns.indexOf(featureIdColumn);\n const id = row[idIdx];\n\n // Parse geometry columns to geojson\n const geomColumnIdx = columns.indexOf(geomColumn.column_name);\n const geometry = parseGeometry(row[geomColumnIdx].buffer);\n\n const properties = {};\n if (dataColumns) {\n for (const [key, value] of Object.entries(dataColumns)) {\n const idx = columns.indexOf(key);\n // @ts-ignore TODO - Check what happens if null?\n properties[value] = row[idx];\n }\n } else {\n // Put all columns except for the feature id and geometry in properties\n for (let i = 0; i < columns.length; i++) {\n if (i === idIdx || i === geomColumnIdx) {\n // eslint-disable-next-line no-continue\n continue;\n }\n\n const columnName = columns[i];\n properties[columnName] = row[i];\n }\n }\n\n return {\n id,\n type: 'Feature',\n geometry,\n properties\n };\n}\n\n/**\n * Get GeoPackage version from database\n * @param db database\n * @returns version string. One of '1.0', '1.1', '1.2'\n */\n\n// @ts-ignore\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nfunction getGeopackageVersion(db: Database): string | null {\n const textDecoder = new TextDecoder();\n\n // Read application id from SQLite metadata\n const applicationIdQuery = db.exec('PRAGMA application_id;')[0];\n const applicationId = applicationIdQuery.values[0][0];\n\n // Convert 4-byte signed int32 application id to text\n const buffer = new ArrayBuffer(4);\n const view = new DataView(buffer);\n view.setInt32(0, Number(applicationId));\n const versionString = textDecoder.decode(buffer);\n\n if (versionString === 'GP10') {\n return '1.0';\n }\n\n if (versionString === 'GP11') {\n return '1.1';\n }\n\n // If versionString is GPKG, then read user_version\n const userVersionQuery = db.exec('PRAGMA user_version;')[0];\n const userVersionInt = userVersionQuery.values[0][0];\n\n if (userVersionInt && typeof userVersionInt === 'number' && userVersionInt < 10300) {\n return '1.2';\n }\n\n return null;\n}\n\n/**\n * Find name of feature id column in table\n * The feature ID is the primary key of the table.\n * http://www.geopackage.org/spec121/#feature_user_tables\n *\n * @param db database\n * @param tableName name of table\n * @return name of feature id column\n */\nfunction getFeatureIdName(db: Database, tableName: string): string | null {\n // Again, not possible to parameterize table name?\n const stmt = db.prepare(`PRAGMA table_info(\\`${tableName}\\`)`);\n\n while (stmt.step()) {\n const pragmaTableInfo = stmt.getAsObject() as unknown as PragmaTableInfoRow;\n const {name, pk} = pragmaTableInfo;\n if (pk) {\n return name;\n }\n }\n\n // Is it guaranteed for there always to be at least one primary key column in the table?\n return null;\n}\n\n/**\n * Parse geometry buffer\n * GeoPackage vector geometries are slightly extended past the WKB standard\n * See: https://www.geopackage.org/spec121/#gpb_format\n *\n * @param arrayBuffer geometry buffer\n * @return GeoJSON geometry (in original CRS)\n */\nfunction parseGeometry(arrayBuffer: ArrayBuffer): Geometry | null {\n const view = new DataView(arrayBuffer);\n const {envelopeLength, emptyGeometry} = parseGeometryBitFlags(view.getUint8(3));\n\n // A Feature object has a member with the name \"geometry\". The value of the\n // geometry member SHALL be either a Geometry object as defined above or, in\n // the case that the Feature is unlocated, a JSON null value.\n /** @see https://tools.ietf.org/html/rfc7946#section-3.2 */\n if (emptyGeometry) {\n return null;\n }\n\n // Do I need to find the srid here? Is it necessarily the same for every\n // geometry in a table?\n // const srid = view.getInt32(4, littleEndian);\n\n // 2 byte magic, 1 byte version, 1 byte flags, 4 byte int32 srid\n const wkbOffset = 8 + envelopeLength;\n\n // Loaders should not depend on `core` and the context passed to the main loader doesn't include a\n // `parseSync` option, so instead we call parseSync directly on WKBLoader\n const binaryGeometry = WKBLoader.parseSync(arrayBuffer.slice(wkbOffset));\n\n return binaryToGeometry(binaryGeometry);\n}\n\n/**\n * Parse geometry header flags\n * https://www.geopackage.org/spec121/#flags_layout\n *\n * @param byte uint8 number representing flags\n * @return object representing information from bit flags\n */\nfunction parseGeometryBitFlags(byte: number): GeometryBitFlags {\n // Are header values little endian?\n const envelopeValue = (byte & 0b00001110) / 2;\n\n // TODO: Not sure the best way to handle this. Throw an error if envelopeValue outside 0-7?\n const envelopeLength = ENVELOPE_BYTE_LENGTHS[envelopeValue] as number;\n\n return {\n littleEndian: Boolean(byte & 0b00000001),\n envelopeLength,\n emptyGeometry: Boolean(byte & 0b00010000),\n extendedGeometryType: Boolean(byte & 0b00100000)\n };\n}\n\n/**\n * Find geometry column in given vector table\n *\n * @param db GeoPackage object\n * @param tableName Name of vector table\n * @returns Array of geometry column definitions\n */\nfunction getGeometryColumn(db: Database, tableName: string): GeometryColumnsRow {\n const stmt = db.prepare('SELECT * FROM gpkg_geometry_columns WHERE table_name=:tableName;');\n stmt.bind({':tableName': tableName});\n\n // > Requirement 30\n // > A feature table SHALL have only one geometry column.\n // https://www.geopackage.org/spec121/#feature_user_tables\n // So we should need one and only one step, given that we use the WHERE clause in the SQL query\n // above\n stmt.step();\n const geometryColumn = stmt.getAsObject() as unknown as GeometryColumnsRow;\n return geometryColumn;\n}\n\n/**\n * Find property columns in given vector table\n * @param db GeoPackage object\n * @param tableName Name of vector table\n * @returns Mapping from table column names to property name\n */\nfunction getDataColumns(db: Database, tableName: string): DataColumnsMapping | null {\n // gpkg_data_columns is not required to exist\n // https://www.geopackage.org/spec121/#extension_schema\n let stmt: Statement;\n try {\n stmt = db.prepare('SELECT * FROM gpkg_data_columns WHERE table_name=:tableName;');\n } catch (error) {\n if ((error as Error).message.includes('no such table')) {\n return null;\n }\n\n throw error;\n }\n\n stmt.bind({':tableName': tableName});\n\n // Convert DataColumnsRow object this to a key-value {column_name: name}\n const result: DataColumnsMapping = {};\n while (stmt.step()) {\n const column = stmt.getAsObject() as unknown as DataColumnsRow;\n const {column_name, name} = column;\n result[column_name] = name || null;\n }\n\n return result;\n}\n\n/**\n * Get arrow schema\n * @param db GeoPackage object\n * @param tableName table name\n * @returns Arrow-like Schema\n */\nfunction getArrowSchema(db: Database, tableName: string): Schema {\n const stmt = db.prepare(`PRAGMA table_info(\\`${tableName}\\`)`);\n\n const fields: Field[] = [];\n while (stmt.step()) {\n const pragmaTableInfo = stmt.getAsObject() as unknown as PragmaTableInfoRow;\n const {name, type, notnull} = pragmaTableInfo;\n const schemaType = SQL_TYPE_MAPPING[type] && new SQL_TYPE_MAPPING[type]();\n const field = new Field(name, schemaType, !notnull);\n fields.push(field);\n }\n\n return new Schema(fields);\n}\n\nfunction formatTablesAsGeojson(tables: Tables<ObjectRowTable>): Record<string, Feature[]> {\n const geojsonMap = {};\n for (const table of tables.tables) {\n geojsonMap[table.name] = table.table.data;\n }\n\n return geojsonMap;\n}\n"],"mappings":"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"}
@@ -244,7 +244,7 @@ function getGeopackageVersion(db) {
244
244
  // If versionString is GPKG, then read user_version
245
245
  const userVersionQuery = db.exec('PRAGMA user_version;')[0];
246
246
  const userVersionInt = userVersionQuery.values[0][0];
247
- if (userVersionInt && userVersionInt < 10300) {
247
+ if (userVersionInt && typeof userVersionInt === 'number' && userVersionInt < 10300) {
248
248
  return '1.2';
249
249
  }
250
250
  return null;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@loaders.gl/geopackage",
3
3
  "description": "GeoPackage data loaders",
4
- "version": "3.4.0-alpha.2",
4
+ "version": "3.4.0-alpha.4",
5
5
  "license": "MIT",
6
6
  "publishConfig": {
7
7
  "access": "public"
@@ -25,12 +25,12 @@
25
25
  ],
26
26
  "dependencies": {
27
27
  "@babel/runtime": "^7.3.1",
28
- "@loaders.gl/gis": "3.4.0-alpha.2",
29
- "@loaders.gl/schema": "3.4.0-alpha.2",
30
- "@loaders.gl/wkt": "3.4.0-alpha.2",
28
+ "@loaders.gl/gis": "3.4.0-alpha.4",
29
+ "@loaders.gl/schema": "3.4.0-alpha.4",
30
+ "@loaders.gl/wkt": "3.4.0-alpha.4",
31
31
  "@math.gl/proj4": "^3.5.1",
32
32
  "@types/sql.js": "^1.4.2",
33
33
  "sql.js": "1.5.0"
34
34
  },
35
- "gitHead": "f1c00c124d8d0c41a138ff40afb0d1a00711bf2e"
35
+ "gitHead": "f039a523df8b908a91f26c5ba8c4cfc1924b6140"
36
36
  }
@@ -320,7 +320,7 @@ function getGeopackageVersion(db: Database): string | null {
320
320
  const userVersionQuery = db.exec('PRAGMA user_version;')[0];
321
321
  const userVersionInt = userVersionQuery.values[0][0];
322
322
 
323
- if (userVersionInt && userVersionInt < 10300) {
323
+ if (userVersionInt && typeof userVersionInt === 'number' && userVersionInt < 10300) {
324
324
  return '1.2';
325
325
  }
326
326