@loaders.gl/geopackage 3.4.0-alpha.2 → 3.4.0-alpha.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/es5/geopackage-loader.js.map +1 -1
- package/dist/es5/index.js.map +1 -1
- package/dist/es5/lib/parse-geopackage.js +69 -99
- package/dist/es5/lib/parse-geopackage.js.map +1 -1
- package/dist/esm/bundle.js +0 -1
- package/dist/esm/bundle.js.map +1 -1
- package/dist/esm/geopackage-loader.js +0 -1
- package/dist/esm/geopackage-loader.js.map +1 -1
- package/dist/esm/lib/parse-geopackage.js +2 -33
- package/dist/esm/lib/parse-geopackage.js.map +1 -1
- package/dist/lib/parse-geopackage.js +1 -1
- package/package.json +5 -5
- package/src/lib/parse-geopackage.ts +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"geopackage-loader.js","names":["VERSION","GeoPackageLoader","id","name","module","version","extensions","mimeTypes","category","parse","parseGeoPackage","options","geopackage","sqlJsCDN","DEFAULT_SQLJS_CDN","gis","format"],"sources":["../../src/geopackage-loader.ts"],"sourcesContent":["import type {LoaderWithParser, LoaderOptions} from '@loaders.gl/loader-utils';\nimport parseGeoPackage, {DEFAULT_SQLJS_CDN} from './lib/parse-geopackage';\n\n// __VERSION__ is injected by babel-plugin-version-inline\n// @ts-ignore TS2304: Cannot find name '__VERSION__'.\n// const VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'latest';\nconst VERSION = 'latest';\n\nexport type GeoPackageLoaderOptions = LoaderOptions & {\n geopackage?: {\n // Use null in Node\n sqlJsCDN: string | null;\n };\n gis?: {\n reproject?: boolean;\n _targetCrs?: string;\n format?: 'geojson' | 'tables';\n };\n};\n\n/** Geopackage loader */\nexport const GeoPackageLoader: LoaderWithParser = {\n id: 'geopackage',\n name: 'GeoPackage',\n module: 'geopackage',\n version: VERSION,\n extensions: ['gpkg'],\n mimeTypes: ['application/geopackage+sqlite3'],\n category: 'geometry',\n parse: parseGeoPackage,\n options: {\n geopackage: {\n sqlJsCDN: DEFAULT_SQLJS_CDN\n },\n gis: {\n format: 'tables'\n }\n }\n};\n"],"mappings":";;;;;;;AACA;AAA0E;AAAA;AAK1E,
|
|
1
|
+
{"version":3,"file":"geopackage-loader.js","names":["_parseGeopackage","_interopRequireWildcard","require","_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","obj","__esModule","_typeof","default","cache","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","prototype","hasOwnProperty","call","desc","set","VERSION","GeoPackageLoader","id","name","module","version","extensions","mimeTypes","category","parse","parseGeoPackage","options","geopackage","sqlJsCDN","DEFAULT_SQLJS_CDN","gis","format","exports"],"sources":["../../src/geopackage-loader.ts"],"sourcesContent":["import type {LoaderWithParser, LoaderOptions} from '@loaders.gl/loader-utils';\nimport parseGeoPackage, {DEFAULT_SQLJS_CDN} from './lib/parse-geopackage';\n\n// __VERSION__ is injected by babel-plugin-version-inline\n// @ts-ignore TS2304: Cannot find name '__VERSION__'.\n// const VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'latest';\nconst VERSION = 'latest';\n\nexport type GeoPackageLoaderOptions = LoaderOptions & {\n geopackage?: {\n // Use null in Node\n sqlJsCDN: string | null;\n };\n gis?: {\n reproject?: boolean;\n _targetCrs?: string;\n format?: 'geojson' | 'tables';\n };\n};\n\n/** Geopackage loader */\nexport const GeoPackageLoader: LoaderWithParser = {\n id: 'geopackage',\n name: 'GeoPackage',\n module: 'geopackage',\n version: VERSION,\n extensions: ['gpkg'],\n mimeTypes: ['application/geopackage+sqlite3'],\n category: 'geometry',\n parse: parseGeoPackage,\n options: {\n geopackage: {\n sqlJsCDN: DEFAULT_SQLJS_CDN\n },\n gis: {\n format: 'tables'\n }\n }\n};\n"],"mappings":";;;;;;;AACA,IAAAA,gBAAA,GAAAC,uBAAA,CAAAC,OAAA;AAA0E,SAAAC,yBAAAC,WAAA,eAAAC,OAAA,kCAAAC,iBAAA,OAAAD,OAAA,QAAAE,gBAAA,OAAAF,OAAA,YAAAF,wBAAA,YAAAA,yBAAAC,WAAA,WAAAA,WAAA,GAAAG,gBAAA,GAAAD,iBAAA,KAAAF,WAAA;AAAA,SAAAH,wBAAAO,GAAA,EAAAJ,WAAA,SAAAA,WAAA,IAAAI,GAAA,IAAAA,GAAA,CAAAC,UAAA,WAAAD,GAAA,QAAAA,GAAA,aAAAE,OAAA,CAAAF,GAAA,yBAAAA,GAAA,4BAAAG,OAAA,EAAAH,GAAA,UAAAI,KAAA,GAAAT,wBAAA,CAAAC,WAAA,OAAAQ,KAAA,IAAAA,KAAA,CAAAC,GAAA,CAAAL,GAAA,YAAAI,KAAA,CAAAE,GAAA,CAAAN,GAAA,SAAAO,MAAA,WAAAC,qBAAA,GAAAC,MAAA,CAAAC,cAAA,IAAAD,MAAA,CAAAE,wBAAA,WAAAC,GAAA,IAAAZ,GAAA,QAAAY,GAAA,kBAAAH,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAf,GAAA,EAAAY,GAAA,SAAAI,IAAA,GAAAR,qBAAA,GAAAC,MAAA,CAAAE,wBAAA,CAAAX,GAAA,EAAAY,GAAA,cAAAI,IAAA,KAAAA,IAAA,CAAAV,GAAA,IAAAU,IAAA,CAAAC,GAAA,KAAAR,MAAA,CAAAC,cAAA,CAAAH,MAAA,EAAAK,GAAA,EAAAI,IAAA,YAAAT,MAAA,CAAAK,GAAA,IAAAZ,GAAA,CAAAY,GAAA,SAAAL,MAAA,CAAAJ,OAAA,GAAAH,GAAA,MAAAI,KAAA,IAAAA,KAAA,CAAAa,GAAA,CAAAjB,GAAA,EAAAO,MAAA,YAAAA,MAAA;AAK1E,IAAMW,OAAO,GAAG,QAAQ;AAejB,IAAMC,gBAAkC,GAAG;EAChDC,EAAE,EAAE,YAAY;EAChBC,IAAI,EAAE,YAAY;EAClBC,MAAM,EAAE,YAAY;EACpBC,OAAO,EAAEL,OAAO;EAChBM,UAAU,EAAE,CAAC,MAAM,CAAC;EACpBC,SAAS,EAAE,CAAC,gCAAgC,CAAC;EAC7CC,QAAQ,EAAE,UAAU;EACpBC,KAAK,EAAEC,wBAAe;EACtBC,OAAO,EAAE;IACPC,UAAU,EAAE;MACVC,QAAQ,EAAEC;IACZ,CAAC;IACDC,GAAG,EAAE;MACHC,MAAM,EAAE;IACV;EACF;AACF,CAAC;AAACC,OAAA,CAAAhB,gBAAA,GAAAA,gBAAA"}
|
package/dist/es5/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../src/index.ts"],"sourcesContent":["export {GeoPackageLoader} from './geopackage-loader';\n"],"mappings":";;;;;;;;;;;AAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["_geopackageLoader","require"],"sources":["../../src/index.ts"],"sourcesContent":["export {GeoPackageLoader} from './geopackage-loader';\n"],"mappings":";;;;;;;;;;;AAAA,IAAAA,iBAAA,GAAAC,OAAA"}
|
|
@@ -16,9 +16,8 @@ var _gis = require("@loaders.gl/gis");
|
|
|
16
16
|
var _proj = require("@math.gl/proj4");
|
|
17
17
|
function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
|
|
18
18
|
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
19
|
-
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++)
|
|
19
|
+
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
|
|
20
20
|
var DEFAULT_SQLJS_CDN = 'https://cdnjs.cloudflare.com/ajax/libs/sql.js/1.5.0/';
|
|
21
|
-
|
|
22
21
|
exports.DEFAULT_SQLJS_CDN = DEFAULT_SQLJS_CDN;
|
|
23
22
|
var ENVELOPE_BYTE_LENGTHS = {
|
|
24
23
|
0: 0,
|
|
@@ -30,7 +29,6 @@ var ENVELOPE_BYTE_LENGTHS = {
|
|
|
30
29
|
6: 0,
|
|
31
30
|
7: 0
|
|
32
31
|
};
|
|
33
|
-
|
|
34
32
|
var SQL_TYPE_MAPPING = {
|
|
35
33
|
BOOLEAN: _schema.Bool,
|
|
36
34
|
TINYINT: _schema.Int8,
|
|
@@ -61,50 +59,48 @@ function _parseGeoPackage() {
|
|
|
61
59
|
_parseGeoPackage = (0, _asyncToGenerator2.default)(_regenerator.default.mark(function _callee(arrayBuffer, options) {
|
|
62
60
|
var _ref2, _ref2$sqlJsCDN, sqlJsCDN, _ref3, _ref3$reproject, reproject, _ref3$_targetCrs, _targetCrs, _ref3$format, format, db, tables, projections, outputTables, _iterator3, _step3, table, tableName;
|
|
63
61
|
return _regenerator.default.wrap(function _callee$(_context) {
|
|
64
|
-
while (1) {
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
});
|
|
91
|
-
}
|
|
92
|
-
} catch (err) {
|
|
93
|
-
_iterator3.e(err);
|
|
94
|
-
} finally {
|
|
95
|
-
_iterator3.f();
|
|
62
|
+
while (1) switch (_context.prev = _context.next) {
|
|
63
|
+
case 0:
|
|
64
|
+
_ref2 = (options === null || options === void 0 ? void 0 : options.geopackage) || {}, _ref2$sqlJsCDN = _ref2.sqlJsCDN, sqlJsCDN = _ref2$sqlJsCDN === void 0 ? DEFAULT_SQLJS_CDN : _ref2$sqlJsCDN;
|
|
65
|
+
_ref3 = (options === null || options === void 0 ? void 0 : options.gis) || {}, _ref3$reproject = _ref3.reproject, reproject = _ref3$reproject === void 0 ? false : _ref3$reproject, _ref3$_targetCrs = _ref3._targetCrs, _targetCrs = _ref3$_targetCrs === void 0 ? 'WGS84' : _ref3$_targetCrs, _ref3$format = _ref3.format, format = _ref3$format === void 0 ? 'tables' : _ref3$format;
|
|
66
|
+
_context.next = 4;
|
|
67
|
+
return loadDatabase(arrayBuffer, sqlJsCDN);
|
|
68
|
+
case 4:
|
|
69
|
+
db = _context.sent;
|
|
70
|
+
tables = listVectorTables(db);
|
|
71
|
+
projections = getProjections(db);
|
|
72
|
+
outputTables = {
|
|
73
|
+
shape: 'tables',
|
|
74
|
+
tables: []
|
|
75
|
+
};
|
|
76
|
+
_iterator3 = _createForOfIteratorHelper(tables);
|
|
77
|
+
try {
|
|
78
|
+
for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
|
|
79
|
+
table = _step3.value;
|
|
80
|
+
tableName = table.table_name;
|
|
81
|
+
outputTables.tables.push({
|
|
82
|
+
name: tableName,
|
|
83
|
+
table: getVectorTable(db, tableName, projections, {
|
|
84
|
+
reproject: reproject,
|
|
85
|
+
_targetCrs: _targetCrs
|
|
86
|
+
})
|
|
87
|
+
});
|
|
96
88
|
}
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
89
|
+
} catch (err) {
|
|
90
|
+
_iterator3.e(err);
|
|
91
|
+
} finally {
|
|
92
|
+
_iterator3.f();
|
|
93
|
+
}
|
|
94
|
+
if (!(format === 'geojson')) {
|
|
95
|
+
_context.next = 12;
|
|
96
|
+
break;
|
|
97
|
+
}
|
|
98
|
+
return _context.abrupt("return", formatTablesAsGeojson(outputTables));
|
|
99
|
+
case 12:
|
|
100
|
+
return _context.abrupt("return", outputTables);
|
|
101
|
+
case 13:
|
|
102
|
+
case "end":
|
|
103
|
+
return _context.stop();
|
|
108
104
|
}
|
|
109
105
|
}, _callee);
|
|
110
106
|
}));
|
|
@@ -117,41 +113,38 @@ function _loadDatabase() {
|
|
|
117
113
|
_loadDatabase = (0, _asyncToGenerator2.default)(_regenerator.default.mark(function _callee2(arrayBuffer, sqlJsCDN) {
|
|
118
114
|
var SQL;
|
|
119
115
|
return _regenerator.default.wrap(function _callee2$(_context2) {
|
|
120
|
-
while (1) {
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
_context2.next = 6;
|
|
125
|
-
break;
|
|
126
|
-
}
|
|
127
|
-
_context2.next = 3;
|
|
128
|
-
return (0, _sql.default)({
|
|
129
|
-
locateFile: function locateFile(file) {
|
|
130
|
-
return "".concat(sqlJsCDN).concat(file);
|
|
131
|
-
}
|
|
132
|
-
});
|
|
133
|
-
case 3:
|
|
134
|
-
SQL = _context2.sent;
|
|
135
|
-
_context2.next = 9;
|
|
116
|
+
while (1) switch (_context2.prev = _context2.next) {
|
|
117
|
+
case 0:
|
|
118
|
+
if (!sqlJsCDN) {
|
|
119
|
+
_context2.next = 6;
|
|
136
120
|
break;
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
121
|
+
}
|
|
122
|
+
_context2.next = 3;
|
|
123
|
+
return (0, _sql.default)({
|
|
124
|
+
locateFile: function locateFile(file) {
|
|
125
|
+
return "".concat(sqlJsCDN).concat(file);
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
case 3:
|
|
129
|
+
SQL = _context2.sent;
|
|
130
|
+
_context2.next = 9;
|
|
131
|
+
break;
|
|
132
|
+
case 6:
|
|
133
|
+
_context2.next = 8;
|
|
134
|
+
return (0, _sql.default)();
|
|
135
|
+
case 8:
|
|
136
|
+
SQL = _context2.sent;
|
|
137
|
+
case 9:
|
|
138
|
+
return _context2.abrupt("return", new SQL.Database(new Uint8Array(arrayBuffer)));
|
|
139
|
+
case 10:
|
|
140
|
+
case "end":
|
|
141
|
+
return _context2.stop();
|
|
148
142
|
}
|
|
149
143
|
}, _callee2);
|
|
150
144
|
}));
|
|
151
145
|
return _loadDatabase.apply(this, arguments);
|
|
152
146
|
}
|
|
153
147
|
function listVectorTables(db) {
|
|
154
|
-
|
|
155
148
|
var stmt = db.prepare("SELECT * FROM gpkg_contents WHERE data_type='features';");
|
|
156
149
|
var vectorTablesInfo = [];
|
|
157
150
|
while (stmt.step()) {
|
|
@@ -160,14 +153,12 @@ function listVectorTables(db) {
|
|
|
160
153
|
}
|
|
161
154
|
return vectorTablesInfo;
|
|
162
155
|
}
|
|
163
|
-
|
|
164
156
|
function getVectorTable(db, tableName, projections, _ref) {
|
|
165
157
|
var reproject = _ref.reproject,
|
|
166
158
|
_targetCrs = _ref._targetCrs;
|
|
167
159
|
var dataColumns = getDataColumns(db, tableName);
|
|
168
160
|
var geomColumn = getGeometryColumn(db, tableName);
|
|
169
161
|
var featureIdColumn = getFeatureIdName(db, tableName);
|
|
170
|
-
|
|
171
162
|
var _db$exec$ = db.exec("SELECT * FROM `".concat(tableName, "`;"))[0],
|
|
172
163
|
columns = _db$exec$.columns,
|
|
173
164
|
values = _db$exec$.values;
|
|
@@ -185,8 +176,7 @@ function getVectorTable(db, tableName, projections, _ref) {
|
|
|
185
176
|
try {
|
|
186
177
|
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
187
178
|
var row = _step.value;
|
|
188
|
-
var geojsonFeature = constructGeoJsonFeature(columns, row, geomColumn,
|
|
189
|
-
dataColumns, featureIdColumn);
|
|
179
|
+
var geojsonFeature = constructGeoJsonFeature(columns, row, geomColumn, dataColumns, featureIdColumn);
|
|
190
180
|
geojsonFeatures.push(geojsonFeature);
|
|
191
181
|
}
|
|
192
182
|
} catch (err) {
|
|
@@ -208,7 +198,6 @@ function getVectorTable(db, tableName, projections, _ref) {
|
|
|
208
198
|
shape: 'object-row-table'
|
|
209
199
|
};
|
|
210
200
|
}
|
|
211
|
-
|
|
212
201
|
function getProjections(db) {
|
|
213
202
|
var stmt = db.prepare('SELECT * FROM gpkg_spatial_ref_sys;');
|
|
214
203
|
var projectionMapping = {};
|
|
@@ -220,11 +209,9 @@ function getProjections(db) {
|
|
|
220
209
|
}
|
|
221
210
|
return projectionMapping;
|
|
222
211
|
}
|
|
223
|
-
|
|
224
212
|
function constructGeoJsonFeature(columns, row, geomColumn, dataColumns, featureIdColumn) {
|
|
225
213
|
var idIdx = columns.indexOf(featureIdColumn);
|
|
226
214
|
var id = row[idIdx];
|
|
227
|
-
|
|
228
215
|
var geomColumnIdx = columns.indexOf(geomColumn.column_name);
|
|
229
216
|
var geometry = parseGeometry(row[geomColumnIdx].buffer);
|
|
230
217
|
var properties = {};
|
|
@@ -252,13 +239,10 @@ function constructGeoJsonFeature(columns, row, geomColumn, dataColumns, featureI
|
|
|
252
239
|
properties: properties
|
|
253
240
|
};
|
|
254
241
|
}
|
|
255
|
-
|
|
256
242
|
function getGeopackageVersion(db) {
|
|
257
243
|
var textDecoder = new TextDecoder();
|
|
258
|
-
|
|
259
244
|
var applicationIdQuery = db.exec('PRAGMA application_id;')[0];
|
|
260
245
|
var applicationId = applicationIdQuery.values[0][0];
|
|
261
|
-
|
|
262
246
|
var buffer = new ArrayBuffer(4);
|
|
263
247
|
var view = new DataView(buffer);
|
|
264
248
|
view.setInt32(0, Number(applicationId));
|
|
@@ -269,15 +253,13 @@ function getGeopackageVersion(db) {
|
|
|
269
253
|
if (versionString === 'GP11') {
|
|
270
254
|
return '1.1';
|
|
271
255
|
}
|
|
272
|
-
|
|
273
256
|
var userVersionQuery = db.exec('PRAGMA user_version;')[0];
|
|
274
257
|
var userVersionInt = userVersionQuery.values[0][0];
|
|
275
|
-
if (userVersionInt && userVersionInt < 10300) {
|
|
258
|
+
if (userVersionInt && typeof userVersionInt === 'number' && userVersionInt < 10300) {
|
|
276
259
|
return '1.2';
|
|
277
260
|
}
|
|
278
261
|
return null;
|
|
279
262
|
}
|
|
280
|
-
|
|
281
263
|
function getFeatureIdName(db, tableName) {
|
|
282
264
|
var stmt = db.prepare("PRAGMA table_info(`".concat(tableName, "`)"));
|
|
283
265
|
while (stmt.step()) {
|
|
@@ -288,29 +270,22 @@ function getFeatureIdName(db, tableName) {
|
|
|
288
270
|
return name;
|
|
289
271
|
}
|
|
290
272
|
}
|
|
291
|
-
|
|
292
273
|
return null;
|
|
293
274
|
}
|
|
294
|
-
|
|
295
275
|
function parseGeometry(arrayBuffer) {
|
|
296
276
|
var view = new DataView(arrayBuffer);
|
|
297
277
|
var _parseGeometryBitFlag = parseGeometryBitFlags(view.getUint8(3)),
|
|
298
278
|
envelopeLength = _parseGeometryBitFlag.envelopeLength,
|
|
299
279
|
emptyGeometry = _parseGeometryBitFlag.emptyGeometry;
|
|
300
|
-
|
|
301
280
|
if (emptyGeometry) {
|
|
302
281
|
return null;
|
|
303
282
|
}
|
|
304
|
-
|
|
305
283
|
var wkbOffset = 8 + envelopeLength;
|
|
306
|
-
|
|
307
284
|
var binaryGeometry = _wkt.WKBLoader.parseSync(arrayBuffer.slice(wkbOffset));
|
|
308
285
|
return (0, _gis.binaryToGeometry)(binaryGeometry);
|
|
309
286
|
}
|
|
310
|
-
|
|
311
287
|
function parseGeometryBitFlags(byte) {
|
|
312
288
|
var envelopeValue = (byte & 14) / 2;
|
|
313
|
-
|
|
314
289
|
var envelopeLength = ENVELOPE_BYTE_LENGTHS[envelopeValue];
|
|
315
290
|
return {
|
|
316
291
|
littleEndian: Boolean(byte & 1),
|
|
@@ -319,18 +294,15 @@ function parseGeometryBitFlags(byte) {
|
|
|
319
294
|
extendedGeometryType: Boolean(byte & 32)
|
|
320
295
|
};
|
|
321
296
|
}
|
|
322
|
-
|
|
323
297
|
function getGeometryColumn(db, tableName) {
|
|
324
298
|
var stmt = db.prepare('SELECT * FROM gpkg_geometry_columns WHERE table_name=:tableName;');
|
|
325
299
|
stmt.bind({
|
|
326
300
|
':tableName': tableName
|
|
327
301
|
});
|
|
328
|
-
|
|
329
302
|
stmt.step();
|
|
330
303
|
var geometryColumn = stmt.getAsObject();
|
|
331
304
|
return geometryColumn;
|
|
332
305
|
}
|
|
333
|
-
|
|
334
306
|
function getDataColumns(db, tableName) {
|
|
335
307
|
var stmt;
|
|
336
308
|
try {
|
|
@@ -344,7 +316,6 @@ function getDataColumns(db, tableName) {
|
|
|
344
316
|
stmt.bind({
|
|
345
317
|
':tableName': tableName
|
|
346
318
|
});
|
|
347
|
-
|
|
348
319
|
var result = {};
|
|
349
320
|
while (stmt.step()) {
|
|
350
321
|
var column = stmt.getAsObject();
|
|
@@ -354,7 +325,6 @@ function getDataColumns(db, tableName) {
|
|
|
354
325
|
}
|
|
355
326
|
return result;
|
|
356
327
|
}
|
|
357
|
-
|
|
358
328
|
function getArrowSchema(db, tableName) {
|
|
359
329
|
var stmt = db.prepare("PRAGMA table_info(`".concat(tableName, "`)"));
|
|
360
330
|
var fields = [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse-geopackage.js","names":["DEFAULT_SQLJS_CDN","ENVELOPE_BYTE_LENGTHS","SQL_TYPE_MAPPING","BOOLEAN","Bool","TINYINT","Int8","SMALLINT","Int16","MEDIUMINT","Int32","INT","INTEGER","FLOAT","Float32","DOUBLE","Float64","REAL","TEXT","Utf8","BLOB","Binary","DATE","DATETIME","GEOMETRY","POINT","LINESTRING","POLYGON","MULTIPOINT","MULTILINESTRING","MULTIPOLYGON","GEOMETRYCOLLECTION","parseGeoPackage","arrayBuffer","options","geopackage","sqlJsCDN","gis","reproject","_targetCrs","format","loadDatabase","db","tables","listVectorTables","projections","getProjections","outputTables","shape","table","tableName","table_name","push","name","getVectorTable","formatTablesAsGeojson","initSqlJs","locateFile","file","SQL","Database","Uint8Array","stmt","prepare","vectorTablesInfo","step","vectorTableInfo","getAsObject","dataColumns","getDataColumns","geomColumn","getGeometryColumn","featureIdColumn","getFeatureIdName","exec","columns","values","projection","geomColumnProjStr","srs_id","Proj4Projection","from","to","geojsonFeatures","row","geojsonFeature","constructGeoJsonFeature","schema","getArrowSchema","data","transformGeoJsonCoords","project","projectionMapping","srsInfo","definition","idIdx","indexOf","id","geomColumnIdx","column_name","geometry","parseGeometry","buffer","properties","Object","entries","key","value","idx","i","length","columnName","type","getGeopackageVersion","textDecoder","TextDecoder","applicationIdQuery","applicationId","ArrayBuffer","view","DataView","setInt32","Number","versionString","decode","userVersionQuery","userVersionInt","pragmaTableInfo","pk","parseGeometryBitFlags","getUint8","envelopeLength","emptyGeometry","wkbOffset","binaryGeometry","WKBLoader","parseSync","slice","binaryToGeometry","byte","envelopeValue","littleEndian","Boolean","extendedGeometryType","bind","geometryColumn","error","message","includes","result","column","fields","notnull","schemaType","field","Field","Schema","geojsonMap"],"sources":["../../../src/lib/parse-geopackage.ts"],"sourcesContent":["/* eslint-disable camelcase, @typescript-eslint/no-use-before-define */\nimport type {GeoPackageLoaderOptions} from '../geopackage-loader';\nimport initSqlJs, {SqlJsStatic, Database, Statement} from 'sql.js';\nimport {WKBLoader} from '@loaders.gl/wkt';\nimport {\n Schema,\n Field,\n Geometry,\n DataType,\n Bool,\n Utf8,\n Float64,\n Int32,\n Int8,\n Int16,\n Float32,\n Binary,\n Tables,\n ObjectRowTable,\n Feature\n} from '@loaders.gl/schema';\nimport {binaryToGeometry, transformGeoJsonCoords} from '@loaders.gl/gis';\nimport {Proj4Projection} from '@math.gl/proj4';\nimport {\n GeometryColumnsRow,\n ContentsRow,\n SpatialRefSysRow,\n ProjectionMapping,\n GeometryBitFlags,\n DataColumnsRow,\n DataColumnsMapping,\n PragmaTableInfoRow,\n SQLiteTypes,\n GeoPackageGeometryTypes\n} from './types';\n\n// We pin to the same version as sql.js that we use.\n// As of March 2022, versions 1.6.0, 1.6.1, and 1.6.2 of sql.js appeared not to work.\nexport const DEFAULT_SQLJS_CDN = 'https://cdnjs.cloudflare.com/ajax/libs/sql.js/1.5.0/';\n\n// https://www.geopackage.org/spec121/#flags_layout\nconst ENVELOPE_BYTE_LENGTHS = {\n 0: 0,\n 1: 32,\n 2: 48,\n 3: 48,\n 4: 64,\n // values 5-7 are invalid and _should_ never show up\n 5: 0,\n 6: 0,\n 7: 0\n};\n\n// Documentation: https://www.geopackage.org/spec130/index.html#table_column_data_types\nconst SQL_TYPE_MAPPING: {[type in SQLiteTypes | GeoPackageGeometryTypes]: typeof DataType} = {\n BOOLEAN: Bool,\n TINYINT: Int8,\n SMALLINT: Int16,\n MEDIUMINT: Int32,\n INT: Int32,\n INTEGER: Int32,\n FLOAT: Float32,\n DOUBLE: Float64,\n REAL: Float64,\n TEXT: Utf8,\n BLOB: Binary,\n DATE: Utf8,\n DATETIME: Utf8,\n GEOMETRY: Binary,\n POINT: Binary,\n LINESTRING: Binary,\n POLYGON: Binary,\n MULTIPOINT: Binary,\n MULTILINESTRING: Binary,\n MULTIPOLYGON: Binary,\n GEOMETRYCOLLECTION: Binary\n};\n\nexport default async function parseGeoPackage(\n arrayBuffer: ArrayBuffer,\n options?: GeoPackageLoaderOptions\n): Promise<Tables<ObjectRowTable> | Record<string, Feature[]>> {\n const {sqlJsCDN = DEFAULT_SQLJS_CDN} = options?.geopackage || {};\n const {reproject = false, _targetCrs = 'WGS84', format = 'tables'} = options?.gis || {};\n\n const db = await loadDatabase(arrayBuffer, sqlJsCDN);\n const tables = listVectorTables(db);\n const projections = getProjections(db);\n\n // Mapping from tableName to geojson feature collection\n const outputTables: Tables<ObjectRowTable> = {\n shape: 'tables',\n tables: []\n };\n\n for (const table of tables) {\n const {table_name: tableName} = table;\n outputTables.tables.push({\n name: tableName,\n table: getVectorTable(db, tableName, projections, {\n reproject,\n _targetCrs\n })\n });\n }\n\n if (format === 'geojson') {\n return formatTablesAsGeojson(outputTables);\n }\n\n return outputTables;\n}\n\n/**\n * Initialize SQL.js and create database\n *\n * @param arrayBuffer input bytes\n * @return SQL.js database object\n */\nasync function loadDatabase(arrayBuffer: ArrayBuffer, sqlJsCDN: string | null): Promise<Database> {\n // In Node, `locateFile` must not be passed\n let SQL: SqlJsStatic;\n if (sqlJsCDN) {\n SQL = await initSqlJs({\n locateFile: (file) => `${sqlJsCDN}${file}`\n });\n } else {\n SQL = await initSqlJs();\n }\n return new SQL.Database(new Uint8Array(arrayBuffer));\n}\n\n/**\n * Find all vector tables in GeoPackage\n * This queries the `gpkg_contents` table to find a list of vector tables\n *\n * @param db GeoPackage to query\n * @return list of table references\n */\nfunction listVectorTables(db: Database): ContentsRow[] {\n // The gpkg_contents table can have at least three categorical values for\n // data_type.\n // - 'features' refers to a vector geometry table\n // (https://www.geopackage.org/spec121/#_contents_2)\n // - 'tiles' refers to a raster table\n // (https://www.geopackage.org/spec121/#_contents_3)\n // - 'attributes' refers to a data table with no geometry\n // (https://www.geopackage.org/spec121/#_contents_4).\n\n // We hard code 'features' because for now we don't support raster data or pure attribute data\n // eslint-disable-next-line quotes\n const stmt = db.prepare(\"SELECT * FROM gpkg_contents WHERE data_type='features';\");\n\n const vectorTablesInfo: ContentsRow[] = [];\n while (stmt.step()) {\n const vectorTableInfo = stmt.getAsObject() as unknown as ContentsRow;\n vectorTablesInfo.push(vectorTableInfo);\n }\n\n return vectorTablesInfo;\n}\n\n/**\n * Load geometries from vector table\n *\n * @param db GeoPackage object\n * @param tableName name of vector table to query\n * @param projections keys are srs_id values, values are WKT strings\n * @returns Array of GeoJSON Feature objects\n */\nfunction getVectorTable(\n db: Database,\n tableName: string,\n projections: ProjectionMapping,\n {reproject, _targetCrs}: {reproject: boolean; _targetCrs: string}\n): ObjectRowTable {\n const dataColumns = getDataColumns(db, tableName);\n const geomColumn = getGeometryColumn(db, tableName);\n const featureIdColumn = getFeatureIdName(db, tableName);\n\n // Get vector features from table\n // Don't think it's possible to parameterize the table name in SQLite?\n const {columns, values} = db.exec(`SELECT * FROM \\`${tableName}\\`;`)[0];\n\n let projection;\n if (reproject) {\n const geomColumnProjStr = projections[geomColumn.srs_id];\n projection = new Proj4Projection({\n from: geomColumnProjStr,\n to: _targetCrs\n });\n }\n\n const geojsonFeatures: object[] = [];\n for (const row of values) {\n const geojsonFeature = constructGeoJsonFeature(\n columns,\n row,\n geomColumn,\n // @ts-ignore\n dataColumns,\n featureIdColumn\n );\n geojsonFeatures.push(geojsonFeature);\n }\n\n const schema = getArrowSchema(db, tableName);\n if (projection) {\n return {\n data: transformGeoJsonCoords(geojsonFeatures, projection.project),\n schema,\n shape: 'object-row-table'\n };\n }\n\n return {data: geojsonFeatures, schema, shape: 'object-row-table'};\n}\n\n/**\n * Find all projections defined in GeoPackage\n * This queries the gpkg_spatial_ref_sys table\n * @param db GeoPackage object\n * @returns mapping from srid to WKT projection string\n */\nfunction getProjections(db: Database): ProjectionMapping {\n // Query gpkg_spatial_ref_sys to get srid: srtext mappings\n const stmt = db.prepare('SELECT * FROM gpkg_spatial_ref_sys;');\n\n const projectionMapping: ProjectionMapping = {};\n while (stmt.step()) {\n const srsInfo = stmt.getAsObject() as unknown as SpatialRefSysRow;\n const {srs_id, definition} = srsInfo;\n projectionMapping[srs_id] = definition;\n }\n\n return projectionMapping;\n}\n\n/**\n * Construct single GeoJSON feature given row's data\n * @param columns array of ordered column identifiers\n * @param row array of ordered values representing row's data\n * @param geomColumn geometry column metadata\n * @param dataColumns mapping from table column names to property name\n * @returns GeoJSON Feature object\n */\nfunction constructGeoJsonFeature(\n columns: string[],\n row: any[],\n geomColumn: GeometryColumnsRow,\n dataColumns: DataColumnsMapping,\n featureIdColumn: string\n): Feature<Geometry | null> {\n // Find feature id\n const idIdx = columns.indexOf(featureIdColumn);\n const id = row[idIdx];\n\n // Parse geometry columns to geojson\n const geomColumnIdx = columns.indexOf(geomColumn.column_name);\n const geometry = parseGeometry(row[geomColumnIdx].buffer);\n\n const properties = {};\n if (dataColumns) {\n for (const [key, value] of Object.entries(dataColumns)) {\n const idx = columns.indexOf(key);\n // @ts-ignore TODO - Check what happens if null?\n properties[value] = row[idx];\n }\n } else {\n // Put all columns except for the feature id and geometry in properties\n for (let i = 0; i < columns.length; i++) {\n if (i === idIdx || i === geomColumnIdx) {\n // eslint-disable-next-line no-continue\n continue;\n }\n\n const columnName = columns[i];\n properties[columnName] = row[i];\n }\n }\n\n return {\n id,\n type: 'Feature',\n geometry,\n properties\n };\n}\n\n/**\n * Get GeoPackage version from database\n * @param db database\n * @returns version string. One of '1.0', '1.1', '1.2'\n */\n\n// @ts-ignore\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nfunction getGeopackageVersion(db: Database): string | null {\n const textDecoder = new TextDecoder();\n\n // Read application id from SQLite metadata\n const applicationIdQuery = db.exec('PRAGMA application_id;')[0];\n const applicationId = applicationIdQuery.values[0][0];\n\n // Convert 4-byte signed int32 application id to text\n const buffer = new ArrayBuffer(4);\n const view = new DataView(buffer);\n view.setInt32(0, Number(applicationId));\n const versionString = textDecoder.decode(buffer);\n\n if (versionString === 'GP10') {\n return '1.0';\n }\n\n if (versionString === 'GP11') {\n return '1.1';\n }\n\n // If versionString is GPKG, then read user_version\n const userVersionQuery = db.exec('PRAGMA user_version;')[0];\n const userVersionInt = userVersionQuery.values[0][0];\n\n if (userVersionInt && userVersionInt < 10300) {\n return '1.2';\n }\n\n return null;\n}\n\n/**\n * Find name of feature id column in table\n * The feature ID is the primary key of the table.\n * http://www.geopackage.org/spec121/#feature_user_tables\n *\n * @param db database\n * @param tableName name of table\n * @return name of feature id column\n */\nfunction getFeatureIdName(db: Database, tableName: string): string | null {\n // Again, not possible to parameterize table name?\n const stmt = db.prepare(`PRAGMA table_info(\\`${tableName}\\`)`);\n\n while (stmt.step()) {\n const pragmaTableInfo = stmt.getAsObject() as unknown as PragmaTableInfoRow;\n const {name, pk} = pragmaTableInfo;\n if (pk) {\n return name;\n }\n }\n\n // Is it guaranteed for there always to be at least one primary key column in the table?\n return null;\n}\n\n/**\n * Parse geometry buffer\n * GeoPackage vector geometries are slightly extended past the WKB standard\n * See: https://www.geopackage.org/spec121/#gpb_format\n *\n * @param arrayBuffer geometry buffer\n * @return GeoJSON geometry (in original CRS)\n */\nfunction parseGeometry(arrayBuffer: ArrayBuffer): Geometry | null {\n const view = new DataView(arrayBuffer);\n const {envelopeLength, emptyGeometry} = parseGeometryBitFlags(view.getUint8(3));\n\n // A Feature object has a member with the name \"geometry\". The value of the\n // geometry member SHALL be either a Geometry object as defined above or, in\n // the case that the Feature is unlocated, a JSON null value.\n /** @see https://tools.ietf.org/html/rfc7946#section-3.2 */\n if (emptyGeometry) {\n return null;\n }\n\n // Do I need to find the srid here? Is it necessarily the same for every\n // geometry in a table?\n // const srid = view.getInt32(4, littleEndian);\n\n // 2 byte magic, 1 byte version, 1 byte flags, 4 byte int32 srid\n const wkbOffset = 8 + envelopeLength;\n\n // Loaders should not depend on `core` and the context passed to the main loader doesn't include a\n // `parseSync` option, so instead we call parseSync directly on WKBLoader\n const binaryGeometry = WKBLoader.parseSync(arrayBuffer.slice(wkbOffset));\n\n return binaryToGeometry(binaryGeometry);\n}\n\n/**\n * Parse geometry header flags\n * https://www.geopackage.org/spec121/#flags_layout\n *\n * @param byte uint8 number representing flags\n * @return object representing information from bit flags\n */\nfunction parseGeometryBitFlags(byte: number): GeometryBitFlags {\n // Are header values little endian?\n const envelopeValue = (byte & 0b00001110) / 2;\n\n // TODO: Not sure the best way to handle this. Throw an error if envelopeValue outside 0-7?\n const envelopeLength = ENVELOPE_BYTE_LENGTHS[envelopeValue] as number;\n\n return {\n littleEndian: Boolean(byte & 0b00000001),\n envelopeLength,\n emptyGeometry: Boolean(byte & 0b00010000),\n extendedGeometryType: Boolean(byte & 0b00100000)\n };\n}\n\n/**\n * Find geometry column in given vector table\n *\n * @param db GeoPackage object\n * @param tableName Name of vector table\n * @returns Array of geometry column definitions\n */\nfunction getGeometryColumn(db: Database, tableName: string): GeometryColumnsRow {\n const stmt = db.prepare('SELECT * FROM gpkg_geometry_columns WHERE table_name=:tableName;');\n stmt.bind({':tableName': tableName});\n\n // > Requirement 30\n // > A feature table SHALL have only one geometry column.\n // https://www.geopackage.org/spec121/#feature_user_tables\n // So we should need one and only one step, given that we use the WHERE clause in the SQL query\n // above\n stmt.step();\n const geometryColumn = stmt.getAsObject() as unknown as GeometryColumnsRow;\n return geometryColumn;\n}\n\n/**\n * Find property columns in given vector table\n * @param db GeoPackage object\n * @param tableName Name of vector table\n * @returns Mapping from table column names to property name\n */\nfunction getDataColumns(db: Database, tableName: string): DataColumnsMapping | null {\n // gpkg_data_columns is not required to exist\n // https://www.geopackage.org/spec121/#extension_schema\n let stmt: Statement;\n try {\n stmt = db.prepare('SELECT * FROM gpkg_data_columns WHERE table_name=:tableName;');\n } catch (error) {\n if ((error as Error).message.includes('no such table')) {\n return null;\n }\n\n throw error;\n }\n\n stmt.bind({':tableName': tableName});\n\n // Convert DataColumnsRow object this to a key-value {column_name: name}\n const result: DataColumnsMapping = {};\n while (stmt.step()) {\n const column = stmt.getAsObject() as unknown as DataColumnsRow;\n const {column_name, name} = column;\n result[column_name] = name || null;\n }\n\n return result;\n}\n\n/**\n * Get arrow schema\n * @param db GeoPackage object\n * @param tableName table name\n * @returns Arrow-like Schema\n */\nfunction getArrowSchema(db: Database, tableName: string): Schema {\n const stmt = db.prepare(`PRAGMA table_info(\\`${tableName}\\`)`);\n\n const fields: Field[] = [];\n while (stmt.step()) {\n const pragmaTableInfo = stmt.getAsObject() as unknown as PragmaTableInfoRow;\n const {name, type, notnull} = pragmaTableInfo;\n const schemaType = SQL_TYPE_MAPPING[type] && new SQL_TYPE_MAPPING[type]();\n const field = new Field(name, schemaType, !notnull);\n fields.push(field);\n }\n\n return new Schema(fields);\n}\n\nfunction formatTablesAsGeojson(tables: Tables<ObjectRowTable>): Record<string, Feature[]> {\n const geojsonMap = {};\n for (const table of tables.tables) {\n geojsonMap[table.name] = table.table.data;\n }\n\n return geojsonMap;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"parse-geopackage.js","names":["_sql","_interopRequireDefault","require","_wkt","_schema","_gis","_proj","_createForOfIteratorHelper","o","allowArrayLike","it","Symbol","iterator","Array","isArray","_unsupportedIterableToArray","length","i","F","s","n","done","value","e","_e","f","TypeError","normalCompletion","didErr","err","call","step","next","_e2","return","minLen","_arrayLikeToArray","Object","prototype","toString","slice","constructor","name","from","test","arr","len","arr2","DEFAULT_SQLJS_CDN","exports","ENVELOPE_BYTE_LENGTHS","SQL_TYPE_MAPPING","BOOLEAN","Bool","TINYINT","Int8","SMALLINT","Int16","MEDIUMINT","Int32","INT","INTEGER","FLOAT","Float32","DOUBLE","Float64","REAL","TEXT","Utf8","BLOB","Binary","DATE","DATETIME","GEOMETRY","POINT","LINESTRING","POLYGON","MULTIPOINT","MULTILINESTRING","MULTIPOLYGON","GEOMETRYCOLLECTION","parseGeoPackage","_x","_x2","_parseGeoPackage","apply","arguments","_asyncToGenerator2","default","_regenerator","mark","_callee","arrayBuffer","options","_ref2","_ref2$sqlJsCDN","sqlJsCDN","_ref3","_ref3$reproject","reproject","_ref3$_targetCrs","_targetCrs","_ref3$format","format","db","tables","projections","outputTables","_iterator3","_step3","table","tableName","wrap","_callee$","_context","prev","geopackage","gis","loadDatabase","sent","listVectorTables","getProjections","shape","table_name","push","getVectorTable","abrupt","formatTablesAsGeojson","stop","_x3","_x4","_loadDatabase","_callee2","SQL","_callee2$","_context2","initSqlJs","locateFile","file","concat","Database","Uint8Array","stmt","prepare","vectorTablesInfo","vectorTableInfo","getAsObject","_ref","dataColumns","getDataColumns","geomColumn","getGeometryColumn","featureIdColumn","getFeatureIdName","_db$exec$","exec","columns","values","projection","geomColumnProjStr","srs_id","Proj4Projection","to","geojsonFeatures","_iterator","_step","row","geojsonFeature","constructGeoJsonFeature","schema","getArrowSchema","data","transformGeoJsonCoords","project","projectionMapping","srsInfo","definition","idIdx","indexOf","id","geomColumnIdx","column_name","geometry","parseGeometry","buffer","properties","_i","_Object$entries","entries","_Object$entries$_i","_slicedToArray2","key","idx","columnName","type","getGeopackageVersion","textDecoder","TextDecoder","applicationIdQuery","applicationId","ArrayBuffer","view","DataView","setInt32","Number","versionString","decode","userVersionQuery","userVersionInt","pragmaTableInfo","pk","_parseGeometryBitFlag","parseGeometryBitFlags","getUint8","envelopeLength","emptyGeometry","wkbOffset","binaryGeometry","WKBLoader","parseSync","binaryToGeometry","byte","envelopeValue","littleEndian","Boolean","extendedGeometryType","bind","geometryColumn","error","message","includes","result","column","fields","notnull","schemaType","field","Field","Schema","geojsonMap","_iterator2","_step2"],"sources":["../../../src/lib/parse-geopackage.ts"],"sourcesContent":["/* eslint-disable camelcase, @typescript-eslint/no-use-before-define */\nimport type {GeoPackageLoaderOptions} from '../geopackage-loader';\nimport initSqlJs, {SqlJsStatic, Database, Statement} from 'sql.js';\nimport {WKBLoader} from '@loaders.gl/wkt';\nimport {\n Schema,\n Field,\n Geometry,\n DataType,\n Bool,\n Utf8,\n Float64,\n Int32,\n Int8,\n Int16,\n Float32,\n Binary,\n Tables,\n ObjectRowTable,\n Feature\n} from '@loaders.gl/schema';\nimport {binaryToGeometry, transformGeoJsonCoords} from '@loaders.gl/gis';\nimport {Proj4Projection} from '@math.gl/proj4';\nimport {\n GeometryColumnsRow,\n ContentsRow,\n SpatialRefSysRow,\n ProjectionMapping,\n GeometryBitFlags,\n DataColumnsRow,\n DataColumnsMapping,\n PragmaTableInfoRow,\n SQLiteTypes,\n GeoPackageGeometryTypes\n} from './types';\n\n// We pin to the same version as sql.js that we use.\n// As of March 2022, versions 1.6.0, 1.6.1, and 1.6.2 of sql.js appeared not to work.\nexport const DEFAULT_SQLJS_CDN = 'https://cdnjs.cloudflare.com/ajax/libs/sql.js/1.5.0/';\n\n// https://www.geopackage.org/spec121/#flags_layout\nconst ENVELOPE_BYTE_LENGTHS = {\n 0: 0,\n 1: 32,\n 2: 48,\n 3: 48,\n 4: 64,\n // values 5-7 are invalid and _should_ never show up\n 5: 0,\n 6: 0,\n 7: 0\n};\n\n// Documentation: https://www.geopackage.org/spec130/index.html#table_column_data_types\nconst SQL_TYPE_MAPPING: {[type in SQLiteTypes | GeoPackageGeometryTypes]: typeof DataType} = {\n BOOLEAN: Bool,\n TINYINT: Int8,\n SMALLINT: Int16,\n MEDIUMINT: Int32,\n INT: Int32,\n INTEGER: Int32,\n FLOAT: Float32,\n DOUBLE: Float64,\n REAL: Float64,\n TEXT: Utf8,\n BLOB: Binary,\n DATE: Utf8,\n DATETIME: Utf8,\n GEOMETRY: Binary,\n POINT: Binary,\n LINESTRING: Binary,\n POLYGON: Binary,\n MULTIPOINT: Binary,\n MULTILINESTRING: Binary,\n MULTIPOLYGON: Binary,\n GEOMETRYCOLLECTION: Binary\n};\n\nexport default async function parseGeoPackage(\n arrayBuffer: ArrayBuffer,\n options?: GeoPackageLoaderOptions\n): Promise<Tables<ObjectRowTable> | Record<string, Feature[]>> {\n const {sqlJsCDN = DEFAULT_SQLJS_CDN} = options?.geopackage || {};\n const {reproject = false, _targetCrs = 'WGS84', format = 'tables'} = options?.gis || {};\n\n const db = await loadDatabase(arrayBuffer, sqlJsCDN);\n const tables = listVectorTables(db);\n const projections = getProjections(db);\n\n // Mapping from tableName to geojson feature collection\n const outputTables: Tables<ObjectRowTable> = {\n shape: 'tables',\n tables: []\n };\n\n for (const table of tables) {\n const {table_name: tableName} = table;\n outputTables.tables.push({\n name: tableName,\n table: getVectorTable(db, tableName, projections, {\n reproject,\n _targetCrs\n })\n });\n }\n\n if (format === 'geojson') {\n return formatTablesAsGeojson(outputTables);\n }\n\n return outputTables;\n}\n\n/**\n * Initialize SQL.js and create database\n *\n * @param arrayBuffer input bytes\n * @return SQL.js database object\n */\nasync function loadDatabase(arrayBuffer: ArrayBuffer, sqlJsCDN: string | null): Promise<Database> {\n // In Node, `locateFile` must not be passed\n let SQL: SqlJsStatic;\n if (sqlJsCDN) {\n SQL = await initSqlJs({\n locateFile: (file) => `${sqlJsCDN}${file}`\n });\n } else {\n SQL = await initSqlJs();\n }\n return new SQL.Database(new Uint8Array(arrayBuffer));\n}\n\n/**\n * Find all vector tables in GeoPackage\n * This queries the `gpkg_contents` table to find a list of vector tables\n *\n * @param db GeoPackage to query\n * @return list of table references\n */\nfunction listVectorTables(db: Database): ContentsRow[] {\n // The gpkg_contents table can have at least three categorical values for\n // data_type.\n // - 'features' refers to a vector geometry table\n // (https://www.geopackage.org/spec121/#_contents_2)\n // - 'tiles' refers to a raster table\n // (https://www.geopackage.org/spec121/#_contents_3)\n // - 'attributes' refers to a data table with no geometry\n // (https://www.geopackage.org/spec121/#_contents_4).\n\n // We hard code 'features' because for now we don't support raster data or pure attribute data\n // eslint-disable-next-line quotes\n const stmt = db.prepare(\"SELECT * FROM gpkg_contents WHERE data_type='features';\");\n\n const vectorTablesInfo: ContentsRow[] = [];\n while (stmt.step()) {\n const vectorTableInfo = stmt.getAsObject() as unknown as ContentsRow;\n vectorTablesInfo.push(vectorTableInfo);\n }\n\n return vectorTablesInfo;\n}\n\n/**\n * Load geometries from vector table\n *\n * @param db GeoPackage object\n * @param tableName name of vector table to query\n * @param projections keys are srs_id values, values are WKT strings\n * @returns Array of GeoJSON Feature objects\n */\nfunction getVectorTable(\n db: Database,\n tableName: string,\n projections: ProjectionMapping,\n {reproject, _targetCrs}: {reproject: boolean; _targetCrs: string}\n): ObjectRowTable {\n const dataColumns = getDataColumns(db, tableName);\n const geomColumn = getGeometryColumn(db, tableName);\n const featureIdColumn = getFeatureIdName(db, tableName);\n\n // Get vector features from table\n // Don't think it's possible to parameterize the table name in SQLite?\n const {columns, values} = db.exec(`SELECT * FROM \\`${tableName}\\`;`)[0];\n\n let projection;\n if (reproject) {\n const geomColumnProjStr = projections[geomColumn.srs_id];\n projection = new Proj4Projection({\n from: geomColumnProjStr,\n to: _targetCrs\n });\n }\n\n const geojsonFeatures: object[] = [];\n for (const row of values) {\n const geojsonFeature = constructGeoJsonFeature(\n columns,\n row,\n geomColumn,\n // @ts-ignore\n dataColumns,\n featureIdColumn\n );\n geojsonFeatures.push(geojsonFeature);\n }\n\n const schema = getArrowSchema(db, tableName);\n if (projection) {\n return {\n data: transformGeoJsonCoords(geojsonFeatures, projection.project),\n schema,\n shape: 'object-row-table'\n };\n }\n\n return {data: geojsonFeatures, schema, shape: 'object-row-table'};\n}\n\n/**\n * Find all projections defined in GeoPackage\n * This queries the gpkg_spatial_ref_sys table\n * @param db GeoPackage object\n * @returns mapping from srid to WKT projection string\n */\nfunction getProjections(db: Database): ProjectionMapping {\n // Query gpkg_spatial_ref_sys to get srid: srtext mappings\n const stmt = db.prepare('SELECT * FROM gpkg_spatial_ref_sys;');\n\n const projectionMapping: ProjectionMapping = {};\n while (stmt.step()) {\n const srsInfo = stmt.getAsObject() as unknown as SpatialRefSysRow;\n const {srs_id, definition} = srsInfo;\n projectionMapping[srs_id] = definition;\n }\n\n return projectionMapping;\n}\n\n/**\n * Construct single GeoJSON feature given row's data\n * @param columns array of ordered column identifiers\n * @param row array of ordered values representing row's data\n * @param geomColumn geometry column metadata\n * @param dataColumns mapping from table column names to property name\n * @returns GeoJSON Feature object\n */\nfunction constructGeoJsonFeature(\n columns: string[],\n row: any[],\n geomColumn: GeometryColumnsRow,\n dataColumns: DataColumnsMapping,\n featureIdColumn: string\n): Feature<Geometry | null> {\n // Find feature id\n const idIdx = columns.indexOf(featureIdColumn);\n const id = row[idIdx];\n\n // Parse geometry columns to geojson\n const geomColumnIdx = columns.indexOf(geomColumn.column_name);\n const geometry = parseGeometry(row[geomColumnIdx].buffer);\n\n const properties = {};\n if (dataColumns) {\n for (const [key, value] of Object.entries(dataColumns)) {\n const idx = columns.indexOf(key);\n // @ts-ignore TODO - Check what happens if null?\n properties[value] = row[idx];\n }\n } else {\n // Put all columns except for the feature id and geometry in properties\n for (let i = 0; i < columns.length; i++) {\n if (i === idIdx || i === geomColumnIdx) {\n // eslint-disable-next-line no-continue\n continue;\n }\n\n const columnName = columns[i];\n properties[columnName] = row[i];\n }\n }\n\n return {\n id,\n type: 'Feature',\n geometry,\n properties\n };\n}\n\n/**\n * Get GeoPackage version from database\n * @param db database\n * @returns version string. One of '1.0', '1.1', '1.2'\n */\n\n// @ts-ignore\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nfunction getGeopackageVersion(db: Database): string | null {\n const textDecoder = new TextDecoder();\n\n // Read application id from SQLite metadata\n const applicationIdQuery = db.exec('PRAGMA application_id;')[0];\n const applicationId = applicationIdQuery.values[0][0];\n\n // Convert 4-byte signed int32 application id to text\n const buffer = new ArrayBuffer(4);\n const view = new DataView(buffer);\n view.setInt32(0, Number(applicationId));\n const versionString = textDecoder.decode(buffer);\n\n if (versionString === 'GP10') {\n return '1.0';\n }\n\n if (versionString === 'GP11') {\n return '1.1';\n }\n\n // If versionString is GPKG, then read user_version\n const userVersionQuery = db.exec('PRAGMA user_version;')[0];\n const userVersionInt = userVersionQuery.values[0][0];\n\n if (userVersionInt && typeof userVersionInt === 'number' && userVersionInt < 10300) {\n return '1.2';\n }\n\n return null;\n}\n\n/**\n * Find name of feature id column in table\n * The feature ID is the primary key of the table.\n * http://www.geopackage.org/spec121/#feature_user_tables\n *\n * @param db database\n * @param tableName name of table\n * @return name of feature id column\n */\nfunction getFeatureIdName(db: Database, tableName: string): string | null {\n // Again, not possible to parameterize table name?\n const stmt = db.prepare(`PRAGMA table_info(\\`${tableName}\\`)`);\n\n while (stmt.step()) {\n const pragmaTableInfo = stmt.getAsObject() as unknown as PragmaTableInfoRow;\n const {name, pk} = pragmaTableInfo;\n if (pk) {\n return name;\n }\n }\n\n // Is it guaranteed for there always to be at least one primary key column in the table?\n return null;\n}\n\n/**\n * Parse geometry buffer\n * GeoPackage vector geometries are slightly extended past the WKB standard\n * See: https://www.geopackage.org/spec121/#gpb_format\n *\n * @param arrayBuffer geometry buffer\n * @return GeoJSON geometry (in original CRS)\n */\nfunction parseGeometry(arrayBuffer: ArrayBuffer): Geometry | null {\n const view = new DataView(arrayBuffer);\n const {envelopeLength, emptyGeometry} = parseGeometryBitFlags(view.getUint8(3));\n\n // A Feature object has a member with the name \"geometry\". The value of the\n // geometry member SHALL be either a Geometry object as defined above or, in\n // the case that the Feature is unlocated, a JSON null value.\n /** @see https://tools.ietf.org/html/rfc7946#section-3.2 */\n if (emptyGeometry) {\n return null;\n }\n\n // Do I need to find the srid here? Is it necessarily the same for every\n // geometry in a table?\n // const srid = view.getInt32(4, littleEndian);\n\n // 2 byte magic, 1 byte version, 1 byte flags, 4 byte int32 srid\n const wkbOffset = 8 + envelopeLength;\n\n // Loaders should not depend on `core` and the context passed to the main loader doesn't include a\n // `parseSync` option, so instead we call parseSync directly on WKBLoader\n const binaryGeometry = WKBLoader.parseSync(arrayBuffer.slice(wkbOffset));\n\n return binaryToGeometry(binaryGeometry);\n}\n\n/**\n * Parse geometry header flags\n * https://www.geopackage.org/spec121/#flags_layout\n *\n * @param byte uint8 number representing flags\n * @return object representing information from bit flags\n */\nfunction parseGeometryBitFlags(byte: number): GeometryBitFlags {\n // Are header values little endian?\n const envelopeValue = (byte & 0b00001110) / 2;\n\n // TODO: Not sure the best way to handle this. Throw an error if envelopeValue outside 0-7?\n const envelopeLength = ENVELOPE_BYTE_LENGTHS[envelopeValue] as number;\n\n return {\n littleEndian: Boolean(byte & 0b00000001),\n envelopeLength,\n emptyGeometry: Boolean(byte & 0b00010000),\n extendedGeometryType: Boolean(byte & 0b00100000)\n };\n}\n\n/**\n * Find geometry column in given vector table\n *\n * @param db GeoPackage object\n * @param tableName Name of vector table\n * @returns Array of geometry column definitions\n */\nfunction getGeometryColumn(db: Database, tableName: string): GeometryColumnsRow {\n const stmt = db.prepare('SELECT * FROM gpkg_geometry_columns WHERE table_name=:tableName;');\n stmt.bind({':tableName': tableName});\n\n // > Requirement 30\n // > A feature table SHALL have only one geometry column.\n // https://www.geopackage.org/spec121/#feature_user_tables\n // So we should need one and only one step, given that we use the WHERE clause in the SQL query\n // above\n stmt.step();\n const geometryColumn = stmt.getAsObject() as unknown as GeometryColumnsRow;\n return geometryColumn;\n}\n\n/**\n * Find property columns in given vector table\n * @param db GeoPackage object\n * @param tableName Name of vector table\n * @returns Mapping from table column names to property name\n */\nfunction getDataColumns(db: Database, tableName: string): DataColumnsMapping | null {\n // gpkg_data_columns is not required to exist\n // https://www.geopackage.org/spec121/#extension_schema\n let stmt: Statement;\n try {\n stmt = db.prepare('SELECT * FROM gpkg_data_columns WHERE table_name=:tableName;');\n } catch (error) {\n if ((error as Error).message.includes('no such table')) {\n return null;\n }\n\n throw error;\n }\n\n stmt.bind({':tableName': tableName});\n\n // Convert DataColumnsRow object this to a key-value {column_name: name}\n const result: DataColumnsMapping = {};\n while (stmt.step()) {\n const column = stmt.getAsObject() as unknown as DataColumnsRow;\n const {column_name, name} = column;\n result[column_name] = name || null;\n }\n\n return result;\n}\n\n/**\n * Get arrow schema\n * @param db GeoPackage object\n * @param tableName table name\n * @returns Arrow-like Schema\n */\nfunction getArrowSchema(db: Database, tableName: string): Schema {\n const stmt = db.prepare(`PRAGMA table_info(\\`${tableName}\\`)`);\n\n const fields: Field[] = [];\n while (stmt.step()) {\n const pragmaTableInfo = stmt.getAsObject() as unknown as PragmaTableInfoRow;\n const {name, type, notnull} = pragmaTableInfo;\n const schemaType = SQL_TYPE_MAPPING[type] && new SQL_TYPE_MAPPING[type]();\n const field = new Field(name, schemaType, !notnull);\n fields.push(field);\n }\n\n return new Schema(fields);\n}\n\nfunction formatTablesAsGeojson(tables: Tables<ObjectRowTable>): Record<string, Feature[]> {\n const geojsonMap = {};\n for (const table of tables.tables) {\n geojsonMap[table.name] = table.table.data;\n }\n\n return geojsonMap;\n}\n"],"mappings":";;;;;;;;;;;AAEA,IAAAA,IAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,IAAA,GAAAD,OAAA;AACA,IAAAE,OAAA,GAAAF,OAAA;AAiBA,IAAAG,IAAA,GAAAH,OAAA;AACA,IAAAI,KAAA,GAAAJ,OAAA;AAA+C,SAAAK,2BAAAC,CAAA,EAAAC,cAAA,QAAAC,EAAA,UAAAC,MAAA,oBAAAH,CAAA,CAAAG,MAAA,CAAAC,QAAA,KAAAJ,CAAA,qBAAAE,EAAA,QAAAG,KAAA,CAAAC,OAAA,CAAAN,CAAA,MAAAE,EAAA,GAAAK,2BAAA,CAAAP,CAAA,MAAAC,cAAA,IAAAD,CAAA,WAAAA,CAAA,CAAAQ,MAAA,qBAAAN,EAAA,EAAAF,CAAA,GAAAE,EAAA,MAAAO,CAAA,UAAAC,CAAA,YAAAA,EAAA,eAAAC,CAAA,EAAAD,CAAA,EAAAE,CAAA,WAAAA,EAAA,QAAAH,CAAA,IAAAT,CAAA,CAAAQ,MAAA,WAAAK,IAAA,mBAAAA,IAAA,SAAAC,KAAA,EAAAd,CAAA,CAAAS,CAAA,UAAAM,CAAA,WAAAA,EAAAC,EAAA,UAAAA,EAAA,KAAAC,CAAA,EAAAP,CAAA,gBAAAQ,SAAA,iJAAAC,gBAAA,SAAAC,MAAA,UAAAC,GAAA,WAAAV,CAAA,WAAAA,EAAA,IAAAT,EAAA,GAAAA,EAAA,CAAAoB,IAAA,CAAAtB,CAAA,MAAAY,CAAA,WAAAA,EAAA,QAAAW,IAAA,GAAArB,EAAA,CAAAsB,IAAA,IAAAL,gBAAA,GAAAI,IAAA,CAAAV,IAAA,SAAAU,IAAA,KAAAR,CAAA,WAAAA,EAAAU,GAAA,IAAAL,MAAA,SAAAC,GAAA,GAAAI,GAAA,KAAAR,CAAA,WAAAA,EAAA,eAAAE,gBAAA,IAAAjB,EAAA,CAAAwB,MAAA,UAAAxB,EAAA,CAAAwB,MAAA,oBAAAN,MAAA,QAAAC,GAAA;AAAA,SAAAd,4BAAAP,CAAA,EAAA2B,MAAA,SAAA3B,CAAA,qBAAAA,CAAA,sBAAA4B,iBAAA,CAAA5B,CAAA,EAAA2B,MAAA,OAAAf,CAAA,GAAAiB,MAAA,CAAAC,SAAA,CAAAC,QAAA,CAAAT,IAAA,CAAAtB,CAAA,EAAAgC,KAAA,aAAApB,CAAA,iBAAAZ,CAAA,CAAAiC,WAAA,EAAArB,CAAA,GAAAZ,CAAA,CAAAiC,WAAA,CAAAC,IAAA,MAAAtB,CAAA,cAAAA,CAAA,mBAAAP,KAAA,CAAA8B,IAAA,CAAAnC,CAAA,OAAAY,CAAA,+DAAAwB,IAAA,CAAAxB,CAAA,UAAAgB,iBAAA,CAAA5B,CAAA,EAAA2B,MAAA;AAAA,SAAAC,kBAAAS,GAAA,EAAAC,GAAA,QAAAA,GAAA,YAAAA,GAAA,GAAAD,GAAA,CAAA7B,MAAA,EAAA8B,GAAA,GAAAD,GAAA,CAAA7B,MAAA,WAAAC,CAAA,MAAA8B,IAAA,OAAAlC,KAAA,CAAAiC,GAAA,GAAA7B,CAAA,GAAA6B,GAAA,EAAA7B,CAAA,IAAA8B,IAAA,CAAA9B,CAAA,IAAA4B,GAAA,CAAA5B,CAAA,UAAA8B,IAAA;AAgBxC,IAAMC,iBAAiB,GAAG,sDAAsD;AAACC,OAAA,CAAAD,iBAAA,GAAAA,iBAAA;AAGxF,IAAME,qBAAqB,GAAG;EAC5B,CAAC,EAAE,CAAC;EACJ,CAAC,EAAE,EAAE;EACL,CAAC,EAAE,EAAE;EACL,CAAC,EAAE,EAAE;EACL,CAAC,EAAE,EAAE;EAEL,CAAC,EAAE,CAAC;EACJ,CAAC,EAAE,CAAC;EACJ,CAAC,EAAE;AACL,CAAC;AAGD,IAAMC,gBAAoF,GAAG;EAC3FC,OAAO,EAAEC,YAAI;EACbC,OAAO,EAAEC,YAAI;EACbC,QAAQ,EAAEC,aAAK;EACfC,SAAS,EAAEC,aAAK;EAChBC,GAAG,EAAED,aAAK;EACVE,OAAO,EAAEF,aAAK;EACdG,KAAK,EAAEC,eAAO;EACdC,MAAM,EAAEC,eAAO;EACfC,IAAI,EAAED,eAAO;EACbE,IAAI,EAAEC,YAAI;EACVC,IAAI,EAAEC,cAAM;EACZC,IAAI,EAAEH,YAAI;EACVI,QAAQ,EAAEJ,YAAI;EACdK,QAAQ,EAAEH,cAAM;EAChBI,KAAK,EAAEJ,cAAM;EACbK,UAAU,EAAEL,cAAM;EAClBM,OAAO,EAAEN,cAAM;EACfO,UAAU,EAAEP,cAAM;EAClBQ,eAAe,EAAER,cAAM;EACvBS,YAAY,EAAET,cAAM;EACpBU,kBAAkB,EAAEV;AACtB,CAAC;AAAC,SAE4BW,eAAeA,CAAAC,EAAA,EAAAC,GAAA;EAAA,OAAAC,gBAAA,CAAAC,KAAA,OAAAC,SAAA;AAAA;AAAA,SAAAF,iBAAA;EAAAA,gBAAA,OAAAG,kBAAA,CAAAC,OAAA,EAAAC,YAAA,CAAAD,OAAA,CAAAE,IAAA,CAA9B,SAAAC,QACbC,WAAwB,EACxBC,OAAiC;IAAA,IAAAC,KAAA,EAAAC,cAAA,EAAAC,QAAA,EAAAC,KAAA,EAAAC,eAAA,EAAAC,SAAA,EAAAC,gBAAA,EAAAC,UAAA,EAAAC,YAAA,EAAAC,MAAA,EAAAC,EAAA,EAAAC,MAAA,EAAAC,WAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,MAAA,EAAAC,KAAA,EAAAC,SAAA;IAAA,OAAAtB,YAAA,CAAAD,OAAA,CAAAwB,IAAA,UAAAC,SAAAC,QAAA;MAAA,kBAAAA,QAAA,CAAAC,IAAA,GAAAD,QAAA,CAAAlF,IAAA;QAAA;UAAA8D,KAAA,GAEM,CAAAD,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAEuB,UAAU,KAAI,CAAC,CAAC,EAAArB,cAAA,GAAAD,KAAA,CAAzDE,QAAQ,EAARA,QAAQ,GAAAD,cAAA,cAAG/C,iBAAiB,GAAA+C,cAAA;UAAAE,KAAA,GACkC,CAAAJ,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAEwB,GAAG,KAAI,CAAC,CAAC,EAAAnB,eAAA,GAAAD,KAAA,CAAhFE,SAAS,EAATA,SAAS,GAAAD,eAAA,cAAG,KAAK,GAAAA,eAAA,EAAAE,gBAAA,GAAAH,KAAA,CAAEI,UAAU,EAAVA,UAAU,GAAAD,gBAAA,cAAG,OAAO,GAAAA,gBAAA,EAAAE,YAAA,GAAAL,KAAA,CAAEM,MAAM,EAANA,MAAM,GAAAD,YAAA,cAAG,QAAQ,GAAAA,YAAA;UAAAY,QAAA,CAAAlF,IAAA;UAAA,OAEhDsF,YAAY,CAAC1B,WAAW,EAAEI,QAAQ,CAAC;QAAA;UAA9CQ,EAAE,GAAAU,QAAA,CAAAK,IAAA;UACFd,MAAM,GAAGe,gBAAgB,CAAChB,EAAE,CAAC;UAC7BE,WAAW,GAAGe,cAAc,CAACjB,EAAE,CAAC;UAGhCG,YAAoC,GAAG;YAC3Ce,KAAK,EAAE,QAAQ;YACfjB,MAAM,EAAE;UACV,CAAC;UAAAG,UAAA,GAAArG,0BAAA,CAEmBkG,MAAM;UAAA;YAA1B,KAAAG,UAAA,CAAAzF,CAAA,MAAA0F,MAAA,GAAAD,UAAA,CAAAxF,CAAA,IAAAC,IAAA,GAA4B;cAAjByF,KAAK,GAAAD,MAAA,CAAAvF,KAAA;cACKyF,SAAS,GAAID,KAAK,CAA9Ba,UAAU;cACjBhB,YAAY,CAACF,MAAM,CAACmB,IAAI,CAAC;gBACvBlF,IAAI,EAAEqE,SAAS;gBACfD,KAAK,EAAEe,cAAc,CAACrB,EAAE,EAAEO,SAAS,EAAEL,WAAW,EAAE;kBAChDP,SAAS,EAATA,SAAS;kBACTE,UAAU,EAAVA;gBACF,CAAC;cACH,CAAC,CAAC;YACJ;UAAC,SAAAxE,GAAA;YAAA+E,UAAA,CAAArF,CAAA,CAAAM,GAAA;UAAA;YAAA+E,UAAA,CAAAnF,CAAA;UAAA;UAAA,MAEG8E,MAAM,KAAK,SAAS;YAAAW,QAAA,CAAAlF,IAAA;YAAA;UAAA;UAAA,OAAAkF,QAAA,CAAAY,MAAA,WACfC,qBAAqB,CAACpB,YAAY,CAAC;QAAA;UAAA,OAAAO,QAAA,CAAAY,MAAA,WAGrCnB,YAAY;QAAA;QAAA;UAAA,OAAAO,QAAA,CAAAc,IAAA;MAAA;IAAA,GAAArC,OAAA;EAAA,CACpB;EAAA,OAAAP,gBAAA,CAAAC,KAAA,OAAAC,SAAA;AAAA;AAAA,SAQcgC,YAAYA,CAAAW,GAAA,EAAAC,GAAA;EAAA,OAAAC,aAAA,CAAA9C,KAAA,OAAAC,SAAA;AAAA;AAAA,SAAA6C,cAAA;EAAAA,aAAA,OAAA5C,kBAAA,CAAAC,OAAA,EAAAC,YAAA,CAAAD,OAAA,CAAAE,IAAA,CAA3B,SAAA0C,SAA4BxC,WAAwB,EAAEI,QAAuB;IAAA,IAAAqC,GAAA;IAAA,OAAA5C,YAAA,CAAAD,OAAA,CAAAwB,IAAA,UAAAsB,UAAAC,SAAA;MAAA,kBAAAA,SAAA,CAAApB,IAAA,GAAAoB,SAAA,CAAAvG,IAAA;QAAA;UAAA,KAGvEgE,QAAQ;YAAAuC,SAAA,CAAAvG,IAAA;YAAA;UAAA;UAAAuG,SAAA,CAAAvG,IAAA;UAAA,OACE,IAAAwG,YAAS,EAAC;YACpBC,UAAU,EAAE,SAAAA,WAACC,IAAI;cAAA,UAAAC,MAAA,CAAQ3C,QAAQ,EAAA2C,MAAA,CAAGD,IAAI;YAAA;UAC1C,CAAC,CAAC;QAAA;UAFFL,GAAG,GAAAE,SAAA,CAAAhB,IAAA;UAAAgB,SAAA,CAAAvG,IAAA;UAAA;QAAA;UAAAuG,SAAA,CAAAvG,IAAA;UAAA,OAIS,IAAAwG,YAAS,EAAC,CAAC;QAAA;UAAvBH,GAAG,GAAAE,SAAA,CAAAhB,IAAA;QAAA;UAAA,OAAAgB,SAAA,CAAAT,MAAA,WAEE,IAAIO,GAAG,CAACO,QAAQ,CAAC,IAAIC,UAAU,CAACjD,WAAW,CAAC,CAAC;QAAA;QAAA;UAAA,OAAA2C,SAAA,CAAAP,IAAA;MAAA;IAAA,GAAAI,QAAA;EAAA,CACrD;EAAA,OAAAD,aAAA,CAAA9C,KAAA,OAAAC,SAAA;AAAA;AASD,SAASkC,gBAAgBA,CAAChB,EAAY,EAAiB;EAYrD,IAAMsC,IAAI,GAAGtC,EAAE,CAACuC,OAAO,CAAC,yDAAyD,CAAC;EAElF,IAAMC,gBAA+B,GAAG,EAAE;EAC1C,OAAOF,IAAI,CAAC/G,IAAI,CAAC,CAAC,EAAE;IAClB,IAAMkH,eAAe,GAAGH,IAAI,CAACI,WAAW,CAAC,CAA2B;IACpEF,gBAAgB,CAACpB,IAAI,CAACqB,eAAe,CAAC;EACxC;EAEA,OAAOD,gBAAgB;AACzB;AAUA,SAASnB,cAAcA,CACrBrB,EAAY,EACZO,SAAiB,EACjBL,WAA8B,EAAAyC,IAAA,EAEd;EAAA,IADfhD,SAAS,GAAAgD,IAAA,CAAThD,SAAS;IAAEE,UAAU,GAAA8C,IAAA,CAAV9C,UAAU;EAEtB,IAAM+C,WAAW,GAAGC,cAAc,CAAC7C,EAAE,EAAEO,SAAS,CAAC;EACjD,IAAMuC,UAAU,GAAGC,iBAAiB,CAAC/C,EAAE,EAAEO,SAAS,CAAC;EACnD,IAAMyC,eAAe,GAAGC,gBAAgB,CAACjD,EAAE,EAAEO,SAAS,CAAC;EAIvD,IAAA2C,SAAA,GAA0BlD,EAAE,CAACmD,IAAI,mBAAAhB,MAAA,CAAoB5B,SAAS,OAAK,CAAC,CAAC,CAAC,CAAC;IAAhE6C,OAAO,GAAAF,SAAA,CAAPE,OAAO;IAAEC,MAAM,GAAAH,SAAA,CAANG,MAAM;EAEtB,IAAIC,UAAU;EACd,IAAI3D,SAAS,EAAE;IACb,IAAM4D,iBAAiB,GAAGrD,WAAW,CAAC4C,UAAU,CAACU,MAAM,CAAC;IACxDF,UAAU,GAAG,IAAIG,qBAAe,CAAC;MAC/BtH,IAAI,EAAEoH,iBAAiB;MACvBG,EAAE,EAAE7D;IACN,CAAC,CAAC;EACJ;EAEA,IAAM8D,eAAyB,GAAG,EAAE;EAAC,IAAAC,SAAA,GAAA7J,0BAAA,CACnBsJ,MAAM;IAAAQ,KAAA;EAAA;IAAxB,KAAAD,SAAA,CAAAjJ,CAAA,MAAAkJ,KAAA,GAAAD,SAAA,CAAAhJ,CAAA,IAAAC,IAAA,GAA0B;MAAA,IAAfiJ,GAAG,GAAAD,KAAA,CAAA/I,KAAA;MACZ,IAAMiJ,cAAc,GAAGC,uBAAuB,CAC5CZ,OAAO,EACPU,GAAG,EACHhB,UAAU,EAEVF,WAAW,EACXI,eACF,CAAC;MACDW,eAAe,CAACvC,IAAI,CAAC2C,cAAc,CAAC;IACtC;EAAC,SAAA1I,GAAA;IAAAuI,SAAA,CAAA7I,CAAA,CAAAM,GAAA;EAAA;IAAAuI,SAAA,CAAA3I,CAAA;EAAA;EAED,IAAMgJ,MAAM,GAAGC,cAAc,CAAClE,EAAE,EAAEO,SAAS,CAAC;EAC5C,IAAI+C,UAAU,EAAE;IACd,OAAO;MACLa,IAAI,EAAE,IAAAC,2BAAsB,EAACT,eAAe,EAAEL,UAAU,CAACe,OAAO,CAAC;MACjEJ,MAAM,EAANA,MAAM;MACN/C,KAAK,EAAE;IACT,CAAC;EACH;EAEA,OAAO;IAACiD,IAAI,EAAER,eAAe;IAAEM,MAAM,EAANA,MAAM;IAAE/C,KAAK,EAAE;EAAkB,CAAC;AACnE;AAQA,SAASD,cAAcA,CAACjB,EAAY,EAAqB;EAEvD,IAAMsC,IAAI,GAAGtC,EAAE,CAACuC,OAAO,CAAC,qCAAqC,CAAC;EAE9D,IAAM+B,iBAAoC,GAAG,CAAC,CAAC;EAC/C,OAAOhC,IAAI,CAAC/G,IAAI,CAAC,CAAC,EAAE;IAClB,IAAMgJ,OAAO,GAAGjC,IAAI,CAACI,WAAW,CAAC,CAAgC;IACjE,IAAOc,MAAM,GAAgBe,OAAO,CAA7Bf,MAAM;MAAEgB,UAAU,GAAID,OAAO,CAArBC,UAAU;IACzBF,iBAAiB,CAACd,MAAM,CAAC,GAAGgB,UAAU;EACxC;EAEA,OAAOF,iBAAiB;AAC1B;AAUA,SAASN,uBAAuBA,CAC9BZ,OAAiB,EACjBU,GAAU,EACVhB,UAA8B,EAC9BF,WAA+B,EAC/BI,eAAuB,EACG;EAE1B,IAAMyB,KAAK,GAAGrB,OAAO,CAACsB,OAAO,CAAC1B,eAAe,CAAC;EAC9C,IAAM2B,EAAE,GAAGb,GAAG,CAACW,KAAK,CAAC;EAGrB,IAAMG,aAAa,GAAGxB,OAAO,CAACsB,OAAO,CAAC5B,UAAU,CAAC+B,WAAW,CAAC;EAC7D,IAAMC,QAAQ,GAAGC,aAAa,CAACjB,GAAG,CAACc,aAAa,CAAC,CAACI,MAAM,CAAC;EAEzD,IAAMC,UAAU,GAAG,CAAC,CAAC;EACrB,IAAIrC,WAAW,EAAE;IACf,SAAAsC,EAAA,MAAAC,eAAA,GAA2BtJ,MAAM,CAACuJ,OAAO,CAACxC,WAAW,CAAC,EAAAsC,EAAA,GAAAC,eAAA,CAAA3K,MAAA,EAAA0K,EAAA,IAAE;MAAnD,IAAAG,kBAAA,OAAAC,eAAA,CAAAtG,OAAA,EAAAmG,eAAA,CAAAD,EAAA;QAAOK,GAAG,GAAAF,kBAAA;QAAEvK,KAAK,GAAAuK,kBAAA;MACpB,IAAMG,GAAG,GAAGpC,OAAO,CAACsB,OAAO,CAACa,GAAG,CAAC;MAEhCN,UAAU,CAACnK,KAAK,CAAC,GAAGgJ,GAAG,CAAC0B,GAAG,CAAC;IAC9B;EACF,CAAC,MAAM;IAEL,KAAK,IAAI/K,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAG2I,OAAO,CAAC5I,MAAM,EAAEC,CAAC,EAAE,EAAE;MACvC,IAAIA,CAAC,KAAKgK,KAAK,IAAIhK,CAAC,KAAKmK,aAAa,EAAE;QAEtC;MACF;MAEA,IAAMa,UAAU,GAAGrC,OAAO,CAAC3I,CAAC,CAAC;MAC7BwK,UAAU,CAACQ,UAAU,CAAC,GAAG3B,GAAG,CAACrJ,CAAC,CAAC;IACjC;EACF;EAEA,OAAO;IACLkK,EAAE,EAAFA,EAAE;IACFe,IAAI,EAAE,SAAS;IACfZ,QAAQ,EAARA,QAAQ;IACRG,UAAU,EAAVA;EACF,CAAC;AACH;AAUA,SAASU,oBAAoBA,CAAC3F,EAAY,EAAiB;EACzD,IAAM4F,WAAW,GAAG,IAAIC,WAAW,CAAC,CAAC;EAGrC,IAAMC,kBAAkB,GAAG9F,EAAE,CAACmD,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC,CAAC;EAC/D,IAAM4C,aAAa,GAAGD,kBAAkB,CAACzC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;EAGrD,IAAM2B,MAAM,GAAG,IAAIgB,WAAW,CAAC,CAAC,CAAC;EACjC,IAAMC,IAAI,GAAG,IAAIC,QAAQ,CAAClB,MAAM,CAAC;EACjCiB,IAAI,CAACE,QAAQ,CAAC,CAAC,EAAEC,MAAM,CAACL,aAAa,CAAC,CAAC;EACvC,IAAMM,aAAa,GAAGT,WAAW,CAACU,MAAM,CAACtB,MAAM,CAAC;EAEhD,IAAIqB,aAAa,KAAK,MAAM,EAAE;IAC5B,OAAO,KAAK;EACd;EAEA,IAAIA,aAAa,KAAK,MAAM,EAAE;IAC5B,OAAO,KAAK;EACd;EAGA,IAAME,gBAAgB,GAAGvG,EAAE,CAACmD,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;EAC3D,IAAMqD,cAAc,GAAGD,gBAAgB,CAAClD,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;EAEpD,IAAImD,cAAc,IAAI,OAAOA,cAAc,KAAK,QAAQ,IAAIA,cAAc,GAAG,KAAK,EAAE;IAClF,OAAO,KAAK;EACd;EAEA,OAAO,IAAI;AACb;AAWA,SAASvD,gBAAgBA,CAACjD,EAAY,EAAEO,SAAiB,EAAiB;EAExE,IAAM+B,IAAI,GAAGtC,EAAE,CAACuC,OAAO,uBAAAJ,MAAA,CAAwB5B,SAAS,OAAK,CAAC;EAE9D,OAAO+B,IAAI,CAAC/G,IAAI,CAAC,CAAC,EAAE;IAClB,IAAMkL,eAAe,GAAGnE,IAAI,CAACI,WAAW,CAAC,CAAkC;IAC3E,IAAOxG,IAAI,GAAQuK,eAAe,CAA3BvK,IAAI;MAAEwK,EAAE,GAAID,eAAe,CAArBC,EAAE;IACf,IAAIA,EAAE,EAAE;MACN,OAAOxK,IAAI;IACb;EACF;EAGA,OAAO,IAAI;AACb;AAUA,SAAS6I,aAAaA,CAAC3F,WAAwB,EAAmB;EAChE,IAAM6G,IAAI,GAAG,IAAIC,QAAQ,CAAC9G,WAAW,CAAC;EACtC,IAAAuH,qBAAA,GAAwCC,qBAAqB,CAACX,IAAI,CAACY,QAAQ,CAAC,CAAC,CAAC,CAAC;IAAxEC,cAAc,GAAAH,qBAAA,CAAdG,cAAc;IAAEC,aAAa,GAAAJ,qBAAA,CAAbI,aAAa;EAMpC,IAAIA,aAAa,EAAE;IACjB,OAAO,IAAI;EACb;EAOA,IAAMC,SAAS,GAAG,CAAC,GAAGF,cAAc;EAIpC,IAAMG,cAAc,GAAGC,cAAS,CAACC,SAAS,CAAC/H,WAAW,CAACpD,KAAK,CAACgL,SAAS,CAAC,CAAC;EAExE,OAAO,IAAAI,qBAAgB,EAACH,cAAc,CAAC;AACzC;AASA,SAASL,qBAAqBA,CAACS,IAAY,EAAoB;EAE7D,IAAMC,aAAa,GAAG,CAACD,IAAI,GAAG,EAAU,IAAI,CAAC;EAG7C,IAAMP,cAAc,GAAGpK,qBAAqB,CAAC4K,aAAa,CAAW;EAErE,OAAO;IACLC,YAAY,EAAEC,OAAO,CAACH,IAAI,GAAG,CAAU,CAAC;IACxCP,cAAc,EAAdA,cAAc;IACdC,aAAa,EAAES,OAAO,CAACH,IAAI,GAAG,EAAU,CAAC;IACzCI,oBAAoB,EAAED,OAAO,CAACH,IAAI,GAAG,EAAU;EACjD,CAAC;AACH;AASA,SAAStE,iBAAiBA,CAAC/C,EAAY,EAAEO,SAAiB,EAAsB;EAC9E,IAAM+B,IAAI,GAAGtC,EAAE,CAACuC,OAAO,CAAC,kEAAkE,CAAC;EAC3FD,IAAI,CAACoF,IAAI,CAAC;IAAC,YAAY,EAAEnH;EAAS,CAAC,CAAC;EAOpC+B,IAAI,CAAC/G,IAAI,CAAC,CAAC;EACX,IAAMoM,cAAc,GAAGrF,IAAI,CAACI,WAAW,CAAC,CAAkC;EAC1E,OAAOiF,cAAc;AACvB;AAQA,SAAS9E,cAAcA,CAAC7C,EAAY,EAAEO,SAAiB,EAA6B;EAGlF,IAAI+B,IAAe;EACnB,IAAI;IACFA,IAAI,GAAGtC,EAAE,CAACuC,OAAO,CAAC,8DAA8D,CAAC;EACnF,CAAC,CAAC,OAAOqF,KAAK,EAAE;IACd,IAAKA,KAAK,CAAWC,OAAO,CAACC,QAAQ,CAAC,eAAe,CAAC,EAAE;MACtD,OAAO,IAAI;IACb;IAEA,MAAMF,KAAK;EACb;EAEAtF,IAAI,CAACoF,IAAI,CAAC;IAAC,YAAY,EAAEnH;EAAS,CAAC,CAAC;EAGpC,IAAMwH,MAA0B,GAAG,CAAC,CAAC;EACrC,OAAOzF,IAAI,CAAC/G,IAAI,CAAC,CAAC,EAAE;IAClB,IAAMyM,MAAM,GAAG1F,IAAI,CAACI,WAAW,CAAC,CAA8B;IAC9D,IAAOmC,WAAW,GAAUmD,MAAM,CAA3BnD,WAAW;MAAE3I,IAAI,GAAI8L,MAAM,CAAd9L,IAAI;IACxB6L,MAAM,CAAClD,WAAW,CAAC,GAAG3I,IAAI,IAAI,IAAI;EACpC;EAEA,OAAO6L,MAAM;AACf;AAQA,SAAS7D,cAAcA,CAAClE,EAAY,EAAEO,SAAiB,EAAU;EAC/D,IAAM+B,IAAI,GAAGtC,EAAE,CAACuC,OAAO,uBAAAJ,MAAA,CAAwB5B,SAAS,OAAK,CAAC;EAE9D,IAAM0H,MAAe,GAAG,EAAE;EAC1B,OAAO3F,IAAI,CAAC/G,IAAI,CAAC,CAAC,EAAE;IAClB,IAAMkL,eAAe,GAAGnE,IAAI,CAACI,WAAW,CAAC,CAAkC;IAC3E,IAAOxG,IAAI,GAAmBuK,eAAe,CAAtCvK,IAAI;MAAEwJ,IAAI,GAAae,eAAe,CAAhCf,IAAI;MAAEwC,OAAO,GAAIzB,eAAe,CAA1ByB,OAAO;IAC1B,IAAMC,UAAU,GAAGxL,gBAAgB,CAAC+I,IAAI,CAAC,IAAI,IAAI/I,gBAAgB,CAAC+I,IAAI,CAAC,CAAC,CAAC;IACzE,IAAM0C,KAAK,GAAG,IAAIC,aAAK,CAACnM,IAAI,EAAEiM,UAAU,EAAE,CAACD,OAAO,CAAC;IACnDD,MAAM,CAAC7G,IAAI,CAACgH,KAAK,CAAC;EACpB;EAEA,OAAO,IAAIE,cAAM,CAACL,MAAM,CAAC;AAC3B;AAEA,SAAS1G,qBAAqBA,CAACtB,MAA8B,EAA6B;EACxF,IAAMsI,UAAU,GAAG,CAAC,CAAC;EAAC,IAAAC,UAAA,GAAAzO,0BAAA,CACFkG,MAAM,CAACA,MAAM;IAAAwI,MAAA;EAAA;IAAjC,KAAAD,UAAA,CAAA7N,CAAA,MAAA8N,MAAA,GAAAD,UAAA,CAAA5N,CAAA,IAAAC,IAAA,GAAmC;MAAA,IAAxByF,KAAK,GAAAmI,MAAA,CAAA3N,KAAA;MACdyN,UAAU,CAACjI,KAAK,CAACpE,IAAI,CAAC,GAAGoE,KAAK,CAACA,KAAK,CAAC6D,IAAI;IAC3C;EAAC,SAAA9I,GAAA;IAAAmN,UAAA,CAAAzN,CAAA,CAAAM,GAAA;EAAA;IAAAmN,UAAA,CAAAvN,CAAA;EAAA;EAED,OAAOsN,UAAU;AACnB"}
|
package/dist/esm/bundle.js
CHANGED
package/dist/esm/bundle.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bundle.js","names":["moduleExports","require","globalThis","loaders","module","exports","Object","assign"],"sources":["../../src/bundle.ts"],"sourcesContent":["// @ts-nocheck\nconst moduleExports = require('./index');\nglobalThis.loaders = globalThis.loaders || {};\nmodule.exports = Object.assign(globalThis.loaders, moduleExports);\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"bundle.js","names":["moduleExports","require","globalThis","loaders","module","exports","Object","assign"],"sources":["../../src/bundle.ts"],"sourcesContent":["// @ts-nocheck\nconst moduleExports = require('./index');\nglobalThis.loaders = globalThis.loaders || {};\nmodule.exports = Object.assign(globalThis.loaders, moduleExports);\n"],"mappings":"AACA,MAAMA,aAAa,GAAGC,OAAO,CAAC,SAAS,CAAC;AACxCC,UAAU,CAACC,OAAO,GAAGD,UAAU,CAACC,OAAO,IAAI,CAAC,CAAC;AAC7CC,MAAM,CAACC,OAAO,GAAGC,MAAM,CAACC,MAAM,CAACL,UAAU,CAACC,OAAO,EAAEH,aAAa,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"geopackage-loader.js","names":["parseGeoPackage","DEFAULT_SQLJS_CDN","VERSION","GeoPackageLoader","id","name","module","version","extensions","mimeTypes","category","parse","options","geopackage","sqlJsCDN","gis","format"],"sources":["../../src/geopackage-loader.ts"],"sourcesContent":["import type {LoaderWithParser, LoaderOptions} from '@loaders.gl/loader-utils';\nimport parseGeoPackage, {DEFAULT_SQLJS_CDN} from './lib/parse-geopackage';\n\n// __VERSION__ is injected by babel-plugin-version-inline\n// @ts-ignore TS2304: Cannot find name '__VERSION__'.\n// const VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'latest';\nconst VERSION = 'latest';\n\nexport type GeoPackageLoaderOptions = LoaderOptions & {\n geopackage?: {\n // Use null in Node\n sqlJsCDN: string | null;\n };\n gis?: {\n reproject?: boolean;\n _targetCrs?: string;\n format?: 'geojson' | 'tables';\n };\n};\n\n/** Geopackage loader */\nexport const GeoPackageLoader: LoaderWithParser = {\n id: 'geopackage',\n name: 'GeoPackage',\n module: 'geopackage',\n version: VERSION,\n extensions: ['gpkg'],\n mimeTypes: ['application/geopackage+sqlite3'],\n category: 'geometry',\n parse: parseGeoPackage,\n options: {\n geopackage: {\n sqlJsCDN: DEFAULT_SQLJS_CDN\n },\n gis: {\n format: 'tables'\n }\n }\n};\n"],"mappings":"AACA,OAAOA,eAAe,IAAGC,iBAAiB,QAAO,wBAAwB
|
|
1
|
+
{"version":3,"file":"geopackage-loader.js","names":["parseGeoPackage","DEFAULT_SQLJS_CDN","VERSION","GeoPackageLoader","id","name","module","version","extensions","mimeTypes","category","parse","options","geopackage","sqlJsCDN","gis","format"],"sources":["../../src/geopackage-loader.ts"],"sourcesContent":["import type {LoaderWithParser, LoaderOptions} from '@loaders.gl/loader-utils';\nimport parseGeoPackage, {DEFAULT_SQLJS_CDN} from './lib/parse-geopackage';\n\n// __VERSION__ is injected by babel-plugin-version-inline\n// @ts-ignore TS2304: Cannot find name '__VERSION__'.\n// const VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'latest';\nconst VERSION = 'latest';\n\nexport type GeoPackageLoaderOptions = LoaderOptions & {\n geopackage?: {\n // Use null in Node\n sqlJsCDN: string | null;\n };\n gis?: {\n reproject?: boolean;\n _targetCrs?: string;\n format?: 'geojson' | 'tables';\n };\n};\n\n/** Geopackage loader */\nexport const GeoPackageLoader: LoaderWithParser = {\n id: 'geopackage',\n name: 'GeoPackage',\n module: 'geopackage',\n version: VERSION,\n extensions: ['gpkg'],\n mimeTypes: ['application/geopackage+sqlite3'],\n category: 'geometry',\n parse: parseGeoPackage,\n options: {\n geopackage: {\n sqlJsCDN: DEFAULT_SQLJS_CDN\n },\n gis: {\n format: 'tables'\n }\n }\n};\n"],"mappings":"AACA,OAAOA,eAAe,IAAGC,iBAAiB,QAAO,wBAAwB;AAKzE,MAAMC,OAAO,GAAG,QAAQ;AAexB,OAAO,MAAMC,gBAAkC,GAAG;EAChDC,EAAE,EAAE,YAAY;EAChBC,IAAI,EAAE,YAAY;EAClBC,MAAM,EAAE,YAAY;EACpBC,OAAO,EAAEL,OAAO;EAChBM,UAAU,EAAE,CAAC,MAAM,CAAC;EACpBC,SAAS,EAAE,CAAC,gCAAgC,CAAC;EAC7CC,QAAQ,EAAE,UAAU;EACpBC,KAAK,EAAEX,eAAe;EACtBY,OAAO,EAAE;IACPC,UAAU,EAAE;MACVC,QAAQ,EAAEb;IACZ,CAAC;IACDc,GAAG,EAAE;MACHC,MAAM,EAAE;IACV;EACF;AACF,CAAC"}
|
|
@@ -1,12 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
1
|
import initSqlJs from 'sql.js';
|
|
4
2
|
import { WKBLoader } from '@loaders.gl/wkt';
|
|
5
3
|
import { Schema, Field, Bool, Utf8, Float64, Int32, Int8, Int16, Float32, Binary } from '@loaders.gl/schema';
|
|
6
4
|
import { binaryToGeometry, transformGeoJsonCoords } from '@loaders.gl/gis';
|
|
7
5
|
import { Proj4Projection } from '@math.gl/proj4';
|
|
8
6
|
export const DEFAULT_SQLJS_CDN = 'https://cdnjs.cloudflare.com/ajax/libs/sql.js/1.5.0/';
|
|
9
|
-
|
|
10
7
|
const ENVELOPE_BYTE_LENGTHS = {
|
|
11
8
|
0: 0,
|
|
12
9
|
1: 32,
|
|
@@ -17,7 +14,6 @@ const ENVELOPE_BYTE_LENGTHS = {
|
|
|
17
14
|
6: 0,
|
|
18
15
|
7: 0
|
|
19
16
|
};
|
|
20
|
-
|
|
21
17
|
const SQL_TYPE_MAPPING = {
|
|
22
18
|
BOOLEAN: Bool,
|
|
23
19
|
TINYINT: Int8,
|
|
@@ -53,7 +49,6 @@ export default async function parseGeoPackage(arrayBuffer, options) {
|
|
|
53
49
|
const db = await loadDatabase(arrayBuffer, sqlJsCDN);
|
|
54
50
|
const tables = listVectorTables(db);
|
|
55
51
|
const projections = getProjections(db);
|
|
56
|
-
|
|
57
52
|
const outputTables = {
|
|
58
53
|
shape: 'tables',
|
|
59
54
|
tables: []
|
|
@@ -75,7 +70,6 @@ export default async function parseGeoPackage(arrayBuffer, options) {
|
|
|
75
70
|
}
|
|
76
71
|
return outputTables;
|
|
77
72
|
}
|
|
78
|
-
|
|
79
73
|
async function loadDatabase(arrayBuffer, sqlJsCDN) {
|
|
80
74
|
let SQL;
|
|
81
75
|
if (sqlJsCDN) {
|
|
@@ -87,9 +81,7 @@ async function loadDatabase(arrayBuffer, sqlJsCDN) {
|
|
|
87
81
|
}
|
|
88
82
|
return new SQL.Database(new Uint8Array(arrayBuffer));
|
|
89
83
|
}
|
|
90
|
-
|
|
91
84
|
function listVectorTables(db) {
|
|
92
|
-
|
|
93
85
|
const stmt = db.prepare("SELECT * FROM gpkg_contents WHERE data_type='features';");
|
|
94
86
|
const vectorTablesInfo = [];
|
|
95
87
|
while (stmt.step()) {
|
|
@@ -98,7 +90,6 @@ function listVectorTables(db) {
|
|
|
98
90
|
}
|
|
99
91
|
return vectorTablesInfo;
|
|
100
92
|
}
|
|
101
|
-
|
|
102
93
|
function getVectorTable(db, tableName, projections, _ref) {
|
|
103
94
|
let {
|
|
104
95
|
reproject,
|
|
@@ -107,7 +98,6 @@ function getVectorTable(db, tableName, projections, _ref) {
|
|
|
107
98
|
const dataColumns = getDataColumns(db, tableName);
|
|
108
99
|
const geomColumn = getGeometryColumn(db, tableName);
|
|
109
100
|
const featureIdColumn = getFeatureIdName(db, tableName);
|
|
110
|
-
|
|
111
101
|
const {
|
|
112
102
|
columns,
|
|
113
103
|
values
|
|
@@ -122,8 +112,7 @@ function getVectorTable(db, tableName, projections, _ref) {
|
|
|
122
112
|
}
|
|
123
113
|
const geojsonFeatures = [];
|
|
124
114
|
for (const row of values) {
|
|
125
|
-
const geojsonFeature = constructGeoJsonFeature(columns, row, geomColumn,
|
|
126
|
-
dataColumns, featureIdColumn);
|
|
115
|
+
const geojsonFeature = constructGeoJsonFeature(columns, row, geomColumn, dataColumns, featureIdColumn);
|
|
127
116
|
geojsonFeatures.push(geojsonFeature);
|
|
128
117
|
}
|
|
129
118
|
const schema = getArrowSchema(db, tableName);
|
|
@@ -140,7 +129,6 @@ function getVectorTable(db, tableName, projections, _ref) {
|
|
|
140
129
|
shape: 'object-row-table'
|
|
141
130
|
};
|
|
142
131
|
}
|
|
143
|
-
|
|
144
132
|
function getProjections(db) {
|
|
145
133
|
const stmt = db.prepare('SELECT * FROM gpkg_spatial_ref_sys;');
|
|
146
134
|
const projectionMapping = {};
|
|
@@ -154,11 +142,9 @@ function getProjections(db) {
|
|
|
154
142
|
}
|
|
155
143
|
return projectionMapping;
|
|
156
144
|
}
|
|
157
|
-
|
|
158
145
|
function constructGeoJsonFeature(columns, row, geomColumn, dataColumns, featureIdColumn) {
|
|
159
146
|
const idIdx = columns.indexOf(featureIdColumn);
|
|
160
147
|
const id = row[idIdx];
|
|
161
|
-
|
|
162
148
|
const geomColumnIdx = columns.indexOf(geomColumn.column_name);
|
|
163
149
|
const geometry = parseGeometry(row[geomColumnIdx].buffer);
|
|
164
150
|
const properties = {};
|
|
@@ -183,13 +169,10 @@ function constructGeoJsonFeature(columns, row, geomColumn, dataColumns, featureI
|
|
|
183
169
|
properties
|
|
184
170
|
};
|
|
185
171
|
}
|
|
186
|
-
|
|
187
172
|
function getGeopackageVersion(db) {
|
|
188
173
|
const textDecoder = new TextDecoder();
|
|
189
|
-
|
|
190
174
|
const applicationIdQuery = db.exec('PRAGMA application_id;')[0];
|
|
191
175
|
const applicationId = applicationIdQuery.values[0][0];
|
|
192
|
-
|
|
193
176
|
const buffer = new ArrayBuffer(4);
|
|
194
177
|
const view = new DataView(buffer);
|
|
195
178
|
view.setInt32(0, Number(applicationId));
|
|
@@ -200,15 +183,13 @@ function getGeopackageVersion(db) {
|
|
|
200
183
|
if (versionString === 'GP11') {
|
|
201
184
|
return '1.1';
|
|
202
185
|
}
|
|
203
|
-
|
|
204
186
|
const userVersionQuery = db.exec('PRAGMA user_version;')[0];
|
|
205
187
|
const userVersionInt = userVersionQuery.values[0][0];
|
|
206
|
-
if (userVersionInt && userVersionInt < 10300) {
|
|
188
|
+
if (userVersionInt && typeof userVersionInt === 'number' && userVersionInt < 10300) {
|
|
207
189
|
return '1.2';
|
|
208
190
|
}
|
|
209
191
|
return null;
|
|
210
192
|
}
|
|
211
|
-
|
|
212
193
|
function getFeatureIdName(db, tableName) {
|
|
213
194
|
const stmt = db.prepare("PRAGMA table_info(`".concat(tableName, "`)"));
|
|
214
195
|
while (stmt.step()) {
|
|
@@ -221,30 +202,23 @@ function getFeatureIdName(db, tableName) {
|
|
|
221
202
|
return name;
|
|
222
203
|
}
|
|
223
204
|
}
|
|
224
|
-
|
|
225
205
|
return null;
|
|
226
206
|
}
|
|
227
|
-
|
|
228
207
|
function parseGeometry(arrayBuffer) {
|
|
229
208
|
const view = new DataView(arrayBuffer);
|
|
230
209
|
const {
|
|
231
210
|
envelopeLength,
|
|
232
211
|
emptyGeometry
|
|
233
212
|
} = parseGeometryBitFlags(view.getUint8(3));
|
|
234
|
-
|
|
235
213
|
if (emptyGeometry) {
|
|
236
214
|
return null;
|
|
237
215
|
}
|
|
238
|
-
|
|
239
216
|
const wkbOffset = 8 + envelopeLength;
|
|
240
|
-
|
|
241
217
|
const binaryGeometry = WKBLoader.parseSync(arrayBuffer.slice(wkbOffset));
|
|
242
218
|
return binaryToGeometry(binaryGeometry);
|
|
243
219
|
}
|
|
244
|
-
|
|
245
220
|
function parseGeometryBitFlags(byte) {
|
|
246
221
|
const envelopeValue = (byte & 0b00001110) / 2;
|
|
247
|
-
|
|
248
222
|
const envelopeLength = ENVELOPE_BYTE_LENGTHS[envelopeValue];
|
|
249
223
|
return {
|
|
250
224
|
littleEndian: Boolean(byte & 0b00000001),
|
|
@@ -253,18 +227,15 @@ function parseGeometryBitFlags(byte) {
|
|
|
253
227
|
extendedGeometryType: Boolean(byte & 0b00100000)
|
|
254
228
|
};
|
|
255
229
|
}
|
|
256
|
-
|
|
257
230
|
function getGeometryColumn(db, tableName) {
|
|
258
231
|
const stmt = db.prepare('SELECT * FROM gpkg_geometry_columns WHERE table_name=:tableName;');
|
|
259
232
|
stmt.bind({
|
|
260
233
|
':tableName': tableName
|
|
261
234
|
});
|
|
262
|
-
|
|
263
235
|
stmt.step();
|
|
264
236
|
const geometryColumn = stmt.getAsObject();
|
|
265
237
|
return geometryColumn;
|
|
266
238
|
}
|
|
267
|
-
|
|
268
239
|
function getDataColumns(db, tableName) {
|
|
269
240
|
let stmt;
|
|
270
241
|
try {
|
|
@@ -278,7 +249,6 @@ function getDataColumns(db, tableName) {
|
|
|
278
249
|
stmt.bind({
|
|
279
250
|
':tableName': tableName
|
|
280
251
|
});
|
|
281
|
-
|
|
282
252
|
const result = {};
|
|
283
253
|
while (stmt.step()) {
|
|
284
254
|
const column = stmt.getAsObject();
|
|
@@ -290,7 +260,6 @@ function getDataColumns(db, tableName) {
|
|
|
290
260
|
}
|
|
291
261
|
return result;
|
|
292
262
|
}
|
|
293
|
-
|
|
294
263
|
function getArrowSchema(db, tableName) {
|
|
295
264
|
const stmt = db.prepare("PRAGMA table_info(`".concat(tableName, "`)"));
|
|
296
265
|
const fields = [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse-geopackage.js","names":["initSqlJs","WKBLoader","Schema","Field","Bool","Utf8","Float64","Int32","Int8","Int16","Float32","Binary","binaryToGeometry","transformGeoJsonCoords","Proj4Projection","DEFAULT_SQLJS_CDN","ENVELOPE_BYTE_LENGTHS","SQL_TYPE_MAPPING","BOOLEAN","TINYINT","SMALLINT","MEDIUMINT","INT","INTEGER","FLOAT","DOUBLE","REAL","TEXT","BLOB","DATE","DATETIME","GEOMETRY","POINT","LINESTRING","POLYGON","MULTIPOINT","MULTILINESTRING","MULTIPOLYGON","GEOMETRYCOLLECTION","parseGeoPackage","arrayBuffer","options","sqlJsCDN","geopackage","reproject","_targetCrs","format","gis","db","loadDatabase","tables","listVectorTables","projections","getProjections","outputTables","shape","table","table_name","tableName","push","name","getVectorTable","formatTablesAsGeojson","SQL","locateFile","file","Database","Uint8Array","stmt","prepare","vectorTablesInfo","step","vectorTableInfo","getAsObject","dataColumns","getDataColumns","geomColumn","getGeometryColumn","featureIdColumn","getFeatureIdName","columns","values","exec","projection","geomColumnProjStr","srs_id","from","to","geojsonFeatures","row","geojsonFeature","constructGeoJsonFeature","schema","getArrowSchema","data","project","projectionMapping","srsInfo","definition","idIdx","indexOf","id","geomColumnIdx","column_name","geometry","parseGeometry","buffer","properties","key","value","Object","entries","idx","i","length","columnName","type","getGeopackageVersion","textDecoder","TextDecoder","applicationIdQuery","applicationId","ArrayBuffer","view","DataView","setInt32","Number","versionString","decode","userVersionQuery","userVersionInt","pragmaTableInfo","pk","envelopeLength","emptyGeometry","parseGeometryBitFlags","getUint8","wkbOffset","binaryGeometry","parseSync","slice","byte","envelopeValue","littleEndian","Boolean","extendedGeometryType","bind","geometryColumn","error","message","includes","result","column","fields","notnull","schemaType","field","geojsonMap"],"sources":["../../../src/lib/parse-geopackage.ts"],"sourcesContent":["/* eslint-disable camelcase, @typescript-eslint/no-use-before-define */\nimport type {GeoPackageLoaderOptions} from '../geopackage-loader';\nimport initSqlJs, {SqlJsStatic, Database, Statement} from 'sql.js';\nimport {WKBLoader} from '@loaders.gl/wkt';\nimport {\n Schema,\n Field,\n Geometry,\n DataType,\n Bool,\n Utf8,\n Float64,\n Int32,\n Int8,\n Int16,\n Float32,\n Binary,\n Tables,\n ObjectRowTable,\n Feature\n} from '@loaders.gl/schema';\nimport {binaryToGeometry, transformGeoJsonCoords} from '@loaders.gl/gis';\nimport {Proj4Projection} from '@math.gl/proj4';\nimport {\n GeometryColumnsRow,\n ContentsRow,\n SpatialRefSysRow,\n ProjectionMapping,\n GeometryBitFlags,\n DataColumnsRow,\n DataColumnsMapping,\n PragmaTableInfoRow,\n SQLiteTypes,\n GeoPackageGeometryTypes\n} from './types';\n\n// We pin to the same version as sql.js that we use.\n// As of March 2022, versions 1.6.0, 1.6.1, and 1.6.2 of sql.js appeared not to work.\nexport const DEFAULT_SQLJS_CDN = 'https://cdnjs.cloudflare.com/ajax/libs/sql.js/1.5.0/';\n\n// https://www.geopackage.org/spec121/#flags_layout\nconst ENVELOPE_BYTE_LENGTHS = {\n 0: 0,\n 1: 32,\n 2: 48,\n 3: 48,\n 4: 64,\n // values 5-7 are invalid and _should_ never show up\n 5: 0,\n 6: 0,\n 7: 0\n};\n\n// Documentation: https://www.geopackage.org/spec130/index.html#table_column_data_types\nconst SQL_TYPE_MAPPING: {[type in SQLiteTypes | GeoPackageGeometryTypes]: typeof DataType} = {\n BOOLEAN: Bool,\n TINYINT: Int8,\n SMALLINT: Int16,\n MEDIUMINT: Int32,\n INT: Int32,\n INTEGER: Int32,\n FLOAT: Float32,\n DOUBLE: Float64,\n REAL: Float64,\n TEXT: Utf8,\n BLOB: Binary,\n DATE: Utf8,\n DATETIME: Utf8,\n GEOMETRY: Binary,\n POINT: Binary,\n LINESTRING: Binary,\n POLYGON: Binary,\n MULTIPOINT: Binary,\n MULTILINESTRING: Binary,\n MULTIPOLYGON: Binary,\n GEOMETRYCOLLECTION: Binary\n};\n\nexport default async function parseGeoPackage(\n arrayBuffer: ArrayBuffer,\n options?: GeoPackageLoaderOptions\n): Promise<Tables<ObjectRowTable> | Record<string, Feature[]>> {\n const {sqlJsCDN = DEFAULT_SQLJS_CDN} = options?.geopackage || {};\n const {reproject = false, _targetCrs = 'WGS84', format = 'tables'} = options?.gis || {};\n\n const db = await loadDatabase(arrayBuffer, sqlJsCDN);\n const tables = listVectorTables(db);\n const projections = getProjections(db);\n\n // Mapping from tableName to geojson feature collection\n const outputTables: Tables<ObjectRowTable> = {\n shape: 'tables',\n tables: []\n };\n\n for (const table of tables) {\n const {table_name: tableName} = table;\n outputTables.tables.push({\n name: tableName,\n table: getVectorTable(db, tableName, projections, {\n reproject,\n _targetCrs\n })\n });\n }\n\n if (format === 'geojson') {\n return formatTablesAsGeojson(outputTables);\n }\n\n return outputTables;\n}\n\n/**\n * Initialize SQL.js and create database\n *\n * @param arrayBuffer input bytes\n * @return SQL.js database object\n */\nasync function loadDatabase(arrayBuffer: ArrayBuffer, sqlJsCDN: string | null): Promise<Database> {\n // In Node, `locateFile` must not be passed\n let SQL: SqlJsStatic;\n if (sqlJsCDN) {\n SQL = await initSqlJs({\n locateFile: (file) => `${sqlJsCDN}${file}`\n });\n } else {\n SQL = await initSqlJs();\n }\n return new SQL.Database(new Uint8Array(arrayBuffer));\n}\n\n/**\n * Find all vector tables in GeoPackage\n * This queries the `gpkg_contents` table to find a list of vector tables\n *\n * @param db GeoPackage to query\n * @return list of table references\n */\nfunction listVectorTables(db: Database): ContentsRow[] {\n // The gpkg_contents table can have at least three categorical values for\n // data_type.\n // - 'features' refers to a vector geometry table\n // (https://www.geopackage.org/spec121/#_contents_2)\n // - 'tiles' refers to a raster table\n // (https://www.geopackage.org/spec121/#_contents_3)\n // - 'attributes' refers to a data table with no geometry\n // (https://www.geopackage.org/spec121/#_contents_4).\n\n // We hard code 'features' because for now we don't support raster data or pure attribute data\n // eslint-disable-next-line quotes\n const stmt = db.prepare(\"SELECT * FROM gpkg_contents WHERE data_type='features';\");\n\n const vectorTablesInfo: ContentsRow[] = [];\n while (stmt.step()) {\n const vectorTableInfo = stmt.getAsObject() as unknown as ContentsRow;\n vectorTablesInfo.push(vectorTableInfo);\n }\n\n return vectorTablesInfo;\n}\n\n/**\n * Load geometries from vector table\n *\n * @param db GeoPackage object\n * @param tableName name of vector table to query\n * @param projections keys are srs_id values, values are WKT strings\n * @returns Array of GeoJSON Feature objects\n */\nfunction getVectorTable(\n db: Database,\n tableName: string,\n projections: ProjectionMapping,\n {reproject, _targetCrs}: {reproject: boolean; _targetCrs: string}\n): ObjectRowTable {\n const dataColumns = getDataColumns(db, tableName);\n const geomColumn = getGeometryColumn(db, tableName);\n const featureIdColumn = getFeatureIdName(db, tableName);\n\n // Get vector features from table\n // Don't think it's possible to parameterize the table name in SQLite?\n const {columns, values} = db.exec(`SELECT * FROM \\`${tableName}\\`;`)[0];\n\n let projection;\n if (reproject) {\n const geomColumnProjStr = projections[geomColumn.srs_id];\n projection = new Proj4Projection({\n from: geomColumnProjStr,\n to: _targetCrs\n });\n }\n\n const geojsonFeatures: object[] = [];\n for (const row of values) {\n const geojsonFeature = constructGeoJsonFeature(\n columns,\n row,\n geomColumn,\n // @ts-ignore\n dataColumns,\n featureIdColumn\n );\n geojsonFeatures.push(geojsonFeature);\n }\n\n const schema = getArrowSchema(db, tableName);\n if (projection) {\n return {\n data: transformGeoJsonCoords(geojsonFeatures, projection.project),\n schema,\n shape: 'object-row-table'\n };\n }\n\n return {data: geojsonFeatures, schema, shape: 'object-row-table'};\n}\n\n/**\n * Find all projections defined in GeoPackage\n * This queries the gpkg_spatial_ref_sys table\n * @param db GeoPackage object\n * @returns mapping from srid to WKT projection string\n */\nfunction getProjections(db: Database): ProjectionMapping {\n // Query gpkg_spatial_ref_sys to get srid: srtext mappings\n const stmt = db.prepare('SELECT * FROM gpkg_spatial_ref_sys;');\n\n const projectionMapping: ProjectionMapping = {};\n while (stmt.step()) {\n const srsInfo = stmt.getAsObject() as unknown as SpatialRefSysRow;\n const {srs_id, definition} = srsInfo;\n projectionMapping[srs_id] = definition;\n }\n\n return projectionMapping;\n}\n\n/**\n * Construct single GeoJSON feature given row's data\n * @param columns array of ordered column identifiers\n * @param row array of ordered values representing row's data\n * @param geomColumn geometry column metadata\n * @param dataColumns mapping from table column names to property name\n * @returns GeoJSON Feature object\n */\nfunction constructGeoJsonFeature(\n columns: string[],\n row: any[],\n geomColumn: GeometryColumnsRow,\n dataColumns: DataColumnsMapping,\n featureIdColumn: string\n): Feature<Geometry | null> {\n // Find feature id\n const idIdx = columns.indexOf(featureIdColumn);\n const id = row[idIdx];\n\n // Parse geometry columns to geojson\n const geomColumnIdx = columns.indexOf(geomColumn.column_name);\n const geometry = parseGeometry(row[geomColumnIdx].buffer);\n\n const properties = {};\n if (dataColumns) {\n for (const [key, value] of Object.entries(dataColumns)) {\n const idx = columns.indexOf(key);\n // @ts-ignore TODO - Check what happens if null?\n properties[value] = row[idx];\n }\n } else {\n // Put all columns except for the feature id and geometry in properties\n for (let i = 0; i < columns.length; i++) {\n if (i === idIdx || i === geomColumnIdx) {\n // eslint-disable-next-line no-continue\n continue;\n }\n\n const columnName = columns[i];\n properties[columnName] = row[i];\n }\n }\n\n return {\n id,\n type: 'Feature',\n geometry,\n properties\n };\n}\n\n/**\n * Get GeoPackage version from database\n * @param db database\n * @returns version string. One of '1.0', '1.1', '1.2'\n */\n\n// @ts-ignore\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nfunction getGeopackageVersion(db: Database): string | null {\n const textDecoder = new TextDecoder();\n\n // Read application id from SQLite metadata\n const applicationIdQuery = db.exec('PRAGMA application_id;')[0];\n const applicationId = applicationIdQuery.values[0][0];\n\n // Convert 4-byte signed int32 application id to text\n const buffer = new ArrayBuffer(4);\n const view = new DataView(buffer);\n view.setInt32(0, Number(applicationId));\n const versionString = textDecoder.decode(buffer);\n\n if (versionString === 'GP10') {\n return '1.0';\n }\n\n if (versionString === 'GP11') {\n return '1.1';\n }\n\n // If versionString is GPKG, then read user_version\n const userVersionQuery = db.exec('PRAGMA user_version;')[0];\n const userVersionInt = userVersionQuery.values[0][0];\n\n if (userVersionInt && userVersionInt < 10300) {\n return '1.2';\n }\n\n return null;\n}\n\n/**\n * Find name of feature id column in table\n * The feature ID is the primary key of the table.\n * http://www.geopackage.org/spec121/#feature_user_tables\n *\n * @param db database\n * @param tableName name of table\n * @return name of feature id column\n */\nfunction getFeatureIdName(db: Database, tableName: string): string | null {\n // Again, not possible to parameterize table name?\n const stmt = db.prepare(`PRAGMA table_info(\\`${tableName}\\`)`);\n\n while (stmt.step()) {\n const pragmaTableInfo = stmt.getAsObject() as unknown as PragmaTableInfoRow;\n const {name, pk} = pragmaTableInfo;\n if (pk) {\n return name;\n }\n }\n\n // Is it guaranteed for there always to be at least one primary key column in the table?\n return null;\n}\n\n/**\n * Parse geometry buffer\n * GeoPackage vector geometries are slightly extended past the WKB standard\n * See: https://www.geopackage.org/spec121/#gpb_format\n *\n * @param arrayBuffer geometry buffer\n * @return GeoJSON geometry (in original CRS)\n */\nfunction parseGeometry(arrayBuffer: ArrayBuffer): Geometry | null {\n const view = new DataView(arrayBuffer);\n const {envelopeLength, emptyGeometry} = parseGeometryBitFlags(view.getUint8(3));\n\n // A Feature object has a member with the name \"geometry\". The value of the\n // geometry member SHALL be either a Geometry object as defined above or, in\n // the case that the Feature is unlocated, a JSON null value.\n /** @see https://tools.ietf.org/html/rfc7946#section-3.2 */\n if (emptyGeometry) {\n return null;\n }\n\n // Do I need to find the srid here? Is it necessarily the same for every\n // geometry in a table?\n // const srid = view.getInt32(4, littleEndian);\n\n // 2 byte magic, 1 byte version, 1 byte flags, 4 byte int32 srid\n const wkbOffset = 8 + envelopeLength;\n\n // Loaders should not depend on `core` and the context passed to the main loader doesn't include a\n // `parseSync` option, so instead we call parseSync directly on WKBLoader\n const binaryGeometry = WKBLoader.parseSync(arrayBuffer.slice(wkbOffset));\n\n return binaryToGeometry(binaryGeometry);\n}\n\n/**\n * Parse geometry header flags\n * https://www.geopackage.org/spec121/#flags_layout\n *\n * @param byte uint8 number representing flags\n * @return object representing information from bit flags\n */\nfunction parseGeometryBitFlags(byte: number): GeometryBitFlags {\n // Are header values little endian?\n const envelopeValue = (byte & 0b00001110) / 2;\n\n // TODO: Not sure the best way to handle this. Throw an error if envelopeValue outside 0-7?\n const envelopeLength = ENVELOPE_BYTE_LENGTHS[envelopeValue] as number;\n\n return {\n littleEndian: Boolean(byte & 0b00000001),\n envelopeLength,\n emptyGeometry: Boolean(byte & 0b00010000),\n extendedGeometryType: Boolean(byte & 0b00100000)\n };\n}\n\n/**\n * Find geometry column in given vector table\n *\n * @param db GeoPackage object\n * @param tableName Name of vector table\n * @returns Array of geometry column definitions\n */\nfunction getGeometryColumn(db: Database, tableName: string): GeometryColumnsRow {\n const stmt = db.prepare('SELECT * FROM gpkg_geometry_columns WHERE table_name=:tableName;');\n stmt.bind({':tableName': tableName});\n\n // > Requirement 30\n // > A feature table SHALL have only one geometry column.\n // https://www.geopackage.org/spec121/#feature_user_tables\n // So we should need one and only one step, given that we use the WHERE clause in the SQL query\n // above\n stmt.step();\n const geometryColumn = stmt.getAsObject() as unknown as GeometryColumnsRow;\n return geometryColumn;\n}\n\n/**\n * Find property columns in given vector table\n * @param db GeoPackage object\n * @param tableName Name of vector table\n * @returns Mapping from table column names to property name\n */\nfunction getDataColumns(db: Database, tableName: string): DataColumnsMapping | null {\n // gpkg_data_columns is not required to exist\n // https://www.geopackage.org/spec121/#extension_schema\n let stmt: Statement;\n try {\n stmt = db.prepare('SELECT * FROM gpkg_data_columns WHERE table_name=:tableName;');\n } catch (error) {\n if ((error as Error).message.includes('no such table')) {\n return null;\n }\n\n throw error;\n }\n\n stmt.bind({':tableName': tableName});\n\n // Convert DataColumnsRow object this to a key-value {column_name: name}\n const result: DataColumnsMapping = {};\n while (stmt.step()) {\n const column = stmt.getAsObject() as unknown as DataColumnsRow;\n const {column_name, name} = column;\n result[column_name] = name || null;\n }\n\n return result;\n}\n\n/**\n * Get arrow schema\n * @param db GeoPackage object\n * @param tableName table name\n * @returns Arrow-like Schema\n */\nfunction getArrowSchema(db: Database, tableName: string): Schema {\n const stmt = db.prepare(`PRAGMA table_info(\\`${tableName}\\`)`);\n\n const fields: Field[] = [];\n while (stmt.step()) {\n const pragmaTableInfo = stmt.getAsObject() as unknown as PragmaTableInfoRow;\n const {name, type, notnull} = pragmaTableInfo;\n const schemaType = SQL_TYPE_MAPPING[type] && new SQL_TYPE_MAPPING[type]();\n const field = new Field(name, schemaType, !notnull);\n fields.push(field);\n }\n\n return new Schema(fields);\n}\n\nfunction formatTablesAsGeojson(tables: Tables<ObjectRowTable>): Record<string, Feature[]> {\n const geojsonMap = {};\n for (const table of tables.tables) {\n geojsonMap[table.name] = table.table.data;\n }\n\n return geojsonMap;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"parse-geopackage.js","names":["initSqlJs","WKBLoader","Schema","Field","Bool","Utf8","Float64","Int32","Int8","Int16","Float32","Binary","binaryToGeometry","transformGeoJsonCoords","Proj4Projection","DEFAULT_SQLJS_CDN","ENVELOPE_BYTE_LENGTHS","SQL_TYPE_MAPPING","BOOLEAN","TINYINT","SMALLINT","MEDIUMINT","INT","INTEGER","FLOAT","DOUBLE","REAL","TEXT","BLOB","DATE","DATETIME","GEOMETRY","POINT","LINESTRING","POLYGON","MULTIPOINT","MULTILINESTRING","MULTIPOLYGON","GEOMETRYCOLLECTION","parseGeoPackage","arrayBuffer","options","sqlJsCDN","geopackage","reproject","_targetCrs","format","gis","db","loadDatabase","tables","listVectorTables","projections","getProjections","outputTables","shape","table","table_name","tableName","push","name","getVectorTable","formatTablesAsGeojson","SQL","locateFile","file","concat","Database","Uint8Array","stmt","prepare","vectorTablesInfo","step","vectorTableInfo","getAsObject","_ref","dataColumns","getDataColumns","geomColumn","getGeometryColumn","featureIdColumn","getFeatureIdName","columns","values","exec","projection","geomColumnProjStr","srs_id","from","to","geojsonFeatures","row","geojsonFeature","constructGeoJsonFeature","schema","getArrowSchema","data","project","projectionMapping","srsInfo","definition","idIdx","indexOf","id","geomColumnIdx","column_name","geometry","parseGeometry","buffer","properties","key","value","Object","entries","idx","i","length","columnName","type","getGeopackageVersion","textDecoder","TextDecoder","applicationIdQuery","applicationId","ArrayBuffer","view","DataView","setInt32","Number","versionString","decode","userVersionQuery","userVersionInt","pragmaTableInfo","pk","envelopeLength","emptyGeometry","parseGeometryBitFlags","getUint8","wkbOffset","binaryGeometry","parseSync","slice","byte","envelopeValue","littleEndian","Boolean","extendedGeometryType","bind","geometryColumn","error","message","includes","result","column","fields","notnull","schemaType","field","geojsonMap"],"sources":["../../../src/lib/parse-geopackage.ts"],"sourcesContent":["/* eslint-disable camelcase, @typescript-eslint/no-use-before-define */\nimport type {GeoPackageLoaderOptions} from '../geopackage-loader';\nimport initSqlJs, {SqlJsStatic, Database, Statement} from 'sql.js';\nimport {WKBLoader} from '@loaders.gl/wkt';\nimport {\n Schema,\n Field,\n Geometry,\n DataType,\n Bool,\n Utf8,\n Float64,\n Int32,\n Int8,\n Int16,\n Float32,\n Binary,\n Tables,\n ObjectRowTable,\n Feature\n} from '@loaders.gl/schema';\nimport {binaryToGeometry, transformGeoJsonCoords} from '@loaders.gl/gis';\nimport {Proj4Projection} from '@math.gl/proj4';\nimport {\n GeometryColumnsRow,\n ContentsRow,\n SpatialRefSysRow,\n ProjectionMapping,\n GeometryBitFlags,\n DataColumnsRow,\n DataColumnsMapping,\n PragmaTableInfoRow,\n SQLiteTypes,\n GeoPackageGeometryTypes\n} from './types';\n\n// We pin to the same version as sql.js that we use.\n// As of March 2022, versions 1.6.0, 1.6.1, and 1.6.2 of sql.js appeared not to work.\nexport const DEFAULT_SQLJS_CDN = 'https://cdnjs.cloudflare.com/ajax/libs/sql.js/1.5.0/';\n\n// https://www.geopackage.org/spec121/#flags_layout\nconst ENVELOPE_BYTE_LENGTHS = {\n 0: 0,\n 1: 32,\n 2: 48,\n 3: 48,\n 4: 64,\n // values 5-7 are invalid and _should_ never show up\n 5: 0,\n 6: 0,\n 7: 0\n};\n\n// Documentation: https://www.geopackage.org/spec130/index.html#table_column_data_types\nconst SQL_TYPE_MAPPING: {[type in SQLiteTypes | GeoPackageGeometryTypes]: typeof DataType} = {\n BOOLEAN: Bool,\n TINYINT: Int8,\n SMALLINT: Int16,\n MEDIUMINT: Int32,\n INT: Int32,\n INTEGER: Int32,\n FLOAT: Float32,\n DOUBLE: Float64,\n REAL: Float64,\n TEXT: Utf8,\n BLOB: Binary,\n DATE: Utf8,\n DATETIME: Utf8,\n GEOMETRY: Binary,\n POINT: Binary,\n LINESTRING: Binary,\n POLYGON: Binary,\n MULTIPOINT: Binary,\n MULTILINESTRING: Binary,\n MULTIPOLYGON: Binary,\n GEOMETRYCOLLECTION: Binary\n};\n\nexport default async function parseGeoPackage(\n arrayBuffer: ArrayBuffer,\n options?: GeoPackageLoaderOptions\n): Promise<Tables<ObjectRowTable> | Record<string, Feature[]>> {\n const {sqlJsCDN = DEFAULT_SQLJS_CDN} = options?.geopackage || {};\n const {reproject = false, _targetCrs = 'WGS84', format = 'tables'} = options?.gis || {};\n\n const db = await loadDatabase(arrayBuffer, sqlJsCDN);\n const tables = listVectorTables(db);\n const projections = getProjections(db);\n\n // Mapping from tableName to geojson feature collection\n const outputTables: Tables<ObjectRowTable> = {\n shape: 'tables',\n tables: []\n };\n\n for (const table of tables) {\n const {table_name: tableName} = table;\n outputTables.tables.push({\n name: tableName,\n table: getVectorTable(db, tableName, projections, {\n reproject,\n _targetCrs\n })\n });\n }\n\n if (format === 'geojson') {\n return formatTablesAsGeojson(outputTables);\n }\n\n return outputTables;\n}\n\n/**\n * Initialize SQL.js and create database\n *\n * @param arrayBuffer input bytes\n * @return SQL.js database object\n */\nasync function loadDatabase(arrayBuffer: ArrayBuffer, sqlJsCDN: string | null): Promise<Database> {\n // In Node, `locateFile` must not be passed\n let SQL: SqlJsStatic;\n if (sqlJsCDN) {\n SQL = await initSqlJs({\n locateFile: (file) => `${sqlJsCDN}${file}`\n });\n } else {\n SQL = await initSqlJs();\n }\n return new SQL.Database(new Uint8Array(arrayBuffer));\n}\n\n/**\n * Find all vector tables in GeoPackage\n * This queries the `gpkg_contents` table to find a list of vector tables\n *\n * @param db GeoPackage to query\n * @return list of table references\n */\nfunction listVectorTables(db: Database): ContentsRow[] {\n // The gpkg_contents table can have at least three categorical values for\n // data_type.\n // - 'features' refers to a vector geometry table\n // (https://www.geopackage.org/spec121/#_contents_2)\n // - 'tiles' refers to a raster table\n // (https://www.geopackage.org/spec121/#_contents_3)\n // - 'attributes' refers to a data table with no geometry\n // (https://www.geopackage.org/spec121/#_contents_4).\n\n // We hard code 'features' because for now we don't support raster data or pure attribute data\n // eslint-disable-next-line quotes\n const stmt = db.prepare(\"SELECT * FROM gpkg_contents WHERE data_type='features';\");\n\n const vectorTablesInfo: ContentsRow[] = [];\n while (stmt.step()) {\n const vectorTableInfo = stmt.getAsObject() as unknown as ContentsRow;\n vectorTablesInfo.push(vectorTableInfo);\n }\n\n return vectorTablesInfo;\n}\n\n/**\n * Load geometries from vector table\n *\n * @param db GeoPackage object\n * @param tableName name of vector table to query\n * @param projections keys are srs_id values, values are WKT strings\n * @returns Array of GeoJSON Feature objects\n */\nfunction getVectorTable(\n db: Database,\n tableName: string,\n projections: ProjectionMapping,\n {reproject, _targetCrs}: {reproject: boolean; _targetCrs: string}\n): ObjectRowTable {\n const dataColumns = getDataColumns(db, tableName);\n const geomColumn = getGeometryColumn(db, tableName);\n const featureIdColumn = getFeatureIdName(db, tableName);\n\n // Get vector features from table\n // Don't think it's possible to parameterize the table name in SQLite?\n const {columns, values} = db.exec(`SELECT * FROM \\`${tableName}\\`;`)[0];\n\n let projection;\n if (reproject) {\n const geomColumnProjStr = projections[geomColumn.srs_id];\n projection = new Proj4Projection({\n from: geomColumnProjStr,\n to: _targetCrs\n });\n }\n\n const geojsonFeatures: object[] = [];\n for (const row of values) {\n const geojsonFeature = constructGeoJsonFeature(\n columns,\n row,\n geomColumn,\n // @ts-ignore\n dataColumns,\n featureIdColumn\n );\n geojsonFeatures.push(geojsonFeature);\n }\n\n const schema = getArrowSchema(db, tableName);\n if (projection) {\n return {\n data: transformGeoJsonCoords(geojsonFeatures, projection.project),\n schema,\n shape: 'object-row-table'\n };\n }\n\n return {data: geojsonFeatures, schema, shape: 'object-row-table'};\n}\n\n/**\n * Find all projections defined in GeoPackage\n * This queries the gpkg_spatial_ref_sys table\n * @param db GeoPackage object\n * @returns mapping from srid to WKT projection string\n */\nfunction getProjections(db: Database): ProjectionMapping {\n // Query gpkg_spatial_ref_sys to get srid: srtext mappings\n const stmt = db.prepare('SELECT * FROM gpkg_spatial_ref_sys;');\n\n const projectionMapping: ProjectionMapping = {};\n while (stmt.step()) {\n const srsInfo = stmt.getAsObject() as unknown as SpatialRefSysRow;\n const {srs_id, definition} = srsInfo;\n projectionMapping[srs_id] = definition;\n }\n\n return projectionMapping;\n}\n\n/**\n * Construct single GeoJSON feature given row's data\n * @param columns array of ordered column identifiers\n * @param row array of ordered values representing row's data\n * @param geomColumn geometry column metadata\n * @param dataColumns mapping from table column names to property name\n * @returns GeoJSON Feature object\n */\nfunction constructGeoJsonFeature(\n columns: string[],\n row: any[],\n geomColumn: GeometryColumnsRow,\n dataColumns: DataColumnsMapping,\n featureIdColumn: string\n): Feature<Geometry | null> {\n // Find feature id\n const idIdx = columns.indexOf(featureIdColumn);\n const id = row[idIdx];\n\n // Parse geometry columns to geojson\n const geomColumnIdx = columns.indexOf(geomColumn.column_name);\n const geometry = parseGeometry(row[geomColumnIdx].buffer);\n\n const properties = {};\n if (dataColumns) {\n for (const [key, value] of Object.entries(dataColumns)) {\n const idx = columns.indexOf(key);\n // @ts-ignore TODO - Check what happens if null?\n properties[value] = row[idx];\n }\n } else {\n // Put all columns except for the feature id and geometry in properties\n for (let i = 0; i < columns.length; i++) {\n if (i === idIdx || i === geomColumnIdx) {\n // eslint-disable-next-line no-continue\n continue;\n }\n\n const columnName = columns[i];\n properties[columnName] = row[i];\n }\n }\n\n return {\n id,\n type: 'Feature',\n geometry,\n properties\n };\n}\n\n/**\n * Get GeoPackage version from database\n * @param db database\n * @returns version string. One of '1.0', '1.1', '1.2'\n */\n\n// @ts-ignore\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nfunction getGeopackageVersion(db: Database): string | null {\n const textDecoder = new TextDecoder();\n\n // Read application id from SQLite metadata\n const applicationIdQuery = db.exec('PRAGMA application_id;')[0];\n const applicationId = applicationIdQuery.values[0][0];\n\n // Convert 4-byte signed int32 application id to text\n const buffer = new ArrayBuffer(4);\n const view = new DataView(buffer);\n view.setInt32(0, Number(applicationId));\n const versionString = textDecoder.decode(buffer);\n\n if (versionString === 'GP10') {\n return '1.0';\n }\n\n if (versionString === 'GP11') {\n return '1.1';\n }\n\n // If versionString is GPKG, then read user_version\n const userVersionQuery = db.exec('PRAGMA user_version;')[0];\n const userVersionInt = userVersionQuery.values[0][0];\n\n if (userVersionInt && typeof userVersionInt === 'number' && userVersionInt < 10300) {\n return '1.2';\n }\n\n return null;\n}\n\n/**\n * Find name of feature id column in table\n * The feature ID is the primary key of the table.\n * http://www.geopackage.org/spec121/#feature_user_tables\n *\n * @param db database\n * @param tableName name of table\n * @return name of feature id column\n */\nfunction getFeatureIdName(db: Database, tableName: string): string | null {\n // Again, not possible to parameterize table name?\n const stmt = db.prepare(`PRAGMA table_info(\\`${tableName}\\`)`);\n\n while (stmt.step()) {\n const pragmaTableInfo = stmt.getAsObject() as unknown as PragmaTableInfoRow;\n const {name, pk} = pragmaTableInfo;\n if (pk) {\n return name;\n }\n }\n\n // Is it guaranteed for there always to be at least one primary key column in the table?\n return null;\n}\n\n/**\n * Parse geometry buffer\n * GeoPackage vector geometries are slightly extended past the WKB standard\n * See: https://www.geopackage.org/spec121/#gpb_format\n *\n * @param arrayBuffer geometry buffer\n * @return GeoJSON geometry (in original CRS)\n */\nfunction parseGeometry(arrayBuffer: ArrayBuffer): Geometry | null {\n const view = new DataView(arrayBuffer);\n const {envelopeLength, emptyGeometry} = parseGeometryBitFlags(view.getUint8(3));\n\n // A Feature object has a member with the name \"geometry\". The value of the\n // geometry member SHALL be either a Geometry object as defined above or, in\n // the case that the Feature is unlocated, a JSON null value.\n /** @see https://tools.ietf.org/html/rfc7946#section-3.2 */\n if (emptyGeometry) {\n return null;\n }\n\n // Do I need to find the srid here? Is it necessarily the same for every\n // geometry in a table?\n // const srid = view.getInt32(4, littleEndian);\n\n // 2 byte magic, 1 byte version, 1 byte flags, 4 byte int32 srid\n const wkbOffset = 8 + envelopeLength;\n\n // Loaders should not depend on `core` and the context passed to the main loader doesn't include a\n // `parseSync` option, so instead we call parseSync directly on WKBLoader\n const binaryGeometry = WKBLoader.parseSync(arrayBuffer.slice(wkbOffset));\n\n return binaryToGeometry(binaryGeometry);\n}\n\n/**\n * Parse geometry header flags\n * https://www.geopackage.org/spec121/#flags_layout\n *\n * @param byte uint8 number representing flags\n * @return object representing information from bit flags\n */\nfunction parseGeometryBitFlags(byte: number): GeometryBitFlags {\n // Are header values little endian?\n const envelopeValue = (byte & 0b00001110) / 2;\n\n // TODO: Not sure the best way to handle this. Throw an error if envelopeValue outside 0-7?\n const envelopeLength = ENVELOPE_BYTE_LENGTHS[envelopeValue] as number;\n\n return {\n littleEndian: Boolean(byte & 0b00000001),\n envelopeLength,\n emptyGeometry: Boolean(byte & 0b00010000),\n extendedGeometryType: Boolean(byte & 0b00100000)\n };\n}\n\n/**\n * Find geometry column in given vector table\n *\n * @param db GeoPackage object\n * @param tableName Name of vector table\n * @returns Array of geometry column definitions\n */\nfunction getGeometryColumn(db: Database, tableName: string): GeometryColumnsRow {\n const stmt = db.prepare('SELECT * FROM gpkg_geometry_columns WHERE table_name=:tableName;');\n stmt.bind({':tableName': tableName});\n\n // > Requirement 30\n // > A feature table SHALL have only one geometry column.\n // https://www.geopackage.org/spec121/#feature_user_tables\n // So we should need one and only one step, given that we use the WHERE clause in the SQL query\n // above\n stmt.step();\n const geometryColumn = stmt.getAsObject() as unknown as GeometryColumnsRow;\n return geometryColumn;\n}\n\n/**\n * Find property columns in given vector table\n * @param db GeoPackage object\n * @param tableName Name of vector table\n * @returns Mapping from table column names to property name\n */\nfunction getDataColumns(db: Database, tableName: string): DataColumnsMapping | null {\n // gpkg_data_columns is not required to exist\n // https://www.geopackage.org/spec121/#extension_schema\n let stmt: Statement;\n try {\n stmt = db.prepare('SELECT * FROM gpkg_data_columns WHERE table_name=:tableName;');\n } catch (error) {\n if ((error as Error).message.includes('no such table')) {\n return null;\n }\n\n throw error;\n }\n\n stmt.bind({':tableName': tableName});\n\n // Convert DataColumnsRow object this to a key-value {column_name: name}\n const result: DataColumnsMapping = {};\n while (stmt.step()) {\n const column = stmt.getAsObject() as unknown as DataColumnsRow;\n const {column_name, name} = column;\n result[column_name] = name || null;\n }\n\n return result;\n}\n\n/**\n * Get arrow schema\n * @param db GeoPackage object\n * @param tableName table name\n * @returns Arrow-like Schema\n */\nfunction getArrowSchema(db: Database, tableName: string): Schema {\n const stmt = db.prepare(`PRAGMA table_info(\\`${tableName}\\`)`);\n\n const fields: Field[] = [];\n while (stmt.step()) {\n const pragmaTableInfo = stmt.getAsObject() as unknown as PragmaTableInfoRow;\n const {name, type, notnull} = pragmaTableInfo;\n const schemaType = SQL_TYPE_MAPPING[type] && new SQL_TYPE_MAPPING[type]();\n const field = new Field(name, schemaType, !notnull);\n fields.push(field);\n }\n\n return new Schema(fields);\n}\n\nfunction formatTablesAsGeojson(tables: Tables<ObjectRowTable>): Record<string, Feature[]> {\n const geojsonMap = {};\n for (const table of tables.tables) {\n geojsonMap[table.name] = table.table.data;\n }\n\n return geojsonMap;\n}\n"],"mappings":"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"}
|
|
@@ -244,7 +244,7 @@ function getGeopackageVersion(db) {
|
|
|
244
244
|
// If versionString is GPKG, then read user_version
|
|
245
245
|
const userVersionQuery = db.exec('PRAGMA user_version;')[0];
|
|
246
246
|
const userVersionInt = userVersionQuery.values[0][0];
|
|
247
|
-
if (userVersionInt && userVersionInt < 10300) {
|
|
247
|
+
if (userVersionInt && typeof userVersionInt === 'number' && userVersionInt < 10300) {
|
|
248
248
|
return '1.2';
|
|
249
249
|
}
|
|
250
250
|
return null;
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@loaders.gl/geopackage",
|
|
3
3
|
"description": "GeoPackage data loaders",
|
|
4
|
-
"version": "3.4.0-alpha.
|
|
4
|
+
"version": "3.4.0-alpha.4",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"publishConfig": {
|
|
7
7
|
"access": "public"
|
|
@@ -25,12 +25,12 @@
|
|
|
25
25
|
],
|
|
26
26
|
"dependencies": {
|
|
27
27
|
"@babel/runtime": "^7.3.1",
|
|
28
|
-
"@loaders.gl/gis": "3.4.0-alpha.
|
|
29
|
-
"@loaders.gl/schema": "3.4.0-alpha.
|
|
30
|
-
"@loaders.gl/wkt": "3.4.0-alpha.
|
|
28
|
+
"@loaders.gl/gis": "3.4.0-alpha.4",
|
|
29
|
+
"@loaders.gl/schema": "3.4.0-alpha.4",
|
|
30
|
+
"@loaders.gl/wkt": "3.4.0-alpha.4",
|
|
31
31
|
"@math.gl/proj4": "^3.5.1",
|
|
32
32
|
"@types/sql.js": "^1.4.2",
|
|
33
33
|
"sql.js": "1.5.0"
|
|
34
34
|
},
|
|
35
|
-
"gitHead": "
|
|
35
|
+
"gitHead": "f039a523df8b908a91f26c5ba8c4cfc1924b6140"
|
|
36
36
|
}
|
|
@@ -320,7 +320,7 @@ function getGeopackageVersion(db: Database): string | null {
|
|
|
320
320
|
const userVersionQuery = db.exec('PRAGMA user_version;')[0];
|
|
321
321
|
const userVersionInt = userVersionQuery.values[0][0];
|
|
322
322
|
|
|
323
|
-
if (userVersionInt && userVersionInt < 10300) {
|
|
323
|
+
if (userVersionInt && typeof userVersionInt === 'number' && userVersionInt < 10300) {
|
|
324
324
|
return '1.2';
|
|
325
325
|
}
|
|
326
326
|
|