@loaders.gl/geopackage 4.0.0-alpha.24 → 4.0.0-alpha.25

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.
@@ -17,7 +17,8 @@ var GeoPackageLoader = {
17
17
  parse: _parseGeopackage.parseGeoPackage,
18
18
  options: {
19
19
  geopackage: {
20
- sqlJsCDN: _parseGeopackage.DEFAULT_SQLJS_CDN
20
+ sqlJsCDN: _parseGeopackage.DEFAULT_SQLJS_CDN,
21
+ shape: 'geojson-table'
21
22
  },
22
23
  gis: {}
23
24
  }
@@ -1 +1 @@
1
- {"version":3,"file":"geopackage-loader.js","names":["_parseGeopackage","require","VERSION","GeoPackageLoader","id","name","module","version","extensions","mimeTypes","category","parse","parseGeoPackage","options","geopackage","sqlJsCDN","DEFAULT_SQLJS_CDN","gis","exports"],"sources":["../../src/geopackage-loader.ts"],"sourcesContent":["// loaders.gl, MIT license\nimport type {LoaderWithParser, LoaderOptions} from '@loaders.gl/loader-utils';\nimport {Tables, ObjectRowTable} from '@loaders.gl/schema';\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 };\n};\n\nexport const GeoPackageLoader: LoaderWithParser<\n Tables<ObjectRowTable>,\n never,\n GeoPackageLoaderOptions\n> = {\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 }\n};\n\n/** Geopackage loader *\nexport const GeoPackageTableLoader: LoaderWithParser<Record<string, Feature[]>, never, GeoPackageLoaderOptions> = {\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 }\n }\n};\n*/\n"],"mappings":";;;;;;AAGA,IAAAA,gBAAA,GAAAC,OAAA;AAKA,IAAMC,OAAO,GAAG,QAAQ;AAajB,IAAMC,gBAIZ,GAAG;EACFC,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,gCAAe;EACtBC,OAAO,EAAE;IACPC,UAAU,EAAE;MACVC,QAAQ,EAAEC;IACZ,CAAC;IACDC,GAAG,EAAE,CAAC;EACR;AACF,CAAC;AAACC,OAAA,CAAAf,gBAAA,GAAAA,gBAAA"}
1
+ {"version":3,"file":"geopackage-loader.js","names":["_parseGeopackage","require","VERSION","GeoPackageLoader","id","name","module","version","extensions","mimeTypes","category","parse","parseGeoPackage","options","geopackage","sqlJsCDN","DEFAULT_SQLJS_CDN","shape","gis","exports"],"sources":["../../src/geopackage-loader.ts"],"sourcesContent":["// loaders.gl, MIT license\nimport type {LoaderWithParser, LoaderOptions} from '@loaders.gl/loader-utils';\nimport {Tables, GeoJSONTable} from '@loaders.gl/schema';\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 /** Options for the geopackage loader */\n geopackage?: {\n /** Shape of returned data */\n shape?: 'geojson-table' | 'tables';\n /** Name of table to load (defaults to first table), unless shape==='tables' */\n table?: string;\n /** Use null in Node */\n sqlJsCDN?: string | null;\n };\n gis?: {\n reproject?: boolean;\n _targetCrs?: string;\n };\n};\n\nexport const GeoPackageLoader: LoaderWithParser<\n GeoJSONTable | Tables<GeoJSONTable>,\n never,\n GeoPackageLoaderOptions\n> = {\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 shape: 'geojson-table'\n },\n gis: {}\n }\n};\n\n/** Geopackage loader *\nexport const GeoPackageTableLoader: LoaderWithParser<Record<string, Feature[]>, never, GeoPackageLoaderOptions> = {\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 }\n }\n};\n*/\n"],"mappings":";;;;;;AAGA,IAAAA,gBAAA,GAAAC,OAAA;AAKA,IAAMC,OAAO,GAAG,QAAQ;AAkBjB,IAAMC,gBAIZ,GAAG;EACFC,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,gCAAe;EACtBC,OAAO,EAAE;IACPC,UAAU,EAAE;MACVC,QAAQ,EAAEC,kCAAiB;MAC3BC,KAAK,EAAE;IACT,CAAC;IACDC,GAAG,EAAE,CAAC;EACR;AACF,CAAC;AAACC,OAAA,CAAAhB,gBAAA,GAAAA,gBAAA"}
@@ -9,14 +9,15 @@ exports.parseGeoPackage = parseGeoPackage;
9
9
  var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
10
10
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
11
11
  var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
12
- var _sql = _interopRequireDefault(require("sql.js"));
12
+ var _loaderUtils = require("@loaders.gl/loader-utils");
13
13
  var _wkt = require("@loaders.gl/wkt");
14
14
  var _gis = require("@loaders.gl/gis");
15
15
  var _proj = require("@math.gl/proj4");
16
+ var _sql = _interopRequireDefault(require("sql.js"));
16
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; } } }; }
17
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); }
18
19
  function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
19
- var DEFAULT_SQLJS_CDN = 'https://cdnjs.cloudflare.com/ajax/libs/sql.js/1.5.0/';
20
+ var DEFAULT_SQLJS_CDN = _loaderUtils.isBrowser ? 'https://cdnjs.cloudflare.com/ajax/libs/sql.js/1.5.0/' : null;
20
21
  exports.DEFAULT_SQLJS_CDN = DEFAULT_SQLJS_CDN;
21
22
  var ENVELOPE_BYTE_LENGTHS = {
22
23
  0: 0,
@@ -56,7 +57,8 @@ function parseGeoPackage(_x, _x2) {
56
57
  }
57
58
  function _parseGeoPackage() {
58
59
  _parseGeoPackage = (0, _asyncToGenerator2.default)(_regenerator.default.mark(function _callee(arrayBuffer, options) {
59
- var _ref2, _ref2$sqlJsCDN, sqlJsCDN, _ref3, _ref3$reproject, reproject, _ref3$_targetCrs, _targetCrs, db, tables, projections, outputTables, _iterator2, _step2, table, tableName;
60
+ var _options$geopackage2;
61
+ var _ref2, _ref2$sqlJsCDN, sqlJsCDN, _ref3, _ref3$reproject, reproject, _ref3$_targetCrs, _targetCrs, db, tables, projections, selectedTable, tableName, shape, outputTables, _iterator2, _step2, table, _tableName;
60
62
  return _regenerator.default.wrap(function _callee$(_context) {
61
63
  while (1) switch (_context.prev = _context.next) {
62
64
  case 0:
@@ -68,6 +70,21 @@ function _parseGeoPackage() {
68
70
  db = _context.sent;
69
71
  tables = listVectorTables(db);
70
72
  projections = getProjections(db);
73
+ selectedTable = tables.find(function (table) {
74
+ var _options$geopackage;
75
+ return table.table_name === (options === null || options === void 0 ? void 0 : (_options$geopackage = options.geopackage) === null || _options$geopackage === void 0 ? void 0 : _options$geopackage.table);
76
+ });
77
+ tableName = selectedTable ? selectedTable.table_name : tables[0].table_name;
78
+ shape = options === null || options === void 0 ? void 0 : (_options$geopackage2 = options.geopackage) === null || _options$geopackage2 === void 0 ? void 0 : _options$geopackage2.shape;
79
+ _context.t0 = shape;
80
+ _context.next = _context.t0 === 'geojson-table' ? 13 : _context.t0 === 'tables' ? 14 : 18;
81
+ break;
82
+ case 13:
83
+ return _context.abrupt("return", getVectorTable(db, tableName, projections, {
84
+ reproject: reproject,
85
+ _targetCrs: _targetCrs
86
+ }));
87
+ case 14:
71
88
  outputTables = {
72
89
  shape: 'tables',
73
90
  tables: []
@@ -76,10 +93,10 @@ function _parseGeoPackage() {
76
93
  try {
77
94
  for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
78
95
  table = _step2.value;
79
- tableName = table.table_name;
96
+ _tableName = table.table_name;
80
97
  outputTables.tables.push({
81
- name: tableName,
82
- table: getVectorTable(db, tableName, projections, {
98
+ name: _tableName,
99
+ table: getVectorTable(db, _tableName, projections, {
83
100
  reproject: reproject,
84
101
  _targetCrs: _targetCrs
85
102
  })
@@ -91,7 +108,9 @@ function _parseGeoPackage() {
91
108
  _iterator2.f();
92
109
  }
93
110
  return _context.abrupt("return", outputTables);
94
- case 11:
111
+ case 18:
112
+ throw new Error(shape);
113
+ case 19:
95
114
  case "end":
96
115
  return _context.stop();
97
116
  }
@@ -180,15 +199,17 @@ function getVectorTable(db, tableName, projections, _ref) {
180
199
  var schema = getSchema(db, tableName);
181
200
  if (projection) {
182
201
  return {
183
- shape: 'object-row-table',
184
- data: (0, _gis.transformGeoJsonCoords)(geojsonFeatures, projection.project),
202
+ shape: 'geojson-table',
203
+ type: 'FeatureCollection',
204
+ features: (0, _gis.transformGeoJsonCoords)(geojsonFeatures, projection.project),
185
205
  schema: schema
186
206
  };
187
207
  }
188
208
  return {
189
- data: geojsonFeatures,
209
+ shape: 'geojson-table',
190
210
  schema: schema,
191
- shape: 'object-row-table'
211
+ type: 'FeatureCollection',
212
+ features: geojsonFeatures
192
213
  };
193
214
  }
194
215
  function getProjections(db) {
@@ -1 +1 @@
1
- {"version":3,"file":"parse-geopackage.js","names":["_sql","_interopRequireDefault","require","_wkt","_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","TINYINT","SMALLINT","MEDIUMINT","INT","INTEGER","FLOAT","DOUBLE","REAL","TEXT","BLOB","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","db","tables","projections","outputTables","_iterator2","_step2","table","tableName","wrap","_callee$","_context","prev","geopackage","gis","loadDatabase","sent","listVectorTables","getProjections","shape","table_name","push","getVectorTable","abrupt","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","getSchema","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","_WKBLoader$parseSync","_parseGeometryBitFlag","parseGeometryBitFlags","getUint8","envelopeLength","emptyGeometry","wkbOffset","binaryGeometry","WKBLoader","parseSync","binaryToGeometry","byte","envelopeValue","littleEndian","Boolean","extendedGeometryType","bind","geometryColumn","error","message","includes","result","column","fields","sqlType","notnull","field","nullable","metadata"],"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 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]: 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 async function parseGeoPackage(\n arrayBuffer: ArrayBuffer,\n options?: GeoPackageLoaderOptions\n): Promise<Tables<ObjectRowTable>> {\n const {sqlJsCDN = DEFAULT_SQLJS_CDN} = options?.geopackage || {};\n const {reproject = false, _targetCrs = 'WGS84'} = options?.gis || {};\n\n const db = await loadDatabase(arrayBuffer, sqlJsCDN);\n const tables = listVectorTables(db);\n const projections = getProjections(db);\n\n // Mapping from tableName to geojson feature collection\n const 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 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: Feature<Geometry | null>[] = [];\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 = getSchema(db, tableName);\n if (projection) {\n return {\n shape: 'object-row-table',\n // @ts-expect-error TODO - null geometries causing problems...\n data: transformGeoJsonCoords(geojsonFeatures, projection.project),\n schema\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 // @ts-expect-error\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 getSchema(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: sqlType, notnull} = pragmaTableInfo;\n const type = SQL_TYPE_MAPPING[sqlType];\n const field = {name, type, nullable: !notnull};\n fields.push(field);\n }\n\n return {fields, metadata: {}};\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"parse-geopackage.js","names":["_loaderUtils","require","_wkt","_gis","_proj","_sql","_interopRequireDefault","_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","isBrowser","exports","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","_x","_x2","_parseGeoPackage","apply","arguments","_asyncToGenerator2","default","_regenerator","mark","_callee","arrayBuffer","options","_options$geopackage2","_ref2","_ref2$sqlJsCDN","sqlJsCDN","_ref3","_ref3$reproject","reproject","_ref3$_targetCrs","_targetCrs","db","tables","projections","selectedTable","tableName","shape","outputTables","_iterator2","_step2","table","_tableName","wrap","_callee$","_context","prev","geopackage","gis","loadDatabase","sent","listVectorTables","getProjections","find","_options$geopackage","table_name","t0","abrupt","getVectorTable","push","Error","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","getSchema","type","features","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","getGeopackageVersion","textDecoder","TextDecoder","applicationIdQuery","applicationId","ArrayBuffer","view","DataView","setInt32","Number","versionString","decode","userVersionQuery","userVersionInt","pragmaTableInfo","pk","_WKBLoader$parseSync","_parseGeometryBitFlag","parseGeometryBitFlags","getUint8","envelopeLength","emptyGeometry","wkbOffset","binaryGeometry","WKBLoader","parseSync","binaryToGeometry","byte","envelopeValue","littleEndian","Boolean","extendedGeometryType","bind","geometryColumn","error","message","includes","result","column","fields","sqlType","notnull","field","nullable","metadata"],"sources":["../../../src/lib/parse-geopackage.ts"],"sourcesContent":["/* eslint-disable camelcase, @typescript-eslint/no-use-before-define */\nimport {isBrowser} from '@loaders.gl/loader-utils';\nimport {WKBLoader} from '@loaders.gl/wkt';\nimport {Schema, Field, Geometry, DataType, Tables, GeoJSONTable, Feature} from '@loaders.gl/schema';\nimport {binaryToGeometry, transformGeoJsonCoords} from '@loaders.gl/gis';\nimport {Proj4Projection} from '@math.gl/proj4';\nimport initSqlJs, {SqlJsStatic, Database, Statement} from 'sql.js';\n\nimport type {GeoPackageLoaderOptions} from '../geopackage-loader';\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/**\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.\n */\nexport const DEFAULT_SQLJS_CDN = isBrowser\n ? 'https://cdnjs.cloudflare.com/ajax/libs/sql.js/1.5.0/'\n : null;\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]: 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 async function parseGeoPackage(\n arrayBuffer: ArrayBuffer,\n options?: GeoPackageLoaderOptions\n): Promise<GeoJSONTable | Tables<GeoJSONTable>> {\n const {sqlJsCDN = DEFAULT_SQLJS_CDN} = options?.geopackage || {};\n const {reproject = false, _targetCrs = 'WGS84'} = options?.gis || {};\n\n const db = await loadDatabase(arrayBuffer, sqlJsCDN);\n const tables = listVectorTables(db);\n const projections = getProjections(db);\n\n const selectedTable = tables.find((table) => table.table_name === options?.geopackage?.table);\n const tableName = selectedTable ? selectedTable.table_name : tables[0].table_name;\n\n const shape = options?.geopackage?.shape;\n switch (shape) {\n case 'geojson-table':\n return getVectorTable(db, tableName, projections, {\n reproject,\n _targetCrs\n });\n\n case 'tables':\n // Mapping from tableName to geojson feature collection\n const outputTables: Tables<GeoJSONTable> = {\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 return outputTables;\n\n default:\n throw new Error(shape);\n }\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): GeoJSONTable {\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: Feature<Geometry | null>[] = [];\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 = getSchema(db, tableName);\n if (projection) {\n return {\n shape: 'geojson-table',\n type: 'FeatureCollection',\n // @ts-expect-error TODO - null geometries causing problems...\n features: transformGeoJsonCoords(geojsonFeatures, projection.project),\n schema\n };\n }\n\n return {\n shape: 'geojson-table',\n schema,\n type: 'FeatureCollection',\n // @ts-expect-error TODO - null features\n features: geojsonFeatures\n };\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 // @ts-expect-error\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 getSchema(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: sqlType, notnull} = pragmaTableInfo;\n const type = SQL_TYPE_MAPPING[sqlType];\n const field = {name, type, nullable: !notnull};\n fields.push(field);\n }\n\n return {fields, metadata: {}};\n}\n"],"mappings":"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"}
@@ -11,7 +11,8 @@ export const GeoPackageLoader = {
11
11
  parse: parseGeoPackage,
12
12
  options: {
13
13
  geopackage: {
14
- sqlJsCDN: DEFAULT_SQLJS_CDN
14
+ sqlJsCDN: DEFAULT_SQLJS_CDN,
15
+ shape: 'geojson-table'
15
16
  },
16
17
  gis: {}
17
18
  }
@@ -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"],"sources":["../../src/geopackage-loader.ts"],"sourcesContent":["// loaders.gl, MIT license\nimport type {LoaderWithParser, LoaderOptions} from '@loaders.gl/loader-utils';\nimport {Tables, ObjectRowTable} from '@loaders.gl/schema';\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 };\n};\n\nexport const GeoPackageLoader: LoaderWithParser<\n Tables<ObjectRowTable>,\n never,\n GeoPackageLoaderOptions\n> = {\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 }\n};\n\n/** Geopackage loader *\nexport const GeoPackageTableLoader: LoaderWithParser<Record<string, Feature[]>, never, GeoPackageLoaderOptions> = {\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 }\n }\n};\n*/\n"],"mappings":"AAGA,SAAQA,eAAe,EAAEC,iBAAiB,QAAO,wBAAwB;AAKzE,MAAMC,OAAO,GAAG,QAAQ;AAaxB,OAAO,MAAMC,gBAIZ,GAAG;EACFC,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,CAAC;EACR;AACF,CAAC"}
1
+ {"version":3,"file":"geopackage-loader.js","names":["parseGeoPackage","DEFAULT_SQLJS_CDN","VERSION","GeoPackageLoader","id","name","module","version","extensions","mimeTypes","category","parse","options","geopackage","sqlJsCDN","shape","gis"],"sources":["../../src/geopackage-loader.ts"],"sourcesContent":["// loaders.gl, MIT license\nimport type {LoaderWithParser, LoaderOptions} from '@loaders.gl/loader-utils';\nimport {Tables, GeoJSONTable} from '@loaders.gl/schema';\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 /** Options for the geopackage loader */\n geopackage?: {\n /** Shape of returned data */\n shape?: 'geojson-table' | 'tables';\n /** Name of table to load (defaults to first table), unless shape==='tables' */\n table?: string;\n /** Use null in Node */\n sqlJsCDN?: string | null;\n };\n gis?: {\n reproject?: boolean;\n _targetCrs?: string;\n };\n};\n\nexport const GeoPackageLoader: LoaderWithParser<\n GeoJSONTable | Tables<GeoJSONTable>,\n never,\n GeoPackageLoaderOptions\n> = {\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 shape: 'geojson-table'\n },\n gis: {}\n }\n};\n\n/** Geopackage loader *\nexport const GeoPackageTableLoader: LoaderWithParser<Record<string, Feature[]>, never, GeoPackageLoaderOptions> = {\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 }\n }\n};\n*/\n"],"mappings":"AAGA,SAAQA,eAAe,EAAEC,iBAAiB,QAAO,wBAAwB;AAKzE,MAAMC,OAAO,GAAG,QAAQ;AAkBxB,OAAO,MAAMC,gBAIZ,GAAG;EACFC,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,iBAAiB;MAC3Bc,KAAK,EAAE;IACT,CAAC;IACDC,GAAG,EAAE,CAAC;EACR;AACF,CAAC"}
@@ -1,8 +1,9 @@
1
- import initSqlJs from 'sql.js';
1
+ import { isBrowser } from '@loaders.gl/loader-utils';
2
2
  import { WKBLoader } from '@loaders.gl/wkt';
3
3
  import { binaryToGeometry, transformGeoJsonCoords } from '@loaders.gl/gis';
4
4
  import { Proj4Projection } from '@math.gl/proj4';
5
- export const DEFAULT_SQLJS_CDN = 'https://cdnjs.cloudflare.com/ajax/libs/sql.js/1.5.0/';
5
+ import initSqlJs from 'sql.js';
6
+ export const DEFAULT_SQLJS_CDN = isBrowser ? 'https://cdnjs.cloudflare.com/ajax/libs/sql.js/1.5.0/' : null;
6
7
  const ENVELOPE_BYTE_LENGTHS = {
7
8
  0: 0,
8
9
  1: 32,
@@ -37,6 +38,7 @@ const SQL_TYPE_MAPPING = {
37
38
  GEOMETRYCOLLECTION: 'binary'
38
39
  };
39
40
  export async function parseGeoPackage(arrayBuffer, options) {
41
+ var _options$geopackage2;
40
42
  const {
41
43
  sqlJsCDN = DEFAULT_SQLJS_CDN
42
44
  } = (options === null || options === void 0 ? void 0 : options.geopackage) || {};
@@ -47,23 +49,39 @@ export async function parseGeoPackage(arrayBuffer, options) {
47
49
  const db = await loadDatabase(arrayBuffer, sqlJsCDN);
48
50
  const tables = listVectorTables(db);
49
51
  const projections = getProjections(db);
50
- const outputTables = {
51
- shape: 'tables',
52
- tables: []
53
- };
54
- for (const table of tables) {
55
- const {
56
- table_name: tableName
57
- } = table;
58
- outputTables.tables.push({
59
- name: tableName,
60
- table: getVectorTable(db, tableName, projections, {
52
+ const selectedTable = tables.find(table => {
53
+ var _options$geopackage;
54
+ return table.table_name === (options === null || options === void 0 ? void 0 : (_options$geopackage = options.geopackage) === null || _options$geopackage === void 0 ? void 0 : _options$geopackage.table);
55
+ });
56
+ const tableName = selectedTable ? selectedTable.table_name : tables[0].table_name;
57
+ const shape = options === null || options === void 0 ? void 0 : (_options$geopackage2 = options.geopackage) === null || _options$geopackage2 === void 0 ? void 0 : _options$geopackage2.shape;
58
+ switch (shape) {
59
+ case 'geojson-table':
60
+ return getVectorTable(db, tableName, projections, {
61
61
  reproject,
62
62
  _targetCrs
63
- })
64
- });
63
+ });
64
+ case 'tables':
65
+ const outputTables = {
66
+ shape: 'tables',
67
+ tables: []
68
+ };
69
+ for (const table of tables) {
70
+ const {
71
+ table_name: tableName
72
+ } = table;
73
+ outputTables.tables.push({
74
+ name: tableName,
75
+ table: getVectorTable(db, tableName, projections, {
76
+ reproject,
77
+ _targetCrs
78
+ })
79
+ });
80
+ }
81
+ return outputTables;
82
+ default:
83
+ throw new Error(shape);
65
84
  }
66
- return outputTables;
67
85
  }
68
86
  async function loadDatabase(arrayBuffer, sqlJsCDN) {
69
87
  let SQL;
@@ -113,15 +131,17 @@ function getVectorTable(db, tableName, projections, _ref) {
113
131
  const schema = getSchema(db, tableName);
114
132
  if (projection) {
115
133
  return {
116
- shape: 'object-row-table',
117
- data: transformGeoJsonCoords(geojsonFeatures, projection.project),
134
+ shape: 'geojson-table',
135
+ type: 'FeatureCollection',
136
+ features: transformGeoJsonCoords(geojsonFeatures, projection.project),
118
137
  schema
119
138
  };
120
139
  }
121
140
  return {
122
- data: geojsonFeatures,
141
+ shape: 'geojson-table',
123
142
  schema,
124
- shape: 'object-row-table'
143
+ type: 'FeatureCollection',
144
+ features: geojsonFeatures
125
145
  };
126
146
  }
127
147
  function getProjections(db) {
@@ -1 +1 @@
1
- {"version":3,"file":"parse-geopackage.js","names":["initSqlJs","WKBLoader","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","gis","db","loadDatabase","tables","listVectorTables","projections","getProjections","outputTables","shape","table","table_name","tableName","push","name","getVectorTable","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","getSchema","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","_WKBLoader$parseSync","envelopeLength","emptyGeometry","parseGeometryBitFlags","getUint8","wkbOffset","binaryGeometry","parseSync","call","slice","byte","envelopeValue","littleEndian","Boolean","extendedGeometryType","bind","geometryColumn","error","message","includes","result","column","fields","sqlType","notnull","field","nullable","metadata"],"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 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]: 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 async function parseGeoPackage(\n arrayBuffer: ArrayBuffer,\n options?: GeoPackageLoaderOptions\n): Promise<Tables<ObjectRowTable>> {\n const {sqlJsCDN = DEFAULT_SQLJS_CDN} = options?.geopackage || {};\n const {reproject = false, _targetCrs = 'WGS84'} = options?.gis || {};\n\n const db = await loadDatabase(arrayBuffer, sqlJsCDN);\n const tables = listVectorTables(db);\n const projections = getProjections(db);\n\n // Mapping from tableName to geojson feature collection\n const 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 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: Feature<Geometry | null>[] = [];\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 = getSchema(db, tableName);\n if (projection) {\n return {\n shape: 'object-row-table',\n // @ts-expect-error TODO - null geometries causing problems...\n data: transformGeoJsonCoords(geojsonFeatures, projection.project),\n schema\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 // @ts-expect-error\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 getSchema(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: sqlType, notnull} = pragmaTableInfo;\n const type = SQL_TYPE_MAPPING[sqlType];\n const field = {name, type, nullable: !notnull};\n fields.push(field);\n }\n\n return {fields, metadata: {}};\n}\n"],"mappings":"AAEA,OAAOA,SAAS,MAA0C,QAAQ;AAClE,SAAQC,SAAS,QAAO,iBAAiB;AAUzC,SAAQC,gBAAgB,EAAEC,sBAAsB,QAAO,iBAAiB;AACxE,SAAQC,eAAe,QAAO,gBAAgB;AAgB9C,OAAO,MAAMC,iBAAiB,GAAG,sDAAsD;AAGvF,MAAMC,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,MAAMC,gBAA6E,GAAG;EACpFC,OAAO,EAAE,MAAM;EACfC,OAAO,EAAE,MAAM;EACfC,QAAQ,EAAE,OAAO;EACjBC,SAAS,EAAE,OAAO;EAClBC,GAAG,EAAE,OAAO;EACZC,OAAO,EAAE,OAAO;EAChBC,KAAK,EAAE,SAAS;EAChBC,MAAM,EAAE,SAAS;EACjBC,IAAI,EAAE,SAAS;EACfC,IAAI,EAAE,MAAM;EACZC,IAAI,EAAE,QAAQ;EACdC,IAAI,EAAE,MAAM;EACZC,QAAQ,EAAE,MAAM;EAChBC,QAAQ,EAAE,QAAQ;EAClBC,KAAK,EAAE,QAAQ;EACfC,UAAU,EAAE,QAAQ;EACpBC,OAAO,EAAE,QAAQ;EACjBC,UAAU,EAAE,QAAQ;EACpBC,eAAe,EAAE,QAAQ;EACzBC,YAAY,EAAE,QAAQ;EACtBC,kBAAkB,EAAE;AACtB,CAAC;AAED,OAAO,eAAeC,eAAeA,CACnCC,WAAwB,EACxBC,OAAiC,EACA;EACjC,MAAM;IAACC,QAAQ,GAAG3B;EAAiB,CAAC,GAAG,CAAA0B,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAEE,UAAU,KAAI,CAAC,CAAC;EAChE,MAAM;IAACC,SAAS,GAAG,KAAK;IAAEC,UAAU,GAAG;EAAO,CAAC,GAAG,CAAAJ,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAEK,GAAG,KAAI,CAAC,CAAC;EAEpE,MAAMC,EAAE,GAAG,MAAMC,YAAY,CAACR,WAAW,EAAEE,QAAQ,CAAC;EACpD,MAAMO,MAAM,GAAGC,gBAAgB,CAACH,EAAE,CAAC;EACnC,MAAMI,WAAW,GAAGC,cAAc,CAACL,EAAE,CAAC;EAGtC,MAAMM,YAAoC,GAAG;IAC3CC,KAAK,EAAE,QAAQ;IACfL,MAAM,EAAE;EACV,CAAC;EAED,KAAK,MAAMM,KAAK,IAAIN,MAAM,EAAE;IAC1B,MAAM;MAACO,UAAU,EAAEC;IAAS,CAAC,GAAGF,KAAK;IACrCF,YAAY,CAACJ,MAAM,CAACS,IAAI,CAAC;MACvBC,IAAI,EAAEF,SAAS;MACfF,KAAK,EAAEK,cAAc,CAACb,EAAE,EAAEU,SAAS,EAAEN,WAAW,EAAE;QAChDP,SAAS;QACTC;MACF,CAAC;IACH,CAAC,CAAC;EACJ;EAEA,OAAOQ,YAAY;AACrB;AAQA,eAAeL,YAAYA,CAACR,WAAwB,EAAEE,QAAuB,EAAqB;EAEhG,IAAImB,GAAgB;EACpB,IAAInB,QAAQ,EAAE;IACZmB,GAAG,GAAG,MAAMnD,SAAS,CAAC;MACpBoD,UAAU,EAAGC,IAAI,OAAAC,MAAA,CAAQtB,QAAQ,EAAAsB,MAAA,CAAGD,IAAI;IAC1C,CAAC,CAAC;EACJ,CAAC,MAAM;IACLF,GAAG,GAAG,MAAMnD,SAAS,CAAC,CAAC;EACzB;EACA,OAAO,IAAImD,GAAG,CAACI,QAAQ,CAAC,IAAIC,UAAU,CAAC1B,WAAW,CAAC,CAAC;AACtD;AASA,SAASU,gBAAgBA,CAACH,EAAY,EAAiB;EAYrD,MAAMoB,IAAI,GAAGpB,EAAE,CAACqB,OAAO,CAAC,yDAAyD,CAAC;EAElF,MAAMC,gBAA+B,GAAG,EAAE;EAC1C,OAAOF,IAAI,CAACG,IAAI,CAAC,CAAC,EAAE;IAClB,MAAMC,eAAe,GAAGJ,IAAI,CAACK,WAAW,CAAC,CAA2B;IACpEH,gBAAgB,CAACX,IAAI,CAACa,eAAe,CAAC;EACxC;EAEA,OAAOF,gBAAgB;AACzB;AAUA,SAAST,cAAcA,CACrBb,EAAY,EACZU,SAAiB,EACjBN,WAA8B,EAAAsB,IAAA,EAEd;EAAA,IADhB;IAAC7B,SAAS;IAAEC;EAAoD,CAAC,GAAA4B,IAAA;EAEjE,MAAMC,WAAW,GAAGC,cAAc,CAAC5B,EAAE,EAAEU,SAAS,CAAC;EACjD,MAAMmB,UAAU,GAAGC,iBAAiB,CAAC9B,EAAE,EAAEU,SAAS,CAAC;EACnD,MAAMqB,eAAe,GAAGC,gBAAgB,CAAChC,EAAE,EAAEU,SAAS,CAAC;EAIvD,MAAM;IAACuB,OAAO;IAAEC;EAAM,CAAC,GAAGlC,EAAE,CAACmC,IAAI,mBAAAlB,MAAA,CAAoBP,SAAS,OAAK,CAAC,CAAC,CAAC,CAAC;EAEvE,IAAI0B,UAAU;EACd,IAAIvC,SAAS,EAAE;IACb,MAAMwC,iBAAiB,GAAGjC,WAAW,CAACyB,UAAU,CAACS,MAAM,CAAC;IACxDF,UAAU,GAAG,IAAIrE,eAAe,CAAC;MAC/BwE,IAAI,EAAEF,iBAAiB;MACvBG,EAAE,EAAE1C;IACN,CAAC,CAAC;EACJ;EAEA,MAAM2C,eAA2C,GAAG,EAAE;EACtD,KAAK,MAAMC,GAAG,IAAIR,MAAM,EAAE;IACxB,MAAMS,cAAc,GAAGC,uBAAuB,CAC5CX,OAAO,EACPS,GAAG,EACHb,UAAU,EAEVF,WAAW,EACXI,eACF,CAAC;IACDU,eAAe,CAAC9B,IAAI,CAACgC,cAAc,CAAC;EACtC;EAEA,MAAME,MAAM,GAAGC,SAAS,CAAC9C,EAAE,EAAEU,SAAS,CAAC;EACvC,IAAI0B,UAAU,EAAE;IACd,OAAO;MACL7B,KAAK,EAAE,kBAAkB;MAEzBwC,IAAI,EAAEjF,sBAAsB,CAAC2E,eAAe,EAAEL,UAAU,CAACY,OAAO,CAAC;MACjEH;IACF,CAAC;EACH;EAEA,OAAO;IAACE,IAAI,EAAEN,eAAe;IAAEI,MAAM;IAAEtC,KAAK,EAAE;EAAkB,CAAC;AACnE;AAQA,SAASF,cAAcA,CAACL,EAAY,EAAqB;EAEvD,MAAMoB,IAAI,GAAGpB,EAAE,CAACqB,OAAO,CAAC,qCAAqC,CAAC;EAE9D,MAAM4B,iBAAoC,GAAG,CAAC,CAAC;EAC/C,OAAO7B,IAAI,CAACG,IAAI,CAAC,CAAC,EAAE;IAClB,MAAM2B,OAAO,GAAG9B,IAAI,CAACK,WAAW,CAAC,CAAgC;IACjE,MAAM;MAACa,MAAM;MAAEa;IAAU,CAAC,GAAGD,OAAO;IACpCD,iBAAiB,CAACX,MAAM,CAAC,GAAGa,UAAU;EACxC;EAEA,OAAOF,iBAAiB;AAC1B;AAUA,SAASL,uBAAuBA,CAC9BX,OAAiB,EACjBS,GAAU,EACVb,UAA8B,EAC9BF,WAA+B,EAC/BI,eAAuB,EACG;EAE1B,MAAMqB,KAAK,GAAGnB,OAAO,CAACoB,OAAO,CAACtB,eAAe,CAAC;EAC9C,MAAMuB,EAAE,GAAGZ,GAAG,CAACU,KAAK,CAAC;EAGrB,MAAMG,aAAa,GAAGtB,OAAO,CAACoB,OAAO,CAACxB,UAAU,CAAC2B,WAAW,CAAC;EAC7D,MAAMC,QAAQ,GAAGC,aAAa,CAAChB,GAAG,CAACa,aAAa,CAAC,CAACI,MAAM,CAAC;EAEzD,MAAMC,UAAU,GAAG,CAAC,CAAC;EACrB,IAAIjC,WAAW,EAAE;IACf,KAAK,MAAM,CAACkC,GAAG,EAAEC,KAAK,CAAC,IAAIC,MAAM,CAACC,OAAO,CAACrC,WAAW,CAAC,EAAE;MACtD,MAAMsC,GAAG,GAAGhC,OAAO,CAACoB,OAAO,CAACQ,GAAG,CAAC;MAEhCD,UAAU,CAACE,KAAK,CAAC,GAAGpB,GAAG,CAACuB,GAAG,CAAC;IAC9B;EACF,CAAC,MAAM;IAEL,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGjC,OAAO,CAACkC,MAAM,EAAED,CAAC,EAAE,EAAE;MACvC,IAAIA,CAAC,KAAKd,KAAK,IAAIc,CAAC,KAAKX,aAAa,EAAE;QAEtC;MACF;MAEA,MAAMa,UAAU,GAAGnC,OAAO,CAACiC,CAAC,CAAC;MAC7BN,UAAU,CAACQ,UAAU,CAAC,GAAG1B,GAAG,CAACwB,CAAC,CAAC;IACjC;EACF;EAEA,OAAO;IACLZ,EAAE;IACFe,IAAI,EAAE,SAAS;IACfZ,QAAQ;IACRG;EACF,CAAC;AACH;AAUA,SAASU,oBAAoBA,CAACtE,EAAY,EAAiB;EACzD,MAAMuE,WAAW,GAAG,IAAIC,WAAW,CAAC,CAAC;EAGrC,MAAMC,kBAAkB,GAAGzE,EAAE,CAACmC,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC,CAAC;EAC/D,MAAMuC,aAAa,GAAGD,kBAAkB,CAACvC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;EAGrD,MAAMyB,MAAM,GAAG,IAAIgB,WAAW,CAAC,CAAC,CAAC;EACjC,MAAMC,IAAI,GAAG,IAAIC,QAAQ,CAAClB,MAAM,CAAC;EACjCiB,IAAI,CAACE,QAAQ,CAAC,CAAC,EAAEC,MAAM,CAACL,aAAa,CAAC,CAAC;EACvC,MAAMM,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,MAAME,gBAAgB,GAAGlF,EAAE,CAACmC,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;EAC3D,MAAMgD,cAAc,GAAGD,gBAAgB,CAAChD,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;EAEpD,IAAIiD,cAAc,IAAI,OAAOA,cAAc,KAAK,QAAQ,IAAIA,cAAc,GAAG,KAAK,EAAE;IAClF,OAAO,KAAK;EACd;EAEA,OAAO,IAAI;AACb;AAWA,SAASnD,gBAAgBA,CAAChC,EAAY,EAAEU,SAAiB,EAAiB;EAExE,MAAMU,IAAI,GAAGpB,EAAE,CAACqB,OAAO,uBAAAJ,MAAA,CAAwBP,SAAS,OAAK,CAAC;EAE9D,OAAOU,IAAI,CAACG,IAAI,CAAC,CAAC,EAAE;IAClB,MAAM6D,eAAe,GAAGhE,IAAI,CAACK,WAAW,CAAC,CAAkC;IAC3E,MAAM;MAACb,IAAI;MAAEyE;IAAE,CAAC,GAAGD,eAAe;IAClC,IAAIC,EAAE,EAAE;MACN,OAAOzE,IAAI;IACb;EACF;EAGA,OAAO,IAAI;AACb;AAUA,SAAS8C,aAAaA,CAACjE,WAAwB,EAAmB;EAAA,IAAA6F,oBAAA;EAChE,MAAMV,IAAI,GAAG,IAAIC,QAAQ,CAACpF,WAAW,CAAC;EACtC,MAAM;IAAC8F,cAAc;IAAEC;EAAa,CAAC,GAAGC,qBAAqB,CAACb,IAAI,CAACc,QAAQ,CAAC,CAAC,CAAC,CAAC;EAM/E,IAAIF,aAAa,EAAE;IACjB,OAAO,IAAI;EACb;EAOA,MAAMG,SAAS,GAAG,CAAC,GAAGJ,cAAc;EAIpC,MAAMK,cAAc,IAAAN,oBAAA,GAAG1H,SAAS,CAACiI,SAAS,cAAAP,oBAAA,uBAAnBA,oBAAA,CAAAQ,IAAA,CAAAlI,SAAS,EAAa6B,WAAW,CAACsG,KAAK,CAACJ,SAAS,CAAC,CAAC;EAG1E,OAAO9H,gBAAgB,CAAC+H,cAAc,CAAC;AACzC;AASA,SAASH,qBAAqBA,CAACO,IAAY,EAAoB;EAE7D,MAAMC,aAAa,GAAG,CAACD,IAAI,GAAG,UAAU,IAAI,CAAC;EAG7C,MAAMT,cAAc,GAAGtH,qBAAqB,CAACgI,aAAa,CAAW;EAErE,OAAO;IACLC,YAAY,EAAEC,OAAO,CAACH,IAAI,GAAG,UAAU,CAAC;IACxCT,cAAc;IACdC,aAAa,EAAEW,OAAO,CAACH,IAAI,GAAG,UAAU,CAAC;IACzCI,oBAAoB,EAAED,OAAO,CAACH,IAAI,GAAG,UAAU;EACjD,CAAC;AACH;AASA,SAASlE,iBAAiBA,CAAC9B,EAAY,EAAEU,SAAiB,EAAsB;EAC9E,MAAMU,IAAI,GAAGpB,EAAE,CAACqB,OAAO,CAAC,kEAAkE,CAAC;EAC3FD,IAAI,CAACiF,IAAI,CAAC;IAAC,YAAY,EAAE3F;EAAS,CAAC,CAAC;EAOpCU,IAAI,CAACG,IAAI,CAAC,CAAC;EACX,MAAM+E,cAAc,GAAGlF,IAAI,CAACK,WAAW,CAAC,CAAkC;EAC1E,OAAO6E,cAAc;AACvB;AAQA,SAAS1E,cAAcA,CAAC5B,EAAY,EAAEU,SAAiB,EAA6B;EAGlF,IAAIU,IAAe;EACnB,IAAI;IACFA,IAAI,GAAGpB,EAAE,CAACqB,OAAO,CAAC,8DAA8D,CAAC;EACnF,CAAC,CAAC,OAAOkF,KAAK,EAAE;IACd,IAAKA,KAAK,CAAWC,OAAO,CAACC,QAAQ,CAAC,eAAe,CAAC,EAAE;MACtD,OAAO,IAAI;IACb;IAEA,MAAMF,KAAK;EACb;EAEAnF,IAAI,CAACiF,IAAI,CAAC;IAAC,YAAY,EAAE3F;EAAS,CAAC,CAAC;EAGpC,MAAMgG,MAA0B,GAAG,CAAC,CAAC;EACrC,OAAOtF,IAAI,CAACG,IAAI,CAAC,CAAC,EAAE;IAClB,MAAMoF,MAAM,GAAGvF,IAAI,CAACK,WAAW,CAAC,CAA8B;IAC9D,MAAM;MAAC+B,WAAW;MAAE5C;IAAI,CAAC,GAAG+F,MAAM;IAClCD,MAAM,CAAClD,WAAW,CAAC,GAAG5C,IAAI,IAAI,IAAI;EACpC;EAEA,OAAO8F,MAAM;AACf;AAQA,SAAS5D,SAASA,CAAC9C,EAAY,EAAEU,SAAiB,EAAU;EAC1D,MAAMU,IAAI,GAAGpB,EAAE,CAACqB,OAAO,uBAAAJ,MAAA,CAAwBP,SAAS,OAAK,CAAC;EAE9D,MAAMkG,MAAe,GAAG,EAAE;EAC1B,OAAOxF,IAAI,CAACG,IAAI,CAAC,CAAC,EAAE;IAClB,MAAM6D,eAAe,GAAGhE,IAAI,CAACK,WAAW,CAAC,CAAkC;IAC3E,MAAM;MAACb,IAAI;MAAEyD,IAAI,EAAEwC,OAAO;MAAEC;IAAO,CAAC,GAAG1B,eAAe;IACtD,MAAMf,IAAI,GAAGnG,gBAAgB,CAAC2I,OAAO,CAAC;IACtC,MAAME,KAAK,GAAG;MAACnG,IAAI;MAAEyD,IAAI;MAAE2C,QAAQ,EAAE,CAACF;IAAO,CAAC;IAC9CF,MAAM,CAACjG,IAAI,CAACoG,KAAK,CAAC;EACpB;EAEA,OAAO;IAACH,MAAM;IAAEK,QAAQ,EAAE,CAAC;EAAC,CAAC;AAC/B"}
1
+ {"version":3,"file":"parse-geopackage.js","names":["isBrowser","WKBLoader","binaryToGeometry","transformGeoJsonCoords","Proj4Projection","initSqlJs","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","_options$geopackage2","sqlJsCDN","geopackage","reproject","_targetCrs","gis","db","loadDatabase","tables","listVectorTables","projections","getProjections","selectedTable","find","table","_options$geopackage","table_name","tableName","shape","getVectorTable","outputTables","push","name","Error","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","getSchema","type","features","project","projectionMapping","srsInfo","definition","idIdx","indexOf","id","geomColumnIdx","column_name","geometry","parseGeometry","buffer","properties","key","value","Object","entries","idx","i","length","columnName","getGeopackageVersion","textDecoder","TextDecoder","applicationIdQuery","applicationId","ArrayBuffer","view","DataView","setInt32","Number","versionString","decode","userVersionQuery","userVersionInt","pragmaTableInfo","pk","_WKBLoader$parseSync","envelopeLength","emptyGeometry","parseGeometryBitFlags","getUint8","wkbOffset","binaryGeometry","parseSync","call","slice","byte","envelopeValue","littleEndian","Boolean","extendedGeometryType","bind","geometryColumn","error","message","includes","result","column","fields","sqlType","notnull","field","nullable","metadata"],"sources":["../../../src/lib/parse-geopackage.ts"],"sourcesContent":["/* eslint-disable camelcase, @typescript-eslint/no-use-before-define */\nimport {isBrowser} from '@loaders.gl/loader-utils';\nimport {WKBLoader} from '@loaders.gl/wkt';\nimport {Schema, Field, Geometry, DataType, Tables, GeoJSONTable, Feature} from '@loaders.gl/schema';\nimport {binaryToGeometry, transformGeoJsonCoords} from '@loaders.gl/gis';\nimport {Proj4Projection} from '@math.gl/proj4';\nimport initSqlJs, {SqlJsStatic, Database, Statement} from 'sql.js';\n\nimport type {GeoPackageLoaderOptions} from '../geopackage-loader';\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/**\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.\n */\nexport const DEFAULT_SQLJS_CDN = isBrowser\n ? 'https://cdnjs.cloudflare.com/ajax/libs/sql.js/1.5.0/'\n : null;\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]: 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 async function parseGeoPackage(\n arrayBuffer: ArrayBuffer,\n options?: GeoPackageLoaderOptions\n): Promise<GeoJSONTable | Tables<GeoJSONTable>> {\n const {sqlJsCDN = DEFAULT_SQLJS_CDN} = options?.geopackage || {};\n const {reproject = false, _targetCrs = 'WGS84'} = options?.gis || {};\n\n const db = await loadDatabase(arrayBuffer, sqlJsCDN);\n const tables = listVectorTables(db);\n const projections = getProjections(db);\n\n const selectedTable = tables.find((table) => table.table_name === options?.geopackage?.table);\n const tableName = selectedTable ? selectedTable.table_name : tables[0].table_name;\n\n const shape = options?.geopackage?.shape;\n switch (shape) {\n case 'geojson-table':\n return getVectorTable(db, tableName, projections, {\n reproject,\n _targetCrs\n });\n\n case 'tables':\n // Mapping from tableName to geojson feature collection\n const outputTables: Tables<GeoJSONTable> = {\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 return outputTables;\n\n default:\n throw new Error(shape);\n }\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): GeoJSONTable {\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: Feature<Geometry | null>[] = [];\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 = getSchema(db, tableName);\n if (projection) {\n return {\n shape: 'geojson-table',\n type: 'FeatureCollection',\n // @ts-expect-error TODO - null geometries causing problems...\n features: transformGeoJsonCoords(geojsonFeatures, projection.project),\n schema\n };\n }\n\n return {\n shape: 'geojson-table',\n schema,\n type: 'FeatureCollection',\n // @ts-expect-error TODO - null features\n features: geojsonFeatures\n };\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 // @ts-expect-error\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 getSchema(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: sqlType, notnull} = pragmaTableInfo;\n const type = SQL_TYPE_MAPPING[sqlType];\n const field = {name, type, nullable: !notnull};\n fields.push(field);\n }\n\n return {fields, metadata: {}};\n}\n"],"mappings":"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"}
@@ -1,16 +1,21 @@
1
1
  import type { LoaderWithParser, LoaderOptions } from '@loaders.gl/loader-utils';
2
- import { Tables, ObjectRowTable } from '@loaders.gl/schema';
2
+ import { Tables, GeoJSONTable } from '@loaders.gl/schema';
3
3
  export type GeoPackageLoaderOptions = LoaderOptions & {
4
+ /** Options for the geopackage loader */
4
5
  geopackage?: {
6
+ /** Shape of returned data */
7
+ shape?: 'geojson-table' | 'tables';
8
+ /** Name of table to load (defaults to first table), unless shape==='tables' */
9
+ table?: string;
5
10
  /** Use null in Node */
6
- sqlJsCDN: string | null;
11
+ sqlJsCDN?: string | null;
7
12
  };
8
13
  gis?: {
9
14
  reproject?: boolean;
10
15
  _targetCrs?: string;
11
16
  };
12
17
  };
13
- export declare const GeoPackageLoader: LoaderWithParser<Tables<ObjectRowTable>, never, GeoPackageLoaderOptions>;
18
+ export declare const GeoPackageLoader: LoaderWithParser<GeoJSONTable | Tables<GeoJSONTable>, never, GeoPackageLoaderOptions>;
14
19
  /** Geopackage loader *
15
20
  export const GeoPackageTableLoader: LoaderWithParser<Record<string, Feature[]>, never, GeoPackageLoaderOptions> = {
16
21
  id: 'geopackage',
@@ -1 +1 @@
1
- {"version":3,"file":"geopackage-loader.d.ts","sourceRoot":"","sources":["../src/geopackage-loader.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,gBAAgB,EAAE,aAAa,EAAC,MAAM,0BAA0B,CAAC;AAC9E,OAAO,EAAC,MAAM,EAAE,cAAc,EAAC,MAAM,oBAAoB,CAAC;AAQ1D,MAAM,MAAM,uBAAuB,GAAG,aAAa,GAAG;IACpD,UAAU,CAAC,EAAE;QACX,uBAAuB;QACvB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;KACzB,CAAC;IACF,GAAG,CAAC,EAAE;QACJ,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;CACH,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,gBAAgB,CAC7C,MAAM,CAAC,cAAc,CAAC,EACtB,KAAK,EACL,uBAAuB,CAgBxB,CAAC;AAEF;;;;;;;;;;;;;;;;;;EAkBE"}
1
+ {"version":3,"file":"geopackage-loader.d.ts","sourceRoot":"","sources":["../src/geopackage-loader.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,gBAAgB,EAAE,aAAa,EAAC,MAAM,0BAA0B,CAAC;AAC9E,OAAO,EAAC,MAAM,EAAE,YAAY,EAAC,MAAM,oBAAoB,CAAC;AAQxD,MAAM,MAAM,uBAAuB,GAAG,aAAa,GAAG;IACpD,wCAAwC;IACxC,UAAU,CAAC,EAAE;QACX,6BAA6B;QAC7B,KAAK,CAAC,EAAE,eAAe,GAAG,QAAQ,CAAC;QACnC,+EAA+E;QAC/E,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,uBAAuB;QACvB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;KAC1B,CAAC;IACF,GAAG,CAAC,EAAE;QACJ,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;CACH,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,gBAAgB,CAC7C,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC,EACnC,KAAK,EACL,uBAAuB,CAiBxB,CAAC;AAEF;;;;;;;;;;;;;;;;;;EAkBE"}
@@ -1,5 +1,9 @@
1
+ import { Tables, GeoJSONTable } from '@loaders.gl/schema';
1
2
  import type { GeoPackageLoaderOptions } from '../geopackage-loader';
2
- import { Tables, ObjectRowTable } from '@loaders.gl/schema';
3
- export declare const DEFAULT_SQLJS_CDN = "https://cdnjs.cloudflare.com/ajax/libs/sql.js/1.5.0/";
4
- export declare function parseGeoPackage(arrayBuffer: ArrayBuffer, options?: GeoPackageLoaderOptions): Promise<Tables<ObjectRowTable>>;
3
+ /**
4
+ * We pin to the same version as sql.js that we use.
5
+ * As of March 2022, versions 1.6.0, 1.6.1, and 1.6.2 of sql.js appeared not to work.
6
+ */
7
+ export declare const DEFAULT_SQLJS_CDN: string | null;
8
+ export declare function parseGeoPackage(arrayBuffer: ArrayBuffer, options?: GeoPackageLoaderOptions): Promise<GeoJSONTable | Tables<GeoJSONTable>>;
5
9
  //# sourceMappingURL=parse-geopackage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"parse-geopackage.d.ts","sourceRoot":"","sources":["../../src/lib/parse-geopackage.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,uBAAuB,EAAC,MAAM,sBAAsB,CAAC;AAGlE,OAAO,EAKL,MAAM,EACN,cAAc,EAEf,MAAM,oBAAoB,CAAC;AAkB5B,eAAO,MAAM,iBAAiB,yDAAyD,CAAC;AAwCxF,wBAAsB,eAAe,CACnC,WAAW,EAAE,WAAW,EACxB,OAAO,CAAC,EAAE,uBAAuB,GAChC,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CA0BjC"}
1
+ {"version":3,"file":"parse-geopackage.d.ts","sourceRoot":"","sources":["../../src/lib/parse-geopackage.ts"],"names":[],"mappings":"AAGA,OAAO,EAAoC,MAAM,EAAE,YAAY,EAAU,MAAM,oBAAoB,CAAC;AAKpG,OAAO,KAAK,EAAC,uBAAuB,EAAC,MAAM,sBAAsB,CAAC;AAclE;;;GAGG;AACH,eAAO,MAAM,iBAAiB,eAEtB,CAAC;AAwCT,wBAAsB,eAAe,CACnC,WAAW,EAAE,WAAW,EACxB,OAAO,CAAC,EAAE,uBAAuB,GAChC,OAAO,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC,CA0C9C"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@loaders.gl/geopackage",
3
3
  "description": "GeoPackage data loaders",
4
- "version": "4.0.0-alpha.24",
4
+ "version": "4.0.0-alpha.25",
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": "4.0.0-alpha.24",
29
- "@loaders.gl/schema": "4.0.0-alpha.24",
30
- "@loaders.gl/wkt": "4.0.0-alpha.24",
28
+ "@loaders.gl/gis": "4.0.0-alpha.25",
29
+ "@loaders.gl/schema": "4.0.0-alpha.25",
30
+ "@loaders.gl/wkt": "4.0.0-alpha.25",
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": "97a8990595c132fb14e3445a8768d9f4cb98ff05"
35
+ "gitHead": "40135f391b869388dbbcd615bbe51178d0c370be"
36
36
  }
@@ -1,6 +1,6 @@
1
1
  // loaders.gl, MIT license
2
2
  import type {LoaderWithParser, LoaderOptions} from '@loaders.gl/loader-utils';
3
- import {Tables, ObjectRowTable} from '@loaders.gl/schema';
3
+ import {Tables, GeoJSONTable} from '@loaders.gl/schema';
4
4
  import {parseGeoPackage, DEFAULT_SQLJS_CDN} from './lib/parse-geopackage';
5
5
 
6
6
  // __VERSION__ is injected by babel-plugin-version-inline
@@ -9,9 +9,14 @@ import {parseGeoPackage, DEFAULT_SQLJS_CDN} from './lib/parse-geopackage';
9
9
  const VERSION = 'latest';
10
10
 
11
11
  export type GeoPackageLoaderOptions = LoaderOptions & {
12
+ /** Options for the geopackage loader */
12
13
  geopackage?: {
14
+ /** Shape of returned data */
15
+ shape?: 'geojson-table' | 'tables';
16
+ /** Name of table to load (defaults to first table), unless shape==='tables' */
17
+ table?: string;
13
18
  /** Use null in Node */
14
- sqlJsCDN: string | null;
19
+ sqlJsCDN?: string | null;
15
20
  };
16
21
  gis?: {
17
22
  reproject?: boolean;
@@ -20,7 +25,7 @@ export type GeoPackageLoaderOptions = LoaderOptions & {
20
25
  };
21
26
 
22
27
  export const GeoPackageLoader: LoaderWithParser<
23
- Tables<ObjectRowTable>,
28
+ GeoJSONTable | Tables<GeoJSONTable>,
24
29
  never,
25
30
  GeoPackageLoaderOptions
26
31
  > = {
@@ -34,7 +39,8 @@ export const GeoPackageLoader: LoaderWithParser<
34
39
  parse: parseGeoPackage,
35
40
  options: {
36
41
  geopackage: {
37
- sqlJsCDN: DEFAULT_SQLJS_CDN
42
+ sqlJsCDN: DEFAULT_SQLJS_CDN,
43
+ shape: 'geojson-table'
38
44
  },
39
45
  gis: {}
40
46
  }
@@ -1,18 +1,12 @@
1
1
  /* eslint-disable camelcase, @typescript-eslint/no-use-before-define */
2
- import type {GeoPackageLoaderOptions} from '../geopackage-loader';
3
- import initSqlJs, {SqlJsStatic, Database, Statement} from 'sql.js';
2
+ import {isBrowser} from '@loaders.gl/loader-utils';
4
3
  import {WKBLoader} from '@loaders.gl/wkt';
5
- import {
6
- Schema,
7
- Field,
8
- Geometry,
9
- DataType,
10
- Tables,
11
- ObjectRowTable,
12
- Feature
13
- } from '@loaders.gl/schema';
4
+ import {Schema, Field, Geometry, DataType, Tables, GeoJSONTable, Feature} from '@loaders.gl/schema';
14
5
  import {binaryToGeometry, transformGeoJsonCoords} from '@loaders.gl/gis';
15
6
  import {Proj4Projection} from '@math.gl/proj4';
7
+ import initSqlJs, {SqlJsStatic, Database, Statement} from 'sql.js';
8
+
9
+ import type {GeoPackageLoaderOptions} from '../geopackage-loader';
16
10
  import {
17
11
  GeometryColumnsRow,
18
12
  ContentsRow,
@@ -26,9 +20,13 @@ import {
26
20
  GeoPackageGeometryTypes
27
21
  } from './types';
28
22
 
29
- // We pin to the same version as sql.js that we use.
30
- // As of March 2022, versions 1.6.0, 1.6.1, and 1.6.2 of sql.js appeared not to work.
31
- export const DEFAULT_SQLJS_CDN = 'https://cdnjs.cloudflare.com/ajax/libs/sql.js/1.5.0/';
23
+ /**
24
+ * We pin to the same version as sql.js that we use.
25
+ * As of March 2022, versions 1.6.0, 1.6.1, and 1.6.2 of sql.js appeared not to work.
26
+ */
27
+ export const DEFAULT_SQLJS_CDN = isBrowser
28
+ ? 'https://cdnjs.cloudflare.com/ajax/libs/sql.js/1.5.0/'
29
+ : null;
32
30
 
33
31
  // https://www.geopackage.org/spec121/#flags_layout
34
32
  const ENVELOPE_BYTE_LENGTHS = {
@@ -71,7 +69,7 @@ const SQL_TYPE_MAPPING: {[type in SQLiteTypes | GeoPackageGeometryTypes]: DataTy
71
69
  export async function parseGeoPackage(
72
70
  arrayBuffer: ArrayBuffer,
73
71
  options?: GeoPackageLoaderOptions
74
- ): Promise<Tables<ObjectRowTable>> {
72
+ ): Promise<GeoJSONTable | Tables<GeoJSONTable>> {
75
73
  const {sqlJsCDN = DEFAULT_SQLJS_CDN} = options?.geopackage || {};
76
74
  const {reproject = false, _targetCrs = 'WGS84'} = options?.gis || {};
77
75
 
@@ -79,24 +77,40 @@ export async function parseGeoPackage(
79
77
  const tables = listVectorTables(db);
80
78
  const projections = getProjections(db);
81
79
 
82
- // Mapping from tableName to geojson feature collection
83
- const outputTables: Tables<ObjectRowTable> = {
84
- shape: 'tables',
85
- tables: []
86
- };
80
+ const selectedTable = tables.find((table) => table.table_name === options?.geopackage?.table);
81
+ const tableName = selectedTable ? selectedTable.table_name : tables[0].table_name;
87
82
 
88
- for (const table of tables) {
89
- const {table_name: tableName} = table;
90
- outputTables.tables.push({
91
- name: tableName,
92
- table: getVectorTable(db, tableName, projections, {
83
+ const shape = options?.geopackage?.shape;
84
+ switch (shape) {
85
+ case 'geojson-table':
86
+ return getVectorTable(db, tableName, projections, {
93
87
  reproject,
94
88
  _targetCrs
95
- })
96
- });
97
- }
89
+ });
90
+
91
+ case 'tables':
92
+ // Mapping from tableName to geojson feature collection
93
+ const outputTables: Tables<GeoJSONTable> = {
94
+ shape: 'tables',
95
+ tables: []
96
+ };
97
+
98
+ for (const table of tables) {
99
+ const {table_name: tableName} = table;
100
+ outputTables.tables.push({
101
+ name: tableName,
102
+ table: getVectorTable(db, tableName, projections, {
103
+ reproject,
104
+ _targetCrs
105
+ })
106
+ });
107
+ }
98
108
 
99
- return outputTables;
109
+ return outputTables;
110
+
111
+ default:
112
+ throw new Error(shape);
113
+ }
100
114
  }
101
115
 
102
116
  /**
@@ -161,7 +175,7 @@ function getVectorTable(
161
175
  tableName: string,
162
176
  projections: ProjectionMapping,
163
177
  {reproject, _targetCrs}: {reproject: boolean; _targetCrs: string}
164
- ): ObjectRowTable {
178
+ ): GeoJSONTable {
165
179
  const dataColumns = getDataColumns(db, tableName);
166
180
  const geomColumn = getGeometryColumn(db, tableName);
167
181
  const featureIdColumn = getFeatureIdName(db, tableName);
@@ -195,14 +209,21 @@ function getVectorTable(
195
209
  const schema = getSchema(db, tableName);
196
210
  if (projection) {
197
211
  return {
198
- shape: 'object-row-table',
212
+ shape: 'geojson-table',
213
+ type: 'FeatureCollection',
199
214
  // @ts-expect-error TODO - null geometries causing problems...
200
- data: transformGeoJsonCoords(geojsonFeatures, projection.project),
215
+ features: transformGeoJsonCoords(geojsonFeatures, projection.project),
201
216
  schema
202
217
  };
203
218
  }
204
219
 
205
- return {data: geojsonFeatures, schema, shape: 'object-row-table'};
220
+ return {
221
+ shape: 'geojson-table',
222
+ schema,
223
+ type: 'FeatureCollection',
224
+ // @ts-expect-error TODO - null features
225
+ features: geojsonFeatures
226
+ };
206
227
  }
207
228
 
208
229
  /**