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

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.
@@ -266,6 +266,7 @@ function getFeatureIdName(db, tableName) {
266
266
  return null;
267
267
  }
268
268
  function parseGeometry(arrayBuffer) {
269
+ var _WKBLoader$parseSync;
269
270
  var view = new DataView(arrayBuffer);
270
271
  var _parseGeometryBitFlag = parseGeometryBitFlags(view.getUint8(3)),
271
272
  envelopeLength = _parseGeometryBitFlag.envelopeLength,
@@ -274,7 +275,7 @@ function parseGeometry(arrayBuffer) {
274
275
  return null;
275
276
  }
276
277
  var wkbOffset = 8 + envelopeLength;
277
- var binaryGeometry = _wkt.WKBLoader.parseSync(arrayBuffer.slice(wkbOffset));
278
+ var binaryGeometry = (_WKBLoader$parseSync = _wkt.WKBLoader.parseSync) === null || _WKBLoader$parseSync === void 0 ? void 0 : _WKBLoader$parseSync.call(_wkt.WKBLoader, arrayBuffer.slice(wkbOffset));
278
279
  return (0, _gis.binaryToGeometry)(binaryGeometry);
279
280
  }
280
281
  function parseGeometryBitFlags(byte) {
@@ -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","_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 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":["_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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"}
@@ -200,6 +200,7 @@ function getFeatureIdName(db, tableName) {
200
200
  return null;
201
201
  }
202
202
  function parseGeometry(arrayBuffer) {
203
+ var _WKBLoader$parseSync;
203
204
  const view = new DataView(arrayBuffer);
204
205
  const {
205
206
  envelopeLength,
@@ -209,7 +210,7 @@ function parseGeometry(arrayBuffer) {
209
210
  return null;
210
211
  }
211
212
  const wkbOffset = 8 + envelopeLength;
212
- const binaryGeometry = WKBLoader.parseSync(arrayBuffer.slice(wkbOffset));
213
+ const binaryGeometry = (_WKBLoader$parseSync = WKBLoader.parseSync) === null || _WKBLoader$parseSync === void 0 ? void 0 : _WKBLoader$parseSync.call(WKBLoader, arrayBuffer.slice(wkbOffset));
213
214
  return binaryToGeometry(binaryGeometry);
214
215
  }
215
216
  function parseGeometryBitFlags(byte) {
@@ -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","envelopeLength","emptyGeometry","parseGeometryBitFlags","getUint8","wkbOffset","binaryGeometry","parseSync","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 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":["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":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@loaders.gl/geopackage",
3
3
  "description": "GeoPackage data loaders",
4
- "version": "4.0.0-alpha.22",
4
+ "version": "4.0.0-alpha.24",
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.22",
29
- "@loaders.gl/schema": "4.0.0-alpha.22",
30
- "@loaders.gl/wkt": "4.0.0-alpha.22",
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",
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": "0da838c506d1275383f2fd3d244d9c72b25397d2"
35
+ "gitHead": "97a8990595c132fb14e3445a8768d9f4cb98ff05"
36
36
  }
@@ -370,8 +370,9 @@ function parseGeometry(arrayBuffer: ArrayBuffer): Geometry | null {
370
370
 
371
371
  // Loaders should not depend on `core` and the context passed to the main loader doesn't include a
372
372
  // `parseSync` option, so instead we call parseSync directly on WKBLoader
373
- const binaryGeometry = WKBLoader.parseSync(arrayBuffer.slice(wkbOffset));
373
+ const binaryGeometry = WKBLoader.parseSync?.(arrayBuffer.slice(wkbOffset));
374
374
 
375
+ // @ts-expect-error
375
376
  return binaryToGeometry(binaryGeometry);
376
377
  }
377
378
 
package/dist/bundle.js DELETED
@@ -1,5 +0,0 @@
1
- "use strict";
2
- // @ts-nocheck
3
- const moduleExports = require('./index');
4
- globalThis.loaders = globalThis.loaders || {};
5
- module.exports = Object.assign(globalThis.loaders, moduleExports);
@@ -1,43 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.GeoPackageLoader = void 0;
4
- const parse_geopackage_1 = require("./lib/parse-geopackage");
5
- // __VERSION__ is injected by babel-plugin-version-inline
6
- // @ts-ignore TS2304: Cannot find name '__VERSION__'.
7
- // const VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'latest';
8
- const VERSION = 'latest';
9
- exports.GeoPackageLoader = {
10
- id: 'geopackage',
11
- name: 'GeoPackage',
12
- module: 'geopackage',
13
- version: VERSION,
14
- extensions: ['gpkg'],
15
- mimeTypes: ['application/geopackage+sqlite3'],
16
- category: 'geometry',
17
- parse: parse_geopackage_1.parseGeoPackage,
18
- options: {
19
- geopackage: {
20
- sqlJsCDN: parse_geopackage_1.DEFAULT_SQLJS_CDN
21
- },
22
- gis: {}
23
- }
24
- };
25
- /** Geopackage loader *
26
- export const GeoPackageTableLoader: LoaderWithParser<Record<string, Feature[]>, never, GeoPackageLoaderOptions> = {
27
- id: 'geopackage',
28
- name: 'GeoPackage',
29
- module: 'geopackage',
30
- version: VERSION,
31
- extensions: ['gpkg'],
32
- mimeTypes: ['application/geopackage+sqlite3'],
33
- category: 'geometry',
34
- parse: parseGeoPackage,
35
- options: {
36
- geopackage: {
37
- sqlJsCDN: DEFAULT_SQLJS_CDN,
38
- },
39
- gis: {
40
- }
41
- }
42
- };
43
- */
package/dist/index.js DELETED
@@ -1,5 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.GeoPackageLoader = void 0;
4
- var geopackage_loader_1 = require("./geopackage-loader");
5
- Object.defineProperty(exports, "GeoPackageLoader", { enumerable: true, get: function () { return geopackage_loader_1.GeoPackageLoader; } });
@@ -1,383 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.parseGeoPackage = exports.DEFAULT_SQLJS_CDN = void 0;
7
- const sql_js_1 = __importDefault(require("sql.js"));
8
- const wkt_1 = require("@loaders.gl/wkt");
9
- const gis_1 = require("@loaders.gl/gis");
10
- const proj4_1 = require("@math.gl/proj4");
11
- // We pin to the same version as sql.js that we use.
12
- // As of March 2022, versions 1.6.0, 1.6.1, and 1.6.2 of sql.js appeared not to work.
13
- exports.DEFAULT_SQLJS_CDN = 'https://cdnjs.cloudflare.com/ajax/libs/sql.js/1.5.0/';
14
- // https://www.geopackage.org/spec121/#flags_layout
15
- const ENVELOPE_BYTE_LENGTHS = {
16
- 0: 0,
17
- 1: 32,
18
- 2: 48,
19
- 3: 48,
20
- 4: 64,
21
- // values 5-7 are invalid and _should_ never show up
22
- 5: 0,
23
- 6: 0,
24
- 7: 0
25
- };
26
- // Documentation: https://www.geopackage.org/spec130/index.html#table_column_data_types
27
- const SQL_TYPE_MAPPING = {
28
- BOOLEAN: 'bool',
29
- TINYINT: 'int8',
30
- SMALLINT: 'int16',
31
- MEDIUMINT: 'int32',
32
- INT: 'int32',
33
- INTEGER: 'int32',
34
- FLOAT: 'float32',
35
- DOUBLE: 'float64',
36
- REAL: 'float64',
37
- TEXT: 'utf8',
38
- BLOB: 'binary',
39
- DATE: 'utf8',
40
- DATETIME: 'utf8',
41
- GEOMETRY: 'binary',
42
- POINT: 'binary',
43
- LINESTRING: 'binary',
44
- POLYGON: 'binary',
45
- MULTIPOINT: 'binary',
46
- MULTILINESTRING: 'binary',
47
- MULTIPOLYGON: 'binary',
48
- GEOMETRYCOLLECTION: 'binary'
49
- };
50
- async function parseGeoPackage(arrayBuffer, options) {
51
- const { sqlJsCDN = exports.DEFAULT_SQLJS_CDN } = options?.geopackage || {};
52
- const { reproject = false, _targetCrs = 'WGS84' } = options?.gis || {};
53
- const db = await loadDatabase(arrayBuffer, sqlJsCDN);
54
- const tables = listVectorTables(db);
55
- const projections = getProjections(db);
56
- // Mapping from tableName to geojson feature collection
57
- const outputTables = {
58
- shape: 'tables',
59
- tables: []
60
- };
61
- for (const table of tables) {
62
- const { table_name: tableName } = table;
63
- outputTables.tables.push({
64
- name: tableName,
65
- table: getVectorTable(db, tableName, projections, {
66
- reproject,
67
- _targetCrs
68
- })
69
- });
70
- }
71
- return outputTables;
72
- }
73
- exports.parseGeoPackage = parseGeoPackage;
74
- /**
75
- * Initialize SQL.js and create database
76
- *
77
- * @param arrayBuffer input bytes
78
- * @return SQL.js database object
79
- */
80
- async function loadDatabase(arrayBuffer, sqlJsCDN) {
81
- // In Node, `locateFile` must not be passed
82
- let SQL;
83
- if (sqlJsCDN) {
84
- SQL = await (0, sql_js_1.default)({
85
- locateFile: (file) => `${sqlJsCDN}${file}`
86
- });
87
- }
88
- else {
89
- SQL = await (0, sql_js_1.default)();
90
- }
91
- return new SQL.Database(new Uint8Array(arrayBuffer));
92
- }
93
- /**
94
- * Find all vector tables in GeoPackage
95
- * This queries the `gpkg_contents` table to find a list of vector tables
96
- *
97
- * @param db GeoPackage to query
98
- * @return list of table references
99
- */
100
- function listVectorTables(db) {
101
- // The gpkg_contents table can have at least three categorical values for
102
- // data_type.
103
- // - 'features' refers to a vector geometry table
104
- // (https://www.geopackage.org/spec121/#_contents_2)
105
- // - 'tiles' refers to a raster table
106
- // (https://www.geopackage.org/spec121/#_contents_3)
107
- // - 'attributes' refers to a data table with no geometry
108
- // (https://www.geopackage.org/spec121/#_contents_4).
109
- // We hard code 'features' because for now we don't support raster data or pure attribute data
110
- // eslint-disable-next-line quotes
111
- const stmt = db.prepare("SELECT * FROM gpkg_contents WHERE data_type='features';");
112
- const vectorTablesInfo = [];
113
- while (stmt.step()) {
114
- const vectorTableInfo = stmt.getAsObject();
115
- vectorTablesInfo.push(vectorTableInfo);
116
- }
117
- return vectorTablesInfo;
118
- }
119
- /**
120
- * Load geometries from vector table
121
- *
122
- * @param db GeoPackage object
123
- * @param tableName name of vector table to query
124
- * @param projections keys are srs_id values, values are WKT strings
125
- * @returns Array of GeoJSON Feature objects
126
- */
127
- function getVectorTable(db, tableName, projections, { reproject, _targetCrs }) {
128
- const dataColumns = getDataColumns(db, tableName);
129
- const geomColumn = getGeometryColumn(db, tableName);
130
- const featureIdColumn = getFeatureIdName(db, tableName);
131
- // Get vector features from table
132
- // Don't think it's possible to parameterize the table name in SQLite?
133
- const { columns, values } = db.exec(`SELECT * FROM \`${tableName}\`;`)[0];
134
- let projection;
135
- if (reproject) {
136
- const geomColumnProjStr = projections[geomColumn.srs_id];
137
- projection = new proj4_1.Proj4Projection({
138
- from: geomColumnProjStr,
139
- to: _targetCrs
140
- });
141
- }
142
- const geojsonFeatures = [];
143
- for (const row of values) {
144
- const geojsonFeature = constructGeoJsonFeature(columns, row, geomColumn,
145
- // @ts-ignore
146
- dataColumns, featureIdColumn);
147
- geojsonFeatures.push(geojsonFeature);
148
- }
149
- const schema = getSchema(db, tableName);
150
- if (projection) {
151
- return {
152
- shape: 'object-row-table',
153
- // @ts-expect-error TODO - null geometries causing problems...
154
- data: (0, gis_1.transformGeoJsonCoords)(geojsonFeatures, projection.project),
155
- schema
156
- };
157
- }
158
- return { data: geojsonFeatures, schema, shape: 'object-row-table' };
159
- }
160
- /**
161
- * Find all projections defined in GeoPackage
162
- * This queries the gpkg_spatial_ref_sys table
163
- * @param db GeoPackage object
164
- * @returns mapping from srid to WKT projection string
165
- */
166
- function getProjections(db) {
167
- // Query gpkg_spatial_ref_sys to get srid: srtext mappings
168
- const stmt = db.prepare('SELECT * FROM gpkg_spatial_ref_sys;');
169
- const projectionMapping = {};
170
- while (stmt.step()) {
171
- const srsInfo = stmt.getAsObject();
172
- const { srs_id, definition } = srsInfo;
173
- projectionMapping[srs_id] = definition;
174
- }
175
- return projectionMapping;
176
- }
177
- /**
178
- * Construct single GeoJSON feature given row's data
179
- * @param columns array of ordered column identifiers
180
- * @param row array of ordered values representing row's data
181
- * @param geomColumn geometry column metadata
182
- * @param dataColumns mapping from table column names to property name
183
- * @returns GeoJSON Feature object
184
- */
185
- function constructGeoJsonFeature(columns, row, geomColumn, dataColumns, featureIdColumn) {
186
- // Find feature id
187
- const idIdx = columns.indexOf(featureIdColumn);
188
- const id = row[idIdx];
189
- // Parse geometry columns to geojson
190
- const geomColumnIdx = columns.indexOf(geomColumn.column_name);
191
- const geometry = parseGeometry(row[geomColumnIdx].buffer);
192
- const properties = {};
193
- if (dataColumns) {
194
- for (const [key, value] of Object.entries(dataColumns)) {
195
- const idx = columns.indexOf(key);
196
- // @ts-ignore TODO - Check what happens if null?
197
- properties[value] = row[idx];
198
- }
199
- }
200
- else {
201
- // Put all columns except for the feature id and geometry in properties
202
- for (let i = 0; i < columns.length; i++) {
203
- if (i === idIdx || i === geomColumnIdx) {
204
- // eslint-disable-next-line no-continue
205
- continue;
206
- }
207
- const columnName = columns[i];
208
- properties[columnName] = row[i];
209
- }
210
- }
211
- return {
212
- id,
213
- type: 'Feature',
214
- geometry,
215
- properties
216
- };
217
- }
218
- /**
219
- * Get GeoPackage version from database
220
- * @param db database
221
- * @returns version string. One of '1.0', '1.1', '1.2'
222
- */
223
- // @ts-ignore
224
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
225
- function getGeopackageVersion(db) {
226
- const textDecoder = new TextDecoder();
227
- // Read application id from SQLite metadata
228
- const applicationIdQuery = db.exec('PRAGMA application_id;')[0];
229
- const applicationId = applicationIdQuery.values[0][0];
230
- // Convert 4-byte signed int32 application id to text
231
- const buffer = new ArrayBuffer(4);
232
- const view = new DataView(buffer);
233
- view.setInt32(0, Number(applicationId));
234
- const versionString = textDecoder.decode(buffer);
235
- if (versionString === 'GP10') {
236
- return '1.0';
237
- }
238
- if (versionString === 'GP11') {
239
- return '1.1';
240
- }
241
- // If versionString is GPKG, then read user_version
242
- const userVersionQuery = db.exec('PRAGMA user_version;')[0];
243
- const userVersionInt = userVersionQuery.values[0][0];
244
- if (userVersionInt && typeof userVersionInt === 'number' && userVersionInt < 10300) {
245
- return '1.2';
246
- }
247
- return null;
248
- }
249
- /**
250
- * Find name of feature id column in table
251
- * The feature ID is the primary key of the table.
252
- * http://www.geopackage.org/spec121/#feature_user_tables
253
- *
254
- * @param db database
255
- * @param tableName name of table
256
- * @return name of feature id column
257
- */
258
- function getFeatureIdName(db, tableName) {
259
- // Again, not possible to parameterize table name?
260
- const stmt = db.prepare(`PRAGMA table_info(\`${tableName}\`)`);
261
- while (stmt.step()) {
262
- const pragmaTableInfo = stmt.getAsObject();
263
- const { name, pk } = pragmaTableInfo;
264
- if (pk) {
265
- return name;
266
- }
267
- }
268
- // Is it guaranteed for there always to be at least one primary key column in the table?
269
- return null;
270
- }
271
- /**
272
- * Parse geometry buffer
273
- * GeoPackage vector geometries are slightly extended past the WKB standard
274
- * See: https://www.geopackage.org/spec121/#gpb_format
275
- *
276
- * @param arrayBuffer geometry buffer
277
- * @return GeoJSON geometry (in original CRS)
278
- */
279
- function parseGeometry(arrayBuffer) {
280
- const view = new DataView(arrayBuffer);
281
- const { envelopeLength, emptyGeometry } = parseGeometryBitFlags(view.getUint8(3));
282
- // A Feature object has a member with the name "geometry". The value of the
283
- // geometry member SHALL be either a Geometry object as defined above or, in
284
- // the case that the Feature is unlocated, a JSON null value.
285
- /** @see https://tools.ietf.org/html/rfc7946#section-3.2 */
286
- if (emptyGeometry) {
287
- return null;
288
- }
289
- // Do I need to find the srid here? Is it necessarily the same for every
290
- // geometry in a table?
291
- // const srid = view.getInt32(4, littleEndian);
292
- // 2 byte magic, 1 byte version, 1 byte flags, 4 byte int32 srid
293
- const wkbOffset = 8 + envelopeLength;
294
- // Loaders should not depend on `core` and the context passed to the main loader doesn't include a
295
- // `parseSync` option, so instead we call parseSync directly on WKBLoader
296
- const binaryGeometry = wkt_1.WKBLoader.parseSync(arrayBuffer.slice(wkbOffset));
297
- return (0, gis_1.binaryToGeometry)(binaryGeometry);
298
- }
299
- /**
300
- * Parse geometry header flags
301
- * https://www.geopackage.org/spec121/#flags_layout
302
- *
303
- * @param byte uint8 number representing flags
304
- * @return object representing information from bit flags
305
- */
306
- function parseGeometryBitFlags(byte) {
307
- // Are header values little endian?
308
- const envelopeValue = (byte & 0b00001110) / 2;
309
- // TODO: Not sure the best way to handle this. Throw an error if envelopeValue outside 0-7?
310
- const envelopeLength = ENVELOPE_BYTE_LENGTHS[envelopeValue];
311
- return {
312
- littleEndian: Boolean(byte & 0b00000001),
313
- envelopeLength,
314
- emptyGeometry: Boolean(byte & 0b00010000),
315
- extendedGeometryType: Boolean(byte & 0b00100000)
316
- };
317
- }
318
- /**
319
- * Find geometry column in given vector table
320
- *
321
- * @param db GeoPackage object
322
- * @param tableName Name of vector table
323
- * @returns Array of geometry column definitions
324
- */
325
- function getGeometryColumn(db, tableName) {
326
- const stmt = db.prepare('SELECT * FROM gpkg_geometry_columns WHERE table_name=:tableName;');
327
- stmt.bind({ ':tableName': tableName });
328
- // > Requirement 30
329
- // > A feature table SHALL have only one geometry column.
330
- // https://www.geopackage.org/spec121/#feature_user_tables
331
- // So we should need one and only one step, given that we use the WHERE clause in the SQL query
332
- // above
333
- stmt.step();
334
- const geometryColumn = stmt.getAsObject();
335
- return geometryColumn;
336
- }
337
- /**
338
- * Find property columns in given vector table
339
- * @param db GeoPackage object
340
- * @param tableName Name of vector table
341
- * @returns Mapping from table column names to property name
342
- */
343
- function getDataColumns(db, tableName) {
344
- // gpkg_data_columns is not required to exist
345
- // https://www.geopackage.org/spec121/#extension_schema
346
- let stmt;
347
- try {
348
- stmt = db.prepare('SELECT * FROM gpkg_data_columns WHERE table_name=:tableName;');
349
- }
350
- catch (error) {
351
- if (error.message.includes('no such table')) {
352
- return null;
353
- }
354
- throw error;
355
- }
356
- stmt.bind({ ':tableName': tableName });
357
- // Convert DataColumnsRow object this to a key-value {column_name: name}
358
- const result = {};
359
- while (stmt.step()) {
360
- const column = stmt.getAsObject();
361
- const { column_name, name } = column;
362
- result[column_name] = name || null;
363
- }
364
- return result;
365
- }
366
- /**
367
- * Get arrow schema
368
- * @param db GeoPackage object
369
- * @param tableName table name
370
- * @returns Arrow-like Schema
371
- */
372
- function getSchema(db, tableName) {
373
- const stmt = db.prepare(`PRAGMA table_info(\`${tableName}\`)`);
374
- const fields = [];
375
- while (stmt.step()) {
376
- const pragmaTableInfo = stmt.getAsObject();
377
- const { name, type: sqlType, notnull } = pragmaTableInfo;
378
- const type = SQL_TYPE_MAPPING[sqlType];
379
- const field = { name, type, nullable: !notnull };
380
- fields.push(field);
381
- }
382
- return { fields, metadata: {} };
383
- }
package/dist/lib/types.js DELETED
@@ -1,2 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });