UNPKG

@loaders.gl/geopackage

Version:

GeoPackage data loaders

8 lines (7 loc) 21.3 kB
{ "version": 3, "sources": ["index.js", "lib/parse-geopackage.js", "geopackage-loader.js"], "sourcesContent": ["// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nexport { GeoPackageLoader } from \"./geopackage-loader.js\";\n", "/* eslint-disable camelcase, @typescript-eslint/no-use-before-define */\nimport { isBrowser } from '@loaders.gl/loader-utils';\nimport { WKBLoader } from '@loaders.gl/wkt';\nimport { binaryToGeometry, transformGeoJsonCoords } from '@loaders.gl/gis';\nimport { Proj4Projection } from '@math.gl/proj4';\nimport initSqlJs from 'sql.js';\nconst SQL_JS_VERSION = '1.8.0';\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/${SQL_JS_VERSION}/`\n : null;\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// Documentation: https://www.geopackage.org/spec130/index.html#table_column_data_types\nconst SQL_TYPE_MAPPING = {\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};\nexport async function parseGeoPackage(arrayBuffer, options) {\n const { sqlJsCDN = DEFAULT_SQLJS_CDN } = options?.geopackage || {};\n const { reproject = false, _targetCrs = 'WGS84' } = options?.gis || {};\n const db = await loadDatabase(arrayBuffer, sqlJsCDN);\n const tables = listVectorTables(db);\n const projections = getProjections(db);\n const selectedTable = tables.find((table) => table.table_name === options?.geopackage?.table);\n const tableName = selectedTable ? selectedTable.table_name : tables[0].table_name;\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 case 'tables':\n // Mapping from tableName to geojson feature collection\n const outputTables = {\n shape: 'tables',\n tables: []\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 return outputTables;\n default:\n throw new Error(shape);\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, sqlJsCDN) {\n // In Node, `locateFile` must not be passed\n let SQL;\n if (sqlJsCDN) {\n SQL = await initSqlJs({\n locateFile: (file) => `${sqlJsCDN}${file}`\n });\n }\n else {\n SQL = await initSqlJs();\n }\n return new SQL.Database(new Uint8Array(arrayBuffer));\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) {\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 // 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 const vectorTablesInfo = [];\n while (stmt.step()) {\n const vectorTableInfo = stmt.getAsObject();\n vectorTablesInfo.push(vectorTableInfo);\n }\n return vectorTablesInfo;\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(db, tableName, projections, { reproject, _targetCrs }) {\n const dataColumns = getDataColumns(db, tableName);\n const geomColumn = getGeometryColumn(db, tableName);\n const featureIdColumn = getFeatureIdName(db, tableName);\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 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 const geojsonFeatures = [];\n for (const row of values) {\n const geojsonFeature = constructGeoJsonFeature(columns, row, geomColumn, \n // @ts-ignore\n dataColumns, featureIdColumn);\n geojsonFeatures.push(geojsonFeature);\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 return {\n shape: 'geojson-table',\n schema,\n type: 'FeatureCollection',\n // @ts-expect-error TODO - null features\n features: geojsonFeatures\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) {\n // Query gpkg_spatial_ref_sys to get srid: srtext mappings\n const stmt = db.prepare('SELECT * FROM gpkg_spatial_ref_sys;');\n const projectionMapping = {};\n while (stmt.step()) {\n const srsInfo = stmt.getAsObject();\n const { srs_id, definition } = srsInfo;\n projectionMapping[srs_id] = definition;\n }\n return projectionMapping;\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(columns, row, geomColumn, dataColumns, featureIdColumn) {\n // Find feature id\n const idIdx = columns.indexOf(featureIdColumn);\n const id = row[idIdx];\n // Parse geometry columns to geojson\n const geomColumnIdx = columns.indexOf(geomColumn.column_name);\n const geometry = parseGeometry(row[geomColumnIdx].buffer);\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 }\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 const columnName = columns[i];\n properties[columnName] = row[i];\n }\n }\n return {\n id,\n type: 'Feature',\n geometry,\n properties\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// @ts-ignore\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nfunction getGeopackageVersion(db) {\n const textDecoder = new TextDecoder();\n // Read application id from SQLite metadata\n const applicationIdQuery = db.exec('PRAGMA application_id;')[0];\n const applicationId = applicationIdQuery.values[0][0];\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 if (versionString === 'GP10') {\n return '1.0';\n }\n if (versionString === 'GP11') {\n return '1.1';\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 if (userVersionInt && typeof userVersionInt === 'number' && userVersionInt < 10300) {\n return '1.2';\n }\n return null;\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, tableName) {\n // Again, not possible to parameterize table name?\n const stmt = db.prepare(`PRAGMA table_info(\\`${tableName}\\`)`);\n while (stmt.step()) {\n const pragmaTableInfo = stmt.getAsObject();\n const { name, pk } = pragmaTableInfo;\n if (pk) {\n return name;\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 * 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) {\n const view = new DataView(arrayBuffer);\n const { envelopeLength, emptyGeometry } = parseGeometryBitFlags(view.getUint8(3));\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 // 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 // 2 byte magic, 1 byte version, 1 byte flags, 4 byte int32 srid\n const wkbOffset = 8 + envelopeLength;\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 // @ts-expect-error\n return binaryToGeometry(binaryGeometry);\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) {\n // Are header values little endian?\n const envelopeValue = (byte & 0b00001110) / 2;\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];\n return {\n littleEndian: Boolean(byte & 0b00000001),\n envelopeLength,\n emptyGeometry: Boolean(byte & 0b00010000),\n extendedGeometryType: Boolean(byte & 0b00100000)\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, tableName) {\n const stmt = db.prepare('SELECT * FROM gpkg_geometry_columns WHERE table_name=:tableName;');\n stmt.bind({ ':tableName': tableName });\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();\n return geometryColumn;\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, tableName) {\n // gpkg_data_columns is not required to exist\n // https://www.geopackage.org/spec121/#extension_schema\n let stmt;\n try {\n stmt = db.prepare('SELECT * FROM gpkg_data_columns WHERE table_name=:tableName;');\n }\n catch (error) {\n if (error.message.includes('no such table')) {\n return null;\n }\n throw error;\n }\n stmt.bind({ ':tableName': tableName });\n // Convert DataColumnsRow object this to a key-value {column_name: name}\n const result = {};\n while (stmt.step()) {\n const column = stmt.getAsObject();\n const { column_name, name } = column;\n result[column_name] = name || null;\n }\n return result;\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, tableName) {\n const stmt = db.prepare(`PRAGMA table_info(\\`${tableName}\\`)`);\n const fields = [];\n while (stmt.step()) {\n const pragmaTableInfo = stmt.getAsObject();\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 return { fields, metadata: {} };\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { parseGeoPackage, DEFAULT_SQLJS_CDN } from \"./lib/parse-geopackage.js\";\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';\nexport const GeoPackageLoader = {\n dataType: null,\n batchType: null,\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: 'tables'\n },\n gis: {}\n }\n};\n"], "mappings": "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", "names": ["_a", "tableName", "initSqlJs"] }