@sqlrooms/deck 0.29.0-rc.11 → 0.29.0-rc.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +193 -35
- package/dist/BlockMapSettings.d.ts.map +1 -1
- package/dist/BlockMapSettings.js +4 -16
- package/dist/BlockMapSettings.js.map +1 -1
- package/dist/DashboardMapSettings.d.ts.map +1 -1
- package/dist/DashboardMapSettings.js +7 -10
- package/dist/DashboardMapSettings.js.map +1 -1
- package/dist/DeckJsonMap.d.ts.map +1 -1
- package/dist/DeckJsonMap.js +75 -23
- package/dist/DeckJsonMap.js.map +1 -1
- package/dist/DeckJsonMapSpec.d.ts +41 -0
- package/dist/DeckJsonMapSpec.d.ts.map +1 -1
- package/dist/DeckJsonMapSpec.js +2 -0
- package/dist/DeckJsonMapSpec.js.map +1 -1
- package/dist/DeckMapBasemapSelect.d.ts +9 -0
- package/dist/DeckMapBasemapSelect.d.ts.map +1 -0
- package/dist/DeckMapBasemapSelect.js +20 -0
- package/dist/DeckMapBasemapSelect.js.map +1 -0
- package/dist/DeckMapDefaultStylesProvider.d.ts +13 -19
- package/dist/DeckMapDefaultStylesProvider.d.ts.map +1 -1
- package/dist/DeckMapDefaultStylesProvider.js +11 -18
- package/dist/DeckMapDefaultStylesProvider.js.map +1 -1
- package/dist/DeckMapSurface.d.ts +1 -1
- package/dist/DeckMapSurface.js +1 -1
- package/dist/DeckMapSurface.js.map +1 -1
- package/dist/DeckMapsSlice.d.ts +5 -0
- package/dist/DeckMapsSlice.d.ts.map +1 -1
- package/dist/DeckMapsSlice.js +6 -3
- package/dist/DeckMapsSlice.js.map +1 -1
- package/dist/MapSettings.d.ts +14 -0
- package/dist/MapSettings.d.ts.map +1 -1
- package/dist/MapSettings.js +548 -192
- package/dist/MapSettings.js.map +1 -1
- package/dist/MapSettingsControls.d.ts +8 -1
- package/dist/MapSettingsControls.d.ts.map +1 -1
- package/dist/MapSettingsControls.js +24 -2
- package/dist/MapSettingsControls.js.map +1 -1
- package/dist/ai.d.ts.map +1 -1
- package/dist/ai.js +20 -12
- package/dist/ai.js.map +1 -1
- package/dist/aiNormalize.d.ts.map +1 -1
- package/dist/aiNormalize.js +2 -1
- package/dist/aiNormalize.js.map +1 -1
- package/dist/basemap.d.ts +23 -0
- package/dist/basemap.d.ts.map +1 -0
- package/dist/basemap.js +23 -0
- package/dist/basemap.js.map +1 -0
- package/dist/block.d.ts +1 -1
- package/dist/block.d.ts.map +1 -1
- package/dist/block.js +13 -9
- package/dist/block.js.map +1 -1
- package/dist/createOrUpdateDeckMapResource.d.ts +6 -2
- package/dist/createOrUpdateDeckMapResource.d.ts.map +1 -1
- package/dist/createOrUpdateDeckMapResource.js +57 -4
- package/dist/createOrUpdateDeckMapResource.js.map +1 -1
- package/dist/datasets/PreparedDatasetStore.d.ts +3 -4
- package/dist/datasets/PreparedDatasetStore.d.ts.map +1 -1
- package/dist/datasets/PreparedDatasetStore.js +4 -8
- package/dist/datasets/PreparedDatasetStore.js.map +1 -1
- package/dist/datasets/helpers.d.ts +39 -2
- package/dist/datasets/helpers.d.ts.map +1 -1
- package/dist/datasets/helpers.js +86 -3
- package/dist/datasets/helpers.js.map +1 -1
- package/dist/datasets/usePreparedDatasetStates.d.ts.map +1 -1
- package/dist/datasets/usePreparedDatasetStates.js +12 -8
- package/dist/datasets/usePreparedDatasetStates.js.map +1 -1
- package/dist/index.d.ts +6 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -2
- package/dist/index.js.map +1 -1
- package/dist/json/colorScaleFunction.d.ts +12 -4
- package/dist/json/colorScaleFunction.d.ts.map +1 -1
- package/dist/json/colorScaleFunction.js.map +1 -1
- package/dist/json/compileColorScale.d.ts +3 -2
- package/dist/json/compileColorScale.d.ts.map +1 -1
- package/dist/json/compileColorScale.js +16 -1
- package/dist/json/compileColorScale.js.map +1 -1
- package/dist/json/createDeckJsonConfiguration.d.ts.map +1 -1
- package/dist/json/createDeckJsonConfiguration.js +235 -175
- package/dist/json/createDeckJsonConfiguration.js.map +1 -1
- package/dist/json/defaultClasses.d.ts.map +1 -1
- package/dist/json/defaultClasses.js +3 -3
- package/dist/json/defaultClasses.js.map +1 -1
- package/dist/json/extractColorScaleLegends.d.ts.map +1 -1
- package/dist/json/extractColorScaleLegends.js +41 -26
- package/dist/json/extractColorScaleLegends.js.map +1 -1
- package/dist/json/heatmapDefaults.d.ts +17 -7
- package/dist/json/heatmapDefaults.d.ts.map +1 -1
- package/dist/json/heatmapDefaults.js +54 -12
- package/dist/json/heatmapDefaults.js.map +1 -1
- package/dist/json/layers/DeckHeatmapLayer.d.ts +32 -0
- package/dist/json/layers/DeckHeatmapLayer.d.ts.map +1 -0
- package/dist/json/layers/DeckHeatmapLayer.js +69 -0
- package/dist/json/layers/DeckHeatmapLayer.js.map +1 -0
- package/dist/json/layers/index.d.ts +1 -0
- package/dist/json/layers/index.d.ts.map +1 -1
- package/dist/json/layers/index.js +1 -0
- package/dist/json/layers/index.js.map +1 -1
- package/dist/json/rewriteGeoArrowAccessors.d.ts.map +1 -1
- package/dist/json/rewriteGeoArrowAccessors.js +13 -5
- package/dist/json/rewriteGeoArrowAccessors.js.map +1 -1
- package/dist/json/scaleFunction.d.ts +5 -8
- package/dist/json/scaleFunction.d.ts.map +1 -1
- package/dist/json/scaleFunction.js +30 -5
- package/dist/json/scaleFunction.js.map +1 -1
- package/dist/mapAiConfig.d.ts +6 -0
- package/dist/mapAiConfig.d.ts.map +1 -1
- package/dist/mapAiConfig.js +7 -0
- package/dist/mapAiConfig.js.map +1 -1
- package/dist/mapAiSharedInstructions.d.ts +1 -1
- package/dist/mapAiSharedInstructions.d.ts.map +1 -1
- package/dist/mapAiSharedInstructions.js +4 -3
- package/dist/mapAiSharedInstructions.js.map +1 -1
- package/dist/mapConfig.d.ts +6 -1
- package/dist/mapConfig.d.ts.map +1 -1
- package/dist/mapConfig.js +28 -3
- package/dist/mapConfig.js.map +1 -1
- package/dist/mapConfigUtils.d.ts +22 -0
- package/dist/mapConfigUtils.d.ts.map +1 -1
- package/dist/mapConfigUtils.js +152 -5
- package/dist/mapConfigUtils.js.map +1 -1
- package/dist/mapLayerConfigUtils.d.ts +55 -0
- package/dist/mapLayerConfigUtils.d.ts.map +1 -1
- package/dist/mapLayerConfigUtils.js +222 -11
- package/dist/mapLayerConfigUtils.js.map +1 -1
- package/dist/mapResourceAuthoring.d.ts +1 -1
- package/dist/mapResourceAuthoring.d.ts.map +1 -1
- package/dist/mapResourceAuthoring.js +14 -7
- package/dist/mapResourceAuthoring.js.map +1 -1
- package/dist/mapStyles.d.ts +16 -0
- package/dist/mapStyles.d.ts.map +1 -0
- package/dist/mapStyles.js +32 -0
- package/dist/mapStyles.js.map +1 -0
- package/dist/prepare/prepareDeckDataset.d.ts.map +1 -1
- package/dist/prepare/prepareDeckDataset.js +1 -0
- package/dist/prepare/prepareDeckDataset.js.map +1 -1
- package/dist/prepare/types.d.ts +3 -0
- package/dist/prepare/types.d.ts.map +1 -1
- package/dist/prepare/types.js.map +1 -1
- package/dist/prepare/wkbDecoder.d.ts.map +1 -1
- package/dist/prepare/wkbDecoder.js +62 -16
- package/dist/prepare/wkbDecoder.js.map +1 -1
- package/dist/prepare/wkbParser.d.ts +2 -0
- package/dist/prepare/wkbParser.d.ts.map +1 -1
- package/dist/prepare/wkbParser.js +1 -0
- package/dist/prepare/wkbParser.js.map +1 -1
- package/dist/protomapsStyles.d.ts +18 -0
- package/dist/protomapsStyles.d.ts.map +1 -0
- package/dist/protomapsStyles.js +38 -0
- package/dist/protomapsStyles.js.map +1 -0
- package/dist/types.d.ts +13 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +11 -9
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mapStyles.js","sourceRoot":"","sources":["../src/mapStyles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,QAAQ,EAAqB,MAAM,cAAc,CAAC;AAE1D,mFAAmF;AACnF,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,EAAC,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAC;IAC7C,EAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAC;CAClC,CAAC;AAEX,0EAA0E;AAC1E,MAAM,UAAU,oBAAoB,CAClC,KAAc;IAEd,yEAAyE;IACzE,IAAI,KAAK,KAAK,iBAAiB;QAAE,OAAO,OAAO,CAAC;IAChD,IAAI,KAAK,KAAK,gBAAgB;QAAE,OAAO,MAAM,CAAC;IAC9C,OAAO,uBAAuB,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,KAAK,CAAC;QACxE,EAAE,KAAK,CAAC;AACZ,CAAC;AAED,SAAS,eAAe;IACtB,wEAAwE;IACxE,0DAA0D;IAC1D,IAAI,OAAO,QAAQ,KAAK,WAAW,EAAE,CAAC;QACpC,IAAI,QAAQ,CAAC,eAAe,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE,OAAO,MAAM,CAAC;QACvE,IAAI,QAAQ,CAAC,eAAe,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE,OAAO,OAAO,CAAC;IAC3E,CAAC;IACD,OAAO,QAAQ,EAAE,CAAC;AACpB,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,sBAAsB,CACpC,QAAuB,eAAe,EAAE;IAExC,OAAO,KAAK,CAAC;AACf,CAAC","sourcesContent":["import {getTheme, type ResolvedTheme} from '@sqlrooms/ui';\n\n/** Built-in basemaps offered in map settings. IDs are persisted in map configs. */\nexport const DECK_MAP_BASEMAP_STYLES = [\n {id: 'light', label: 'Light', theme: 'light'},\n {id: 'dark', label: 'Dark', theme: 'dark'},\n] as const;\n\n/** Returns the theme variant for a built-in basemap ID, if recognized. */\nexport function getDeckMapStyleTheme(\n style: unknown,\n): ResolvedTheme | undefined {\n // Preserve selections saved by early versions of the Protomaps defaults.\n if (style === 'protomaps-light') return 'light';\n if (style === 'protomaps-dark') return 'dark';\n return DECK_MAP_BASEMAP_STYLES.find((candidate) => candidate.id === style)\n ?.theme;\n}\n\nfunction getCurrentTheme(): ResolvedTheme {\n // ThemeProvider applies the resolved theme here, including hosts with a\n // custom storage key and default theme (such as the CLI).\n if (typeof document !== 'undefined') {\n if (document.documentElement.classList.contains('dark')) return 'dark';\n if (document.documentElement.classList.contains('light')) return 'light';\n }\n return getTheme();\n}\n\n/** Snapshots the current app theme as a portable basemap ID at map creation. */\nexport function getDefaultDeckMapStyle(\n theme: ResolvedTheme = getCurrentTheme(),\n): string {\n return theme;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prepareDeckDataset.d.ts","sourceRoot":"","sources":["../../src/prepare/prepareDeckDataset.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAC;AAM3C,OAAO,KAAK,EACV,oBAAoB,EACpB,mBAAmB,EAGpB,MAAM,SAAS,CAAC;AAGjB,KAAK,yBAAyB,GAAG;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;CAC7C,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,yBAAyB,GACjC,mBAAmB,
|
|
1
|
+
{"version":3,"file":"prepareDeckDataset.d.ts","sourceRoot":"","sources":["../../src/prepare/prepareDeckDataset.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAC;AAM3C,OAAO,KAAK,EACV,oBAAoB,EACpB,mBAAmB,EAGpB,MAAM,SAAS,CAAC;AAGjB,KAAK,yBAAyB,GAAG;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;CAC7C,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,yBAAyB,GACjC,mBAAmB,CA6ErB"}
|
|
@@ -70,6 +70,7 @@ export function prepareDeckDataset(options) {
|
|
|
70
70
|
datasetId,
|
|
71
71
|
table,
|
|
72
72
|
datasetGeometryColumn: geometryColumn,
|
|
73
|
+
datasetGeometryEncodingHint: geometryEncodingHint,
|
|
73
74
|
resolveGeometry,
|
|
74
75
|
getGeoArrowLayerData(geometryColumnOverride) {
|
|
75
76
|
const cacheKey = geometryColumnOverride ?? '__default__';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prepareDeckDataset.js","sourceRoot":"","sources":["../../src/prepare/prepareDeckDataset.ts"],"names":[],"mappings":"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","sourcesContent":["import type * as arrow from 'apache-arrow';\nimport {detectGeometryColumn} from './detectGeometryColumn';\nimport {\n buildNativeGeoArrowBinaryData,\n isDirectGeoArrowEncoding,\n} from './geoarrow';\nimport type {\n GeometryEncodingHint,\n PreparedDeckDataset,\n PreparedGeoArrowLayerData,\n ResolvedGeometryColumn,\n} from './types';\nimport {wkbGeometryDecoder} from './wkbDecoder';\n\ntype PrepareDeckDatasetOptions = {\n datasetId: string;\n table: arrow.Table;\n geometryColumn?: string;\n geometryEncodingHint?: GeometryEncodingHint;\n};\n\n/**\n * Build the reusable deck-facing geometry helpers for one resolved Arrow table.\n *\n * This is the expensive preparation step that `preparedDatasetStore` caches.\n * It accepts one resolved Arrow table plus a geometry column/hint and turns\n * the source geometry into canonical deck-facing outputs that can be reused by\n * multiple layers and multiple `DeckJsonMap` instances.\n *\n * Supported input geometry forms:\n *\n * - native GeoArrow columns\n * Already columnar and geometry-aware. These are the cheapest inputs:\n * preparation mainly does geometry-column detection plus lightweight wrapper\n * shaping so GeoArrow-capable deck layers can consume the Arrow table/vector\n * directly.\n * - WKB / GeoArrow WKB columns\n * Binary geometry needs decoding because deck layers cannot render raw WKB\n * bytes. Preparation promotes the binary values into deck-ready geometry\n * structures for GeoArrow layers and GeoJSON-binary fallback layers.\n * - WKT / GeoArrow WKT columns\n * Text geometry likewise needs parsing before deck can render it. This has a\n * similar cost profile to WKB, but starts from text parsing rather than\n * binary decoding.\n *\n * These transformations are necessary because the input table shape is chosen\n * by the query/data source, while deck expects render-oriented geometry\n * payloads. The canonical outputs produced here are:\n *\n * - GeoArrow layer data\n * A `PreparedGeoArrowLayerData` payload for GeoArrow-native deck layers,\n * either forwarded directly from native GeoArrow inputs or promoted from\n * WKB/WKT into a GeoArrow-like representation.\n * - GeoJSON-binary data\n * A binary GeoJSON-style payload for layers such as `GeoJsonLayer` that do\n * not consume GeoArrow inputs directly.\n *\n * The returned object also memoizes:\n *\n * - geometry column detection\n * - GeoArrow layer payloads\n * - GeoJSON-binary fallbacks\n *\n * Caching at this level lets deck reuse geometry decoding and shaping work\n * even when the upstream query result is already cached by another system such\n * as Mosaic's query manager.\n */\nexport function prepareDeckDataset(\n options: PrepareDeckDatasetOptions,\n): PreparedDeckDataset {\n const {datasetId, table, geometryColumn, geometryEncodingHint} = options;\n const resolvedGeometryCache = new Map<string, ResolvedGeometryColumn>();\n const geoArrowCache = new Map<string, PreparedGeoArrowLayerData>();\n const geoJsonBinaryCache = new Map<string, unknown>();\n\n const resolveGeometry = (geometryColumnOverride?: string) => {\n const cacheKey = geometryColumnOverride ?? '__default__';\n const cached = resolvedGeometryCache.get(cacheKey);\n if (cached) {\n return cached;\n }\n\n const resolved = detectGeometryColumn({\n table,\n geometryColumn: geometryColumnOverride ?? geometryColumn,\n geometryEncodingHint,\n });\n resolvedGeometryCache.set(cacheKey, resolved);\n return resolved;\n };\n\n return {\n datasetId,\n table,\n datasetGeometryColumn: geometryColumn,\n resolveGeometry,\n getGeoArrowLayerData(geometryColumnOverride?: string) {\n const cacheKey = geometryColumnOverride ?? '__default__';\n const cached = geoArrowCache.get(cacheKey);\n if (cached) {\n return cached;\n }\n\n const resolved = resolveGeometry(geometryColumnOverride);\n let prepared: PreparedGeoArrowLayerData;\n\n if (isDirectGeoArrowEncoding(resolved.encoding)) {\n prepared = {\n table,\n geometryColumnName: resolved.columnName,\n geometryColumn: resolved.vector,\n encoding: resolved.encoding,\n source: 'native',\n };\n } else {\n prepared = wkbGeometryDecoder.toGeoArrowLike(\n table,\n resolved.columnName,\n resolved.encoding,\n );\n }\n\n geoArrowCache.set(cacheKey, prepared);\n return prepared;\n },\n getGeoJsonBinaryData(geometryColumnOverride?: string) {\n const cacheKey = geometryColumnOverride ?? '__default__';\n const cached = geoJsonBinaryCache.get(cacheKey);\n if (cached) {\n return cached;\n }\n\n const resolved = resolveGeometry(geometryColumnOverride);\n const binaryData = resolved.nativeGeoArrow\n ? buildNativeGeoArrowBinaryData(table, resolved)\n : wkbGeometryDecoder.toGeoJsonBinary(\n table,\n resolved.columnName,\n resolved.encoding,\n );\n\n geoJsonBinaryCache.set(cacheKey, binaryData);\n return binaryData;\n },\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"prepareDeckDataset.js","sourceRoot":"","sources":["../../src/prepare/prepareDeckDataset.ts"],"names":[],"mappings":"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","sourcesContent":["import type * as arrow from 'apache-arrow';\nimport {detectGeometryColumn} from './detectGeometryColumn';\nimport {\n buildNativeGeoArrowBinaryData,\n isDirectGeoArrowEncoding,\n} from './geoarrow';\nimport type {\n GeometryEncodingHint,\n PreparedDeckDataset,\n PreparedGeoArrowLayerData,\n ResolvedGeometryColumn,\n} from './types';\nimport {wkbGeometryDecoder} from './wkbDecoder';\n\ntype PrepareDeckDatasetOptions = {\n datasetId: string;\n table: arrow.Table;\n geometryColumn?: string;\n geometryEncodingHint?: GeometryEncodingHint;\n};\n\n/**\n * Build the reusable deck-facing geometry helpers for one resolved Arrow table.\n *\n * This is the expensive preparation step that `preparedDatasetStore` caches.\n * It accepts one resolved Arrow table plus a geometry column/hint and turns\n * the source geometry into canonical deck-facing outputs that can be reused by\n * multiple layers and multiple `DeckJsonMap` instances.\n *\n * Supported input geometry forms:\n *\n * - native GeoArrow columns\n * Already columnar and geometry-aware. These are the cheapest inputs:\n * preparation mainly does geometry-column detection plus lightweight wrapper\n * shaping so GeoArrow-capable deck layers can consume the Arrow table/vector\n * directly.\n * - WKB / GeoArrow WKB columns\n * Binary geometry needs decoding because deck layers cannot render raw WKB\n * bytes. Preparation promotes the binary values into deck-ready geometry\n * structures for GeoArrow layers and GeoJSON-binary fallback layers.\n * - WKT / GeoArrow WKT columns\n * Text geometry likewise needs parsing before deck can render it. This has a\n * similar cost profile to WKB, but starts from text parsing rather than\n * binary decoding.\n *\n * These transformations are necessary because the input table shape is chosen\n * by the query/data source, while deck expects render-oriented geometry\n * payloads. The canonical outputs produced here are:\n *\n * - GeoArrow layer data\n * A `PreparedGeoArrowLayerData` payload for GeoArrow-native deck layers,\n * either forwarded directly from native GeoArrow inputs or promoted from\n * WKB/WKT into a GeoArrow-like representation.\n * - GeoJSON-binary data\n * A binary GeoJSON-style payload for layers such as `GeoJsonLayer` that do\n * not consume GeoArrow inputs directly.\n *\n * The returned object also memoizes:\n *\n * - geometry column detection\n * - GeoArrow layer payloads\n * - GeoJSON-binary fallbacks\n *\n * Caching at this level lets deck reuse geometry decoding and shaping work\n * even when the upstream query result is already cached by another system such\n * as Mosaic's query manager.\n */\nexport function prepareDeckDataset(\n options: PrepareDeckDatasetOptions,\n): PreparedDeckDataset {\n const {datasetId, table, geometryColumn, geometryEncodingHint} = options;\n const resolvedGeometryCache = new Map<string, ResolvedGeometryColumn>();\n const geoArrowCache = new Map<string, PreparedGeoArrowLayerData>();\n const geoJsonBinaryCache = new Map<string, unknown>();\n\n const resolveGeometry = (geometryColumnOverride?: string) => {\n const cacheKey = geometryColumnOverride ?? '__default__';\n const cached = resolvedGeometryCache.get(cacheKey);\n if (cached) {\n return cached;\n }\n\n const resolved = detectGeometryColumn({\n table,\n geometryColumn: geometryColumnOverride ?? geometryColumn,\n geometryEncodingHint,\n });\n resolvedGeometryCache.set(cacheKey, resolved);\n return resolved;\n };\n\n return {\n datasetId,\n table,\n datasetGeometryColumn: geometryColumn,\n datasetGeometryEncodingHint: geometryEncodingHint,\n resolveGeometry,\n getGeoArrowLayerData(geometryColumnOverride?: string) {\n const cacheKey = geometryColumnOverride ?? '__default__';\n const cached = geoArrowCache.get(cacheKey);\n if (cached) {\n return cached;\n }\n\n const resolved = resolveGeometry(geometryColumnOverride);\n let prepared: PreparedGeoArrowLayerData;\n\n if (isDirectGeoArrowEncoding(resolved.encoding)) {\n prepared = {\n table,\n geometryColumnName: resolved.columnName,\n geometryColumn: resolved.vector,\n encoding: resolved.encoding,\n source: 'native',\n };\n } else {\n prepared = wkbGeometryDecoder.toGeoArrowLike(\n table,\n resolved.columnName,\n resolved.encoding,\n );\n }\n\n geoArrowCache.set(cacheKey, prepared);\n return prepared;\n },\n getGeoJsonBinaryData(geometryColumnOverride?: string) {\n const cacheKey = geometryColumnOverride ?? '__default__';\n const cached = geoJsonBinaryCache.get(cacheKey);\n if (cached) {\n return cached;\n }\n\n const resolved = resolveGeometry(geometryColumnOverride);\n const binaryData = resolved.nativeGeoArrow\n ? buildNativeGeoArrowBinaryData(table, resolved)\n : wkbGeometryDecoder.toGeoJsonBinary(\n table,\n resolved.columnName,\n resolved.encoding,\n );\n\n geoJsonBinaryCache.set(cacheKey, binaryData);\n return binaryData;\n },\n };\n}\n"]}
|
package/dist/prepare/types.d.ts
CHANGED
|
@@ -17,7 +17,10 @@ export type PreparedGeoArrowLayerData = {
|
|
|
17
17
|
export type PreparedDeckDataset = {
|
|
18
18
|
datasetId: string;
|
|
19
19
|
table: arrow.Table;
|
|
20
|
+
/** Dataset-level geometry column used when preparing this payload. */
|
|
20
21
|
datasetGeometryColumn?: string;
|
|
22
|
+
/** Dataset-level encoding hint used when preparing this payload. */
|
|
23
|
+
datasetGeometryEncodingHint?: GeometryEncodingHint;
|
|
21
24
|
resolveGeometry: (geometryColumn?: string) => ResolvedGeometryColumn;
|
|
22
25
|
getGeoArrowLayerData: (geometryColumn?: string) => PreparedGeoArrowLayerData;
|
|
23
26
|
getGeoJsonBinaryData: (geometryColumn?: string) => unknown;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/prepare/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAC;AAE3C,MAAM,MAAM,oBAAoB,GAAG,UAAU,GAAG,KAAK,GAAG,KAAK,CAAC;AAE9D,MAAM,MAAM,wBAAwB,GAChC,gBAAgB,GAChB,qBAAqB,GACrB,qBAAqB,GACrB,0BAA0B,GAC1B,kBAAkB,GAClB,uBAAuB,GACvB,cAAc,GACd,cAAc,GACd,KAAK,GACL,KAAK,GACL,SAAS,CAAC;AAEd,MAAM,MAAM,sBAAsB,GAAG;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC;IACrB,QAAQ,EAAE,wBAAwB,CAAC;IACnC,cAAc,EAAE,OAAO,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IAKtC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC;IACnB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,cAAc,EAAE,KAAK,CAAC,MAAM,CAAC;IAC7B,QAAQ,EAAE,wBAAwB,CAAC;IACnC,MAAM,EAAE,QAAQ,GAAG,UAAU,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC;IACnB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,eAAe,EAAE,CAAC,cAAc,CAAC,EAAE,MAAM,KAAK,sBAAsB,CAAC;IACrE,oBAAoB,EAAE,CAAC,cAAc,CAAC,EAAE,MAAM,KAAK,yBAAyB,CAAC;IAC7E,oBAAoB,EAAE,CAAC,cAAc,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;CAC5D,CAAC"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/prepare/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAC;AAE3C,MAAM,MAAM,oBAAoB,GAAG,UAAU,GAAG,KAAK,GAAG,KAAK,CAAC;AAE9D,MAAM,MAAM,wBAAwB,GAChC,gBAAgB,GAChB,qBAAqB,GACrB,qBAAqB,GACrB,0BAA0B,GAC1B,kBAAkB,GAClB,uBAAuB,GACvB,cAAc,GACd,cAAc,GACd,KAAK,GACL,KAAK,GACL,SAAS,CAAC;AAEd,MAAM,MAAM,sBAAsB,GAAG;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC;IACrB,QAAQ,EAAE,wBAAwB,CAAC;IACnC,cAAc,EAAE,OAAO,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IAKtC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC;IACnB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,cAAc,EAAE,KAAK,CAAC,MAAM,CAAC;IAC7B,QAAQ,EAAE,wBAAwB,CAAC;IACnC,MAAM,EAAE,QAAQ,GAAG,UAAU,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC;IACnB,sEAAsE;IACtE,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,oEAAoE;IACpE,2BAA2B,CAAC,EAAE,oBAAoB,CAAC;IACnD,eAAe,EAAE,CAAC,cAAc,CAAC,EAAE,MAAM,KAAK,sBAAsB,CAAC;IACrE,oBAAoB,EAAE,CAAC,cAAc,CAAC,EAAE,MAAM,KAAK,yBAAyB,CAAC;IAC7E,oBAAoB,EAAE,CAAC,cAAc,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;CAC5D,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/prepare/types.ts"],"names":[],"mappings":"","sourcesContent":["import type * as arrow from 'apache-arrow';\n\nexport type GeometryEncodingHint = 'geoarrow' | 'wkb' | 'wkt';\n\nexport type ResolvedGeometryEncoding =\n | 'geoarrow.point'\n | 'geoarrow.multipoint'\n | 'geoarrow.linestring'\n | 'geoarrow.multilinestring'\n | 'geoarrow.polygon'\n | 'geoarrow.multipolygon'\n | 'geoarrow.wkb'\n | 'geoarrow.wkt'\n | 'wkb'\n | 'wkt'\n | 'unknown';\n\nexport type ResolvedGeometryColumn = {\n columnName: string;\n vector: arrow.Vector;\n encoding: ResolvedGeometryEncoding;\n nativeGeoArrow: boolean;\n};\n\nexport type PreparedGeoArrowLayerData = {\n // NOTE: This `Table` + `Vector` payload shape was used by the old\n // `@geoarrow/deck.gl-layers@0.3.x`. The current `@geoarrow/deck.gl-geoarrow@0.4.x`\n // prefers RecordBatch inputs, but our custom layer wrappers still consume\n // Table/Vector and chunk internally.\n table: arrow.Table;\n geometryColumnName: string;\n geometryColumn: arrow.Vector;\n encoding: ResolvedGeometryEncoding;\n source: 'native' | 'promoted';\n};\n\nexport type PreparedDeckDataset = {\n datasetId: string;\n table: arrow.Table;\n datasetGeometryColumn?: string;\n resolveGeometry: (geometryColumn?: string) => ResolvedGeometryColumn;\n getGeoArrowLayerData: (geometryColumn?: string) => PreparedGeoArrowLayerData;\n getGeoJsonBinaryData: (geometryColumn?: string) => unknown;\n};\n"]}
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/prepare/types.ts"],"names":[],"mappings":"","sourcesContent":["import type * as arrow from 'apache-arrow';\n\nexport type GeometryEncodingHint = 'geoarrow' | 'wkb' | 'wkt';\n\nexport type ResolvedGeometryEncoding =\n | 'geoarrow.point'\n | 'geoarrow.multipoint'\n | 'geoarrow.linestring'\n | 'geoarrow.multilinestring'\n | 'geoarrow.polygon'\n | 'geoarrow.multipolygon'\n | 'geoarrow.wkb'\n | 'geoarrow.wkt'\n | 'wkb'\n | 'wkt'\n | 'unknown';\n\nexport type ResolvedGeometryColumn = {\n columnName: string;\n vector: arrow.Vector;\n encoding: ResolvedGeometryEncoding;\n nativeGeoArrow: boolean;\n};\n\nexport type PreparedGeoArrowLayerData = {\n // NOTE: This `Table` + `Vector` payload shape was used by the old\n // `@geoarrow/deck.gl-layers@0.3.x`. The current `@geoarrow/deck.gl-geoarrow@0.4.x`\n // prefers RecordBatch inputs, but our custom layer wrappers still consume\n // Table/Vector and chunk internally.\n table: arrow.Table;\n geometryColumnName: string;\n geometryColumn: arrow.Vector;\n encoding: ResolvedGeometryEncoding;\n source: 'native' | 'promoted';\n};\n\nexport type PreparedDeckDataset = {\n datasetId: string;\n table: arrow.Table;\n /** Dataset-level geometry column used when preparing this payload. */\n datasetGeometryColumn?: string;\n /** Dataset-level encoding hint used when preparing this payload. */\n datasetGeometryEncodingHint?: GeometryEncodingHint;\n resolveGeometry: (geometryColumn?: string) => ResolvedGeometryColumn;\n getGeoArrowLayerData: (geometryColumn?: string) => PreparedGeoArrowLayerData;\n getGeoJsonBinaryData: (geometryColumn?: string) => unknown;\n};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wkbDecoder.d.ts","sourceRoot":"","sources":["../../src/prepare/wkbDecoder.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAC;AAU3C,OAAO,KAAK,EAAC,eAAe,EAAC,MAAM,mBAAmB,CAAC;AAEvD,OAAO,KAAK,EACV,yBAAyB,EACzB,wBAAwB,EACzB,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"wkbDecoder.d.ts","sourceRoot":"","sources":["../../src/prepare/wkbDecoder.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAC;AAU3C,OAAO,KAAK,EAAC,eAAe,EAAC,MAAM,mBAAmB,CAAC;AAEvD,OAAO,KAAK,EACV,yBAAyB,EACzB,wBAAwB,EACzB,MAAM,SAAS,CAAC;AAsbjB,gEAAgE;AAChE,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,KAAK,CAAC,KAAK,EAClB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,wBAAwB,GACjC,yBAAyB,GAAG,IAAI,CAElC;AAED,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAE/D;AAsCD;;;GAGG;AACH,wBAAgB,gCAAgC,CAC9C,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,wBAAwB,EAClC,KAAK,EAAE,KAAK,CAAC,KAAK,EAClB,UAAU,EAAE,MAAM,GACjB,MAAM,CA4BR;AA8GD,eAAO,MAAM,kBAAkB,EAAE,eAsFhC,CAAC"}
|
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
import { WKBLoader, WKTLoader } from '@loaders.gl/wkt';
|
|
2
2
|
import { Field, FixedSizeList, Float64, List, makeData, Table, Vector, } from 'apache-arrow';
|
|
3
3
|
import { buildBinaryGeoJsonData } from './toGeoJsonBinary';
|
|
4
|
-
import { parseWKBHeader, readWKBLineStringXY, readWKBMultiLineStringXY, readWKBPointXY, visitWKBPolygonCoordinates, WKB_LINESTRING, WKB_MULTILINESTRING, WKB_MULTIPOLYGON, WKB_POINT, WKB_POLYGON, } from './wkbParser';
|
|
4
|
+
import { parseWKBHeader, readWKBLineStringXY, readWKBMultiLineStringXY, readWKBPointXY, visitWKBMultiPolygonCoordinates, visitWKBPolygonCoordinates, WKB_LINESTRING, WKB_MULTILINESTRING, WKB_MULTIPOLYGON, WKB_POINT, WKB_POLYGON, } from './wkbParser';
|
|
5
5
|
const COORD_FIELD = new Field('xy', new Float64(), false);
|
|
6
6
|
const VERTEX_TYPE = new FixedSizeList(2, COORD_FIELD);
|
|
7
7
|
const VERTEX_FIELD = new Field('', VERTEX_TYPE, true);
|
|
8
8
|
const RING_TYPE = new List(VERTEX_FIELD);
|
|
9
9
|
const RING_FIELD = new Field('', RING_TYPE, true);
|
|
10
10
|
const POLYGON_TYPE = new List(RING_FIELD);
|
|
11
|
+
const POLYGON_FIELD = new Field('', POLYGON_TYPE, true);
|
|
12
|
+
const MULTIPOLYGON_TYPE = new List(POLYGON_FIELD);
|
|
11
13
|
const GEOMETRY_SAMPLE_LIMIT = 100;
|
|
12
14
|
const BITS_PER_VALIDITY_BYTE = 8;
|
|
13
15
|
function toArrayBuffer(value) {
|
|
@@ -139,21 +141,32 @@ function tryPromotePolygonTable(table, columnName, encoding) {
|
|
|
139
141
|
if (!vector)
|
|
140
142
|
return null;
|
|
141
143
|
const n = table.numRows;
|
|
142
|
-
const
|
|
144
|
+
const rowPolygonOffsets = new Int32Array(n + 1);
|
|
145
|
+
const polygonRingStarts = [];
|
|
143
146
|
const ringOffsetsList = [];
|
|
144
147
|
const xyList = [];
|
|
145
148
|
const isNull = new Uint8Array(n);
|
|
146
149
|
let nullCount = 0;
|
|
150
|
+
let sawMultiPolygon = false;
|
|
151
|
+
const startPolygon = () => {
|
|
152
|
+
polygonRingStarts.push(ringOffsetsList.length);
|
|
153
|
+
};
|
|
147
154
|
const polygonVisitor = {
|
|
155
|
+
onPolygonStart: startPolygon,
|
|
148
156
|
onRingStart: () => ringOffsetsList.push(xyList.length / 2),
|
|
149
157
|
onCoordinate: (x, y) => xyList.push(x, y),
|
|
150
158
|
};
|
|
159
|
+
const appendParsedPolygon = (rings) => {
|
|
160
|
+
startPolygon();
|
|
161
|
+
appendPolygonCoordinates(rings, ringOffsetsList, xyList);
|
|
162
|
+
};
|
|
151
163
|
for (let i = 0; i < n; i++) {
|
|
152
|
-
|
|
164
|
+
rowPolygonOffsets[i] = polygonRingStarts.length;
|
|
153
165
|
const raw = vector.get(i);
|
|
154
166
|
if (raw == null) {
|
|
155
167
|
isNull[i] = 1;
|
|
156
168
|
nullCount++;
|
|
169
|
+
startPolygon();
|
|
157
170
|
continue;
|
|
158
171
|
}
|
|
159
172
|
if (isWKTEncoding(encoding, raw)) {
|
|
@@ -161,13 +174,21 @@ function tryPromotePolygonTable(table, columnName, encoding) {
|
|
|
161
174
|
if (!geom) {
|
|
162
175
|
isNull[i] = 1;
|
|
163
176
|
nullCount++;
|
|
177
|
+
startPolygon();
|
|
164
178
|
continue;
|
|
165
179
|
}
|
|
166
180
|
if (geom.type === 'Polygon') {
|
|
167
|
-
|
|
181
|
+
appendParsedPolygon(geom.coordinates);
|
|
182
|
+
}
|
|
183
|
+
else if (geom.type === 'MultiPolygon') {
|
|
184
|
+
sawMultiPolygon = true;
|
|
185
|
+
for (const rings of geom.coordinates) {
|
|
186
|
+
appendParsedPolygon(rings);
|
|
187
|
+
}
|
|
168
188
|
}
|
|
169
|
-
else
|
|
189
|
+
else {
|
|
170
190
|
return null;
|
|
191
|
+
}
|
|
171
192
|
continue;
|
|
172
193
|
}
|
|
173
194
|
const buf = toArrayBuffer(raw);
|
|
@@ -175,25 +196,37 @@ function tryPromotePolygonTable(table, columnName, encoding) {
|
|
|
175
196
|
if (!hdr)
|
|
176
197
|
return null;
|
|
177
198
|
if (hdr.geomType === WKB_POLYGON) {
|
|
199
|
+
startPolygon();
|
|
178
200
|
if (visitWKBPolygonCoordinates(buf, hdr, polygonVisitor) == null) {
|
|
179
201
|
return null;
|
|
180
202
|
}
|
|
181
203
|
}
|
|
182
|
-
else
|
|
204
|
+
else if (hdr.geomType === WKB_MULTIPOLYGON) {
|
|
205
|
+
sawMultiPolygon = true;
|
|
206
|
+
if (!visitWKBMultiPolygonCoordinates(buf, hdr, polygonVisitor)) {
|
|
207
|
+
return null;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
else {
|
|
183
211
|
return null;
|
|
212
|
+
}
|
|
184
213
|
}
|
|
185
|
-
|
|
214
|
+
rowPolygonOffsets[n] = polygonRingStarts.length;
|
|
215
|
+
const nPolygons = polygonRingStarts.length;
|
|
186
216
|
const totalRings = ringOffsetsList.length;
|
|
187
217
|
const totalPoints = xyList.length / 2;
|
|
188
218
|
const ringOffsets = new Int32Array(totalRings + 1);
|
|
189
219
|
for (let j = 0; j < totalRings; j++)
|
|
190
220
|
ringOffsets[j] = ringOffsetsList[j];
|
|
191
221
|
ringOffsets[totalRings] = totalPoints;
|
|
192
|
-
const
|
|
222
|
+
const polygonOffsets = new Int32Array(nPolygons + 1);
|
|
223
|
+
for (let j = 0; j < nPolygons; j++)
|
|
224
|
+
polygonOffsets[j] = polygonRingStarts[j];
|
|
225
|
+
polygonOffsets[nPolygons] = totalRings;
|
|
193
226
|
const floatData = makeData({
|
|
194
227
|
type: new Float64(),
|
|
195
228
|
length: totalPoints * 2,
|
|
196
|
-
data:
|
|
229
|
+
data: new Float64Array(xyList),
|
|
197
230
|
});
|
|
198
231
|
const pointData = makeData({
|
|
199
232
|
type: VERTEX_TYPE,
|
|
@@ -208,13 +241,26 @@ function tryPromotePolygonTable(table, columnName, encoding) {
|
|
|
208
241
|
});
|
|
209
242
|
const polyData = makeData({
|
|
210
243
|
type: POLYGON_TYPE,
|
|
244
|
+
length: nPolygons,
|
|
245
|
+
nullCount: sawMultiPolygon ? 0 : nullCount,
|
|
246
|
+
nullBitmap: sawMultiPolygon ? null : buildNullBitmap(n, isNull, nullCount),
|
|
247
|
+
valueOffsets: polygonOffsets,
|
|
248
|
+
child: ringData,
|
|
249
|
+
});
|
|
250
|
+
if (!sawMultiPolygon) {
|
|
251
|
+
if (nPolygons !== n)
|
|
252
|
+
return null;
|
|
253
|
+
return buildPromotedResult(table, columnName, new Vector([polyData]), 'geoarrow.polygon');
|
|
254
|
+
}
|
|
255
|
+
const multiData = makeData({
|
|
256
|
+
type: MULTIPOLYGON_TYPE,
|
|
211
257
|
length: n,
|
|
212
258
|
nullCount,
|
|
213
259
|
nullBitmap: buildNullBitmap(n, isNull, nullCount),
|
|
214
|
-
valueOffsets:
|
|
215
|
-
child:
|
|
260
|
+
valueOffsets: rowPolygonOffsets,
|
|
261
|
+
child: polyData,
|
|
216
262
|
});
|
|
217
|
-
return buildPromotedResult(table, columnName, new Vector([
|
|
263
|
+
return buildPromotedResult(table, columnName, new Vector([multiData]), 'geoarrow.multipolygon');
|
|
218
264
|
}
|
|
219
265
|
/**
|
|
220
266
|
* Attempt to promote WKB/WKT Point geometries into a native GeoArrow
|
|
@@ -341,9 +387,9 @@ export function describeGeoArrowPromotionFailure(layerType, encoding, table, col
|
|
|
341
387
|
? ` Sampled geometry types: ${sampled.join(', ')}.`
|
|
342
388
|
: '';
|
|
343
389
|
if (POLYGON_LAYERS.has(layerType)) {
|
|
344
|
-
return (`${sampledText} GeoArrowPolygonLayer requires
|
|
345
|
-
` Use GeoJsonLayer for
|
|
346
|
-
` WHERE ST_GeometryType(geom)
|
|
390
|
+
return (`${sampledText} GeoArrowPolygonLayer requires Polygon or MultiPolygon rows.` +
|
|
391
|
+
` Use GeoJsonLayer for mixed Point/Line/Polygon columns, or filter with` +
|
|
392
|
+
` WHERE ST_GeometryType(geom) IN ('POLYGON','MULTIPOLYGON').`);
|
|
347
393
|
}
|
|
348
394
|
if (PATH_LAYERS.has(layerType)) {
|
|
349
395
|
return (`${sampledText} GeoArrowPathLayer requires only LineString/MultiLineString rows.` +
|
|
@@ -460,7 +506,7 @@ export const wkbGeometryDecoder = {
|
|
|
460
506
|
return sampledGeometriesMatch(table, columnName, encoding, (geometryType) => geometryType === 'Point', (geometryType) => geometryType === WKB_POINT);
|
|
461
507
|
}
|
|
462
508
|
if (POLYGON_LAYERS.has(layerType)) {
|
|
463
|
-
return sampledGeometriesMatch(table, columnName, encoding, (geometryType) => geometryType === 'Polygon', (geometryType) => geometryType === WKB_POLYGON);
|
|
509
|
+
return sampledGeometriesMatch(table, columnName, encoding, (geometryType) => geometryType === 'Polygon' || geometryType === 'MultiPolygon', (geometryType) => geometryType === WKB_POLYGON || geometryType === WKB_MULTIPOLYGON);
|
|
464
510
|
}
|
|
465
511
|
if (PATH_LAYERS.has(layerType)) {
|
|
466
512
|
return sampledGeometriesMatch(table, columnName, encoding, (geometryType) => geometryType === 'LineString' || geometryType === 'MultiLineString', (geometryType) => geometryType === WKB_LINESTRING ||
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wkbDecoder.js","sourceRoot":"","sources":["../../src/prepare/wkbDecoder.ts"],"names":[],"mappings":"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","sourcesContent":["import {WKBLoader, WKTLoader} from '@loaders.gl/wkt';\nimport type * as arrow from 'apache-arrow';\nimport {\n Field,\n FixedSizeList,\n Float64,\n List,\n makeData,\n Table,\n Vector,\n} from 'apache-arrow';\nimport type {GeometryDecoder} from './geometryDecoder';\nimport {buildBinaryGeoJsonData} from './toGeoJsonBinary';\nimport type {\n PreparedGeoArrowLayerData,\n ResolvedGeometryEncoding,\n} from './types';\nimport {\n parseWKBHeader,\n readWKBLineStringXY,\n readWKBMultiLineStringXY,\n readWKBPointXY,\n visitWKBPolygonCoordinates,\n WKB_LINESTRING,\n WKB_MULTILINESTRING,\n WKB_MULTIPOLYGON,\n WKB_POINT,\n WKB_POLYGON,\n} from './wkbParser';\n\nconst COORD_FIELD = new Field('xy', new Float64(), false);\nconst VERTEX_TYPE = new FixedSizeList(2, COORD_FIELD);\nconst VERTEX_FIELD = new Field('', VERTEX_TYPE, true);\nconst RING_TYPE = new List(VERTEX_FIELD);\nconst RING_FIELD = new Field('', RING_TYPE, true);\nconst POLYGON_TYPE = new List(RING_FIELD);\n\nconst GEOMETRY_SAMPLE_LIMIT = 100;\nconst BITS_PER_VALIDITY_BYTE = 8;\n\nfunction toArrayBuffer(value: unknown): ArrayBuffer {\n if (ArrayBuffer.isView(value)) {\n const copy = new Uint8Array(value.byteLength);\n copy.set(\n new Uint8Array(value.buffer, value.byteOffset, value.byteLength),\n 0,\n );\n return copy.buffer;\n }\n return value as ArrayBuffer;\n}\n\nfunction isWKTEncoding(\n encoding: ResolvedGeometryEncoding,\n value: unknown,\n): boolean {\n return (\n encoding === 'wkt' ||\n encoding === 'geoarrow.wkt' ||\n (encoding === 'unknown' && typeof value === 'string')\n );\n}\n\nfunction buildNullBitmap(\n n: number,\n isNull: Uint8Array,\n nullCount: number,\n): Uint8Array | null {\n if (nullCount === 0) return null;\n const bitmap = new Uint8Array(Math.ceil(n / BITS_PER_VALIDITY_BYTE));\n for (let i = 0; i < n; i++) {\n if (isNull[i] !== 1) setValidityBit(bitmap, i);\n }\n return bitmap;\n}\n\nfunction setValidityBit(bitmap: Uint8Array, rowIndex: number) {\n const byteIndex = Math.floor(rowIndex / BITS_PER_VALIDITY_BYTE);\n const bitIndex = rowIndex % BITS_PER_VALIDITY_BYTE;\n bitmap[byteIndex]! |= 1 << bitIndex;\n}\n\nfunction buildPromotedResult(\n table: arrow.Table,\n columnName: string,\n promotedGeometry: arrow.Vector,\n encoding: PreparedGeoArrowLayerData['encoding'],\n): PreparedGeoArrowLayerData {\n const columns: Record<string, arrow.Vector> = {};\n for (const field of table.schema.fields) {\n columns[field.name] =\n field.name === columnName\n ? promotedGeometry\n : (table.getChild(field.name) as arrow.Vector);\n }\n const promotedTable = new Table(columns);\n return {\n table: promotedTable,\n geometryColumnName: columnName,\n geometryColumn: promotedTable.getChild(columnName)!,\n encoding,\n source: 'promoted',\n };\n}\n\nfunction parseGeometryValue(\n value: unknown,\n encoding: ResolvedGeometryEncoding,\n) {\n if (value == null) return null;\n\n try {\n if (isWKTEncoding(encoding, value)) {\n // Keep WKT support for ST_AsText(...) and geoarrow.wkt inputs.\n // The upstream WKB parser plan does not cover WKT.\n // See: https://github.com/geoarrow/geoarrow-js/issues/54\n return (\n WKTLoader.parseTextSync?.(String(value), {wkt: {crs: false}}) ?? null\n );\n }\n\n return (\n WKBLoader.parseSync?.(toArrayBuffer(value), {\n wkb: {shape: 'geojson-geometry'},\n }) ?? null\n );\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (\n message.includes('WKB: Unsupported geometry type: 0') ||\n message.includes('WKB: Unsupported iso-wkb type')\n ) {\n throw new Error(\n 'DuckDB GEOMETRY values are not WKB by default. Select ST_AsWKB(geom) AS geom or ST_AsText(geom) AS geom before passing the result to DeckJsonMap.',\n );\n }\n throw error instanceof Error ? error : new Error(message);\n }\n}\n\nfunction getSampleWKBGeomTypes(\n table: arrow.Table,\n columnName: string,\n sampleLimit = GEOMETRY_SAMPLE_LIMIT,\n): number[] | null {\n const vector = table.getChild(columnName);\n if (!vector) return null;\n const geomTypes: number[] = [];\n for (let i = 0; i < table.numRows; i++) {\n const raw = vector.get(i);\n if (raw == null) continue;\n const hdr = parseWKBHeader(toArrayBuffer(raw));\n if (!hdr) return null;\n geomTypes.push(hdr.geomType);\n if (geomTypes.length >= sampleLimit) break;\n }\n return geomTypes;\n}\n\nfunction getSampleGeometryTypes(\n table: arrow.Table,\n columnName: string,\n encoding: ResolvedGeometryEncoding,\n sampleLimit = GEOMETRY_SAMPLE_LIMIT,\n): string[] | null {\n const vector = table.getChild(columnName);\n if (!vector) return null;\n const geometryTypes: string[] = [];\n\n for (let i = 0; i < table.numRows; i++) {\n const geometry = parseGeometryValue(vector.get(i), encoding);\n if (!geometry) continue;\n geometryTypes.push(geometry.type);\n if (geometryTypes.length >= sampleLimit) break;\n }\n return geometryTypes;\n}\n\nfunction appendPolygonCoordinates(\n rings: number[][][],\n ringOffsetsList: number[],\n xyList: number[],\n) {\n for (const ring of rings) {\n ringOffsetsList.push(xyList.length / 2);\n for (const point of ring) {\n xyList.push(point[0]!, point[1]!);\n }\n }\n}\n\nfunction sampledGeometriesMatch(\n table: arrow.Table,\n columnName: string,\n encoding: ResolvedGeometryEncoding,\n matchesParsedType: (geometryType: string) => boolean,\n matchesWKBType: (geometryType: number) => boolean,\n) {\n try {\n const geometryTypes = getSampleGeometryTypes(table, columnName, encoding);\n return geometryTypes != null && geometryTypes.every(matchesParsedType);\n } catch {\n try {\n const geomTypes = getSampleWKBGeomTypes(table, columnName);\n return geomTypes != null && geomTypes.every(matchesWKBType);\n } catch {\n return false;\n }\n }\n}\n\nfunction tryPromotePolygonTable(\n table: arrow.Table,\n columnName: string,\n encoding: ResolvedGeometryEncoding,\n): PreparedGeoArrowLayerData | null {\n const vector = table.getChild(columnName);\n if (!vector) return null;\n\n const n = table.numRows;\n const polygonOffsets = new Int32Array(n + 1);\n const ringOffsetsList: number[] = [];\n const xyList: number[] = [];\n const isNull = new Uint8Array(n);\n let nullCount = 0;\n const polygonVisitor = {\n onRingStart: () => ringOffsetsList.push(xyList.length / 2),\n onCoordinate: (x: number, y: number) => xyList.push(x, y),\n };\n\n for (let i = 0; i < n; i++) {\n polygonOffsets[i] = ringOffsetsList.length;\n const raw = vector.get(i);\n\n if (raw == null) {\n isNull[i] = 1;\n nullCount++;\n continue;\n }\n\n if (isWKTEncoding(encoding, raw)) {\n const geom = parseGeometryValue(raw, encoding);\n if (!geom) {\n isNull[i] = 1;\n nullCount++;\n continue;\n }\n if (geom.type === 'Polygon') {\n appendPolygonCoordinates(\n geom.coordinates as number[][][],\n ringOffsetsList,\n xyList,\n );\n } else return null;\n continue;\n }\n\n const buf = toArrayBuffer(raw);\n const hdr = parseWKBHeader(buf);\n if (!hdr) return null;\n\n if (hdr.geomType === WKB_POLYGON) {\n if (visitWKBPolygonCoordinates(buf, hdr, polygonVisitor) == null) {\n return null;\n }\n } else return null;\n }\n polygonOffsets[n] = ringOffsetsList.length;\n\n const totalRings = ringOffsetsList.length;\n const totalPoints = xyList.length / 2;\n\n const ringOffsets = new Int32Array(totalRings + 1);\n for (let j = 0; j < totalRings; j++) ringOffsets[j] = ringOffsetsList[j]!;\n ringOffsets[totalRings] = totalPoints;\n\n const flatCoords = new Float64Array(xyList);\n const floatData = makeData({\n type: new Float64(),\n length: totalPoints * 2,\n data: flatCoords,\n });\n const pointData = makeData({\n type: VERTEX_TYPE,\n length: totalPoints,\n child: floatData,\n });\n const ringData = makeData({\n type: RING_TYPE,\n length: totalRings,\n valueOffsets: ringOffsets,\n child: pointData,\n });\n const polyData = makeData({\n type: POLYGON_TYPE,\n length: n,\n nullCount,\n nullBitmap: buildNullBitmap(n, isNull, nullCount),\n valueOffsets: polygonOffsets,\n child: ringData,\n });\n return buildPromotedResult(\n table,\n columnName,\n new Vector([polyData]),\n 'geoarrow.polygon',\n );\n}\n\n/**\n * Attempt to promote WKB/WKT Point geometries into a native GeoArrow\n * FixedSizeList column. Returns `null` if any non-null geometry is not\n * a Point, so callers can fall back to the GeoJSON binary path.\n */\nfunction tryPromotePointTable(\n table: arrow.Table,\n columnName: string,\n encoding: ResolvedGeometryEncoding,\n): PreparedGeoArrowLayerData | null {\n const vector = table.getChild(columnName);\n if (!vector) return null;\n\n const n = table.numRows;\n const xyValues = new Float64Array(n * 2);\n const isNull = new Uint8Array(n);\n let nullCount = 0;\n\n const markNullPoint = (rowIndex: number) => {\n isNull[rowIndex] = 1;\n xyValues[rowIndex * 2] = Number.NaN;\n xyValues[rowIndex * 2 + 1] = Number.NaN;\n nullCount++;\n };\n\n for (let i = 0; i < n; i++) {\n const raw = vector.get(i);\n if (raw == null) {\n markNullPoint(i);\n continue;\n }\n\n if (isWKTEncoding(encoding, raw)) {\n const geom = parseGeometryValue(raw, encoding);\n if (!geom) {\n markNullPoint(i);\n continue;\n }\n if (geom.type !== 'Point') return null;\n const c = geom.coordinates as number[];\n xyValues[i * 2] = c[0]!;\n xyValues[i * 2 + 1] = c[1]!;\n continue;\n }\n\n const hdr = parseWKBHeader(toArrayBuffer(raw));\n if (!hdr) return null;\n const xy = readWKBPointXY(hdr);\n if (!xy) return null;\n xyValues[i * 2] = xy[0];\n xyValues[i * 2 + 1] = xy[1];\n }\n\n const floatData = makeData({\n type: new Float64(),\n length: n * 2,\n data: xyValues,\n });\n const geomData = makeData({\n type: VERTEX_TYPE,\n length: n,\n nullCount,\n nullBitmap: buildNullBitmap(n, isNull, nullCount),\n child: floatData,\n });\n return buildPromotedResult(\n table,\n columnName,\n new Vector([geomData]),\n 'geoarrow.point',\n );\n}\n\nconst POINT_LAYERS = new Set([\n 'GeoArrowScatterplotLayer',\n 'GeoArrowHeatmapLayer',\n 'GeoArrowColumnLayer',\n 'GeoArrowArcLayer',\n]);\n\n/** Scatter / heatmap / column (not OD arcs). */\nconst POINT_POSITION_LAYERS = new Set([\n 'GeoArrowScatterplotLayer',\n 'GeoArrowHeatmapLayer',\n 'GeoArrowColumnLayer',\n]);\n\nconst POLYGON_LAYERS = new Set([\n 'GeoArrowPolygonLayer',\n 'GeoArrowSolidPolygonLayer',\n]);\n\nconst PATH_LAYERS = new Set(['GeoArrowPathLayer', 'GeoArrowTripsLayer']);\n\n/** Promote WKB/WKT Points only — no silent polygon centroid. */\nexport function promoteToPointPositions(\n table: arrow.Table,\n columnName: string,\n encoding: ResolvedGeometryEncoding,\n): PreparedGeoArrowLayerData | null {\n return tryPromotePointTable(table, columnName, encoding);\n}\n\nexport function isPointPositionLayer(layerType: string): boolean {\n return POINT_POSITION_LAYERS.has(layerType);\n}\n\nconst WKB_TYPE_NAMES: Record<number, string> = {\n [WKB_POINT]: 'Point',\n [WKB_LINESTRING]: 'LineString',\n [WKB_POLYGON]: 'Polygon',\n [WKB_MULTILINESTRING]: 'MultiLineString',\n [WKB_MULTIPOLYGON]: 'MultiPolygon',\n};\n\nfunction uniqueSortedTypes(types: string[]): string[] {\n return [...new Set(types)].sort();\n}\n\nfunction sampleGeometryTypeNames(\n table: arrow.Table,\n columnName: string,\n encoding: ResolvedGeometryEncoding,\n): string[] | null {\n try {\n const parsed = getSampleGeometryTypes(table, columnName, encoding);\n if (parsed && parsed.length > 0) {\n return uniqueSortedTypes(parsed);\n }\n } catch {\n // Fall through to WKB header sampling.\n }\n try {\n const wkbTypes = getSampleWKBGeomTypes(table, columnName);\n if (!wkbTypes || wkbTypes.length === 0) return null;\n return uniqueSortedTypes(\n wkbTypes.map((t) => WKB_TYPE_NAMES[t] ?? `type:${t}`),\n );\n } catch {\n return null;\n }\n}\n\n/**\n * Extra guidance when a typed GeoArrow layer cannot promote WKB/WKT geometry.\n * Mixed geometry columns must use GeoJsonLayer or an ST_GeometryType filter.\n */\nexport function describeGeoArrowPromotionFailure(\n layerType: string,\n encoding: ResolvedGeometryEncoding,\n table: arrow.Table,\n columnName: string,\n): string {\n const sampled = sampleGeometryTypeNames(table, columnName, encoding);\n const sampledText =\n sampled && sampled.length > 0\n ? ` Sampled geometry types: ${sampled.join(', ')}.`\n : '';\n\n if (POLYGON_LAYERS.has(layerType)) {\n return (\n `${sampledText} GeoArrowPolygonLayer requires only Polygon rows.` +\n ` Use GeoJsonLayer for MultiPolygon or mixed geometry columns, or filter with` +\n ` WHERE ST_GeometryType(geom) = 'POLYGON'.`\n );\n }\n if (PATH_LAYERS.has(layerType)) {\n return (\n `${sampledText} GeoArrowPathLayer requires only LineString/MultiLineString rows.` +\n ` For mixed geometry columns use GeoJsonLayer, or filter with` +\n ` WHERE ST_GeometryType(geom) IN ('LINESTRING','MULTILINESTRING').`\n );\n }\n if (POINT_LAYERS.has(layerType)) {\n return (\n `${sampledText} This point layer requires Point geometry.` +\n ` For mixed geometry columns use GeoJsonLayer, or filter/transform to points.`\n );\n }\n return sampledText;\n}\n\n/**\n * Promotes WKB/WKT LineString geometries (and single-part MultiLineString) to a\n * native GeoArrow LineString vector (List<FixedSizeList<2, Float64>>).\n * Multi-part MultiLineStrings are rejected — stitching parts would draw\n * artificial segments between disjoint routes. Returns null if any non-null\n * geometry is not a promotable line type.\n */\nfunction tryPromoteLineStringTable(\n table: arrow.Table,\n columnName: string,\n encoding: ResolvedGeometryEncoding,\n): PreparedGeoArrowLayerData | null {\n const vector = table.getChild(columnName);\n if (!vector) return null;\n\n const n = table.numRows;\n const allCoords: Float64Array[] = [];\n const offsets = new Int32Array(n + 1);\n const isNull = new Uint8Array(n);\n let nullCount = 0;\n let totalPoints = 0;\n\n for (let i = 0; i < n; i++) {\n offsets[i] = totalPoints;\n const raw = vector.get(i);\n if (raw == null) {\n isNull[i] = 1;\n nullCount++;\n continue;\n }\n\n let coords: Array<[number, number]> | null = null;\n\n if (isWKTEncoding(encoding, raw)) {\n const geom = parseGeometryValue(raw, encoding);\n if (!geom) {\n isNull[i] = 1;\n nullCount++;\n continue;\n }\n if (geom.type === 'LineString') {\n coords = (geom.coordinates as number[][]).map(\n (c) => [c[0]!, c[1]!] as [number, number],\n );\n } else if (geom.type === 'MultiLineString') {\n const parts = geom.coordinates as number[][][];\n // Only single-part MultiLineString promotes cleanly to PathLayer.\n if (parts.length !== 1 || !parts[0]?.length) return null;\n coords = parts[0].map((c) => [c[0]!, c[1]!] as [number, number]);\n } else {\n return null;\n }\n } else {\n const buf = toArrayBuffer(raw);\n const hdr = parseWKBHeader(buf);\n if (!hdr) return null;\n coords =\n hdr.geomType === WKB_MULTILINESTRING\n ? readWKBMultiLineStringXY(buf, hdr)\n : readWKBLineStringXY(buf, hdr);\n if (!coords) return null;\n }\n\n const flat = new Float64Array(coords.length * 2);\n for (let j = 0; j < coords.length; j++) {\n flat[j * 2] = coords[j]![0];\n flat[j * 2 + 1] = coords[j]![1];\n }\n allCoords.push(flat);\n totalPoints += coords.length;\n }\n offsets[n] = totalPoints;\n\n const flatValues = new Float64Array(totalPoints * 2);\n let writeOffset = 0;\n for (const chunk of allCoords) {\n flatValues.set(chunk, writeOffset);\n writeOffset += chunk.length;\n }\n\n const floatData = makeData({\n type: new Float64(),\n length: totalPoints * 2,\n data: flatValues,\n });\n const vertexData = makeData({\n type: VERTEX_TYPE,\n length: totalPoints,\n child: floatData,\n });\n const lineStringType = new List(VERTEX_FIELD);\n const lineData = makeData({\n type: lineStringType,\n length: n,\n nullCount,\n nullBitmap: buildNullBitmap(n, isNull, nullCount),\n valueOffsets: offsets,\n child: vertexData,\n });\n\n return buildPromotedResult(\n table,\n columnName,\n new Vector([lineData]),\n 'geoarrow.linestring',\n );\n}\n\nexport const wkbGeometryDecoder: GeometryDecoder = {\n supportsGeoArrowPromotion(\n layerType: string,\n encoding: ResolvedGeometryEncoding,\n table: arrow.Table,\n columnName: string,\n ) {\n if (\n !['wkb', 'geoarrow.wkb', 'wkt', 'geoarrow.wkt', 'unknown'].includes(\n encoding,\n )\n ) {\n return false;\n }\n\n if (POINT_LAYERS.has(layerType)) {\n return sampledGeometriesMatch(\n table,\n columnName,\n encoding,\n (geometryType) => geometryType === 'Point',\n (geometryType) => geometryType === WKB_POINT,\n );\n }\n\n if (POLYGON_LAYERS.has(layerType)) {\n return sampledGeometriesMatch(\n table,\n columnName,\n encoding,\n (geometryType) => geometryType === 'Polygon',\n (geometryType) => geometryType === WKB_POLYGON,\n );\n }\n\n if (PATH_LAYERS.has(layerType)) {\n return sampledGeometriesMatch(\n table,\n columnName,\n encoding,\n (geometryType) =>\n geometryType === 'LineString' || geometryType === 'MultiLineString',\n (geometryType) =>\n geometryType === WKB_LINESTRING ||\n geometryType === WKB_MULTILINESTRING,\n );\n }\n\n return false;\n },\n\n toGeoArrowLike(\n table: arrow.Table,\n columnName: string,\n encoding: ResolvedGeometryEncoding,\n ) {\n const pointResult = tryPromotePointTable(table, columnName, encoding);\n if (pointResult) return pointResult;\n\n const lineResult = tryPromoteLineStringTable(table, columnName, encoding);\n if (lineResult) return lineResult;\n\n const result = tryPromotePolygonTable(table, columnName, encoding);\n if (result) return result;\n\n throw new Error(\n 'GeoArrow promotion failed: unsupported geometry type for column.',\n );\n },\n\n toGeoJsonBinary(\n table: arrow.Table,\n columnName: string,\n encoding: ResolvedGeometryEncoding,\n ) {\n return buildBinaryGeoJsonData({\n table,\n geometryColumnName: columnName,\n getGeometryAt: (rowIndex) => {\n const value = table.getChild(columnName)?.get(rowIndex);\n return parseGeometryValue(value, encoding);\n },\n });\n },\n};\n"]}
|
|
1
|
+
{"version":3,"file":"wkbDecoder.js","sourceRoot":"","sources":["../../src/prepare/wkbDecoder.ts"],"names":[],"mappings":"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","sourcesContent":["import {WKBLoader, WKTLoader} from '@loaders.gl/wkt';\nimport type * as arrow from 'apache-arrow';\nimport {\n Field,\n FixedSizeList,\n Float64,\n List,\n makeData,\n Table,\n Vector,\n} from 'apache-arrow';\nimport type {GeometryDecoder} from './geometryDecoder';\nimport {buildBinaryGeoJsonData} from './toGeoJsonBinary';\nimport type {\n PreparedGeoArrowLayerData,\n ResolvedGeometryEncoding,\n} from './types';\nimport {\n parseWKBHeader,\n readWKBLineStringXY,\n readWKBMultiLineStringXY,\n readWKBPointXY,\n visitWKBMultiPolygonCoordinates,\n visitWKBPolygonCoordinates,\n WKB_LINESTRING,\n WKB_MULTILINESTRING,\n WKB_MULTIPOLYGON,\n WKB_POINT,\n WKB_POLYGON,\n} from './wkbParser';\n\nconst COORD_FIELD = new Field('xy', new Float64(), false);\nconst VERTEX_TYPE = new FixedSizeList(2, COORD_FIELD);\nconst VERTEX_FIELD = new Field('', VERTEX_TYPE, true);\nconst RING_TYPE = new List(VERTEX_FIELD);\nconst RING_FIELD = new Field('', RING_TYPE, true);\nconst POLYGON_TYPE = new List(RING_FIELD);\nconst POLYGON_FIELD = new Field('', POLYGON_TYPE, true);\nconst MULTIPOLYGON_TYPE = new List(POLYGON_FIELD);\n\nconst GEOMETRY_SAMPLE_LIMIT = 100;\nconst BITS_PER_VALIDITY_BYTE = 8;\n\nfunction toArrayBuffer(value: unknown): ArrayBuffer {\n if (ArrayBuffer.isView(value)) {\n const copy = new Uint8Array(value.byteLength);\n copy.set(\n new Uint8Array(value.buffer, value.byteOffset, value.byteLength),\n 0,\n );\n return copy.buffer;\n }\n return value as ArrayBuffer;\n}\n\nfunction isWKTEncoding(\n encoding: ResolvedGeometryEncoding,\n value: unknown,\n): boolean {\n return (\n encoding === 'wkt' ||\n encoding === 'geoarrow.wkt' ||\n (encoding === 'unknown' && typeof value === 'string')\n );\n}\n\nfunction buildNullBitmap(\n n: number,\n isNull: Uint8Array,\n nullCount: number,\n): Uint8Array | null {\n if (nullCount === 0) return null;\n const bitmap = new Uint8Array(Math.ceil(n / BITS_PER_VALIDITY_BYTE));\n for (let i = 0; i < n; i++) {\n if (isNull[i] !== 1) setValidityBit(bitmap, i);\n }\n return bitmap;\n}\n\nfunction setValidityBit(bitmap: Uint8Array, rowIndex: number) {\n const byteIndex = Math.floor(rowIndex / BITS_PER_VALIDITY_BYTE);\n const bitIndex = rowIndex % BITS_PER_VALIDITY_BYTE;\n bitmap[byteIndex]! |= 1 << bitIndex;\n}\n\nfunction buildPromotedResult(\n table: arrow.Table,\n columnName: string,\n promotedGeometry: arrow.Vector,\n encoding: PreparedGeoArrowLayerData['encoding'],\n): PreparedGeoArrowLayerData {\n const columns: Record<string, arrow.Vector> = {};\n for (const field of table.schema.fields) {\n columns[field.name] =\n field.name === columnName\n ? promotedGeometry\n : (table.getChild(field.name) as arrow.Vector);\n }\n const promotedTable = new Table(columns);\n return {\n table: promotedTable,\n geometryColumnName: columnName,\n geometryColumn: promotedTable.getChild(columnName)!,\n encoding,\n source: 'promoted',\n };\n}\n\nfunction parseGeometryValue(\n value: unknown,\n encoding: ResolvedGeometryEncoding,\n) {\n if (value == null) return null;\n\n try {\n if (isWKTEncoding(encoding, value)) {\n // Keep WKT support for ST_AsText(...) and geoarrow.wkt inputs.\n // The upstream WKB parser plan does not cover WKT.\n // See: https://github.com/geoarrow/geoarrow-js/issues/54\n return (\n WKTLoader.parseTextSync?.(String(value), {wkt: {crs: false}}) ?? null\n );\n }\n\n return (\n WKBLoader.parseSync?.(toArrayBuffer(value), {\n wkb: {shape: 'geojson-geometry'},\n }) ?? null\n );\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (\n message.includes('WKB: Unsupported geometry type: 0') ||\n message.includes('WKB: Unsupported iso-wkb type')\n ) {\n throw new Error(\n 'DuckDB GEOMETRY values are not WKB by default. Select ST_AsWKB(geom) AS geom or ST_AsText(geom) AS geom before passing the result to DeckJsonMap.',\n );\n }\n throw error instanceof Error ? error : new Error(message);\n }\n}\n\nfunction getSampleWKBGeomTypes(\n table: arrow.Table,\n columnName: string,\n sampleLimit = GEOMETRY_SAMPLE_LIMIT,\n): number[] | null {\n const vector = table.getChild(columnName);\n if (!vector) return null;\n const geomTypes: number[] = [];\n for (let i = 0; i < table.numRows; i++) {\n const raw = vector.get(i);\n if (raw == null) continue;\n const hdr = parseWKBHeader(toArrayBuffer(raw));\n if (!hdr) return null;\n geomTypes.push(hdr.geomType);\n if (geomTypes.length >= sampleLimit) break;\n }\n return geomTypes;\n}\n\nfunction getSampleGeometryTypes(\n table: arrow.Table,\n columnName: string,\n encoding: ResolvedGeometryEncoding,\n sampleLimit = GEOMETRY_SAMPLE_LIMIT,\n): string[] | null {\n const vector = table.getChild(columnName);\n if (!vector) return null;\n const geometryTypes: string[] = [];\n\n for (let i = 0; i < table.numRows; i++) {\n const geometry = parseGeometryValue(vector.get(i), encoding);\n if (!geometry) continue;\n geometryTypes.push(geometry.type);\n if (geometryTypes.length >= sampleLimit) break;\n }\n return geometryTypes;\n}\n\nfunction appendPolygonCoordinates(\n rings: number[][][],\n ringOffsetsList: number[],\n xyList: number[],\n) {\n for (const ring of rings) {\n ringOffsetsList.push(xyList.length / 2);\n for (const point of ring) {\n xyList.push(point[0]!, point[1]!);\n }\n }\n}\n\nfunction sampledGeometriesMatch(\n table: arrow.Table,\n columnName: string,\n encoding: ResolvedGeometryEncoding,\n matchesParsedType: (geometryType: string) => boolean,\n matchesWKBType: (geometryType: number) => boolean,\n) {\n try {\n const geometryTypes = getSampleGeometryTypes(table, columnName, encoding);\n return geometryTypes != null && geometryTypes.every(matchesParsedType);\n } catch {\n try {\n const geomTypes = getSampleWKBGeomTypes(table, columnName);\n return geomTypes != null && geomTypes.every(matchesWKBType);\n } catch {\n return false;\n }\n }\n}\n\nfunction tryPromotePolygonTable(\n table: arrow.Table,\n columnName: string,\n encoding: ResolvedGeometryEncoding,\n): PreparedGeoArrowLayerData | null {\n const vector = table.getChild(columnName);\n if (!vector) return null;\n\n const n = table.numRows;\n const rowPolygonOffsets = new Int32Array(n + 1);\n const polygonRingStarts: number[] = [];\n const ringOffsetsList: number[] = [];\n const xyList: number[] = [];\n const isNull = new Uint8Array(n);\n let nullCount = 0;\n let sawMultiPolygon = false;\n\n const startPolygon = () => {\n polygonRingStarts.push(ringOffsetsList.length);\n };\n const polygonVisitor = {\n onPolygonStart: startPolygon,\n onRingStart: () => ringOffsetsList.push(xyList.length / 2),\n onCoordinate: (x: number, y: number) => xyList.push(x, y),\n };\n\n const appendParsedPolygon = (rings: number[][][]) => {\n startPolygon();\n appendPolygonCoordinates(rings, ringOffsetsList, xyList);\n };\n\n for (let i = 0; i < n; i++) {\n rowPolygonOffsets[i] = polygonRingStarts.length;\n const raw = vector.get(i);\n\n if (raw == null) {\n isNull[i] = 1;\n nullCount++;\n startPolygon();\n continue;\n }\n\n if (isWKTEncoding(encoding, raw)) {\n const geom = parseGeometryValue(raw, encoding);\n if (!geom) {\n isNull[i] = 1;\n nullCount++;\n startPolygon();\n continue;\n }\n if (geom.type === 'Polygon') {\n appendParsedPolygon(geom.coordinates as number[][][]);\n } else if (geom.type === 'MultiPolygon') {\n sawMultiPolygon = true;\n for (const rings of geom.coordinates as number[][][][]) {\n appendParsedPolygon(rings);\n }\n } else {\n return null;\n }\n continue;\n }\n\n const buf = toArrayBuffer(raw);\n const hdr = parseWKBHeader(buf);\n if (!hdr) return null;\n\n if (hdr.geomType === WKB_POLYGON) {\n startPolygon();\n if (visitWKBPolygonCoordinates(buf, hdr, polygonVisitor) == null) {\n return null;\n }\n } else if (hdr.geomType === WKB_MULTIPOLYGON) {\n sawMultiPolygon = true;\n if (!visitWKBMultiPolygonCoordinates(buf, hdr, polygonVisitor)) {\n return null;\n }\n } else {\n return null;\n }\n }\n rowPolygonOffsets[n] = polygonRingStarts.length;\n\n const nPolygons = polygonRingStarts.length;\n const totalRings = ringOffsetsList.length;\n const totalPoints = xyList.length / 2;\n\n const ringOffsets = new Int32Array(totalRings + 1);\n for (let j = 0; j < totalRings; j++) ringOffsets[j] = ringOffsetsList[j]!;\n ringOffsets[totalRings] = totalPoints;\n\n const polygonOffsets = new Int32Array(nPolygons + 1);\n for (let j = 0; j < nPolygons; j++) polygonOffsets[j] = polygonRingStarts[j]!;\n polygonOffsets[nPolygons] = totalRings;\n\n const floatData = makeData({\n type: new Float64(),\n length: totalPoints * 2,\n data: new Float64Array(xyList),\n });\n const pointData = makeData({\n type: VERTEX_TYPE,\n length: totalPoints,\n child: floatData,\n });\n const ringData = makeData({\n type: RING_TYPE,\n length: totalRings,\n valueOffsets: ringOffsets,\n child: pointData,\n });\n const polyData = makeData({\n type: POLYGON_TYPE,\n length: nPolygons,\n nullCount: sawMultiPolygon ? 0 : nullCount,\n nullBitmap: sawMultiPolygon ? null : buildNullBitmap(n, isNull, nullCount),\n valueOffsets: polygonOffsets,\n child: ringData,\n });\n\n if (!sawMultiPolygon) {\n if (nPolygons !== n) return null;\n return buildPromotedResult(\n table,\n columnName,\n new Vector([polyData]),\n 'geoarrow.polygon',\n );\n }\n\n const multiData = makeData({\n type: MULTIPOLYGON_TYPE,\n length: n,\n nullCount,\n nullBitmap: buildNullBitmap(n, isNull, nullCount),\n valueOffsets: rowPolygonOffsets,\n child: polyData,\n });\n return buildPromotedResult(\n table,\n columnName,\n new Vector([multiData]),\n 'geoarrow.multipolygon',\n );\n}\n\n/**\n * Attempt to promote WKB/WKT Point geometries into a native GeoArrow\n * FixedSizeList column. Returns `null` if any non-null geometry is not\n * a Point, so callers can fall back to the GeoJSON binary path.\n */\nfunction tryPromotePointTable(\n table: arrow.Table,\n columnName: string,\n encoding: ResolvedGeometryEncoding,\n): PreparedGeoArrowLayerData | null {\n const vector = table.getChild(columnName);\n if (!vector) return null;\n\n const n = table.numRows;\n const xyValues = new Float64Array(n * 2);\n const isNull = new Uint8Array(n);\n let nullCount = 0;\n\n const markNullPoint = (rowIndex: number) => {\n isNull[rowIndex] = 1;\n xyValues[rowIndex * 2] = Number.NaN;\n xyValues[rowIndex * 2 + 1] = Number.NaN;\n nullCount++;\n };\n\n for (let i = 0; i < n; i++) {\n const raw = vector.get(i);\n if (raw == null) {\n markNullPoint(i);\n continue;\n }\n\n if (isWKTEncoding(encoding, raw)) {\n const geom = parseGeometryValue(raw, encoding);\n if (!geom) {\n markNullPoint(i);\n continue;\n }\n if (geom.type !== 'Point') return null;\n const c = geom.coordinates as number[];\n xyValues[i * 2] = c[0]!;\n xyValues[i * 2 + 1] = c[1]!;\n continue;\n }\n\n const hdr = parseWKBHeader(toArrayBuffer(raw));\n if (!hdr) return null;\n const xy = readWKBPointXY(hdr);\n if (!xy) return null;\n xyValues[i * 2] = xy[0];\n xyValues[i * 2 + 1] = xy[1];\n }\n\n const floatData = makeData({\n type: new Float64(),\n length: n * 2,\n data: xyValues,\n });\n const geomData = makeData({\n type: VERTEX_TYPE,\n length: n,\n nullCount,\n nullBitmap: buildNullBitmap(n, isNull, nullCount),\n child: floatData,\n });\n return buildPromotedResult(\n table,\n columnName,\n new Vector([geomData]),\n 'geoarrow.point',\n );\n}\n\nconst POINT_LAYERS = new Set([\n 'GeoArrowScatterplotLayer',\n 'GeoArrowHeatmapLayer',\n 'GeoArrowColumnLayer',\n 'GeoArrowArcLayer',\n]);\n\n/** Scatter / heatmap / column (not OD arcs). */\nconst POINT_POSITION_LAYERS = new Set([\n 'GeoArrowScatterplotLayer',\n 'GeoArrowHeatmapLayer',\n 'GeoArrowColumnLayer',\n]);\n\nconst POLYGON_LAYERS = new Set([\n 'GeoArrowPolygonLayer',\n 'GeoArrowSolidPolygonLayer',\n]);\n\nconst PATH_LAYERS = new Set(['GeoArrowPathLayer', 'GeoArrowTripsLayer']);\n\n/** Promote WKB/WKT Points only — no silent polygon centroid. */\nexport function promoteToPointPositions(\n table: arrow.Table,\n columnName: string,\n encoding: ResolvedGeometryEncoding,\n): PreparedGeoArrowLayerData | null {\n return tryPromotePointTable(table, columnName, encoding);\n}\n\nexport function isPointPositionLayer(layerType: string): boolean {\n return POINT_POSITION_LAYERS.has(layerType);\n}\n\nconst WKB_TYPE_NAMES: Record<number, string> = {\n [WKB_POINT]: 'Point',\n [WKB_LINESTRING]: 'LineString',\n [WKB_POLYGON]: 'Polygon',\n [WKB_MULTILINESTRING]: 'MultiLineString',\n [WKB_MULTIPOLYGON]: 'MultiPolygon',\n};\n\nfunction uniqueSortedTypes(types: string[]): string[] {\n return [...new Set(types)].sort();\n}\n\nfunction sampleGeometryTypeNames(\n table: arrow.Table,\n columnName: string,\n encoding: ResolvedGeometryEncoding,\n): string[] | null {\n try {\n const parsed = getSampleGeometryTypes(table, columnName, encoding);\n if (parsed && parsed.length > 0) {\n return uniqueSortedTypes(parsed);\n }\n } catch {\n // Fall through to WKB header sampling.\n }\n try {\n const wkbTypes = getSampleWKBGeomTypes(table, columnName);\n if (!wkbTypes || wkbTypes.length === 0) return null;\n return uniqueSortedTypes(\n wkbTypes.map((t) => WKB_TYPE_NAMES[t] ?? `type:${t}`),\n );\n } catch {\n return null;\n }\n}\n\n/**\n * Extra guidance when a typed GeoArrow layer cannot promote WKB/WKT geometry.\n * Mixed geometry columns must use GeoJsonLayer or an ST_GeometryType filter.\n */\nexport function describeGeoArrowPromotionFailure(\n layerType: string,\n encoding: ResolvedGeometryEncoding,\n table: arrow.Table,\n columnName: string,\n): string {\n const sampled = sampleGeometryTypeNames(table, columnName, encoding);\n const sampledText =\n sampled && sampled.length > 0\n ? ` Sampled geometry types: ${sampled.join(', ')}.`\n : '';\n\n if (POLYGON_LAYERS.has(layerType)) {\n return (\n `${sampledText} GeoArrowPolygonLayer requires Polygon or MultiPolygon rows.` +\n ` Use GeoJsonLayer for mixed Point/Line/Polygon columns, or filter with` +\n ` WHERE ST_GeometryType(geom) IN ('POLYGON','MULTIPOLYGON').`\n );\n }\n if (PATH_LAYERS.has(layerType)) {\n return (\n `${sampledText} GeoArrowPathLayer requires only LineString/MultiLineString rows.` +\n ` For mixed geometry columns use GeoJsonLayer, or filter with` +\n ` WHERE ST_GeometryType(geom) IN ('LINESTRING','MULTILINESTRING').`\n );\n }\n if (POINT_LAYERS.has(layerType)) {\n return (\n `${sampledText} This point layer requires Point geometry.` +\n ` For mixed geometry columns use GeoJsonLayer, or filter/transform to points.`\n );\n }\n return sampledText;\n}\n\n/**\n * Promotes WKB/WKT LineString geometries (and single-part MultiLineString) to a\n * native GeoArrow LineString vector (List<FixedSizeList<2, Float64>>).\n * Multi-part MultiLineStrings are rejected — stitching parts would draw\n * artificial segments between disjoint routes. Returns null if any non-null\n * geometry is not a promotable line type.\n */\nfunction tryPromoteLineStringTable(\n table: arrow.Table,\n columnName: string,\n encoding: ResolvedGeometryEncoding,\n): PreparedGeoArrowLayerData | null {\n const vector = table.getChild(columnName);\n if (!vector) return null;\n\n const n = table.numRows;\n const allCoords: Float64Array[] = [];\n const offsets = new Int32Array(n + 1);\n const isNull = new Uint8Array(n);\n let nullCount = 0;\n let totalPoints = 0;\n\n for (let i = 0; i < n; i++) {\n offsets[i] = totalPoints;\n const raw = vector.get(i);\n if (raw == null) {\n isNull[i] = 1;\n nullCount++;\n continue;\n }\n\n let coords: Array<[number, number]> | null = null;\n\n if (isWKTEncoding(encoding, raw)) {\n const geom = parseGeometryValue(raw, encoding);\n if (!geom) {\n isNull[i] = 1;\n nullCount++;\n continue;\n }\n if (geom.type === 'LineString') {\n coords = (geom.coordinates as number[][]).map(\n (c) => [c[0]!, c[1]!] as [number, number],\n );\n } else if (geom.type === 'MultiLineString') {\n const parts = geom.coordinates as number[][][];\n // Only single-part MultiLineString promotes cleanly to PathLayer.\n if (parts.length !== 1 || !parts[0]?.length) return null;\n coords = parts[0].map((c) => [c[0]!, c[1]!] as [number, number]);\n } else {\n return null;\n }\n } else {\n const buf = toArrayBuffer(raw);\n const hdr = parseWKBHeader(buf);\n if (!hdr) return null;\n coords =\n hdr.geomType === WKB_MULTILINESTRING\n ? readWKBMultiLineStringXY(buf, hdr)\n : readWKBLineStringXY(buf, hdr);\n if (!coords) return null;\n }\n\n const flat = new Float64Array(coords.length * 2);\n for (let j = 0; j < coords.length; j++) {\n flat[j * 2] = coords[j]![0];\n flat[j * 2 + 1] = coords[j]![1];\n }\n allCoords.push(flat);\n totalPoints += coords.length;\n }\n offsets[n] = totalPoints;\n\n const flatValues = new Float64Array(totalPoints * 2);\n let writeOffset = 0;\n for (const chunk of allCoords) {\n flatValues.set(chunk, writeOffset);\n writeOffset += chunk.length;\n }\n\n const floatData = makeData({\n type: new Float64(),\n length: totalPoints * 2,\n data: flatValues,\n });\n const vertexData = makeData({\n type: VERTEX_TYPE,\n length: totalPoints,\n child: floatData,\n });\n const lineStringType = new List(VERTEX_FIELD);\n const lineData = makeData({\n type: lineStringType,\n length: n,\n nullCount,\n nullBitmap: buildNullBitmap(n, isNull, nullCount),\n valueOffsets: offsets,\n child: vertexData,\n });\n\n return buildPromotedResult(\n table,\n columnName,\n new Vector([lineData]),\n 'geoarrow.linestring',\n );\n}\n\nexport const wkbGeometryDecoder: GeometryDecoder = {\n supportsGeoArrowPromotion(\n layerType: string,\n encoding: ResolvedGeometryEncoding,\n table: arrow.Table,\n columnName: string,\n ) {\n if (\n !['wkb', 'geoarrow.wkb', 'wkt', 'geoarrow.wkt', 'unknown'].includes(\n encoding,\n )\n ) {\n return false;\n }\n\n if (POINT_LAYERS.has(layerType)) {\n return sampledGeometriesMatch(\n table,\n columnName,\n encoding,\n (geometryType) => geometryType === 'Point',\n (geometryType) => geometryType === WKB_POINT,\n );\n }\n\n if (POLYGON_LAYERS.has(layerType)) {\n return sampledGeometriesMatch(\n table,\n columnName,\n encoding,\n (geometryType) =>\n geometryType === 'Polygon' || geometryType === 'MultiPolygon',\n (geometryType) =>\n geometryType === WKB_POLYGON || geometryType === WKB_MULTIPOLYGON,\n );\n }\n\n if (PATH_LAYERS.has(layerType)) {\n return sampledGeometriesMatch(\n table,\n columnName,\n encoding,\n (geometryType) =>\n geometryType === 'LineString' || geometryType === 'MultiLineString',\n (geometryType) =>\n geometryType === WKB_LINESTRING ||\n geometryType === WKB_MULTILINESTRING,\n );\n }\n\n return false;\n },\n\n toGeoArrowLike(\n table: arrow.Table,\n columnName: string,\n encoding: ResolvedGeometryEncoding,\n ) {\n const pointResult = tryPromotePointTable(table, columnName, encoding);\n if (pointResult) return pointResult;\n\n const lineResult = tryPromoteLineStringTable(table, columnName, encoding);\n if (lineResult) return lineResult;\n\n const result = tryPromotePolygonTable(table, columnName, encoding);\n if (result) return result;\n\n throw new Error(\n 'GeoArrow promotion failed: unsupported geometry type for column.',\n );\n },\n\n toGeoJsonBinary(\n table: arrow.Table,\n columnName: string,\n encoding: ResolvedGeometryEncoding,\n ) {\n return buildBinaryGeoJsonData({\n table,\n geometryColumnName: columnName,\n getGeometryAt: (rowIndex) => {\n const value = table.getChild(columnName)?.get(rowIndex);\n return parseGeometryValue(value, encoding);\n },\n });\n },\n};\n"]}
|
|
@@ -11,6 +11,8 @@ export type WKBHeader = {
|
|
|
11
11
|
coordBytes: number;
|
|
12
12
|
};
|
|
13
13
|
export type WKBPolygonCoordinateVisitor = {
|
|
14
|
+
/** Called once per polygon part. Used when visiting MultiPolygon. */
|
|
15
|
+
onPolygonStart?: () => void;
|
|
14
16
|
onRingStart: () => void;
|
|
15
17
|
onCoordinate: (x: number, y: number) => void;
|
|
16
18
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wkbParser.d.ts","sourceRoot":"","sources":["../../src/prepare/wkbParser.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,SAAS,IAAI,CAAC;AAC3B,eAAO,MAAM,cAAc,IAAI,CAAC;AAChC,eAAO,MAAM,WAAW,IAAI,CAAC;AAC7B,eAAO,MAAM,mBAAmB,IAAI,CAAC;AACrC,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAyBlC,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG;IACxC,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,YAAY,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9C,CAAC;AAIF,wBAAgB,cAAc,CAC5B,GAAG,EAAE,WAAW,EAChB,WAAW,SAAI,GACd,SAAS,GAAG,IAAI,CA2BlB;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,SAAS,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAYzE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,WAAW,EAChB,MAAM,EAAE,SAAS,GAChB,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,IAAI,CAkBhC;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CACtC,GAAG,EAAE,WAAW,EAChB,MAAM,EAAE,SAAS,GAChB,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,IAAI,CAYhC;AAED,wBAAgB,0BAA0B,CACxC,GAAG,EAAE,WAAW,EAChB,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,2BAA2B,GACnC,MAAM,GAAG,IAAI,CAyBf;AAED,wBAAgB,+BAA+B,CAC7C,GAAG,EAAE,WAAW,EAChB,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,2BAA2B,GACnC,OAAO,
|
|
1
|
+
{"version":3,"file":"wkbParser.d.ts","sourceRoot":"","sources":["../../src/prepare/wkbParser.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,SAAS,IAAI,CAAC;AAC3B,eAAO,MAAM,cAAc,IAAI,CAAC;AAChC,eAAO,MAAM,WAAW,IAAI,CAAC;AAC7B,eAAO,MAAM,mBAAmB,IAAI,CAAC;AACrC,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAyBlC,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG;IACxC,qEAAqE;IACrE,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;IAC5B,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,YAAY,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9C,CAAC;AAIF,wBAAgB,cAAc,CAC5B,GAAG,EAAE,WAAW,EAChB,WAAW,SAAI,GACd,SAAS,GAAG,IAAI,CA2BlB;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,SAAS,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAYzE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,WAAW,EAChB,MAAM,EAAE,SAAS,GAChB,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,IAAI,CAkBhC;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CACtC,GAAG,EAAE,WAAW,EAChB,MAAM,EAAE,SAAS,GAChB,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,IAAI,CAYhC;AAED,wBAAgB,0BAA0B,CACxC,GAAG,EAAE,WAAW,EAChB,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,2BAA2B,GACnC,MAAM,GAAG,IAAI,CAyBf;AAED,wBAAgB,+BAA+B,CAC7C,GAAG,EAAE,WAAW,EAChB,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,2BAA2B,GACnC,OAAO,CAkBT"}
|
|
@@ -144,6 +144,7 @@ export function visitWKBMultiPolygonCoordinates(buf, header, visitor) {
|
|
|
144
144
|
const polygonHeader = parseWKBHeader(buf, offset);
|
|
145
145
|
if (!polygonHeader || polygonHeader.geomType !== WKB_POLYGON)
|
|
146
146
|
return false;
|
|
147
|
+
visitor.onPolygonStart?.();
|
|
147
148
|
const nextOffset = visitWKBPolygonCoordinates(buf, polygonHeader, visitor);
|
|
148
149
|
if (nextOffset == null)
|
|
149
150
|
return false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wkbParser.js","sourceRoot":"","sources":["../../src/prepare/wkbParser.ts"],"names":[],"mappings":"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","sourcesContent":["export const WKB_POINT = 1;\nexport const WKB_LINESTRING = 2;\nexport const WKB_POLYGON = 3;\nexport const WKB_MULTILINESTRING = 5;\nexport const WKB_MULTIPOLYGON = 6;\n\n// Local WKB parser used until geoarrow-js ships WKB to GeoArrow parsing:\n// See: https://github.com/geoarrow/geoarrow-js/issues/54\nconst WKB_BYTE_ORDER_BYTES = 1;\nconst WKB_GEOMETRY_TYPE_BYTES = 4;\nconst WKB_HEADER_BYTES = WKB_BYTE_ORDER_BYTES + WKB_GEOMETRY_TYPE_BYTES;\nconst WKB_GEOMETRY_TYPE_OFFSET = WKB_BYTE_ORDER_BYTES;\nconst WKB_SRID_BYTES = 4;\nconst WKB_UINT32_BYTES = 4;\nconst XY_COORDINATE_BYTES = 16;\nconst OPTIONAL_COORDINATE_DIMENSION_BYTES = 8;\nconst Y_COORDINATE_OFFSET_BYTES = 8;\n\n// PostGIS EWKB stores Z/M/SRID metadata in the high bits\n// of the WKB type word.\nconst EWKB_Z_FLAG = 0x80000000;\nconst EWKB_M_FLAG = 0x40000000;\nconst EWKB_SRID_FLAG = 0x20000000;\nconst ISO_WKB_TYPE_MASK = 0xffff;\nconst ISO_WKB_Z_OFFSET = 1000;\nconst ISO_WKB_M_OFFSET = 2000;\nconst ISO_WKB_ZM_OFFSET = 3000;\nconst ISO_WKB_MAX_BASE_TYPE = 7;\n\nexport type WKBHeader = {\n view: DataView;\n isLE: boolean;\n geomType: number;\n offset: number;\n coordBytes: number;\n};\n\nexport type WKBPolygonCoordinateVisitor = {\n onRingStart: () => void;\n onCoordinate: (x: number, y: number) => void;\n};\n\n// Reads the shared WKB/EWKB prefix like byte order, geometry type, optional SRID\n// and bytes per coordinate. Point/polygon readers use this to find their data.\nexport function parseWKBHeader(\n buf: ArrayBuffer,\n startOffset = 0,\n): WKBHeader | null {\n if (buf.byteLength < startOffset + WKB_HEADER_BYTES) return null;\n const view = new DataView(buf);\n const isLE = view.getUint8(startOffset) === 1;\n const rawType = view.getUint32(startOffset + WKB_GEOMETRY_TYPE_OFFSET, isLE);\n const isoType = rawType & ISO_WKB_TYPE_MASK;\n const isoZ = hasIsoWKBTypeOffset(isoType, ISO_WKB_Z_OFFSET);\n const isoM = hasIsoWKBTypeOffset(isoType, ISO_WKB_M_OFFSET);\n const isoZM = hasIsoWKBTypeOffset(isoType, ISO_WKB_ZM_OFFSET);\n\n const hasZ = (rawType & EWKB_Z_FLAG) !== 0 || isoZ || isoZM;\n const hasM = (rawType & EWKB_M_FLAG) !== 0 || isoM || isoZM;\n const hasSRID = (rawType & EWKB_SRID_FLAG) !== 0;\n\n let base = isoType;\n if (isoZM) base -= ISO_WKB_ZM_OFFSET;\n else if (isoM) base -= ISO_WKB_M_OFFSET;\n else if (isoZ) base -= ISO_WKB_Z_OFFSET;\n\n let offset = startOffset + WKB_HEADER_BYTES;\n if (hasSRID) offset += WKB_SRID_BYTES;\n\n const coordBytes =\n XY_COORDINATE_BYTES +\n (hasZ ? OPTIONAL_COORDINATE_DIMENSION_BYTES : 0) +\n (hasM ? OPTIONAL_COORDINATE_DIMENSION_BYTES : 0);\n return {view, isLE, geomType: base, offset, coordBytes};\n}\n\nexport function readWKBPointXY(header: WKBHeader): [number, number] | null {\n if (header.geomType !== WKB_POINT) return null;\n if (!hasBytes(header.view.buffer, header.offset, header.coordBytes)) {\n return null;\n }\n return [\n header.view.getFloat64(header.offset, header.isLE),\n header.view.getFloat64(\n header.offset + Y_COORDINATE_OFFSET_BYTES,\n header.isLE,\n ),\n ];\n}\n\n/**\n * Reads a WKB LineString and returns an array of [x, y] coordinate pairs.\n */\nexport function readWKBLineStringXY(\n buf: ArrayBuffer,\n header: WKBHeader,\n): Array<[number, number]> | null {\n if (header.geomType !== WKB_LINESTRING) return null;\n\n const {view, isLE, offset: headerOffset, coordBytes} = header;\n let offset = headerOffset;\n if (!hasBytes(buf, offset, WKB_UINT32_BYTES)) return null;\n const numPoints = view.getUint32(offset, isLE);\n offset += WKB_UINT32_BYTES;\n\n const coords: Array<[number, number]> = [];\n for (let i = 0; i < numPoints; i++) {\n if (!hasBytes(buf, offset, coordBytes)) return null;\n const x = view.getFloat64(offset, isLE);\n const y = view.getFloat64(offset + Y_COORDINATE_OFFSET_BYTES, isLE);\n coords.push([x, y]);\n offset += coordBytes;\n }\n return coords;\n}\n\n/**\n * Reads a WKB MultiLineString with a single part as one coordinate sequence\n * for PathLayer. Multi-part MultiLineStrings are rejected — flattening would\n * draw artificial segments between disjoint parts.\n */\nexport function readWKBMultiLineStringXY(\n buf: ArrayBuffer,\n header: WKBHeader,\n): Array<[number, number]> | null {\n if (header.geomType !== WKB_MULTILINESTRING) return null;\n\n let offset = header.offset;\n if (!hasBytes(buf, offset, WKB_UINT32_BYTES)) return null;\n const numLines = header.view.getUint32(offset, header.isLE);\n offset += WKB_UINT32_BYTES;\n if (numLines !== 1) return null;\n\n const lineHeader = parseWKBHeader(buf, offset);\n if (!lineHeader || lineHeader.geomType !== WKB_LINESTRING) return null;\n return readWKBLineStringXY(buf, lineHeader);\n}\n\nexport function visitWKBPolygonCoordinates(\n buf: ArrayBuffer,\n header: WKBHeader,\n visitor: WKBPolygonCoordinateVisitor,\n): number | null {\n if (header.geomType !== WKB_POLYGON) return null;\n\n const {view, isLE, offset: headerOffset, coordBytes} = header;\n let offset = headerOffset;\n if (!hasBytes(buf, offset, WKB_UINT32_BYTES)) return null;\n const numRings = view.getUint32(offset, isLE);\n offset += WKB_UINT32_BYTES;\n\n for (let ringIndex = 0; ringIndex < numRings; ringIndex++) {\n visitor.onRingStart();\n if (!hasBytes(buf, offset, WKB_UINT32_BYTES)) return null;\n const numPoints = view.getUint32(offset, isLE);\n offset += WKB_UINT32_BYTES;\n for (let pointIndex = 0; pointIndex < numPoints; pointIndex++) {\n if (!hasBytes(buf, offset, coordBytes)) return null;\n visitor.onCoordinate(\n view.getFloat64(offset, isLE),\n view.getFloat64(offset + Y_COORDINATE_OFFSET_BYTES, isLE),\n );\n offset += coordBytes;\n }\n }\n\n return offset <= buf.byteLength ? offset : null;\n}\n\nexport function visitWKBMultiPolygonCoordinates(\n buf: ArrayBuffer,\n header: WKBHeader,\n visitor: WKBPolygonCoordinateVisitor,\n): boolean {\n if (header.geomType !== WKB_MULTIPOLYGON) return false;\n\n let offset = header.offset;\n if (!hasBytes(buf, offset, WKB_UINT32_BYTES)) return false;\n const numPolygons = header.view.getUint32(offset, header.isLE);\n offset += WKB_UINT32_BYTES;\n\n for (let polygonIndex = 0; polygonIndex < numPolygons; polygonIndex++) {\n const polygonHeader = parseWKBHeader(buf, offset);\n if (!polygonHeader || polygonHeader.geomType !== WKB_POLYGON) return false;\n const nextOffset = visitWKBPolygonCoordinates(buf, polygonHeader, visitor);\n if (nextOffset == null) return false;\n offset = nextOffset;\n }\n\n return offset <= buf.byteLength;\n}\n\nfunction hasIsoWKBTypeOffset(isoType: number, offset: number): boolean {\n return isoType >= offset && isoType <= offset + ISO_WKB_MAX_BASE_TYPE;\n}\n\nfunction hasBytes(\n buf: {byteLength: number},\n offset: number,\n byteLength: number,\n) {\n return offset >= 0 && offset + byteLength <= buf.byteLength;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"wkbParser.js","sourceRoot":"","sources":["../../src/prepare/wkbParser.ts"],"names":[],"mappings":"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","sourcesContent":["export const WKB_POINT = 1;\nexport const WKB_LINESTRING = 2;\nexport const WKB_POLYGON = 3;\nexport const WKB_MULTILINESTRING = 5;\nexport const WKB_MULTIPOLYGON = 6;\n\n// Local WKB parser used until geoarrow-js ships WKB to GeoArrow parsing:\n// See: https://github.com/geoarrow/geoarrow-js/issues/54\nconst WKB_BYTE_ORDER_BYTES = 1;\nconst WKB_GEOMETRY_TYPE_BYTES = 4;\nconst WKB_HEADER_BYTES = WKB_BYTE_ORDER_BYTES + WKB_GEOMETRY_TYPE_BYTES;\nconst WKB_GEOMETRY_TYPE_OFFSET = WKB_BYTE_ORDER_BYTES;\nconst WKB_SRID_BYTES = 4;\nconst WKB_UINT32_BYTES = 4;\nconst XY_COORDINATE_BYTES = 16;\nconst OPTIONAL_COORDINATE_DIMENSION_BYTES = 8;\nconst Y_COORDINATE_OFFSET_BYTES = 8;\n\n// PostGIS EWKB stores Z/M/SRID metadata in the high bits\n// of the WKB type word.\nconst EWKB_Z_FLAG = 0x80000000;\nconst EWKB_M_FLAG = 0x40000000;\nconst EWKB_SRID_FLAG = 0x20000000;\nconst ISO_WKB_TYPE_MASK = 0xffff;\nconst ISO_WKB_Z_OFFSET = 1000;\nconst ISO_WKB_M_OFFSET = 2000;\nconst ISO_WKB_ZM_OFFSET = 3000;\nconst ISO_WKB_MAX_BASE_TYPE = 7;\n\nexport type WKBHeader = {\n view: DataView;\n isLE: boolean;\n geomType: number;\n offset: number;\n coordBytes: number;\n};\n\nexport type WKBPolygonCoordinateVisitor = {\n /** Called once per polygon part. Used when visiting MultiPolygon. */\n onPolygonStart?: () => void;\n onRingStart: () => void;\n onCoordinate: (x: number, y: number) => void;\n};\n\n// Reads the shared WKB/EWKB prefix like byte order, geometry type, optional SRID\n// and bytes per coordinate. Point/polygon readers use this to find their data.\nexport function parseWKBHeader(\n buf: ArrayBuffer,\n startOffset = 0,\n): WKBHeader | null {\n if (buf.byteLength < startOffset + WKB_HEADER_BYTES) return null;\n const view = new DataView(buf);\n const isLE = view.getUint8(startOffset) === 1;\n const rawType = view.getUint32(startOffset + WKB_GEOMETRY_TYPE_OFFSET, isLE);\n const isoType = rawType & ISO_WKB_TYPE_MASK;\n const isoZ = hasIsoWKBTypeOffset(isoType, ISO_WKB_Z_OFFSET);\n const isoM = hasIsoWKBTypeOffset(isoType, ISO_WKB_M_OFFSET);\n const isoZM = hasIsoWKBTypeOffset(isoType, ISO_WKB_ZM_OFFSET);\n\n const hasZ = (rawType & EWKB_Z_FLAG) !== 0 || isoZ || isoZM;\n const hasM = (rawType & EWKB_M_FLAG) !== 0 || isoM || isoZM;\n const hasSRID = (rawType & EWKB_SRID_FLAG) !== 0;\n\n let base = isoType;\n if (isoZM) base -= ISO_WKB_ZM_OFFSET;\n else if (isoM) base -= ISO_WKB_M_OFFSET;\n else if (isoZ) base -= ISO_WKB_Z_OFFSET;\n\n let offset = startOffset + WKB_HEADER_BYTES;\n if (hasSRID) offset += WKB_SRID_BYTES;\n\n const coordBytes =\n XY_COORDINATE_BYTES +\n (hasZ ? OPTIONAL_COORDINATE_DIMENSION_BYTES : 0) +\n (hasM ? OPTIONAL_COORDINATE_DIMENSION_BYTES : 0);\n return {view, isLE, geomType: base, offset, coordBytes};\n}\n\nexport function readWKBPointXY(header: WKBHeader): [number, number] | null {\n if (header.geomType !== WKB_POINT) return null;\n if (!hasBytes(header.view.buffer, header.offset, header.coordBytes)) {\n return null;\n }\n return [\n header.view.getFloat64(header.offset, header.isLE),\n header.view.getFloat64(\n header.offset + Y_COORDINATE_OFFSET_BYTES,\n header.isLE,\n ),\n ];\n}\n\n/**\n * Reads a WKB LineString and returns an array of [x, y] coordinate pairs.\n */\nexport function readWKBLineStringXY(\n buf: ArrayBuffer,\n header: WKBHeader,\n): Array<[number, number]> | null {\n if (header.geomType !== WKB_LINESTRING) return null;\n\n const {view, isLE, offset: headerOffset, coordBytes} = header;\n let offset = headerOffset;\n if (!hasBytes(buf, offset, WKB_UINT32_BYTES)) return null;\n const numPoints = view.getUint32(offset, isLE);\n offset += WKB_UINT32_BYTES;\n\n const coords: Array<[number, number]> = [];\n for (let i = 0; i < numPoints; i++) {\n if (!hasBytes(buf, offset, coordBytes)) return null;\n const x = view.getFloat64(offset, isLE);\n const y = view.getFloat64(offset + Y_COORDINATE_OFFSET_BYTES, isLE);\n coords.push([x, y]);\n offset += coordBytes;\n }\n return coords;\n}\n\n/**\n * Reads a WKB MultiLineString with a single part as one coordinate sequence\n * for PathLayer. Multi-part MultiLineStrings are rejected — flattening would\n * draw artificial segments between disjoint parts.\n */\nexport function readWKBMultiLineStringXY(\n buf: ArrayBuffer,\n header: WKBHeader,\n): Array<[number, number]> | null {\n if (header.geomType !== WKB_MULTILINESTRING) return null;\n\n let offset = header.offset;\n if (!hasBytes(buf, offset, WKB_UINT32_BYTES)) return null;\n const numLines = header.view.getUint32(offset, header.isLE);\n offset += WKB_UINT32_BYTES;\n if (numLines !== 1) return null;\n\n const lineHeader = parseWKBHeader(buf, offset);\n if (!lineHeader || lineHeader.geomType !== WKB_LINESTRING) return null;\n return readWKBLineStringXY(buf, lineHeader);\n}\n\nexport function visitWKBPolygonCoordinates(\n buf: ArrayBuffer,\n header: WKBHeader,\n visitor: WKBPolygonCoordinateVisitor,\n): number | null {\n if (header.geomType !== WKB_POLYGON) return null;\n\n const {view, isLE, offset: headerOffset, coordBytes} = header;\n let offset = headerOffset;\n if (!hasBytes(buf, offset, WKB_UINT32_BYTES)) return null;\n const numRings = view.getUint32(offset, isLE);\n offset += WKB_UINT32_BYTES;\n\n for (let ringIndex = 0; ringIndex < numRings; ringIndex++) {\n visitor.onRingStart();\n if (!hasBytes(buf, offset, WKB_UINT32_BYTES)) return null;\n const numPoints = view.getUint32(offset, isLE);\n offset += WKB_UINT32_BYTES;\n for (let pointIndex = 0; pointIndex < numPoints; pointIndex++) {\n if (!hasBytes(buf, offset, coordBytes)) return null;\n visitor.onCoordinate(\n view.getFloat64(offset, isLE),\n view.getFloat64(offset + Y_COORDINATE_OFFSET_BYTES, isLE),\n );\n offset += coordBytes;\n }\n }\n\n return offset <= buf.byteLength ? offset : null;\n}\n\nexport function visitWKBMultiPolygonCoordinates(\n buf: ArrayBuffer,\n header: WKBHeader,\n visitor: WKBPolygonCoordinateVisitor,\n): boolean {\n if (header.geomType !== WKB_MULTIPOLYGON) return false;\n\n let offset = header.offset;\n if (!hasBytes(buf, offset, WKB_UINT32_BYTES)) return false;\n const numPolygons = header.view.getUint32(offset, header.isLE);\n offset += WKB_UINT32_BYTES;\n\n for (let polygonIndex = 0; polygonIndex < numPolygons; polygonIndex++) {\n const polygonHeader = parseWKBHeader(buf, offset);\n if (!polygonHeader || polygonHeader.geomType !== WKB_POLYGON) return false;\n visitor.onPolygonStart?.();\n const nextOffset = visitWKBPolygonCoordinates(buf, polygonHeader, visitor);\n if (nextOffset == null) return false;\n offset = nextOffset;\n }\n\n return offset <= buf.byteLength;\n}\n\nfunction hasIsoWKBTypeOffset(isoType: number, offset: number): boolean {\n return isoType >= offset && isoType <= offset + ISO_WKB_MAX_BASE_TYPE;\n}\n\nfunction hasBytes(\n buf: {byteLength: number},\n offset: number,\n byteLength: number,\n) {\n return offset >= 0 && offset + byteLength <= buf.byteLength;\n}\n"]}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { ResolvedTheme } from '@sqlrooms/ui';
|
|
2
|
+
import type { StyleSpecification } from 'maplibre-gl';
|
|
3
|
+
import type { DeckMapBasemapProvider } from './basemap';
|
|
4
|
+
/** Supported Protomaps palettes: light, dark, white, black, and grayscale. */
|
|
5
|
+
export type ProtomapsFlavor = 'light' | 'dark' | 'white' | 'black' | 'grayscale';
|
|
6
|
+
/**
|
|
7
|
+
* Creates a MapLibre style using the hosted Protomaps v4 vector tiles API.
|
|
8
|
+
* The browser-visible API key should be scoped to the host application's origins.
|
|
9
|
+
*/
|
|
10
|
+
export declare function createProtomapsStyle(flavor: ProtomapsFlavor, apiKey: string): StyleSpecification;
|
|
11
|
+
/** Creates neutral light/dark Protomaps basemap styles. */
|
|
12
|
+
export declare function createProtomapsDefaultStyles(apiKey: string): Record<ResolvedTheme, StyleSpecification>;
|
|
13
|
+
/**
|
|
14
|
+
* Creates a cached Protomaps provider for createDeckMapsSlice or DeckJsonMap.
|
|
15
|
+
* A missing/blank key returns no style, allowing the default basemaps to load.
|
|
16
|
+
*/
|
|
17
|
+
export declare function createProtomapsBasemapProvider(apiKey?: string): DeckMapBasemapProvider;
|
|
18
|
+
//# sourceMappingURL=protomapsStyles.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protomapsStyles.d.ts","sourceRoot":"","sources":["../src/protomapsStyles.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,cAAc,CAAC;AAChD,OAAO,KAAK,EAAC,kBAAkB,EAAC,MAAM,aAAa,CAAC;AACpD,OAAO,KAAK,EAAC,sBAAsB,EAAC,MAAM,WAAW,CAAC;AAEtD,8EAA8E;AAC9E,MAAM,MAAM,eAAe,GACvB,OAAO,GACP,MAAM,GACN,OAAO,GACP,OAAO,GACP,WAAW,CAAC;AAEhB;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,eAAe,EACvB,MAAM,EAAE,MAAM,GACb,kBAAkB,CAiBpB;AAED,2DAA2D;AAC3D,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,MAAM,GACb,MAAM,CAAC,aAAa,EAAE,kBAAkB,CAAC,CAK3C;AAED;;;GAGG;AACH,wBAAgB,8BAA8B,CAC5C,MAAM,CAAC,EAAE,MAAM,GACd,sBAAsB,CAIxB"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { layers, namedFlavor } from '@protomaps/basemaps';
|
|
2
|
+
/**
|
|
3
|
+
* Creates a MapLibre style using the hosted Protomaps v4 vector tiles API.
|
|
4
|
+
* The browser-visible API key should be scoped to the host application's origins.
|
|
5
|
+
*/
|
|
6
|
+
export function createProtomapsStyle(flavor, apiKey) {
|
|
7
|
+
return {
|
|
8
|
+
version: 8,
|
|
9
|
+
glyphs: 'https://protomaps.github.io/basemaps-assets/fonts/{fontstack}/{range}.pbf',
|
|
10
|
+
sprite: `https://protomaps.github.io/basemaps-assets/sprites/v4/${flavor}`,
|
|
11
|
+
sources: {
|
|
12
|
+
protomaps: {
|
|
13
|
+
type: 'vector',
|
|
14
|
+
url: `https://api.protomaps.com/tiles/v4.json?key=${encodeURIComponent(apiKey)}`,
|
|
15
|
+
attribution: '<a href="https://protomaps.com">Protomaps</a> ' +
|
|
16
|
+
'© <a href="https://openstreetmap.org">OpenStreetMap</a>',
|
|
17
|
+
},
|
|
18
|
+
},
|
|
19
|
+
layers: layers('protomaps', namedFlavor(flavor), { lang: 'en' }),
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
/** Creates neutral light/dark Protomaps basemap styles. */
|
|
23
|
+
export function createProtomapsDefaultStyles(apiKey) {
|
|
24
|
+
return {
|
|
25
|
+
light: createProtomapsStyle('white', apiKey),
|
|
26
|
+
dark: createProtomapsStyle('black', apiKey),
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Creates a cached Protomaps provider for createDeckMapsSlice or DeckJsonMap.
|
|
31
|
+
* A missing/blank key returns no style, allowing the default basemaps to load.
|
|
32
|
+
*/
|
|
33
|
+
export function createProtomapsBasemapProvider(apiKey) {
|
|
34
|
+
const key = apiKey?.trim();
|
|
35
|
+
const styles = key ? createProtomapsDefaultStyles(key) : undefined;
|
|
36
|
+
return (theme) => styles?.[theme];
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=protomapsStyles.js.map
|