@loaders.gl/geopackage 3.1.8 → 3.2.0-alpha.3

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,13 +1,17 @@
1
1
  "use strict";
2
2
 
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
3
+ var _typeof = require("@babel/runtime/helpers/typeof");
4
4
 
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
8
  exports.GeoPackageLoader = void 0;
9
9
 
10
- var _parseGeopackage = _interopRequireDefault(require("./lib/parse-geopackage"));
10
+ var _parseGeopackage = _interopRequireWildcard(require("./lib/parse-geopackage"));
11
+
12
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
13
+
14
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
11
15
 
12
16
  var VERSION = 'latest';
13
17
  var GeoPackageLoader = {
@@ -21,7 +25,10 @@ var GeoPackageLoader = {
21
25
  parse: _parseGeopackage.default,
22
26
  options: {
23
27
  geopackage: {
24
- sqlJsCDN: 'https://sql.js.org/dist/'
28
+ sqlJsCDN: _parseGeopackage.DEFAULT_SQLJS_CDN
29
+ },
30
+ gis: {
31
+ format: 'tables'
25
32
  }
26
33
  }
27
34
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/geopackage-loader.ts"],"names":["VERSION","GeoPackageLoader","id","name","module","version","extensions","mimeTypes","category","parse","parseGeoPackage","options","geopackage","sqlJsCDN"],"mappings":";;;;;;;;;AACA;;AAKA,IAAMA,OAAO,GAAG,QAAhB;AAcO,IAAMC,gBAAkC,GAAG;AAChDC,EAAAA,EAAE,EAAE,YAD4C;AAEhDC,EAAAA,IAAI,EAAE,YAF0C;AAGhDC,EAAAA,MAAM,EAAE,YAHwC;AAIhDC,EAAAA,OAAO,EAAEL,OAJuC;AAKhDM,EAAAA,UAAU,EAAE,CAAC,MAAD,CALoC;AAMhDC,EAAAA,SAAS,EAAE,CAAC,gCAAD,CANqC;AAOhDC,EAAAA,QAAQ,EAAE,UAPsC;AAQhDC,EAAAA,KAAK,EAAEC,wBARyC;AAShDC,EAAAA,OAAO,EAAE;AACPC,IAAAA,UAAU,EAAE;AACVC,MAAAA,QAAQ,EAAE;AADA;AADL;AATuC,CAA3C","sourcesContent":["import type {LoaderWithParser, LoaderOptions} from '@loaders.gl/loader-utils';\nimport parseGeoPackage 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 };\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: 'https://sql.js.org/dist/'\n }\n }\n};\n"],"file":"geopackage-loader.js"}
1
+ {"version":3,"sources":["../../src/geopackage-loader.ts"],"names":["VERSION","GeoPackageLoader","id","name","module","version","extensions","mimeTypes","category","parse","parseGeoPackage","options","geopackage","sqlJsCDN","DEFAULT_SQLJS_CDN","gis","format"],"mappings":";;;;;;;;;AACA;;;;;;AAKA,IAAMA,OAAO,GAAG,QAAhB;AAeO,IAAMC,gBAAkC,GAAG;AAChDC,EAAAA,EAAE,EAAE,YAD4C;AAEhDC,EAAAA,IAAI,EAAE,YAF0C;AAGhDC,EAAAA,MAAM,EAAE,YAHwC;AAIhDC,EAAAA,OAAO,EAAEL,OAJuC;AAKhDM,EAAAA,UAAU,EAAE,CAAC,MAAD,CALoC;AAMhDC,EAAAA,SAAS,EAAE,CAAC,gCAAD,CANqC;AAOhDC,EAAAA,QAAQ,EAAE,UAPsC;AAQhDC,EAAAA,KAAK,EAAEC,wBARyC;AAShDC,EAAAA,OAAO,EAAE;AACPC,IAAAA,UAAU,EAAE;AACVC,MAAAA,QAAQ,EAAEC;AADA,KADL;AAIPC,IAAAA,GAAG,EAAE;AACHC,MAAAA,MAAM,EAAE;AADL;AAJE;AATuC,CAA3C","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"],"file":"geopackage-loader.js"}
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
8
  exports.default = parseGeoPackage;
9
+ exports.DEFAULT_SQLJS_CDN = void 0;
9
10
 
10
11
  var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
11
12
 
@@ -29,6 +30,8 @@ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o =
29
30
 
30
31
  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; }
31
32
 
33
+ var DEFAULT_SQLJS_CDN = 'https://cdnjs.cloudflare.com/ajax/libs/sql.js/1.5.0/';
34
+ exports.DEFAULT_SQLJS_CDN = DEFAULT_SQLJS_CDN;
32
35
  var ENVELOPE_BYTE_LENGTHS = {
33
36
  0: 0,
34
37
  1: 32,
@@ -53,7 +56,14 @@ var SQL_TYPE_MAPPING = {
53
56
  BLOB: _schema.Binary,
54
57
  DATE: _schema.Utf8,
55
58
  DATETIME: _schema.Utf8,
56
- GEOMETRY: _schema.Binary
59
+ GEOMETRY: _schema.Binary,
60
+ POINT: _schema.Binary,
61
+ LINESTRING: _schema.Binary,
62
+ POLYGON: _schema.Binary,
63
+ MULTIPOINT: _schema.Binary,
64
+ MULTILINESTRING: _schema.Binary,
65
+ MULTIPOLYGON: _schema.Binary,
66
+ GEOMETRYCOLLECTION: _schema.Binary
57
67
  };
58
68
 
59
69
  function parseGeoPackage(_x, _x2) {
@@ -62,14 +72,14 @@ function parseGeoPackage(_x, _x2) {
62
72
 
63
73
  function _parseGeoPackage() {
64
74
  _parseGeoPackage = (0, _asyncToGenerator2.default)(_regenerator.default.mark(function _callee(arrayBuffer, options) {
65
- var _ref2, _ref2$sqlJsCDN, sqlJsCDN, _ref3, _ref3$reproject, reproject, _ref3$_targetCrs, _targetCrs, db, tables, projections, result, _iterator2, _step2, table, tableName;
75
+ var _ref2, _ref2$sqlJsCDN, sqlJsCDN, _ref3, _ref3$reproject, reproject, _ref3$_targetCrs, _targetCrs, _ref3$format, format, db, tables, projections, outputTables, _iterator3, _step3, table, tableName;
66
76
 
67
77
  return _regenerator.default.wrap(function _callee$(_context) {
68
78
  while (1) {
69
79
  switch (_context.prev = _context.next) {
70
80
  case 0:
71
- _ref2 = (options === null || options === void 0 ? void 0 : options.geopackage) || {}, _ref2$sqlJsCDN = _ref2.sqlJsCDN, sqlJsCDN = _ref2$sqlJsCDN === void 0 ? 'https://sql.js.org/dist/' : _ref2$sqlJsCDN;
72
- _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;
81
+ _ref2 = (options === null || options === void 0 ? void 0 : options.geopackage) || {}, _ref2$sqlJsCDN = _ref2.sqlJsCDN, sqlJsCDN = _ref2$sqlJsCDN === void 0 ? DEFAULT_SQLJS_CDN : _ref2$sqlJsCDN;
82
+ _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;
73
83
  _context.next = 4;
74
84
  return loadDatabase(arrayBuffer, sqlJsCDN);
75
85
 
@@ -77,27 +87,41 @@ function _parseGeoPackage() {
77
87
  db = _context.sent;
78
88
  tables = listVectorTables(db);
79
89
  projections = getProjections(db);
80
- result = {};
81
- _iterator2 = _createForOfIteratorHelper(tables);
90
+ outputTables = {
91
+ shape: 'tables',
92
+ tables: []
93
+ };
94
+ _iterator3 = _createForOfIteratorHelper(tables);
82
95
 
83
96
  try {
84
- for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
85
- table = _step2.value;
97
+ for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
98
+ table = _step3.value;
86
99
  tableName = table.table_name;
87
- result[tableName] = getVectorTable(db, tableName, projections, {
88
- reproject: reproject,
89
- _targetCrs: _targetCrs
100
+ outputTables.tables.push({
101
+ name: tableName,
102
+ table: getVectorTable(db, tableName, projections, {
103
+ reproject: reproject,
104
+ _targetCrs: _targetCrs
105
+ })
90
106
  });
91
107
  }
92
108
  } catch (err) {
93
- _iterator2.e(err);
109
+ _iterator3.e(err);
94
110
  } finally {
95
- _iterator2.f();
111
+ _iterator3.f();
96
112
  }
97
113
 
98
- return _context.abrupt("return", result);
114
+ if (!(format === 'geojson')) {
115
+ _context.next = 12;
116
+ break;
117
+ }
118
+
119
+ return _context.abrupt("return", formatTablesAsGeojson(outputTables));
120
+
121
+ case 12:
122
+ return _context.abrupt("return", outputTables);
99
123
 
100
- case 11:
124
+ case 13:
101
125
  case "end":
102
126
  return _context.stop();
103
127
  }
@@ -207,14 +231,16 @@ function getVectorTable(db, tableName, projections, _ref) {
207
231
 
208
232
  if (projection) {
209
233
  return {
210
- geojsonFeatures: (0, _gis.transformGeoJsonCoords)(geojsonFeatures, projection.project),
211
- schema: schema
234
+ data: (0, _gis.transformGeoJsonCoords)(geojsonFeatures, projection.project),
235
+ schema: schema,
236
+ shape: 'object-row-table'
212
237
  };
213
238
  }
214
239
 
215
240
  return {
216
- geojsonFeatures: geojsonFeatures,
217
- schema: schema
241
+ data: geojsonFeatures,
242
+ schema: schema,
243
+ shape: 'object-row-table'
218
244
  };
219
245
  }
220
246
 
@@ -386,10 +412,31 @@ function getArrowSchema(db, tableName) {
386
412
  var name = pragmaTableInfo.name,
387
413
  type = pragmaTableInfo.type,
388
414
  notnull = pragmaTableInfo.notnull;
389
- var field = new _schema.Field(name, new SQL_TYPE_MAPPING[type](), !notnull);
415
+ var schemaType = SQL_TYPE_MAPPING[type] && new SQL_TYPE_MAPPING[type]();
416
+ var field = new _schema.Field(name, schemaType, !notnull);
390
417
  fields.push(field);
391
418
  }
392
419
 
393
420
  return new _schema.Schema(fields);
394
421
  }
422
+
423
+ function formatTablesAsGeojson(tables) {
424
+ var geojsonMap = {};
425
+
426
+ var _iterator2 = _createForOfIteratorHelper(tables.tables),
427
+ _step2;
428
+
429
+ try {
430
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
431
+ var table = _step2.value;
432
+ geojsonMap[table.name] = table.table.data;
433
+ }
434
+ } catch (err) {
435
+ _iterator2.e(err);
436
+ } finally {
437
+ _iterator2.f();
438
+ }
439
+
440
+ return geojsonMap;
441
+ }
395
442
  //# sourceMappingURL=parse-geopackage.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/parse-geopackage.ts"],"names":["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","parseGeoPackage","arrayBuffer","options","geopackage","sqlJsCDN","gis","reproject","_targetCrs","loadDatabase","db","tables","listVectorTables","projections","getProjections","result","table","tableName","table_name","getVectorTable","locateFile","file","SQL","Database","Uint8Array","stmt","prepare","vectorTablesInfo","step","vectorTableInfo","getAsObject","push","dataColumns","getDataColumns","geomColumn","getGeometryColumn","featureIdColumn","getFeatureIdName","exec","columns","values","projection","geomColumnProjStr","srs_id","Proj4Projection","from","to","geojsonFeatures","row","geojsonFeature","constructGeoJsonFeature","schema","getArrowSchema","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","name","pk","parseGeometryBitFlags","getUint8","envelopeLength","emptyGeometry","wkbOffset","binaryGeometry","WKBLoader","parseSync","slice","byte","envelopeValue","littleEndian","Boolean","extendedGeometryType","bind","geometryColumn","error","message","includes","column","fields","notnull","field","Field","Schema"],"mappings":";;;;;;;;;;;;;;;AAEA;;AACA;;AACA;;AAcA;;AACA;;;;;;;;AAcA,IAAMA,qBAAqB,GAAG;AAC5B,KAAG,CADyB;AAE5B,KAAG,EAFyB;AAG5B,KAAG,EAHyB;AAI5B,KAAG,EAJyB;AAK5B,KAAG,EALyB;AAO5B,KAAG,CAPyB;AAQ5B,KAAG,CARyB;AAS5B,KAAG;AATyB,CAA9B;AAaA,IAAMC,gBAA0D,GAAG;AACjEC,EAAAA,OAAO,EAAEC,YADwD;AAEjEC,EAAAA,OAAO,EAAEC,YAFwD;AAGjEC,EAAAA,QAAQ,EAAEC,aAHuD;AAIjEC,EAAAA,SAAS,EAAEC,aAJsD;AAKjEC,EAAAA,GAAG,EAAED,aAL4D;AAMjEE,EAAAA,OAAO,EAAEF,aANwD;AAOjEG,EAAAA,KAAK,EAAEC,eAP0D;AAQjEC,EAAAA,MAAM,EAAEC,eARyD;AASjEC,EAAAA,IAAI,EAAED,eAT2D;AAUjEE,EAAAA,IAAI,EAAEC,YAV2D;AAWjEC,EAAAA,IAAI,EAAEC,cAX2D;AAYjEC,EAAAA,IAAI,EAAEH,YAZ2D;AAajEI,EAAAA,QAAQ,EAAEJ,YAbuD;AAcjEK,EAAAA,QAAQ,EAAEH;AAduD,CAAnE;;SAiB8BI,e;;;;;+EAAf,iBACbC,WADa,EAEbC,OAFa;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,oBAImC,CAAAA,OAAO,SAAP,IAAAA,OAAO,WAAP,YAAAA,OAAO,CAAEC,UAAT,KAAuB,EAJ1D,yBAINC,QAJM,EAINA,QAJM,+BAIK,0BAJL;AAAA,oBAKqC,CAAAF,OAAO,SAAP,IAAAA,OAAO,WAAP,YAAAA,OAAO,CAAEG,GAAT,KAAgB,EALrD,0BAKNC,SALM,EAKNA,SALM,gCAKM,KALN,6CAKaC,UALb,EAKaA,UALb,iCAK0B,OAL1B;AAAA;AAAA,mBAOIC,YAAY,CAACP,WAAD,EAAcG,QAAd,CAPhB;;AAAA;AAOPK,YAAAA,EAPO;AAQPC,YAAAA,MARO,GAQEC,gBAAgB,CAACF,EAAD,CARlB;AASPG,YAAAA,WATO,GASOC,cAAc,CAACJ,EAAD,CATrB;AAYPK,YAAAA,MAZO,GAYE,EAZF;AAAA,oDAaOJ,MAbP;;AAAA;AAab,qEAA4B;AAAjBK,gBAAAA,KAAiB;AACPC,gBAAAA,SADO,GACMD,KADN,CACnBE,UADmB;AAE1BH,gBAAAA,MAAM,CAACE,SAAD,CAAN,GAAoBE,cAAc,CAACT,EAAD,EAAKO,SAAL,EAAgBJ,WAAhB,EAA6B;AAC7DN,kBAAAA,SAAS,EAATA,SAD6D;AAE7DC,kBAAAA,UAAU,EAAVA;AAF6D,iBAA7B,CAAlC;AAID;AAnBY;AAAA;AAAA;AAAA;AAAA;;AAAA,6CAqBNO,MArBM;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,G;;;;SA8BAN,Y;;;;;4EAAf,kBAA4BP,WAA5B,EAAsDG,QAAtD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAGMA,QAHN;AAAA;AAAA;AAAA;;AAAA;AAAA,mBAIgB,kBAAU;AACpBe,cAAAA,UAAU,EAAE,oBAACC,IAAD;AAAA,iCAAahB,QAAb,SAAwBgB,IAAxB;AAAA;AADQ,aAAV,CAJhB;;AAAA;AAIIC,YAAAA,GAJJ;AAAA;AAAA;;AAAA;AAAA;AAAA,mBAQgB,mBARhB;;AAAA;AAQIA,YAAAA,GARJ;;AAAA;AAAA,8CAUS,IAAIA,GAAG,CAACC,QAAR,CAAiB,IAAIC,UAAJ,CAAetB,WAAf,CAAjB,CAVT;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,G;;;;AAoBA,SAASU,gBAAT,CAA0BF,EAA1B,EAAuD;AAYrD,MAAMe,IAAI,GAAGf,EAAE,CAACgB,OAAH,CAAW,yDAAX,CAAb;AAEA,MAAMC,gBAA+B,GAAG,EAAxC;;AACA,SAAOF,IAAI,CAACG,IAAL,EAAP,EAAoB;AAClB,QAAMC,eAAe,GAAGJ,IAAI,CAACK,WAAL,EAAxB;AACAH,IAAAA,gBAAgB,CAACI,IAAjB,CAAsBF,eAAtB;AACD;;AAED,SAAOF,gBAAP;AACD;;AAUD,SAASR,cAAT,CACET,EADF,EAEEO,SAFF,EAGEJ,WAHF,QAKU;AAAA,MADPN,SACO,QADPA,SACO;AAAA,MADIC,UACJ,QADIA,UACJ;AACR,MAAMwB,WAAW,GAAGC,cAAc,CAACvB,EAAD,EAAKO,SAAL,CAAlC;AACA,MAAMiB,UAAU,GAAGC,iBAAiB,CAACzB,EAAD,EAAKO,SAAL,CAApC;AACA,MAAMmB,eAAe,GAAGC,gBAAgB,CAAC3B,EAAD,EAAKO,SAAL,CAAxC;AAIA,kBAA0BP,EAAE,CAAC4B,IAAH,0BAA2BrB,SAA3B,SAA2C,CAA3C,CAA1B;AAAA,MAAOsB,OAAP,aAAOA,OAAP;AAAA,MAAgBC,MAAhB,aAAgBA,MAAhB;AAEA,MAAIC,UAAJ;;AACA,MAAIlC,SAAJ,EAAe;AACb,QAAMmC,iBAAiB,GAAG7B,WAAW,CAACqB,UAAU,CAACS,MAAZ,CAArC;AACAF,IAAAA,UAAU,GAAG,IAAIG,qBAAJ,CAAoB;AAC/BC,MAAAA,IAAI,EAAEH,iBADyB;AAE/BI,MAAAA,EAAE,EAAEtC;AAF2B,KAApB,CAAb;AAID;;AAED,MAAMuC,eAAyB,GAAG,EAAlC;;AAlBQ,6CAmBUP,MAnBV;AAAA;;AAAA;AAmBR,wDAA0B;AAAA,UAAfQ,GAAe;AACxB,UAAMC,cAAc,GAAGC,uBAAuB,CAC5CX,OAD4C,EAE5CS,GAF4C,EAG5Cd,UAH4C,EAK5CF,WAL4C,EAM5CI,eAN4C,CAA9C;AAQAW,MAAAA,eAAe,CAAChB,IAAhB,CAAqBkB,cAArB;AACD;AA7BO;AAAA;AAAA;AAAA;AAAA;;AA+BR,MAAME,MAAM,GAAGC,cAAc,CAAC1C,EAAD,EAAKO,SAAL,CAA7B;;AACA,MAAIwB,UAAJ,EAAgB;AACd,WAAO;AAACM,MAAAA,eAAe,EAAE,iCAAuBA,eAAvB,EAAwCN,UAAU,CAACY,OAAnD,CAAlB;AAA+EF,MAAAA,MAAM,EAANA;AAA/E,KAAP;AACD;;AAED,SAAO;AAACJ,IAAAA,eAAe,EAAfA,eAAD;AAAkBI,IAAAA,MAAM,EAANA;AAAlB,GAAP;AACD;;AAQD,SAASrC,cAAT,CAAwBJ,EAAxB,EAAyD;AAEvD,MAAMe,IAAI,GAAGf,EAAE,CAACgB,OAAH,CAAW,qCAAX,CAAb;AAEA,MAAM4B,iBAAoC,GAAG,EAA7C;;AACA,SAAO7B,IAAI,CAACG,IAAL,EAAP,EAAoB;AAClB,QAAM2B,OAAO,GAAG9B,IAAI,CAACK,WAAL,EAAhB;AACA,QAAOa,MAAP,GAA6BY,OAA7B,CAAOZ,MAAP;AAAA,QAAea,UAAf,GAA6BD,OAA7B,CAAeC,UAAf;AACAF,IAAAA,iBAAiB,CAACX,MAAD,CAAjB,GAA4Ba,UAA5B;AACD;;AAED,SAAOF,iBAAP;AACD;;AAUD,SAASJ,uBAAT,CACEX,OADF,EAEES,GAFF,EAGEd,UAHF,EAIEF,WAJF,EAKEI,eALF,EAME;AAEA,MAAMqB,KAAK,GAAGlB,OAAO,CAACmB,OAAR,CAAgBtB,eAAhB,CAAd;AACA,MAAMuB,EAAE,GAAGX,GAAG,CAACS,KAAD,CAAd;AAGA,MAAMG,aAAa,GAAGrB,OAAO,CAACmB,OAAR,CAAgBxB,UAAU,CAAC2B,WAA3B,CAAtB;AACA,MAAMC,QAAQ,GAAGC,aAAa,CAACf,GAAG,CAACY,aAAD,CAAH,CAAmBI,MAApB,CAA9B;AAEA,MAAMC,UAAU,GAAG,EAAnB;;AACA,MAAIjC,WAAJ,EAAiB;AACf,uCAA2BkC,MAAM,CAACC,OAAP,CAAenC,WAAf,CAA3B,qCAAwD;AAAnD;AAAA,UAAOoC,GAAP;AAAA,UAAYC,KAAZ;;AACH,UAAMC,GAAG,GAAG/B,OAAO,CAACmB,OAAR,CAAgBU,GAAhB,CAAZ;AAEAH,MAAAA,UAAU,CAACI,KAAD,CAAV,GAAoBrB,GAAG,CAACsB,GAAD,CAAvB;AACD;AACF,GAND,MAMO;AAEL,SAAK,IAAIC,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGhC,OAAO,CAACiC,MAA5B,EAAoCD,CAAC,EAArC,EAAyC;AACvC,UAAIA,CAAC,KAAKd,KAAN,IAAec,CAAC,KAAKX,aAAzB,EAAwC;AAEtC;AACD;;AAED,UAAMa,UAAU,GAAGlC,OAAO,CAACgC,CAAD,CAA1B;AACAN,MAAAA,UAAU,CAACQ,UAAD,CAAV,GAAyBzB,GAAG,CAACuB,CAAD,CAA5B;AACD;AACF;;AAED,SAAO;AACLZ,IAAAA,EAAE,EAAFA,EADK;AAELe,IAAAA,IAAI,EAAE,SAFD;AAGLZ,IAAAA,QAAQ,EAARA,QAHK;AAILG,IAAAA,UAAU,EAAVA;AAJK,GAAP;AAMD;;AAUD,SAASU,oBAAT,CAA8BjE,EAA9B,EAA2D;AACzD,MAAMkE,WAAW,GAAG,IAAIC,WAAJ,EAApB;AAGA,MAAMC,kBAAkB,GAAGpE,EAAE,CAAC4B,IAAH,CAAQ,wBAAR,EAAkC,CAAlC,CAA3B;AACA,MAAMyC,aAAa,GAAGD,kBAAkB,CAACtC,MAAnB,CAA0B,CAA1B,EAA6B,CAA7B,CAAtB;AAGA,MAAMwB,MAAM,GAAG,IAAIgB,WAAJ,CAAgB,CAAhB,CAAf;AACA,MAAMC,IAAI,GAAG,IAAIC,QAAJ,CAAalB,MAAb,CAAb;AACAiB,EAAAA,IAAI,CAACE,QAAL,CAAc,CAAd,EAAiBC,MAAM,CAACL,aAAD,CAAvB;AACA,MAAMM,aAAa,GAAGT,WAAW,CAACU,MAAZ,CAAmBtB,MAAnB,CAAtB;;AAEA,MAAIqB,aAAa,KAAK,MAAtB,EAA8B;AAC5B,WAAO,KAAP;AACD;;AAED,MAAIA,aAAa,KAAK,MAAtB,EAA8B;AAC5B,WAAO,KAAP;AACD;;AAGD,MAAME,gBAAgB,GAAG7E,EAAE,CAAC4B,IAAH,CAAQ,sBAAR,EAAgC,CAAhC,CAAzB;AACA,MAAMkD,cAAc,GAAGD,gBAAgB,CAAC/C,MAAjB,CAAwB,CAAxB,EAA2B,CAA3B,CAAvB;;AAEA,MAAIgD,cAAc,IAAIA,cAAc,GAAG,KAAvC,EAA8C;AAC5C,WAAO,KAAP;AACD;;AAED,SAAO,IAAP;AACD;;AAWD,SAASnD,gBAAT,CAA0B3B,EAA1B,EAAwCO,SAAxC,EAA0E;AAExE,MAAMQ,IAAI,GAAGf,EAAE,CAACgB,OAAH,8BAAkCT,SAAlC,QAAb;;AAEA,SAAOQ,IAAI,CAACG,IAAL,EAAP,EAAoB;AAClB,QAAM6D,eAAe,GAAGhE,IAAI,CAACK,WAAL,EAAxB;AACA,QAAO4D,IAAP,GAAmBD,eAAnB,CAAOC,IAAP;AAAA,QAAaC,EAAb,GAAmBF,eAAnB,CAAaE,EAAb;;AACA,QAAIA,EAAJ,EAAQ;AACN,aAAOD,IAAP;AACD;AACF;;AAGD,SAAO,IAAP;AACD;;AAUD,SAAS3B,aAAT,CAAuB7D,WAAvB,EAAkE;AAChE,MAAM+E,IAAI,GAAG,IAAIC,QAAJ,CAAahF,WAAb,CAAb;;AACA,8BAAwC0F,qBAAqB,CAACX,IAAI,CAACY,QAAL,CAAc,CAAd,CAAD,CAA7D;AAAA,MAAOC,cAAP,yBAAOA,cAAP;AAAA,MAAuBC,aAAvB,yBAAuBA,aAAvB;;AAMA,MAAIA,aAAJ,EAAmB;AACjB,WAAO,IAAP;AACD;;AAOD,MAAMC,SAAS,GAAG,IAAIF,cAAtB;;AAIA,MAAMG,cAAc,GAAGC,eAAUC,SAAV,CAAoBjG,WAAW,CAACkG,KAAZ,CAAkBJ,SAAlB,CAApB,CAAvB;;AAEA,SAAO,2BAAiBC,cAAjB,CAAP;AACD;;AASD,SAASL,qBAAT,CAA+BS,IAA/B,EAA+D;AAE7D,MAAMC,aAAa,GAAG,CAACD,IAAI,GAAG,EAAR,IAAsB,CAA5C;AAGA,MAAMP,cAAc,GAAGrH,qBAAqB,CAAC6H,aAAD,CAA5C;AAEA,SAAO;AACLC,IAAAA,YAAY,EAAEC,OAAO,CAACH,IAAI,GAAG,CAAR,CADhB;AAELP,IAAAA,cAAc,EAAdA,cAFK;AAGLC,IAAAA,aAAa,EAAES,OAAO,CAACH,IAAI,GAAG,EAAR,CAHjB;AAILI,IAAAA,oBAAoB,EAAED,OAAO,CAACH,IAAI,GAAG,EAAR;AAJxB,GAAP;AAMD;;AASD,SAASlE,iBAAT,CAA2BzB,EAA3B,EAAyCO,SAAzC,EAAgF;AAC9E,MAAMQ,IAAI,GAAGf,EAAE,CAACgB,OAAH,CAAW,kEAAX,CAAb;AACAD,EAAAA,IAAI,CAACiF,IAAL,CAAU;AAAC,kBAAczF;AAAf,GAAV;AAOAQ,EAAAA,IAAI,CAACG,IAAL;AACA,MAAM+E,cAAc,GAAGlF,IAAI,CAACK,WAAL,EAAvB;AACA,SAAO6E,cAAP;AACD;;AAQD,SAAS1E,cAAT,CAAwBvB,EAAxB,EAAsCO,SAAtC,EAAoF;AAGlF,MAAIQ,IAAJ;;AACA,MAAI;AACFA,IAAAA,IAAI,GAAGf,EAAE,CAACgB,OAAH,CAAW,8DAAX,CAAP;AACD,GAFD,CAEE,OAAOkF,KAAP,EAAc;AACd,QAAKA,KAAD,CAAiBC,OAAjB,CAAyBC,QAAzB,CAAkC,eAAlC,CAAJ,EAAwD;AACtD,aAAO,IAAP;AACD;;AAED,UAAMF,KAAN;AACD;;AAEDnF,EAAAA,IAAI,CAACiF,IAAL,CAAU;AAAC,kBAAczF;AAAf,GAAV;AAGA,MAAMF,MAA0B,GAAG,EAAnC;;AACA,SAAOU,IAAI,CAACG,IAAL,EAAP,EAAoB;AAClB,QAAMmF,MAAM,GAAGtF,IAAI,CAACK,WAAL,EAAf;AACA,QAAO+B,WAAP,GAA4BkD,MAA5B,CAAOlD,WAAP;AAAA,QAAoB6B,IAApB,GAA4BqB,MAA5B,CAAoBrB,IAApB;AACA3E,IAAAA,MAAM,CAAC8C,WAAD,CAAN,GAAsB6B,IAAI,IAAI,IAA9B;AACD;;AAED,SAAO3E,MAAP;AACD;;AAQD,SAASqC,cAAT,CAAwB1C,EAAxB,EAAsCO,SAAtC,EAAiE;AAC/D,MAAMQ,IAAI,GAAGf,EAAE,CAACgB,OAAH,8BAAkCT,SAAlC,QAAb;AAEA,MAAM+F,MAAe,GAAG,EAAxB;;AACA,SAAOvF,IAAI,CAACG,IAAL,EAAP,EAAoB;AAClB,QAAM6D,eAAe,GAAGhE,IAAI,CAACK,WAAL,EAAxB;AACA,QAAO4D,IAAP,GAA8BD,eAA9B,CAAOC,IAAP;AAAA,QAAahB,IAAb,GAA8Be,eAA9B,CAAaf,IAAb;AAAA,QAAmBuC,OAAnB,GAA8BxB,eAA9B,CAAmBwB,OAAnB;AACA,QAAMC,KAAK,GAAG,IAAIC,aAAJ,CAAUzB,IAAV,EAAgB,IAAIhH,gBAAgB,CAACgG,IAAD,CAApB,EAAhB,EAA8C,CAACuC,OAA/C,CAAd;AACAD,IAAAA,MAAM,CAACjF,IAAP,CAAYmF,KAAZ;AACD;;AAED,SAAO,IAAIE,cAAJ,CAAWJ,MAAX,CAAP;AACD","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} 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} from './types';\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]: 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};\n\nexport default async function parseGeoPackage(\n arrayBuffer: ArrayBuffer,\n options?: GeoPackageLoaderOptions\n) {\n const {sqlJsCDN = 'https://sql.js.org/dist/'} = options?.geopackage || {};\n const {reproject = false, _targetCrs = 'WGS84'} = 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 result = {};\n for (const table of tables) {\n const {table_name: tableName} = table;\n result[tableName] = getVectorTable(db, tableName, projections, {\n reproject,\n _targetCrs\n });\n }\n\n return result;\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): object {\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 {geojsonFeatures: transformGeoJsonCoords(geojsonFeatures, projection.project), schema};\n }\n\n return {geojsonFeatures, schema};\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) {\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 {object} 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 field = new Field(name, new SQL_TYPE_MAPPING[type](), !notnull);\n fields.push(field);\n }\n\n return new Schema(fields);\n}\n"],"file":"parse-geopackage.js"}
1
+ {"version":3,"sources":["../../../src/lib/parse-geopackage.ts"],"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","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","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","byte","envelopeValue","littleEndian","Boolean","extendedGeometryType","bind","geometryColumn","error","message","includes","result","column","fields","notnull","schemaType","field","Field","Schema","geojsonMap"],"mappings":"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","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"],"file":"parse-geopackage.js"}
@@ -1,4 +1,4 @@
1
- import parseGeoPackage from './lib/parse-geopackage';
1
+ import parseGeoPackage, { DEFAULT_SQLJS_CDN } from './lib/parse-geopackage';
2
2
  const VERSION = 'latest';
3
3
  export const GeoPackageLoader = {
4
4
  id: 'geopackage',
@@ -11,7 +11,10 @@ export const GeoPackageLoader = {
11
11
  parse: parseGeoPackage,
12
12
  options: {
13
13
  geopackage: {
14
- sqlJsCDN: 'https://sql.js.org/dist/'
14
+ sqlJsCDN: DEFAULT_SQLJS_CDN
15
+ },
16
+ gis: {
17
+ format: 'tables'
15
18
  }
16
19
  }
17
20
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/geopackage-loader.ts"],"names":["parseGeoPackage","VERSION","GeoPackageLoader","id","name","module","version","extensions","mimeTypes","category","parse","options","geopackage","sqlJsCDN"],"mappings":"AACA,OAAOA,eAAP,MAA4B,wBAA5B;AAKA,MAAMC,OAAO,GAAG,QAAhB;AAcA,OAAO,MAAMC,gBAAkC,GAAG;AAChDC,EAAAA,EAAE,EAAE,YAD4C;AAEhDC,EAAAA,IAAI,EAAE,YAF0C;AAGhDC,EAAAA,MAAM,EAAE,YAHwC;AAIhDC,EAAAA,OAAO,EAAEL,OAJuC;AAKhDM,EAAAA,UAAU,EAAE,CAAC,MAAD,CALoC;AAMhDC,EAAAA,SAAS,EAAE,CAAC,gCAAD,CANqC;AAOhDC,EAAAA,QAAQ,EAAE,UAPsC;AAQhDC,EAAAA,KAAK,EAAEV,eARyC;AAShDW,EAAAA,OAAO,EAAE;AACPC,IAAAA,UAAU,EAAE;AACVC,MAAAA,QAAQ,EAAE;AADA;AADL;AATuC,CAA3C","sourcesContent":["import type {LoaderWithParser, LoaderOptions} from '@loaders.gl/loader-utils';\nimport parseGeoPackage 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 };\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: 'https://sql.js.org/dist/'\n }\n }\n};\n"],"file":"geopackage-loader.js"}
1
+ {"version":3,"sources":["../../src/geopackage-loader.ts"],"names":["parseGeoPackage","DEFAULT_SQLJS_CDN","VERSION","GeoPackageLoader","id","name","module","version","extensions","mimeTypes","category","parse","options","geopackage","sqlJsCDN","gis","format"],"mappings":"AACA,OAAOA,eAAP,IAAyBC,iBAAzB,QAAiD,wBAAjD;AAKA,MAAMC,OAAO,GAAG,QAAhB;AAeA,OAAO,MAAMC,gBAAkC,GAAG;AAChDC,EAAAA,EAAE,EAAE,YAD4C;AAEhDC,EAAAA,IAAI,EAAE,YAF0C;AAGhDC,EAAAA,MAAM,EAAE,YAHwC;AAIhDC,EAAAA,OAAO,EAAEL,OAJuC;AAKhDM,EAAAA,UAAU,EAAE,CAAC,MAAD,CALoC;AAMhDC,EAAAA,SAAS,EAAE,CAAC,gCAAD,CANqC;AAOhDC,EAAAA,QAAQ,EAAE,UAPsC;AAQhDC,EAAAA,KAAK,EAAEX,eARyC;AAShDY,EAAAA,OAAO,EAAE;AACPC,IAAAA,UAAU,EAAE;AACVC,MAAAA,QAAQ,EAAEb;AADA,KADL;AAIPc,IAAAA,GAAG,EAAE;AACHC,MAAAA,MAAM,EAAE;AADL;AAJE;AATuC,CAA3C","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"],"file":"geopackage-loader.js"}
@@ -3,6 +3,7 @@ import { WKBLoader } from '@loaders.gl/wkt';
3
3
  import { Schema, Field, Bool, Utf8, Float64, Int32, Int8, Int16, Float32, Binary } from '@loaders.gl/schema';
4
4
  import { binaryToGeometry, transformGeoJsonCoords } from '@loaders.gl/gis';
5
5
  import { Proj4Projection } from '@math.gl/proj4';
6
+ export const DEFAULT_SQLJS_CDN = 'https://cdnjs.cloudflare.com/ajax/libs/sql.js/1.5.0/';
6
7
  const ENVELOPE_BYTE_LENGTHS = {
7
8
  0: 0,
8
9
  1: 32,
@@ -27,32 +28,50 @@ const SQL_TYPE_MAPPING = {
27
28
  BLOB: Binary,
28
29
  DATE: Utf8,
29
30
  DATETIME: Utf8,
30
- GEOMETRY: Binary
31
+ GEOMETRY: Binary,
32
+ POINT: Binary,
33
+ LINESTRING: Binary,
34
+ POLYGON: Binary,
35
+ MULTIPOINT: Binary,
36
+ MULTILINESTRING: Binary,
37
+ MULTIPOLYGON: Binary,
38
+ GEOMETRYCOLLECTION: Binary
31
39
  };
32
40
  export default async function parseGeoPackage(arrayBuffer, options) {
33
41
  const {
34
- sqlJsCDN = 'https://sql.js.org/dist/'
42
+ sqlJsCDN = DEFAULT_SQLJS_CDN
35
43
  } = (options === null || options === void 0 ? void 0 : options.geopackage) || {};
36
44
  const {
37
45
  reproject = false,
38
- _targetCrs = 'WGS84'
46
+ _targetCrs = 'WGS84',
47
+ format = 'tables'
39
48
  } = (options === null || options === void 0 ? void 0 : options.gis) || {};
40
49
  const db = await loadDatabase(arrayBuffer, sqlJsCDN);
41
50
  const tables = listVectorTables(db);
42
51
  const projections = getProjections(db);
43
- const result = {};
52
+ const outputTables = {
53
+ shape: 'tables',
54
+ tables: []
55
+ };
44
56
 
45
57
  for (const table of tables) {
46
58
  const {
47
59
  table_name: tableName
48
60
  } = table;
49
- result[tableName] = getVectorTable(db, tableName, projections, {
50
- reproject,
51
- _targetCrs
61
+ outputTables.tables.push({
62
+ name: tableName,
63
+ table: getVectorTable(db, tableName, projections, {
64
+ reproject,
65
+ _targetCrs
66
+ })
52
67
  });
53
68
  }
54
69
 
55
- return result;
70
+ if (format === 'geojson') {
71
+ return formatTablesAsGeojson(outputTables);
72
+ }
73
+
74
+ return outputTables;
56
75
  }
57
76
 
58
77
  async function loadDatabase(arrayBuffer, sqlJsCDN) {
@@ -113,14 +132,16 @@ function getVectorTable(db, tableName, projections, {
113
132
 
114
133
  if (projection) {
115
134
  return {
116
- geojsonFeatures: transformGeoJsonCoords(geojsonFeatures, projection.project),
117
- schema
135
+ data: transformGeoJsonCoords(geojsonFeatures, projection.project),
136
+ schema,
137
+ shape: 'object-row-table'
118
138
  };
119
139
  }
120
140
 
121
141
  return {
122
- geojsonFeatures,
123
- schema
142
+ data: geojsonFeatures,
143
+ schema,
144
+ shape: 'object-row-table'
124
145
  };
125
146
  }
126
147
 
@@ -294,10 +315,21 @@ function getArrowSchema(db, tableName) {
294
315
  type,
295
316
  notnull
296
317
  } = pragmaTableInfo;
297
- const field = new Field(name, new SQL_TYPE_MAPPING[type](), !notnull);
318
+ const schemaType = SQL_TYPE_MAPPING[type] && new SQL_TYPE_MAPPING[type]();
319
+ const field = new Field(name, schemaType, !notnull);
298
320
  fields.push(field);
299
321
  }
300
322
 
301
323
  return new Schema(fields);
302
324
  }
325
+
326
+ function formatTablesAsGeojson(tables) {
327
+ const geojsonMap = {};
328
+
329
+ for (const table of tables.tables) {
330
+ geojsonMap[table.name] = table.table.data;
331
+ }
332
+
333
+ return geojsonMap;
334
+ }
303
335
  //# sourceMappingURL=parse-geopackage.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/parse-geopackage.ts"],"names":["initSqlJs","WKBLoader","Schema","Field","Bool","Utf8","Float64","Int32","Int8","Int16","Float32","Binary","binaryToGeometry","transformGeoJsonCoords","Proj4Projection","ENVELOPE_BYTE_LENGTHS","SQL_TYPE_MAPPING","BOOLEAN","TINYINT","SMALLINT","MEDIUMINT","INT","INTEGER","FLOAT","DOUBLE","REAL","TEXT","BLOB","DATE","DATETIME","GEOMETRY","parseGeoPackage","arrayBuffer","options","sqlJsCDN","geopackage","reproject","_targetCrs","gis","db","loadDatabase","tables","listVectorTables","projections","getProjections","result","table","table_name","tableName","getVectorTable","SQL","locateFile","file","Database","Uint8Array","stmt","prepare","vectorTablesInfo","step","vectorTableInfo","getAsObject","push","dataColumns","getDataColumns","geomColumn","getGeometryColumn","featureIdColumn","getFeatureIdName","columns","values","exec","projection","geomColumnProjStr","srs_id","from","to","geojsonFeatures","row","geojsonFeature","constructGeoJsonFeature","schema","getArrowSchema","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","name","pk","envelopeLength","emptyGeometry","parseGeometryBitFlags","getUint8","wkbOffset","binaryGeometry","parseSync","slice","byte","envelopeValue","littleEndian","Boolean","extendedGeometryType","bind","geometryColumn","error","message","includes","column","fields","notnull","field"],"mappings":"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","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} 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} from './types';\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]: 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};\n\nexport default async function parseGeoPackage(\n arrayBuffer: ArrayBuffer,\n options?: GeoPackageLoaderOptions\n) {\n const {sqlJsCDN = 'https://sql.js.org/dist/'} = options?.geopackage || {};\n const {reproject = false, _targetCrs = 'WGS84'} = 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 result = {};\n for (const table of tables) {\n const {table_name: tableName} = table;\n result[tableName] = getVectorTable(db, tableName, projections, {\n reproject,\n _targetCrs\n });\n }\n\n return result;\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): object {\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 {geojsonFeatures: transformGeoJsonCoords(geojsonFeatures, projection.project), schema};\n }\n\n return {geojsonFeatures, schema};\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) {\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 {object} 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 field = new Field(name, new SQL_TYPE_MAPPING[type](), !notnull);\n fields.push(field);\n }\n\n return new Schema(fields);\n}\n"],"file":"parse-geopackage.js"}
1
+ {"version":3,"sources":["../../../src/lib/parse-geopackage.ts"],"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"],"mappings":"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","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"],"file":"parse-geopackage.js"}
@@ -6,6 +6,7 @@ export declare type GeoPackageLoaderOptions = LoaderOptions & {
6
6
  gis?: {
7
7
  reproject?: boolean;
8
8
  _targetCrs?: string;
9
+ format?: 'geojson' | 'tables';
9
10
  };
10
11
  };
11
12
  /** Geopackage loader */
@@ -1 +1 @@
1
- {"version":3,"file":"geopackage-loader.d.ts","sourceRoot":"","sources":["../src/geopackage-loader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,gBAAgB,EAAE,aAAa,EAAC,MAAM,0BAA0B,CAAC;AAQ9E,oBAAY,uBAAuB,GAAG,aAAa,GAAG;IACpD,UAAU,CAAC,EAAE;QAEX,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;KACzB,CAAC;IACF,GAAG,CAAC,EAAE;QACJ,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;CACH,CAAC;AAEF,wBAAwB;AACxB,eAAO,MAAM,gBAAgB,EAAE,gBAc9B,CAAC"}
1
+ {"version":3,"file":"geopackage-loader.d.ts","sourceRoot":"","sources":["../src/geopackage-loader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,gBAAgB,EAAE,aAAa,EAAC,MAAM,0BAA0B,CAAC;AAQ9E,oBAAY,uBAAuB,GAAG,aAAa,GAAG;IACpD,UAAU,CAAC,EAAE;QAEX,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;KACzB,CAAC;IACF,GAAG,CAAC,EAAE;QACJ,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,MAAM,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAC;KAC/B,CAAC;CACH,CAAC;AAEF,wBAAwB;AACxB,eAAO,MAAM,gBAAgB,EAAE,gBAiB9B,CAAC"}
@@ -1,10 +1,26 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
11
+ }) : function(o, v) {
12
+ o["default"] = v;
13
+ });
14
+ var __importStar = (this && this.__importStar) || function (mod) {
15
+ if (mod && mod.__esModule) return mod;
16
+ var result = {};
17
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
+ __setModuleDefault(result, mod);
19
+ return result;
4
20
  };
5
21
  Object.defineProperty(exports, "__esModule", { value: true });
6
22
  exports.GeoPackageLoader = void 0;
7
- const parse_geopackage_1 = __importDefault(require("./lib/parse-geopackage"));
23
+ const parse_geopackage_1 = __importStar(require("./lib/parse-geopackage"));
8
24
  // __VERSION__ is injected by babel-plugin-version-inline
9
25
  // @ts-ignore TS2304: Cannot find name '__VERSION__'.
10
26
  // const VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'latest';
@@ -21,7 +37,10 @@ exports.GeoPackageLoader = {
21
37
  parse: parse_geopackage_1.default,
22
38
  options: {
23
39
  geopackage: {
24
- sqlJsCDN: 'https://sql.js.org/dist/'
40
+ sqlJsCDN: parse_geopackage_1.DEFAULT_SQLJS_CDN
41
+ },
42
+ gis: {
43
+ format: 'tables'
25
44
  }
26
45
  }
27
46
  };
@@ -1,3 +1,5 @@
1
1
  import type { GeoPackageLoaderOptions } from '../geopackage-loader';
2
- export default function parseGeoPackage(arrayBuffer: ArrayBuffer, options?: GeoPackageLoaderOptions): Promise<{}>;
2
+ import { Tables, ObjectRowTable, Feature } from '@loaders.gl/schema';
3
+ export declare const DEFAULT_SQLJS_CDN = "https://cdnjs.cloudflare.com/ajax/libs/sql.js/1.5.0/";
4
+ export default function parseGeoPackage(arrayBuffer: ArrayBuffer, options?: GeoPackageLoaderOptions): Promise<Tables<ObjectRowTable> | Record<string, Feature[]>>;
3
5
  //# sourceMappingURL=parse-geopackage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"parse-geopackage.d.ts","sourceRoot":"","sources":["../../src/lib/parse-geopackage.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,uBAAuB,EAAC,MAAM,sBAAsB,CAAC;AA8DlE,wBAA8B,eAAe,CAC3C,WAAW,EAAE,WAAW,EACxB,OAAO,CAAC,EAAE,uBAAuB,eAoBlC"}
1
+ {"version":3,"file":"parse-geopackage.d.ts","sourceRoot":"","sources":["../../src/lib/parse-geopackage.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,uBAAuB,EAAC,MAAM,sBAAsB,CAAC;AAGlE,OAAO,EAaL,MAAM,EACN,cAAc,EACd,OAAO,EACR,MAAM,oBAAoB,CAAC;AAkB5B,eAAO,MAAM,iBAAiB,yDAAyD,CAAC;AAwCxF,wBAA8B,eAAe,CAC3C,WAAW,EAAE,WAAW,EACxB,OAAO,CAAC,EAAE,uBAAuB,GAChC,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,CA8B7D"}
@@ -3,11 +3,15 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.DEFAULT_SQLJS_CDN = void 0;
6
7
  const sql_js_1 = __importDefault(require("sql.js"));
7
8
  const wkt_1 = require("@loaders.gl/wkt");
8
9
  const schema_1 = require("@loaders.gl/schema");
9
10
  const gis_1 = require("@loaders.gl/gis");
10
11
  const proj4_1 = require("@math.gl/proj4");
12
+ // We pin to the same version as sql.js that we use.
13
+ // As of March 2022, versions 1.6.0, 1.6.1, and 1.6.2 of sql.js appeared not to work.
14
+ exports.DEFAULT_SQLJS_CDN = 'https://cdnjs.cloudflare.com/ajax/libs/sql.js/1.5.0/';
11
15
  // https://www.geopackage.org/spec121/#flags_layout
12
16
  const ENVELOPE_BYTE_LENGTHS = {
13
17
  0: 0,
@@ -35,24 +39,40 @@ const SQL_TYPE_MAPPING = {
35
39
  BLOB: schema_1.Binary,
36
40
  DATE: schema_1.Utf8,
37
41
  DATETIME: schema_1.Utf8,
38
- GEOMETRY: schema_1.Binary
42
+ GEOMETRY: schema_1.Binary,
43
+ POINT: schema_1.Binary,
44
+ LINESTRING: schema_1.Binary,
45
+ POLYGON: schema_1.Binary,
46
+ MULTIPOINT: schema_1.Binary,
47
+ MULTILINESTRING: schema_1.Binary,
48
+ MULTIPOLYGON: schema_1.Binary,
49
+ GEOMETRYCOLLECTION: schema_1.Binary
39
50
  };
40
51
  async function parseGeoPackage(arrayBuffer, options) {
41
- const { sqlJsCDN = 'https://sql.js.org/dist/' } = options?.geopackage || {};
42
- const { reproject = false, _targetCrs = 'WGS84' } = options?.gis || {};
52
+ const { sqlJsCDN = exports.DEFAULT_SQLJS_CDN } = options?.geopackage || {};
53
+ const { reproject = false, _targetCrs = 'WGS84', format = 'tables' } = options?.gis || {};
43
54
  const db = await loadDatabase(arrayBuffer, sqlJsCDN);
44
55
  const tables = listVectorTables(db);
45
56
  const projections = getProjections(db);
46
57
  // Mapping from tableName to geojson feature collection
47
- const result = {};
58
+ const outputTables = {
59
+ shape: 'tables',
60
+ tables: []
61
+ };
48
62
  for (const table of tables) {
49
63
  const { table_name: tableName } = table;
50
- result[tableName] = getVectorTable(db, tableName, projections, {
51
- reproject,
52
- _targetCrs
64
+ outputTables.tables.push({
65
+ name: tableName,
66
+ table: getVectorTable(db, tableName, projections, {
67
+ reproject,
68
+ _targetCrs
69
+ })
53
70
  });
54
71
  }
55
- return result;
72
+ if (format === 'geojson') {
73
+ return formatTablesAsGeojson(outputTables);
74
+ }
75
+ return outputTables;
56
76
  }
57
77
  exports.default = parseGeoPackage;
58
78
  /**
@@ -132,9 +152,13 @@ function getVectorTable(db, tableName, projections, { reproject, _targetCrs }) {
132
152
  }
133
153
  const schema = getArrowSchema(db, tableName);
134
154
  if (projection) {
135
- return { geojsonFeatures: (0, gis_1.transformGeoJsonCoords)(geojsonFeatures, projection.project), schema };
155
+ return {
156
+ data: (0, gis_1.transformGeoJsonCoords)(geojsonFeatures, projection.project),
157
+ schema,
158
+ shape: 'object-row-table'
159
+ };
136
160
  }
137
- return { geojsonFeatures, schema };
161
+ return { data: geojsonFeatures, schema, shape: 'object-row-table' };
138
162
  }
139
163
  /**
140
164
  * Find all projections defined in GeoPackage
@@ -253,7 +277,7 @@ function getFeatureIdName(db, tableName) {
253
277
  * See: https://www.geopackage.org/spec121/#gpb_format
254
278
  *
255
279
  * @param arrayBuffer geometry buffer
256
- * @return {object} GeoJSON geometry (in original CRS)
280
+ * @return GeoJSON geometry (in original CRS)
257
281
  */
258
282
  function parseGeometry(arrayBuffer) {
259
283
  const view = new DataView(arrayBuffer);
@@ -354,8 +378,16 @@ function getArrowSchema(db, tableName) {
354
378
  while (stmt.step()) {
355
379
  const pragmaTableInfo = stmt.getAsObject();
356
380
  const { name, type, notnull } = pragmaTableInfo;
357
- const field = new schema_1.Field(name, new SQL_TYPE_MAPPING[type](), !notnull);
381
+ const schemaType = SQL_TYPE_MAPPING[type] && new SQL_TYPE_MAPPING[type]();
382
+ const field = new schema_1.Field(name, schemaType, !notnull);
358
383
  fields.push(field);
359
384
  }
360
385
  return new schema_1.Schema(fields);
361
386
  }
387
+ function formatTablesAsGeojson(tables) {
388
+ const geojsonMap = {};
389
+ for (const table of tables.tables) {
390
+ geojsonMap[table.name] = table.table.data;
391
+ }
392
+ return geojsonMap;
393
+ }
@@ -10,7 +10,14 @@ export declare type ProjectionMapping = {
10
10
  export declare type DataColumnsMapping = {
11
11
  [columnName: string]: string | null;
12
12
  };
13
- export declare type SQLiteTypes = 'BOOLEAN' | 'TINYINT' | 'SMALLINT' | 'MEDIUMINT' | 'INT' | 'INTEGER' | 'FLOAT' | 'DOUBLE' | 'REAL' | 'TEXT' | 'BLOB' | 'DATE' | 'DATETIME' | 'GEOMETRY';
13
+ export declare type SQLiteTypes = 'BOOLEAN' | 'TINYINT' | 'SMALLINT' | 'MEDIUMINT' | 'INT' | 'INTEGER' | 'FLOAT' | 'DOUBLE' | 'REAL' | 'TEXT' | 'BLOB' | 'DATE' | 'DATETIME';
14
+ /** Type names for geopackage geometries
15
+ *
16
+ * As defined in https://www.geopackage.org/spec130/index.html#table_column_data_types, geometries
17
+ * can be stored with any geometry name listed here:
18
+ * https://www.geopackage.org/spec130/index.html#geometry_types
19
+ */
20
+ export declare type GeoPackageGeometryTypes = 'GEOMETRY' | 'POINT' | 'LINESTRING' | 'POLYGON' | 'MULTIPOINT' | 'MULTILINESTRING' | 'MULTIPOLYGON' | 'GEOMETRYCOLLECTION';
14
21
  /**
15
22
  * https://www.geopackage.org/spec121/#spatial_ref_sys
16
23
  */
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":"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"}
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.1.8",
4
+ "version": "3.2.0-alpha.3",
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.1.8",
29
- "@loaders.gl/schema": "3.1.8",
30
- "@loaders.gl/wkt": "3.1.8",
28
+ "@loaders.gl/gis": "3.2.0-alpha.3",
29
+ "@loaders.gl/schema": "3.2.0-alpha.3",
30
+ "@loaders.gl/wkt": "3.2.0-alpha.3",
31
31
  "@math.gl/proj4": "^3.5.1",
32
32
  "@types/sql.js": "^1.4.2",
33
- "sql.js": "^1.5.0"
33
+ "sql.js": "1.5.0"
34
34
  },
35
- "gitHead": "0ef07b4e9fc20f5a882224cf241c6fd1bad898d8"
35
+ "gitHead": "f0d4b801efeb7094283106352ee759eccfb21f10"
36
36
  }
@@ -1,5 +1,5 @@
1
1
  import type {LoaderWithParser, LoaderOptions} from '@loaders.gl/loader-utils';
2
- import parseGeoPackage from './lib/parse-geopackage';
2
+ import parseGeoPackage, {DEFAULT_SQLJS_CDN} from './lib/parse-geopackage';
3
3
 
4
4
  // __VERSION__ is injected by babel-plugin-version-inline
5
5
  // @ts-ignore TS2304: Cannot find name '__VERSION__'.
@@ -14,6 +14,7 @@ export type GeoPackageLoaderOptions = LoaderOptions & {
14
14
  gis?: {
15
15
  reproject?: boolean;
16
16
  _targetCrs?: string;
17
+ format?: 'geojson' | 'tables';
17
18
  };
18
19
  };
19
20
 
@@ -29,7 +30,10 @@ export const GeoPackageLoader: LoaderWithParser = {
29
30
  parse: parseGeoPackage,
30
31
  options: {
31
32
  geopackage: {
32
- sqlJsCDN: 'https://sql.js.org/dist/'
33
+ sqlJsCDN: DEFAULT_SQLJS_CDN
34
+ },
35
+ gis: {
36
+ format: 'tables'
33
37
  }
34
38
  }
35
39
  };
@@ -14,7 +14,10 @@ import {
14
14
  Int8,
15
15
  Int16,
16
16
  Float32,
17
- Binary
17
+ Binary,
18
+ Tables,
19
+ ObjectRowTable,
20
+ Feature
18
21
  } from '@loaders.gl/schema';
19
22
  import {binaryToGeometry, transformGeoJsonCoords} from '@loaders.gl/gis';
20
23
  import {Proj4Projection} from '@math.gl/proj4';
@@ -27,9 +30,14 @@ import {
27
30
  DataColumnsRow,
28
31
  DataColumnsMapping,
29
32
  PragmaTableInfoRow,
30
- SQLiteTypes
33
+ SQLiteTypes,
34
+ GeoPackageGeometryTypes
31
35
  } from './types';
32
36
 
37
+ // We pin to the same version as sql.js that we use.
38
+ // As of March 2022, versions 1.6.0, 1.6.1, and 1.6.2 of sql.js appeared not to work.
39
+ export const DEFAULT_SQLJS_CDN = 'https://cdnjs.cloudflare.com/ajax/libs/sql.js/1.5.0/';
40
+
33
41
  // https://www.geopackage.org/spec121/#flags_layout
34
42
  const ENVELOPE_BYTE_LENGTHS = {
35
43
  0: 0,
@@ -44,7 +52,7 @@ const ENVELOPE_BYTE_LENGTHS = {
44
52
  };
45
53
 
46
54
  // Documentation: https://www.geopackage.org/spec130/index.html#table_column_data_types
47
- const SQL_TYPE_MAPPING: {[type in SQLiteTypes]: typeof DataType} = {
55
+ const SQL_TYPE_MAPPING: {[type in SQLiteTypes | GeoPackageGeometryTypes]: typeof DataType} = {
48
56
  BOOLEAN: Bool,
49
57
  TINYINT: Int8,
50
58
  SMALLINT: Int16,
@@ -58,31 +66,49 @@ const SQL_TYPE_MAPPING: {[type in SQLiteTypes]: typeof DataType} = {
58
66
  BLOB: Binary,
59
67
  DATE: Utf8,
60
68
  DATETIME: Utf8,
61
- GEOMETRY: Binary
69
+ GEOMETRY: Binary,
70
+ POINT: Binary,
71
+ LINESTRING: Binary,
72
+ POLYGON: Binary,
73
+ MULTIPOINT: Binary,
74
+ MULTILINESTRING: Binary,
75
+ MULTIPOLYGON: Binary,
76
+ GEOMETRYCOLLECTION: Binary
62
77
  };
63
78
 
64
79
  export default async function parseGeoPackage(
65
80
  arrayBuffer: ArrayBuffer,
66
81
  options?: GeoPackageLoaderOptions
67
- ) {
68
- const {sqlJsCDN = 'https://sql.js.org/dist/'} = options?.geopackage || {};
69
- const {reproject = false, _targetCrs = 'WGS84'} = options?.gis || {};
82
+ ): Promise<Tables<ObjectRowTable> | Record<string, Feature[]>> {
83
+ const {sqlJsCDN = DEFAULT_SQLJS_CDN} = options?.geopackage || {};
84
+ const {reproject = false, _targetCrs = 'WGS84', format = 'tables'} = options?.gis || {};
70
85
 
71
86
  const db = await loadDatabase(arrayBuffer, sqlJsCDN);
72
87
  const tables = listVectorTables(db);
73
88
  const projections = getProjections(db);
74
89
 
75
90
  // Mapping from tableName to geojson feature collection
76
- const result = {};
91
+ const outputTables: Tables<ObjectRowTable> = {
92
+ shape: 'tables',
93
+ tables: []
94
+ };
95
+
77
96
  for (const table of tables) {
78
97
  const {table_name: tableName} = table;
79
- result[tableName] = getVectorTable(db, tableName, projections, {
80
- reproject,
81
- _targetCrs
98
+ outputTables.tables.push({
99
+ name: tableName,
100
+ table: getVectorTable(db, tableName, projections, {
101
+ reproject,
102
+ _targetCrs
103
+ })
82
104
  });
83
105
  }
84
106
 
85
- return result;
107
+ if (format === 'geojson') {
108
+ return formatTablesAsGeojson(outputTables);
109
+ }
110
+
111
+ return outputTables;
86
112
  }
87
113
 
88
114
  /**
@@ -147,7 +173,7 @@ function getVectorTable(
147
173
  tableName: string,
148
174
  projections: ProjectionMapping,
149
175
  {reproject, _targetCrs}: {reproject: boolean; _targetCrs: string}
150
- ): object {
176
+ ): ObjectRowTable {
151
177
  const dataColumns = getDataColumns(db, tableName);
152
178
  const geomColumn = getGeometryColumn(db, tableName);
153
179
  const featureIdColumn = getFeatureIdName(db, tableName);
@@ -180,10 +206,14 @@ function getVectorTable(
180
206
 
181
207
  const schema = getArrowSchema(db, tableName);
182
208
  if (projection) {
183
- return {geojsonFeatures: transformGeoJsonCoords(geojsonFeatures, projection.project), schema};
209
+ return {
210
+ data: transformGeoJsonCoords(geojsonFeatures, projection.project),
211
+ schema,
212
+ shape: 'object-row-table'
213
+ };
184
214
  }
185
215
 
186
- return {geojsonFeatures, schema};
216
+ return {data: geojsonFeatures, schema, shape: 'object-row-table'};
187
217
  }
188
218
 
189
219
  /**
@@ -220,7 +250,7 @@ function constructGeoJsonFeature(
220
250
  geomColumn: GeometryColumnsRow,
221
251
  dataColumns: DataColumnsMapping,
222
252
  featureIdColumn: string
223
- ) {
253
+ ): Feature<Geometry | null> {
224
254
  // Find feature id
225
255
  const idIdx = columns.indexOf(featureIdColumn);
226
256
  const id = row[idIdx];
@@ -328,7 +358,7 @@ function getFeatureIdName(db: Database, tableName: string): string | null {
328
358
  * See: https://www.geopackage.org/spec121/#gpb_format
329
359
  *
330
360
  * @param arrayBuffer geometry buffer
331
- * @return {object} GeoJSON geometry (in original CRS)
361
+ * @return GeoJSON geometry (in original CRS)
332
362
  */
333
363
  function parseGeometry(arrayBuffer: ArrayBuffer): Geometry | null {
334
364
  const view = new DataView(arrayBuffer);
@@ -445,9 +475,19 @@ function getArrowSchema(db: Database, tableName: string): Schema {
445
475
  while (stmt.step()) {
446
476
  const pragmaTableInfo = stmt.getAsObject() as unknown as PragmaTableInfoRow;
447
477
  const {name, type, notnull} = pragmaTableInfo;
448
- const field = new Field(name, new SQL_TYPE_MAPPING[type](), !notnull);
478
+ const schemaType = SQL_TYPE_MAPPING[type] && new SQL_TYPE_MAPPING[type]();
479
+ const field = new Field(name, schemaType, !notnull);
449
480
  fields.push(field);
450
481
  }
451
482
 
452
483
  return new Schema(fields);
453
484
  }
485
+
486
+ function formatTablesAsGeojson(tables: Tables<ObjectRowTable>): Record<string, Feature[]> {
487
+ const geojsonMap = {};
488
+ for (const table of tables.tables) {
489
+ geojsonMap[table.name] = table.table.data;
490
+ }
491
+
492
+ return geojsonMap;
493
+ }
package/src/lib/types.ts CHANGED
@@ -21,8 +21,23 @@ export type SQLiteTypes =
21
21
  | 'TEXT'
22
22
  | 'BLOB'
23
23
  | 'DATE'
24
- | 'DATETIME'
25
- | 'GEOMETRY';
24
+ | 'DATETIME';
25
+
26
+ /** Type names for geopackage geometries
27
+ *
28
+ * As defined in https://www.geopackage.org/spec130/index.html#table_column_data_types, geometries
29
+ * can be stored with any geometry name listed here:
30
+ * https://www.geopackage.org/spec130/index.html#geometry_types
31
+ */
32
+ export type GeoPackageGeometryTypes =
33
+ | 'GEOMETRY'
34
+ | 'POINT'
35
+ | 'LINESTRING'
36
+ | 'POLYGON'
37
+ | 'MULTIPOINT'
38
+ | 'MULTILINESTRING'
39
+ | 'MULTIPOLYGON'
40
+ | 'GEOMETRYCOLLECTION';
26
41
 
27
42
  /**
28
43
  * https://www.geopackage.org/spec121/#spatial_ref_sys