@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.
Files changed (154) hide show
  1. package/README.md +193 -35
  2. package/dist/BlockMapSettings.d.ts.map +1 -1
  3. package/dist/BlockMapSettings.js +4 -16
  4. package/dist/BlockMapSettings.js.map +1 -1
  5. package/dist/DashboardMapSettings.d.ts.map +1 -1
  6. package/dist/DashboardMapSettings.js +7 -10
  7. package/dist/DashboardMapSettings.js.map +1 -1
  8. package/dist/DeckJsonMap.d.ts.map +1 -1
  9. package/dist/DeckJsonMap.js +75 -23
  10. package/dist/DeckJsonMap.js.map +1 -1
  11. package/dist/DeckJsonMapSpec.d.ts +41 -0
  12. package/dist/DeckJsonMapSpec.d.ts.map +1 -1
  13. package/dist/DeckJsonMapSpec.js +2 -0
  14. package/dist/DeckJsonMapSpec.js.map +1 -1
  15. package/dist/DeckMapBasemapSelect.d.ts +9 -0
  16. package/dist/DeckMapBasemapSelect.d.ts.map +1 -0
  17. package/dist/DeckMapBasemapSelect.js +20 -0
  18. package/dist/DeckMapBasemapSelect.js.map +1 -0
  19. package/dist/DeckMapDefaultStylesProvider.d.ts +13 -19
  20. package/dist/DeckMapDefaultStylesProvider.d.ts.map +1 -1
  21. package/dist/DeckMapDefaultStylesProvider.js +11 -18
  22. package/dist/DeckMapDefaultStylesProvider.js.map +1 -1
  23. package/dist/DeckMapSurface.d.ts +1 -1
  24. package/dist/DeckMapSurface.js +1 -1
  25. package/dist/DeckMapSurface.js.map +1 -1
  26. package/dist/DeckMapsSlice.d.ts +5 -0
  27. package/dist/DeckMapsSlice.d.ts.map +1 -1
  28. package/dist/DeckMapsSlice.js +6 -3
  29. package/dist/DeckMapsSlice.js.map +1 -1
  30. package/dist/MapSettings.d.ts +14 -0
  31. package/dist/MapSettings.d.ts.map +1 -1
  32. package/dist/MapSettings.js +548 -192
  33. package/dist/MapSettings.js.map +1 -1
  34. package/dist/MapSettingsControls.d.ts +8 -1
  35. package/dist/MapSettingsControls.d.ts.map +1 -1
  36. package/dist/MapSettingsControls.js +24 -2
  37. package/dist/MapSettingsControls.js.map +1 -1
  38. package/dist/ai.d.ts.map +1 -1
  39. package/dist/ai.js +20 -12
  40. package/dist/ai.js.map +1 -1
  41. package/dist/aiNormalize.d.ts.map +1 -1
  42. package/dist/aiNormalize.js +2 -1
  43. package/dist/aiNormalize.js.map +1 -1
  44. package/dist/basemap.d.ts +23 -0
  45. package/dist/basemap.d.ts.map +1 -0
  46. package/dist/basemap.js +23 -0
  47. package/dist/basemap.js.map +1 -0
  48. package/dist/block.d.ts +1 -1
  49. package/dist/block.d.ts.map +1 -1
  50. package/dist/block.js +13 -9
  51. package/dist/block.js.map +1 -1
  52. package/dist/createOrUpdateDeckMapResource.d.ts +6 -2
  53. package/dist/createOrUpdateDeckMapResource.d.ts.map +1 -1
  54. package/dist/createOrUpdateDeckMapResource.js +57 -4
  55. package/dist/createOrUpdateDeckMapResource.js.map +1 -1
  56. package/dist/datasets/PreparedDatasetStore.d.ts +3 -4
  57. package/dist/datasets/PreparedDatasetStore.d.ts.map +1 -1
  58. package/dist/datasets/PreparedDatasetStore.js +4 -8
  59. package/dist/datasets/PreparedDatasetStore.js.map +1 -1
  60. package/dist/datasets/helpers.d.ts +39 -2
  61. package/dist/datasets/helpers.d.ts.map +1 -1
  62. package/dist/datasets/helpers.js +86 -3
  63. package/dist/datasets/helpers.js.map +1 -1
  64. package/dist/datasets/usePreparedDatasetStates.d.ts.map +1 -1
  65. package/dist/datasets/usePreparedDatasetStates.js +12 -8
  66. package/dist/datasets/usePreparedDatasetStates.js.map +1 -1
  67. package/dist/index.d.ts +6 -3
  68. package/dist/index.d.ts.map +1 -1
  69. package/dist/index.js +5 -2
  70. package/dist/index.js.map +1 -1
  71. package/dist/json/colorScaleFunction.d.ts +12 -4
  72. package/dist/json/colorScaleFunction.d.ts.map +1 -1
  73. package/dist/json/colorScaleFunction.js.map +1 -1
  74. package/dist/json/compileColorScale.d.ts +3 -2
  75. package/dist/json/compileColorScale.d.ts.map +1 -1
  76. package/dist/json/compileColorScale.js +16 -1
  77. package/dist/json/compileColorScale.js.map +1 -1
  78. package/dist/json/createDeckJsonConfiguration.d.ts.map +1 -1
  79. package/dist/json/createDeckJsonConfiguration.js +235 -175
  80. package/dist/json/createDeckJsonConfiguration.js.map +1 -1
  81. package/dist/json/defaultClasses.d.ts.map +1 -1
  82. package/dist/json/defaultClasses.js +3 -3
  83. package/dist/json/defaultClasses.js.map +1 -1
  84. package/dist/json/extractColorScaleLegends.d.ts.map +1 -1
  85. package/dist/json/extractColorScaleLegends.js +41 -26
  86. package/dist/json/extractColorScaleLegends.js.map +1 -1
  87. package/dist/json/heatmapDefaults.d.ts +17 -7
  88. package/dist/json/heatmapDefaults.d.ts.map +1 -1
  89. package/dist/json/heatmapDefaults.js +54 -12
  90. package/dist/json/heatmapDefaults.js.map +1 -1
  91. package/dist/json/layers/DeckHeatmapLayer.d.ts +32 -0
  92. package/dist/json/layers/DeckHeatmapLayer.d.ts.map +1 -0
  93. package/dist/json/layers/DeckHeatmapLayer.js +69 -0
  94. package/dist/json/layers/DeckHeatmapLayer.js.map +1 -0
  95. package/dist/json/layers/index.d.ts +1 -0
  96. package/dist/json/layers/index.d.ts.map +1 -1
  97. package/dist/json/layers/index.js +1 -0
  98. package/dist/json/layers/index.js.map +1 -1
  99. package/dist/json/rewriteGeoArrowAccessors.d.ts.map +1 -1
  100. package/dist/json/rewriteGeoArrowAccessors.js +13 -5
  101. package/dist/json/rewriteGeoArrowAccessors.js.map +1 -1
  102. package/dist/json/scaleFunction.d.ts +5 -8
  103. package/dist/json/scaleFunction.d.ts.map +1 -1
  104. package/dist/json/scaleFunction.js +30 -5
  105. package/dist/json/scaleFunction.js.map +1 -1
  106. package/dist/mapAiConfig.d.ts +6 -0
  107. package/dist/mapAiConfig.d.ts.map +1 -1
  108. package/dist/mapAiConfig.js +7 -0
  109. package/dist/mapAiConfig.js.map +1 -1
  110. package/dist/mapAiSharedInstructions.d.ts +1 -1
  111. package/dist/mapAiSharedInstructions.d.ts.map +1 -1
  112. package/dist/mapAiSharedInstructions.js +4 -3
  113. package/dist/mapAiSharedInstructions.js.map +1 -1
  114. package/dist/mapConfig.d.ts +6 -1
  115. package/dist/mapConfig.d.ts.map +1 -1
  116. package/dist/mapConfig.js +28 -3
  117. package/dist/mapConfig.js.map +1 -1
  118. package/dist/mapConfigUtils.d.ts +22 -0
  119. package/dist/mapConfigUtils.d.ts.map +1 -1
  120. package/dist/mapConfigUtils.js +152 -5
  121. package/dist/mapConfigUtils.js.map +1 -1
  122. package/dist/mapLayerConfigUtils.d.ts +55 -0
  123. package/dist/mapLayerConfigUtils.d.ts.map +1 -1
  124. package/dist/mapLayerConfigUtils.js +222 -11
  125. package/dist/mapLayerConfigUtils.js.map +1 -1
  126. package/dist/mapResourceAuthoring.d.ts +1 -1
  127. package/dist/mapResourceAuthoring.d.ts.map +1 -1
  128. package/dist/mapResourceAuthoring.js +14 -7
  129. package/dist/mapResourceAuthoring.js.map +1 -1
  130. package/dist/mapStyles.d.ts +16 -0
  131. package/dist/mapStyles.d.ts.map +1 -0
  132. package/dist/mapStyles.js +32 -0
  133. package/dist/mapStyles.js.map +1 -0
  134. package/dist/prepare/prepareDeckDataset.d.ts.map +1 -1
  135. package/dist/prepare/prepareDeckDataset.js +1 -0
  136. package/dist/prepare/prepareDeckDataset.js.map +1 -1
  137. package/dist/prepare/types.d.ts +3 -0
  138. package/dist/prepare/types.d.ts.map +1 -1
  139. package/dist/prepare/types.js.map +1 -1
  140. package/dist/prepare/wkbDecoder.d.ts.map +1 -1
  141. package/dist/prepare/wkbDecoder.js +62 -16
  142. package/dist/prepare/wkbDecoder.js.map +1 -1
  143. package/dist/prepare/wkbParser.d.ts +2 -0
  144. package/dist/prepare/wkbParser.d.ts.map +1 -1
  145. package/dist/prepare/wkbParser.js +1 -0
  146. package/dist/prepare/wkbParser.js.map +1 -1
  147. package/dist/protomapsStyles.d.ts +18 -0
  148. package/dist/protomapsStyles.d.ts.map +1 -0
  149. package/dist/protomapsStyles.js +38 -0
  150. package/dist/protomapsStyles.js.map +1 -0
  151. package/dist/types.d.ts +13 -0
  152. package/dist/types.d.ts.map +1 -1
  153. package/dist/types.js.map +1 -1
  154. 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,CA4ErB"}
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"]}
@@ -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;AAmYjB,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,eAoFhC,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 polygonOffsets = new Int32Array(n + 1);
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
- polygonOffsets[i] = ringOffsetsList.length;
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
- appendPolygonCoordinates(geom.coordinates, ringOffsetsList, xyList);
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
- polygonOffsets[n] = ringOffsetsList.length;
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 flatCoords = new Float64Array(xyList);
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: flatCoords,
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: polygonOffsets,
215
- child: ringData,
260
+ valueOffsets: rowPolygonOffsets,
261
+ child: polyData,
216
262
  });
217
- return buildPromotedResult(table, columnName, new Vector([polyData]), 'geoarrow.polygon');
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 only Polygon rows.` +
345
- ` Use GeoJsonLayer for MultiPolygon or mixed geometry columns, or filter with` +
346
- ` WHERE ST_GeometryType(geom) = 'POLYGON'.`);
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,CAiBT"}
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