@loaders.gl/geopackage 4.3.1 → 4.4.0-alpha.1

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.
@@ -0,0 +1,9 @@
1
+ export declare const GeoPackageFormat: {
2
+ readonly id: "geopackage";
3
+ readonly name: "GeoPackage";
4
+ readonly module: "geopackage";
5
+ readonly extensions: ["gpkg"];
6
+ readonly mimeTypes: ["application/geopackage+sqlite3"];
7
+ readonly category: "geometry";
8
+ };
9
+ //# sourceMappingURL=geopackage-format.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"geopackage-format.d.ts","sourceRoot":"","sources":["../src/geopackage-format.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,gBAAgB;;;;;;;CAOF,CAAC"}
@@ -0,0 +1,11 @@
1
+ // loaders.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+ export const GeoPackageFormat = {
5
+ id: 'geopackage',
6
+ name: 'GeoPackage',
7
+ module: 'geopackage',
8
+ extensions: ['gpkg'],
9
+ mimeTypes: ['application/geopackage+sqlite3'],
10
+ category: 'geometry'
11
+ };
@@ -21,13 +21,7 @@ export type GeoPackageLoaderOptions = LoaderOptions & {
21
21
  export declare const GeoPackageLoader: {
22
22
  readonly dataType: GeoJSONTable | Tables<GeoJSONTable>;
23
23
  readonly batchType: never;
24
- readonly id: "geopackage";
25
- readonly name: "GeoPackage";
26
- readonly module: "geopackage";
27
24
  readonly version: "latest";
28
- readonly extensions: ["gpkg"];
29
- readonly mimeTypes: ["application/geopackage+sqlite3"];
30
- readonly category: "geometry";
31
25
  readonly parse: typeof parseGeoPackage;
32
26
  readonly options: {
33
27
  readonly geopackage: {
@@ -36,5 +30,11 @@ export declare const GeoPackageLoader: {
36
30
  };
37
31
  readonly gis: {};
38
32
  };
33
+ readonly id: "geopackage";
34
+ readonly name: "GeoPackage";
35
+ readonly module: "geopackage";
36
+ readonly extensions: ["gpkg"];
37
+ readonly mimeTypes: ["application/geopackage+sqlite3"];
38
+ readonly category: "geometry";
39
39
  };
40
40
  //# sourceMappingURL=geopackage-loader.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"geopackage-loader.d.ts","sourceRoot":"","sources":["../src/geopackage-loader.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAmB,aAAa,EAAC,MAAM,0BAA0B,CAAC;AAC9E,OAAO,EAAC,MAAM,EAAE,YAAY,EAAC,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAC,eAAe,EAAoB,kCAA+B;AAO1E,MAAM,MAAM,uBAAuB,GAAG,aAAa,GAAG;IACpD,wCAAwC;IACxC,UAAU,CAAC,EAAE;QACX,6BAA6B;QAC7B,KAAK,CAAC,EAAE,eAAe,GAAG,QAAQ,CAAC;QACnC,+EAA+E;QAC/E,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,uBAAuB;QACvB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACzB,8EAA8E;QAC9E,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,GAAG,CAAC,EAAE;QACJ,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;CACH,CAAC;AAEF,eAAO,MAAM,gBAAgB;uBACE,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;wBAC7C,KAAK;;;;;;;;;;;;;;;;CAqBzB,CAAC"}
1
+ {"version":3,"file":"geopackage-loader.d.ts","sourceRoot":"","sources":["../src/geopackage-loader.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAmB,aAAa,EAAC,MAAM,0BAA0B,CAAC;AAC9E,OAAO,EAAC,MAAM,EAAE,YAAY,EAAC,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAC,eAAe,EAAoB,kCAA+B;AAQ1E,MAAM,MAAM,uBAAuB,GAAG,aAAa,GAAG;IACpD,wCAAwC;IACxC,UAAU,CAAC,EAAE;QACX,6BAA6B;QAC7B,KAAK,CAAC,EAAE,eAAe,GAAG,QAAQ,CAAC;QACnC,+EAA+E;QAC/E,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,uBAAuB;QACvB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACzB,8EAA8E;QAC9E,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,GAAG,CAAC,EAAE;QACJ,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;CACH,CAAC;AAEF,eAAO,MAAM,gBAAgB;uBAGE,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;wBAC7C,KAAK;;;;;;;;;;;;;;;;CAezB,CAAC"}
@@ -2,20 +2,16 @@
2
2
  // SPDX-License-Identifier: MIT
3
3
  // Copyright (c) vis.gl contributors
4
4
  import { parseGeoPackage, DEFAULT_SQLJS_CDN } from "./lib/parse-geopackage.js";
5
+ import { GeoPackageFormat } from "./geopackage-format.js";
5
6
  // __VERSION__ is injected by babel-plugin-version-inline
6
7
  // @ts-ignore TS2304: Cannot find name '__VERSION__'.
7
8
  // const VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'latest';
8
9
  const VERSION = 'latest';
9
10
  export const GeoPackageLoader = {
11
+ ...GeoPackageFormat,
10
12
  dataType: null,
11
13
  batchType: null,
12
- id: 'geopackage',
13
- name: 'GeoPackage',
14
- module: 'geopackage',
15
14
  version: VERSION,
16
- extensions: ['gpkg'],
17
- mimeTypes: ['application/geopackage+sqlite3'],
18
- category: 'geometry',
19
15
  parse: parseGeoPackage,
20
16
  options: {
21
17
  geopackage: {
package/dist/index.cjs CHANGED
@@ -30,13 +30,23 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
30
30
  // dist/index.js
31
31
  var dist_exports = {};
32
32
  __export(dist_exports, {
33
+ GeoPackageFormat: () => GeoPackageFormat,
33
34
  GeoPackageLoader: () => GeoPackageLoader
34
35
  });
35
36
  module.exports = __toCommonJS(dist_exports);
36
37
 
38
+ // dist/geopackage-format.js
39
+ var GeoPackageFormat = {
40
+ id: "geopackage",
41
+ name: "GeoPackage",
42
+ module: "geopackage",
43
+ extensions: ["gpkg"],
44
+ mimeTypes: ["application/geopackage+sqlite3"],
45
+ category: "geometry"
46
+ };
47
+
37
48
  // dist/lib/parse-geopackage.js
38
49
  var import_loader_utils = require("@loaders.gl/loader-utils");
39
- var import_wkt = require("@loaders.gl/wkt");
40
50
  var import_gis = require("@loaders.gl/gis");
41
51
  var import_proj4 = require("@math.gl/proj4");
42
52
  var import_sql = __toESM(require("sql.js"), 1);
@@ -227,15 +237,14 @@ function getFeatureIdName(db, tableName) {
227
237
  return null;
228
238
  }
229
239
  function parseGeometry(arrayBuffer) {
230
- var _a, _b;
231
240
  const view = new DataView(arrayBuffer);
232
241
  const { envelopeLength, emptyGeometry } = parseGeometryBitFlags(view.getUint8(3));
233
242
  if (emptyGeometry) {
234
243
  return null;
235
244
  }
236
245
  const wkbOffset = 8 + envelopeLength;
237
- const binaryGeometry = (_b = (_a = import_wkt.WKBLoader).parseSync) == null ? void 0 : _b.call(_a, arrayBuffer.slice(wkbOffset));
238
- return (0, import_gis.binaryToGeometry)(binaryGeometry);
246
+ const wkbBytes = arrayBuffer.slice(wkbOffset);
247
+ return (0, import_gis.convertWKBToGeometry)(wkbBytes);
239
248
  }
240
249
  function parseGeometryBitFlags(byte) {
241
250
  const envelopeValue = (byte & 14) / 2;
@@ -289,15 +298,10 @@ function getSchema(db, tableName) {
289
298
  // dist/geopackage-loader.js
290
299
  var VERSION = "latest";
291
300
  var GeoPackageLoader = {
301
+ ...GeoPackageFormat,
292
302
  dataType: null,
293
303
  batchType: null,
294
- id: "geopackage",
295
- name: "GeoPackage",
296
- module: "geopackage",
297
304
  version: VERSION,
298
- extensions: ["gpkg"],
299
- mimeTypes: ["application/geopackage+sqlite3"],
300
- category: "geometry",
301
305
  parse: parseGeoPackage,
302
306
  options: {
303
307
  geopackage: {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["index.js", "lib/parse-geopackage.js", "geopackage-loader.js"],
4
- "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"],
5
- "mappings": "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",
3
+ "sources": ["index.js", "geopackage-format.js", "lib/parse-geopackage.js", "geopackage-loader.js"],
4
+ "sourcesContent": ["// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nexport { GeoPackageFormat } from \"./geopackage-format.js\";\nexport { GeoPackageLoader } from \"./geopackage-loader.js\";\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nexport const GeoPackageFormat = {\n id: 'geopackage',\n name: 'GeoPackage',\n module: 'geopackage',\n extensions: ['gpkg'],\n mimeTypes: ['application/geopackage+sqlite3'],\n category: 'geometry'\n};\n", "/* eslint-disable camelcase, @typescript-eslint/no-use-before-define */\nimport { isBrowser } from '@loaders.gl/loader-utils';\nimport { convertWKBToGeometry, 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 const wkbBytes = arrayBuffer.slice(wkbOffset);\n return convertWKBToGeometry(wkbBytes);\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\";\nimport { GeoPackageFormat } from \"./geopackage-format.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 ...GeoPackageFormat,\n dataType: null,\n batchType: null,\n version: VERSION,\n parse: parseGeoPackage,\n options: {\n geopackage: {\n sqlJsCDN: DEFAULT_SQLJS_CDN,\n shape: 'tables'\n },\n gis: {}\n }\n};\n"],
5
+ "mappings": "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",
6
6
  "names": ["_a", "tableName", "initSqlJs"]
7
7
  }
package/dist/index.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ export { GeoPackageFormat } from "./geopackage-format.js";
1
2
  export type { GeoPackageLoaderOptions } from "./geopackage-loader.js";
2
3
  export { GeoPackageLoader } from "./geopackage-loader.js";
3
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,YAAY,EAAC,uBAAuB,EAAC,+BAA4B;AACjE,OAAO,EAAC,gBAAgB,EAAC,+BAA4B"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAC,gBAAgB,EAAC,+BAA4B;AACrD,YAAY,EAAC,uBAAuB,EAAC,+BAA4B;AACjE,OAAO,EAAC,gBAAgB,EAAC,+BAA4B"}
package/dist/index.js CHANGED
@@ -1,4 +1,5 @@
1
1
  // loaders.gl
2
2
  // SPDX-License-Identifier: MIT
3
3
  // Copyright (c) vis.gl contributors
4
+ export { GeoPackageFormat } from "./geopackage-format.js";
4
5
  export { GeoPackageLoader } from "./geopackage-loader.js";
@@ -1,4 +1,4 @@
1
- import { Tables, GeoJSONTable } from '@loaders.gl/schema';
1
+ import type { Tables, GeoJSONTable } from '@loaders.gl/schema';
2
2
  import type { GeoPackageLoaderOptions } from "../geopackage-loader.js";
3
3
  /**
4
4
  * We pin to the same version as sql.js that we use.
@@ -1 +1 @@
1
- {"version":3,"file":"parse-geopackage.d.ts","sourceRoot":"","sources":["../../src/lib/parse-geopackage.ts"],"names":[],"mappings":"AAGA,OAAO,EAAoC,MAAM,EAAE,YAAY,EAAU,MAAM,oBAAoB,CAAC;AAKpG,OAAO,KAAK,EAAC,uBAAuB,EAAC,gCAA6B;AAgBlE;;;GAGG;AACH,eAAO,MAAM,iBAAiB,eAEtB,CAAC;AAwCT,wBAAsB,eAAe,CACnC,WAAW,EAAE,WAAW,EACxB,OAAO,CAAC,EAAE,uBAAuB,GAChC,OAAO,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC,CA0C9C"}
1
+ {"version":3,"file":"parse-geopackage.d.ts","sourceRoot":"","sources":["../../src/lib/parse-geopackage.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAKV,MAAM,EACN,YAAY,EAEb,MAAM,oBAAoB,CAAC;AAK5B,OAAO,KAAK,EAAC,uBAAuB,EAAC,gCAA6B;AAgBlE;;;GAGG;AACH,eAAO,MAAM,iBAAiB,eAEtB,CAAC;AAwCT,wBAAsB,eAAe,CACnC,WAAW,EAAE,WAAW,EACxB,OAAO,CAAC,EAAE,uBAAuB,GAChC,OAAO,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC,CA0C9C"}
@@ -1,7 +1,6 @@
1
1
  /* eslint-disable camelcase, @typescript-eslint/no-use-before-define */
2
2
  import { isBrowser } from '@loaders.gl/loader-utils';
3
- import { WKBLoader } from '@loaders.gl/wkt';
4
- import { binaryToGeometry, transformGeoJsonCoords } from '@loaders.gl/gis';
3
+ import { convertWKBToGeometry, transformGeoJsonCoords } from '@loaders.gl/gis';
5
4
  import { Proj4Projection } from '@math.gl/proj4';
6
5
  import initSqlJs from 'sql.js';
7
6
  const SQL_JS_VERSION = '1.8.0';
@@ -311,11 +310,8 @@ function parseGeometry(arrayBuffer) {
311
310
  // const srid = view.getInt32(4, littleEndian);
312
311
  // 2 byte magic, 1 byte version, 1 byte flags, 4 byte int32 srid
313
312
  const wkbOffset = 8 + envelopeLength;
314
- // Loaders should not depend on `core` and the context passed to the main loader doesn't include a
315
- // `parseSync` option, so instead we call parseSync directly on WKBLoader
316
- const binaryGeometry = WKBLoader.parseSync?.(arrayBuffer.slice(wkbOffset));
317
- // @ts-expect-error
318
- return binaryToGeometry(binaryGeometry);
313
+ const wkbBytes = arrayBuffer.slice(wkbOffset);
314
+ return convertWKBToGeometry(wkbBytes);
319
315
  }
320
316
  /**
321
317
  * Parse geometry header flags
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.3.1",
4
+ "version": "4.4.0-alpha.1",
5
5
  "license": "MIT",
6
6
  "type": "module",
7
7
  "publishConfig": {
@@ -43,10 +43,10 @@
43
43
  "build-worker": "# esbuild src/workers/geopackage-worker.ts --bundle --outfile=dist/geopackage-worker.js --external:{util,fs,path} --define:__VERSION__=\\\"$npm_package_version\\\""
44
44
  },
45
45
  "dependencies": {
46
- "@loaders.gl/gis": "4.3.1",
47
- "@loaders.gl/loader-utils": "4.3.1",
48
- "@loaders.gl/schema": "4.3.1",
49
- "@loaders.gl/wkt": "4.3.1",
46
+ "@loaders.gl/gis": "4.4.0-alpha.1",
47
+ "@loaders.gl/loader-utils": "4.4.0-alpha.1",
48
+ "@loaders.gl/schema": "4.4.0-alpha.1",
49
+ "@loaders.gl/wkt": "4.4.0-alpha.1",
50
50
  "@math.gl/proj4": "^4.1.0",
51
51
  "@types/sql.js": "^1.4.5",
52
52
  "fs": "^0.0.1-security",
@@ -54,7 +54,7 @@
54
54
  "sql.js": "1.8.0"
55
55
  },
56
56
  "peerDependencies": {
57
- "@loaders.gl/core": "^4.3.0"
57
+ "@loaders.gl/core": "4.4.0-alpha.0"
58
58
  },
59
- "gitHead": "70a883ab6bc84647c49963215dd6ff62d4d61de3"
59
+ "gitHead": "f1732de45907bd500bf4eedb4803beca8bf4bfb0"
60
60
  }
@@ -0,0 +1,14 @@
1
+ // loaders.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+
5
+ import type {Format} from '@loaders.gl/loader-utils';
6
+
7
+ export const GeoPackageFormat = {
8
+ id: 'geopackage',
9
+ name: 'GeoPackage',
10
+ module: 'geopackage',
11
+ extensions: ['gpkg'],
12
+ mimeTypes: ['application/geopackage+sqlite3'],
13
+ category: 'geometry'
14
+ } as const satisfies Format;
@@ -5,6 +5,7 @@
5
5
  import type {LoaderWithParser, LoaderOptions} from '@loaders.gl/loader-utils';
6
6
  import {Tables, GeoJSONTable} from '@loaders.gl/schema';
7
7
  import {parseGeoPackage, DEFAULT_SQLJS_CDN} from './lib/parse-geopackage';
8
+ import {GeoPackageFormat} from './geopackage-format';
8
9
 
9
10
  // __VERSION__ is injected by babel-plugin-version-inline
10
11
  // @ts-ignore TS2304: Cannot find name '__VERSION__'.
@@ -30,16 +31,12 @@ export type GeoPackageLoaderOptions = LoaderOptions & {
30
31
  };
31
32
 
32
33
  export const GeoPackageLoader = {
34
+ ...GeoPackageFormat,
35
+
33
36
  dataType: null as unknown as GeoJSONTable | Tables<GeoJSONTable>,
34
37
  batchType: null as never,
35
38
 
36
- id: 'geopackage',
37
- name: 'GeoPackage',
38
- module: 'geopackage',
39
39
  version: VERSION,
40
- extensions: ['gpkg'],
41
- mimeTypes: ['application/geopackage+sqlite3'],
42
- category: 'geometry',
43
40
  parse: parseGeoPackage,
44
41
  options: {
45
42
  geopackage: {
package/src/index.ts CHANGED
@@ -2,5 +2,6 @@
2
2
  // SPDX-License-Identifier: MIT
3
3
  // Copyright (c) vis.gl contributors
4
4
 
5
+ export {GeoPackageFormat} from './geopackage-format';
5
6
  export type {GeoPackageLoaderOptions} from './geopackage-loader';
6
7
  export {GeoPackageLoader} from './geopackage-loader';
@@ -1,8 +1,15 @@
1
1
  /* eslint-disable camelcase, @typescript-eslint/no-use-before-define */
2
2
  import {isBrowser} from '@loaders.gl/loader-utils';
3
- import {WKBLoader} from '@loaders.gl/wkt';
4
- import {Schema, Field, Geometry, DataType, Tables, GeoJSONTable, Feature} from '@loaders.gl/schema';
5
- import {binaryToGeometry, transformGeoJsonCoords} from '@loaders.gl/gis';
3
+ import type {
4
+ Schema,
5
+ Field,
6
+ Geometry,
7
+ DataType,
8
+ Tables,
9
+ GeoJSONTable,
10
+ Feature
11
+ } from '@loaders.gl/schema';
12
+ import {convertWKBToGeometry, transformGeoJsonCoords} from '@loaders.gl/gis';
6
13
  import {Proj4Projection} from '@math.gl/proj4';
7
14
  import initSqlJs, {SqlJsStatic, Database, Statement} from 'sql.js';
8
15
 
@@ -391,12 +398,8 @@ function parseGeometry(arrayBuffer: ArrayBuffer): Geometry | null {
391
398
  // 2 byte magic, 1 byte version, 1 byte flags, 4 byte int32 srid
392
399
  const wkbOffset = 8 + envelopeLength;
393
400
 
394
- // Loaders should not depend on `core` and the context passed to the main loader doesn't include a
395
- // `parseSync` option, so instead we call parseSync directly on WKBLoader
396
- const binaryGeometry = WKBLoader.parseSync?.(arrayBuffer.slice(wkbOffset));
397
-
398
- // @ts-expect-error
399
- return binaryToGeometry(binaryGeometry);
401
+ const wkbBytes = arrayBuffer.slice(wkbOffset);
402
+ return convertWKBToGeometry(wkbBytes);
400
403
  }
401
404
 
402
405
  /**