@sqlrooms/deck 0.29.0-rc.10 → 0.29.0-rc.12

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 (173) hide show
  1. package/README.md +88 -16
  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 +20 -18
  10. package/dist/DeckJsonMap.js.map +1 -1
  11. package/dist/DeckJsonMapSpec.d.ts +916 -53
  12. package/dist/DeckJsonMapSpec.d.ts.map +1 -1
  13. package/dist/DeckJsonMapSpec.js +9 -0
  14. package/dist/DeckJsonMapSpec.js.map +1 -1
  15. package/dist/DeckMapDefaultStylesProvider.d.ts +3 -4
  16. package/dist/DeckMapDefaultStylesProvider.d.ts.map +1 -1
  17. package/dist/DeckMapDefaultStylesProvider.js +13 -7
  18. package/dist/DeckMapDefaultStylesProvider.js.map +1 -1
  19. package/dist/DeckMapSurface.d.ts +1 -1
  20. package/dist/DeckMapSurface.js +1 -1
  21. package/dist/DeckMapSurface.js.map +1 -1
  22. package/dist/MapSettings.d.ts +14 -0
  23. package/dist/MapSettings.d.ts.map +1 -1
  24. package/dist/MapSettings.js +555 -186
  25. package/dist/MapSettings.js.map +1 -1
  26. package/dist/MapSettingsControls.d.ts +8 -1
  27. package/dist/MapSettingsControls.d.ts.map +1 -1
  28. package/dist/MapSettingsControls.js +24 -2
  29. package/dist/MapSettingsControls.js.map +1 -1
  30. package/dist/ai.d.ts +19 -5
  31. package/dist/ai.d.ts.map +1 -1
  32. package/dist/ai.js +63 -112
  33. package/dist/ai.js.map +1 -1
  34. package/dist/aiNormalize.d.ts +31 -0
  35. package/dist/aiNormalize.d.ts.map +1 -0
  36. package/dist/aiNormalize.js +630 -0
  37. package/dist/aiNormalize.js.map +1 -0
  38. package/dist/block.d.ts +1 -1
  39. package/dist/block.d.ts.map +1 -1
  40. package/dist/block.js +1 -1
  41. package/dist/block.js.map +1 -1
  42. package/dist/createOrUpdateDeckMapResource.d.ts +6 -2
  43. package/dist/createOrUpdateDeckMapResource.d.ts.map +1 -1
  44. package/dist/createOrUpdateDeckMapResource.js +57 -4
  45. package/dist/createOrUpdateDeckMapResource.js.map +1 -1
  46. package/dist/dashboard.d.ts.map +1 -1
  47. package/dist/dashboard.js +72 -8
  48. package/dist/dashboard.js.map +1 -1
  49. package/dist/dashboardConfig.d.ts +10 -1
  50. package/dist/dashboardConfig.d.ts.map +1 -1
  51. package/dist/dashboardConfig.js +55 -22
  52. package/dist/dashboardConfig.js.map +1 -1
  53. package/dist/datasets/PreparedDatasetStore.d.ts +3 -4
  54. package/dist/datasets/PreparedDatasetStore.d.ts.map +1 -1
  55. package/dist/datasets/PreparedDatasetStore.js +35 -10
  56. package/dist/datasets/PreparedDatasetStore.js.map +1 -1
  57. package/dist/datasets/helpers.d.ts +39 -2
  58. package/dist/datasets/helpers.d.ts.map +1 -1
  59. package/dist/datasets/helpers.js +86 -3
  60. package/dist/datasets/helpers.js.map +1 -1
  61. package/dist/datasets/usePreparedDatasetStates.d.ts.map +1 -1
  62. package/dist/datasets/usePreparedDatasetStates.js +12 -8
  63. package/dist/datasets/usePreparedDatasetStates.js.map +1 -1
  64. package/dist/datasets/wrapGeometryAsWkb.d.ts +20 -0
  65. package/dist/datasets/wrapGeometryAsWkb.d.ts.map +1 -0
  66. package/dist/datasets/wrapGeometryAsWkb.js +65 -0
  67. package/dist/datasets/wrapGeometryAsWkb.js.map +1 -0
  68. package/dist/index.d.ts +3 -2
  69. package/dist/index.d.ts.map +1 -1
  70. package/dist/index.js +2 -1
  71. package/dist/index.js.map +1 -1
  72. package/dist/json/colorScaleFunction.d.ts +12 -4
  73. package/dist/json/colorScaleFunction.d.ts.map +1 -1
  74. package/dist/json/colorScaleFunction.js.map +1 -1
  75. package/dist/json/compileColorScale.d.ts +3 -2
  76. package/dist/json/compileColorScale.d.ts.map +1 -1
  77. package/dist/json/compileColorScale.js +16 -1
  78. package/dist/json/compileColorScale.js.map +1 -1
  79. package/dist/json/compileGeoArrowAccessor.d.ts +5 -0
  80. package/dist/json/compileGeoArrowAccessor.d.ts.map +1 -1
  81. package/dist/json/compileGeoArrowAccessor.js +17 -3
  82. package/dist/json/compileGeoArrowAccessor.js.map +1 -1
  83. package/dist/json/createDeckJsonConfiguration.d.ts.map +1 -1
  84. package/dist/json/createDeckJsonConfiguration.js +278 -151
  85. package/dist/json/createDeckJsonConfiguration.js.map +1 -1
  86. package/dist/json/defaultClasses.d.ts.map +1 -1
  87. package/dist/json/defaultClasses.js +3 -3
  88. package/dist/json/defaultClasses.js.map +1 -1
  89. package/dist/json/extractColorScaleLegends.d.ts.map +1 -1
  90. package/dist/json/extractColorScaleLegends.js +43 -14
  91. package/dist/json/extractColorScaleLegends.js.map +1 -1
  92. package/dist/json/heatmapDefaults.d.ts +17 -7
  93. package/dist/json/heatmapDefaults.d.ts.map +1 -1
  94. package/dist/json/heatmapDefaults.js +54 -12
  95. package/dist/json/heatmapDefaults.js.map +1 -1
  96. package/dist/json/layers/DeckH3HexagonLayer.d.ts.map +1 -1
  97. package/dist/json/layers/DeckH3HexagonLayer.js +9 -14
  98. package/dist/json/layers/DeckH3HexagonLayer.js.map +1 -1
  99. package/dist/json/layers/DeckHeatmapLayer.d.ts +32 -0
  100. package/dist/json/layers/DeckHeatmapLayer.d.ts.map +1 -0
  101. package/dist/json/layers/DeckHeatmapLayer.js +69 -0
  102. package/dist/json/layers/DeckHeatmapLayer.js.map +1 -0
  103. package/dist/json/layers/h3IndexFormat.d.ts +6 -0
  104. package/dist/json/layers/h3IndexFormat.d.ts.map +1 -0
  105. package/dist/json/layers/h3IndexFormat.js +17 -0
  106. package/dist/json/layers/h3IndexFormat.js.map +1 -0
  107. package/dist/json/layers/index.d.ts +2 -0
  108. package/dist/json/layers/index.d.ts.map +1 -1
  109. package/dist/json/layers/index.js +2 -0
  110. package/dist/json/layers/index.js.map +1 -1
  111. package/dist/json/rewriteGeoArrowAccessors.d.ts.map +1 -1
  112. package/dist/json/rewriteGeoArrowAccessors.js +22 -5
  113. package/dist/json/rewriteGeoArrowAccessors.js.map +1 -1
  114. package/dist/json/scaleFunction.d.ts +27 -0
  115. package/dist/json/scaleFunction.d.ts.map +1 -0
  116. package/dist/json/scaleFunction.js +151 -0
  117. package/dist/json/scaleFunction.js.map +1 -0
  118. package/dist/mapAiConfig.d.ts +8 -0
  119. package/dist/mapAiConfig.d.ts.map +1 -1
  120. package/dist/mapAiConfig.js +9 -1
  121. package/dist/mapAiConfig.js.map +1 -1
  122. package/dist/mapAiSharedInstructions.d.ts +3 -0
  123. package/dist/mapAiSharedInstructions.d.ts.map +1 -0
  124. package/dist/mapAiSharedInstructions.js +16 -0
  125. package/dist/mapAiSharedInstructions.js.map +1 -0
  126. package/dist/mapConfig.d.ts +7 -1
  127. package/dist/mapConfig.d.ts.map +1 -1
  128. package/dist/mapConfig.js.map +1 -1
  129. package/dist/mapConfigUtils.d.ts +22 -0
  130. package/dist/mapConfigUtils.d.ts.map +1 -1
  131. package/dist/mapConfigUtils.js +147 -3
  132. package/dist/mapConfigUtils.js.map +1 -1
  133. package/dist/mapFit.d.ts +16 -0
  134. package/dist/mapFit.d.ts.map +1 -1
  135. package/dist/mapFit.js +208 -30
  136. package/dist/mapFit.js.map +1 -1
  137. package/dist/mapLayerConfigUtils.d.ts +64 -1
  138. package/dist/mapLayerConfigUtils.d.ts.map +1 -1
  139. package/dist/mapLayerConfigUtils.js +277 -16
  140. package/dist/mapLayerConfigUtils.js.map +1 -1
  141. package/dist/mapResourceAuthoring.d.ts +3 -1
  142. package/dist/mapResourceAuthoring.d.ts.map +1 -1
  143. package/dist/mapResourceAuthoring.js +413 -20
  144. package/dist/mapResourceAuthoring.js.map +1 -1
  145. package/dist/mosaic.d.ts +1 -1
  146. package/dist/mosaic.d.ts.map +1 -1
  147. package/dist/mosaic.js.map +1 -1
  148. package/dist/prepare/geoarrow.js.map +1 -1
  149. package/dist/prepare/prepareDeckDataset.d.ts.map +1 -1
  150. package/dist/prepare/prepareDeckDataset.js +1 -0
  151. package/dist/prepare/prepareDeckDataset.js.map +1 -1
  152. package/dist/prepare/types.d.ts +3 -0
  153. package/dist/prepare/types.d.ts.map +1 -1
  154. package/dist/prepare/types.js.map +1 -1
  155. package/dist/prepare/wkbDecoder.d.ts +10 -0
  156. package/dist/prepare/wkbDecoder.d.ts.map +1 -1
  157. package/dist/prepare/wkbDecoder.js +141 -20
  158. package/dist/prepare/wkbDecoder.js.map +1 -1
  159. package/dist/prepare/wkbParser.d.ts +9 -0
  160. package/dist/prepare/wkbParser.d.ts.map +1 -1
  161. package/dist/prepare/wkbParser.js +22 -0
  162. package/dist/prepare/wkbParser.js.map +1 -1
  163. package/dist/selectStarAsWkbCollision.d.ts +3 -0
  164. package/dist/selectStarAsWkbCollision.d.ts.map +1 -0
  165. package/dist/selectStarAsWkbCollision.js +78 -0
  166. package/dist/selectStarAsWkbCollision.js.map +1 -0
  167. package/dist/types.d.ts +1 -1
  168. package/dist/types.d.ts.map +1 -1
  169. package/dist/types.js.map +1 -1
  170. package/dist/useDeckMapFitToBounds.d.ts.map +1 -1
  171. package/dist/useDeckMapFitToBounds.js +1 -1
  172. package/dist/useDeckMapFitToBounds.js.map +1 -1
  173. package/package.json +15 -15
@@ -1 +1 @@
1
- {"version":3,"file":"createDeckJsonConfiguration.js","sourceRoot":"","sources":["../../src/json/createDeckJsonConfiguration.ts"],"names":[],"mappings":"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","sourcesContent":["import {JSONConfiguration} from '@deck.gl/json';\nimport * as arrow from 'apache-arrow';\nimport type {ColorScaleConfig} from '@sqlrooms/color-scales';\nimport {wkbGeometryDecoder} from '../prepare/wkbDecoder';\nimport {tryAggregateWaypointsToLineStrings} from './aggregateWaypoints';\nimport type {LayerBindingProps, PreparedDeckDatasetState} from '../types';\nimport {\n createColorScaleMarker,\n getAllColorScales,\n COLOR_SCALE_PROP_NAMES,\n} from './colorScaleFunction';\nimport {compileColorScale} from './compileColorScale';\nimport {\n DEFAULT_DECK_JSON_CLASSES,\n DEFAULT_DECK_JSON_CONSTANTS,\n DEFAULT_DECK_JSON_ENUMERATIONS,\n} from './defaultClasses';\nimport {DEFAULT_HEATMAP_COLOR_RANGE} from './heatmapDefaults';\nimport {getLayerCompatibility} from './layerCompatibility';\nimport {\n isManagedLayer,\n resolveConfiguredColumn,\n resolveDatasetId,\n resolveGeometryColumn,\n stripLayerExtensionProps,\n} from './layerConfig';\nimport {rewriteGeoArrowAccessors} from './rewriteGeoArrowAccessors';\n\ntype CreateDeckJsonConfigurationOptions = {\n datasetStates: Record<string, PreparedDeckDatasetState>;\n datasetIds: string[];\n};\n\nfunction getLayerName(Class: unknown) {\n const maybeClass = Class as {layerName?: string; name?: string};\n return maybeClass.layerName ?? maybeClass.name ?? 'UnknownLayer';\n}\n\nfunction applyColorScale(options: {\n props: Record<string, unknown>;\n table: import('apache-arrow').Table;\n}) {\n const {props, table} = options;\n const allScales = getAllColorScales(props);\n\n let result = props;\n const triggers: Record<string, unknown> =\n result.updateTriggers &&\n typeof result.updateTriggers === 'object' &&\n !Array.isArray(result.updateTriggers)\n ? {...(result.updateTriggers as Record<string, unknown>)}\n : {};\n\n for (const {propName, colorScale} of allScales) {\n result = {\n ...result,\n [propName]: compileColorScale({\n table,\n colorScale,\n }),\n };\n triggers[propName] = JSON.stringify(colorScale);\n }\n\n // Set updateTriggers for color props that are static or absent (not a scale)\n // so deck.gl detects changes when a scale is cleared or a constant value changes.\n for (const propName of COLOR_SCALE_PROP_NAMES) {\n if (!(propName in triggers)) {\n const value = result[propName];\n triggers[propName] = value !== undefined ? JSON.stringify(value) : 'none';\n }\n }\n\n if (Object.keys(triggers).length > 0) {\n result = {...result, updateTriggers: triggers};\n }\n\n return result;\n}\n\nfunction resolveGeoArrowBindings(options: {\n layerName: string;\n compatibility: NonNullable<ReturnType<typeof getLayerCompatibility>> & {\n representation: 'geoarrow';\n };\n layerProps: LayerBindingProps & Record<string, unknown>;\n prepared: Extract<PreparedDeckDatasetState, {status: 'ready'}>['prepared'];\n props: Record<string, unknown>;\n}) {\n const {layerName, compatibility, layerProps, prepared, props} = options;\n let table = prepared.table;\n const boundProps: Record<string, unknown> = {};\n\n for (const binding of compatibility.bindings) {\n if (props[binding.prop] !== undefined) {\n continue;\n }\n\n if (binding.kind === 'geometry') {\n const columnName = resolveConfiguredColumn(layerProps, binding.configKey);\n if (binding.required && !columnName) {\n throw new Error(\n `Layer \"${layerName}\" requires _sqlroomsBinding.${binding.configKey}.`,\n );\n }\n\n let resolvedGeometry;\n try {\n resolvedGeometry = prepared.resolveGeometry(columnName);\n } catch {\n throw new Error(\n `Geometry column \"${columnName}\" was not found in dataset \"${prepared.datasetId}\".`,\n );\n }\n\n // Detect mismatch: synthesized points can't satisfy a LineString binding.\n // For PathLayer, try auto-aggregating waypoint rows into linestrings.\n if (\n resolvedGeometry.encoding === 'geoarrow.point' &&\n binding.prop === 'getPath'\n ) {\n const aggregated = tryAggregateWaypointsToLineStrings(prepared.table);\n if (aggregated) {\n table = aggregated.table;\n boundProps[binding.prop] = aggregated.geometryVector;\n continue;\n }\n const available = prepared.table.schema.fields\n .map((f) => f.name)\n .join(', ');\n throw new Error(\n `Layer \"${layerName}\" requires LineString geometry for getPath, ` +\n `but only point coordinates were found and auto-aggregation failed. ` +\n `The dataset sqlQuery must aggregate rows into linestrings using ST_MakeLine. ` +\n `Available columns: ${available}.`,\n );\n }\n if (\n resolvedGeometry.encoding === 'geoarrow.point' &&\n binding.prop === 'getPolygon'\n ) {\n const available = prepared.table.schema.fields\n .map((f) => f.name)\n .join(', ');\n throw new Error(\n `Layer \"${layerName}\" requires Polygon geometry for ${binding.prop}, ` +\n `but only point coordinates were found. Available columns: ${available}.`,\n );\n }\n if (!resolvedGeometry.nativeGeoArrow) {\n if (\n !compatibility.allowGeoArrowPromotion ||\n !wkbGeometryDecoder.supportsGeoArrowPromotion(\n layerName,\n resolvedGeometry.encoding,\n prepared.table,\n resolvedGeometry.columnName,\n )\n ) {\n throw new Error(\n `Layer \"${layerName}\" cannot render geometry encoding \"${resolvedGeometry.encoding}\" for dataset \"${prepared.datasetId}\".`,\n );\n }\n }\n\n const layerData = prepared.getGeoArrowLayerData(columnName);\n if (layerData.source === 'promoted') {\n boundProps[binding.prop] = layerData.geometryColumn;\n if (table === prepared.table) {\n table = layerData.table;\n }\n } else {\n if (table !== prepared.table && table !== layerData.table) {\n throw new Error(\n `Layer \"${layerName}\" cannot combine promoted geometry columns from different prepared tables.`,\n );\n }\n table = layerData.table;\n boundProps[binding.prop] = layerData.geometryColumn;\n }\n continue;\n }\n\n const columnName = resolveConfiguredColumn(layerProps, binding.configKey);\n if (!columnName) {\n if (binding.required) {\n throw new Error(\n `Layer \"${layerName}\" requires _sqlroomsBinding.${binding.configKey}.`,\n );\n }\n continue;\n }\n\n const vector =\n table.getChild(columnName) ?? prepared.table.getChild(columnName);\n if (!vector) {\n throw new Error(\n `Layer \"${layerName}\" references unknown column \"${columnName}\" for ${binding.prop}.`,\n );\n }\n\n boundProps[binding.prop] = vector;\n }\n\n return {table, boundProps};\n}\n\nexport function createDeckJsonConfiguration(\n options: CreateDeckJsonConfigurationOptions,\n) {\n const {datasetStates, datasetIds} = options;\n\n return new JSONConfiguration({\n classes: DEFAULT_DECK_JSON_CLASSES,\n enumerations: DEFAULT_DECK_JSON_ENUMERATIONS,\n constants: DEFAULT_DECK_JSON_CONSTANTS,\n functions: {\n colorScale: (props: ColorScaleConfig) => createColorScaleMarker(props),\n scale: (props: Record<string, unknown>) => {\n const field = typeof props.field === 'string' ? props.field : undefined;\n if (!field) return undefined;\n return `@@=${field}`;\n },\n },\n // We preserve raw `@@=` strings here because `@deck.gl/json` would otherwise\n // eagerly compile them into row-based accessors before `preProcessClassProps`\n // can rewrite them for GeoArrow's batch-oriented callback contract.\n convertFunction: ((expression: string) => `@@=${expression}`) as never,\n preProcessClassProps: (Class: unknown, props: Record<string, unknown>) => {\n const layerName = getLayerName(Class);\n const compatibility = getLayerCompatibility(layerName);\n\n if (!compatibility) {\n return props;\n }\n\n const layerProps = props as Record<string, unknown>;\n const extensionProps = layerProps as typeof layerProps &\n LayerBindingProps;\n const datasetId = resolveDatasetId(extensionProps, datasetIds);\n const managed =\n isManagedLayer(extensionProps, datasetIds) ||\n (datasetIds.length > 1 && layerProps.data === undefined);\n\n if (!managed) {\n return props;\n }\n\n if (!datasetId) {\n throw new Error(\n `Layer \"${layerName}\" must declare _sqlroomsBinding.dataset when multiple datasets are available.`,\n );\n }\n\n const datasetState = datasetStates[datasetId];\n if (!datasetState) {\n throw new Error(\n `Layer \"${layerName}\" references unknown dataset \"${datasetId}\".`,\n );\n }\n\n if (datasetState.status !== 'ready') {\n return {...stripLayerExtensionProps(layerProps), data: []};\n }\n\n const prepared = datasetState.prepared;\n const geometryColumn = resolveGeometryColumn(extensionProps);\n const strippedProps = stripLayerExtensionProps(layerProps);\n\n if (compatibility.representation === 'geojson') {\n const baseProps = applyColorScale({\n props: strippedProps,\n table: prepared.table,\n });\n return {\n ...baseProps,\n data: prepared.getGeoJsonBinaryData(geometryColumn),\n };\n }\n\n const {table, boundProps} = resolveGeoArrowBindings({\n layerName,\n compatibility: compatibility as NonNullable<\n ReturnType<typeof getLayerCompatibility>\n > & {representation: 'geoarrow'},\n layerProps: extensionProps,\n prepared,\n props: strippedProps,\n });\n const baseProps = applyColorScale({\n props: strippedProps,\n table,\n });\n const nextProps: Record<string, unknown> = {\n ...baseProps,\n data: table,\n ...boundProps,\n };\n\n // Normalize getElevation: subtract column minimum so the lowest\n // feature sits at ground level and differences are clearly visible.\n const rawElev = nextProps.getElevation;\n if (typeof rawElev === 'string' && rawElev.startsWith('@@=')) {\n const elevField = rawElev.slice(3).trim();\n const elevVector = table.getChild(elevField);\n if (elevVector) {\n let min = Infinity;\n for (let i = 0; i < elevVector.length; i++) {\n const v = Number(elevVector.get(i));\n if (Number.isFinite(v) && v < min) min = v;\n }\n if (Number.isFinite(min) && min !== 0) {\n nextProps.getElevation = `@@=Math.max(0, ${elevField} - ${min})`;\n }\n }\n }\n\n const rewritten = rewriteGeoArrowAccessors({\n props: nextProps,\n table,\n layerName,\n });\n\n // Set updateTriggers for @@= accessor props and getElevation\n // so deck.gl re-evaluates them when references change or are cleared.\n {\n const accessorTriggers: Record<string, unknown> = {};\n for (const [propName, propValue] of Object.entries(nextProps)) {\n if (\n typeof propValue === 'string' &&\n propValue.startsWith('@@=') &&\n propName.startsWith('get')\n ) {\n accessorTriggers[propName] = propValue;\n }\n }\n // Always emit getElevation trigger so clearing the column invalidates\n // stale heights from a previous column-based accessor.\n if (!('getElevation' in accessorTriggers)) {\n const elev = nextProps.getElevation;\n accessorTriggers.getElevation =\n elev !== undefined ? String(elev) : 'none';\n }\n const existingTriggers =\n rewritten.updateTriggers &&\n typeof rewritten.updateTriggers === 'object' &&\n !Array.isArray(rewritten.updateTriggers)\n ? (rewritten.updateTriggers as Record<string, unknown>)\n : {};\n rewritten.updateTriggers = {\n ...existingTriggers,\n ...accessorTriggers,\n };\n }\n\n // For TripsLayer: compute max timestamp for animation and set defaults\n if (layerName === 'GeoArrowTripsLayer' || layerName === 'TripsLayer') {\n const tsVector = boundProps.getTimestamps as arrow.Vector | undefined;\n if (tsVector) {\n let maxTs = 0;\n for (let i = 0; i < tsVector.length; i++) {\n const listItem = tsVector.get(i);\n if (\n listItem &&\n typeof listItem === 'object' &&\n 'length' in listItem\n ) {\n const list = listItem as {\n length: number;\n get: (i: number) => unknown;\n };\n for (let j = 0; j < list.length; j++) {\n const v = Number(list.get(j)) || 0;\n if (v > maxTs) maxTs = v;\n }\n }\n }\n if (maxTs > 0) {\n rewritten._tripsMaxTimestamp = maxTs;\n if (!rewritten.trailLength) {\n rewritten.trailLength = maxTs;\n }\n if (\n rewritten.currentTime === undefined ||\n rewritten.currentTime === 0\n ) {\n rewritten.currentTime = maxTs;\n }\n }\n }\n }\n\n // For HeatmapLayer: apply default colorRange (YlOrRd) when not explicitly set.\n // Also set updateTriggers to force re-aggregation when colorRange changes.\n if (layerName === 'GeoArrowHeatmapLayer') {\n if (!rewritten.colorRange) {\n rewritten.colorRange = DEFAULT_HEATMAP_COLOR_RANGE;\n }\n const existingTriggers =\n rewritten.updateTriggers &&\n typeof rewritten.updateTriggers === 'object' &&\n !Array.isArray(rewritten.updateTriggers)\n ? (rewritten.updateTriggers as Record<string, unknown>)\n : {};\n const previousGetWeight = existingTriggers.getWeight;\n rewritten.updateTriggers = {\n ...existingTriggers,\n getWeight:\n previousGetWeight === undefined\n ? JSON.stringify(rewritten.colorRange)\n : [previousGetWeight, JSON.stringify(rewritten.colorRange)],\n };\n }\n\n return rewritten;\n },\n postProcessConvertedJson: (json: unknown) => {\n if (\n json &&\n typeof json === 'object' &&\n 'layers' in json &&\n Array.isArray((json as {layers?: unknown[]}).layers)\n ) {\n (json as {layers: unknown[]}).layers = (\n json as {layers: unknown[]}\n ).layers.filter(Boolean);\n }\n\n return json;\n },\n });\n}\n"]}
1
+ {"version":3,"file":"createDeckJsonConfiguration.js","sourceRoot":"","sources":["../../src/json/createDeckJsonConfiguration.ts"],"names":[],"mappings":"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","sourcesContent":["import {JSONConfiguration} from '@deck.gl/json';\nimport * as arrow from 'apache-arrow';\nimport {\n isPointPositionLayer,\n promoteToPointPositions,\n wkbGeometryDecoder,\n describeGeoArrowPromotionFailure,\n} from '../prepare/wkbDecoder';\nimport {tryAggregateWaypointsToLineStrings} from './aggregateWaypoints';\nimport type {LayerBindingProps, PreparedDeckDatasetState} from '../types';\nimport {\n createColorScaleMarker,\n getAllColorScales,\n COLOR_SCALE_PROP_NAMES,\n type DeckColorScaleConfig,\n} from './colorScaleFunction';\nimport {compileColorScale} from './compileColorScale';\nimport {\n DEFAULT_DECK_JSON_CLASSES,\n DEFAULT_DECK_JSON_CONSTANTS,\n DEFAULT_DECK_JSON_ENUMERATIONS,\n} from './defaultClasses';\nimport {\n DEFAULT_HEATMAP_COLOR_RANGE,\n DEFAULT_HEATMAP_WEIGHTS_TEXTURE_SIZE,\n} from './heatmapDefaults';\nimport {getLayerCompatibility} from './layerCompatibility';\nimport {\n isManagedLayer,\n resolveConfiguredColumn,\n resolveDatasetId,\n resolveGeometryColumn,\n stripLayerExtensionProps,\n} from './layerConfig';\nimport {rewriteGeoArrowAccessors} from './rewriteGeoArrowAccessors';\nimport {isBindableGeoArrowFieldIdentifier} from './compileGeoArrowAccessor';\nimport {\n compileLinearScaleAccessor,\n compileLinearScaleExpression,\n createScaleMarker,\n isScaleMarker,\n} from './scaleFunction';\n\ntype CreateDeckJsonConfigurationOptions = {\n datasetStates: Record<string, PreparedDeckDatasetState>;\n datasetIds: string[];\n};\n\nfunction getLayerName(Class: unknown) {\n const maybeClass = Class as {layerName?: string; name?: string};\n return maybeClass.layerName ?? maybeClass.name ?? 'UnknownLayer';\n}\n\n/**\n * Deck.gl matches layers by id. Each JSON convert would otherwise create a new\n * GPU layer. Dataset id alone collides when two layers share a dataset.\n */\nfunction assignStableLayerId(\n props: Record<string, unknown>,\n datasetId: string,\n layerName: string,\n index: number,\n) {\n if (typeof props.id === 'string' && props.id !== '') return;\n props.id = `${datasetId}:${layerName}:${index}`;\n}\n\nfunction applyColorScale(options: {\n props: Record<string, unknown>;\n table: import('apache-arrow').Table;\n}) {\n const {props, table} = options;\n const allScales = getAllColorScales(props);\n\n let result = props;\n const triggers: Record<string, unknown> =\n result.updateTriggers &&\n typeof result.updateTriggers === 'object' &&\n !Array.isArray(result.updateTriggers)\n ? {...(result.updateTriggers as Record<string, unknown>)}\n : {};\n\n for (const {propName, colorScale} of allScales) {\n result = {\n ...result,\n [propName]: compileColorScale({\n table,\n colorScale,\n }),\n };\n triggers[propName] = JSON.stringify(colorScale);\n }\n\n // Set updateTriggers for color props that are static or absent (not a scale)\n // so deck.gl detects changes when a scale is cleared or a constant value changes.\n for (const propName of COLOR_SCALE_PROP_NAMES) {\n if (!(propName in triggers)) {\n const value = result[propName];\n triggers[propName] = value !== undefined ? JSON.stringify(value) : 'none';\n }\n }\n\n if (Object.keys(triggers).length > 0) {\n result = {...result, updateTriggers: triggers};\n }\n\n return result;\n}\n\nfunction getElevationTrigger(rawElev: unknown) {\n if (rawElev === undefined) return 'none';\n if (typeof rawElev === 'string' || typeof rawElev === 'number') {\n return String(rawElev);\n }\n try {\n return JSON.stringify(rawElev);\n } catch {\n return String(rawElev);\n }\n}\n\nfunction mergeGetElevationTrigger(\n props: Record<string, unknown>,\n rawElev: unknown,\n) {\n const existing =\n props.updateTriggers &&\n typeof props.updateTriggers === 'object' &&\n !Array.isArray(props.updateTriggers)\n ? (props.updateTriggers as Record<string, unknown>)\n : {};\n return {\n ...props,\n updateTriggers: {\n ...existing,\n getElevation: getElevationTrigger(rawElev),\n },\n };\n}\n\n/** Compile `getElevation` scale / `@@=` column accessors against the Arrow table. */\nfunction compileGetElevation(options: {\n props: Record<string, unknown>;\n table: arrow.Table;\n layerName: string;\n datasetId: string;\n /** GeoJSON cannot evaluate `@@=` column expressions; always emit a function. */\n requireFunctionAccessor?: boolean;\n}): Record<string, unknown> {\n const {table, layerName, datasetId, requireFunctionAccessor} = options;\n const nextProps = {...options.props};\n const rawElev = nextProps.getElevation;\n\n if (isScaleMarker(rawElev)) {\n const expression = requireFunctionAccessor\n ? undefined\n : compileLinearScaleExpression(table, rawElev);\n if (expression) {\n nextProps.getElevation = expression;\n } else {\n const accessor = compileLinearScaleAccessor(table, rawElev);\n if (accessor) {\n nextProps.getElevation = accessor;\n } else {\n const field = typeof rawElev.field === 'string' ? rawElev.field : '';\n throw new Error(\n `Layer \"${layerName}\" getElevation scale field \"${field || '(missing)'}\" was not found in dataset \"${datasetId}\".`,\n );\n }\n }\n } else if (typeof rawElev === 'string' && rawElev.startsWith('@@=')) {\n const elevField = rawElev.slice(3).trim();\n const elevVector = table.getChild(elevField);\n if (elevVector) {\n let min = Infinity;\n for (let i = 0; i < elevVector.length; i++) {\n if (\n typeof elevVector.isValid === 'function' &&\n !elevVector.isValid(i)\n ) {\n continue;\n }\n const raw = elevVector.get(i);\n if (raw == null) continue;\n const v = Number(raw);\n if (Number.isFinite(v) && v < min) min = v;\n }\n if (Number.isFinite(min)) {\n if (\n !requireFunctionAccessor &&\n isBindableGeoArrowFieldIdentifier(elevField)\n ) {\n if (min !== 0) {\n nextProps.getElevation = `@@=Math.max(0, ${elevField} - ${min})`;\n }\n } else {\n const accessor = compileLinearScaleAccessor(table, {\n field: elevField,\n domain: [min, min],\n });\n if (accessor) nextProps.getElevation = accessor;\n }\n }\n }\n }\n\n return nextProps;\n}\n\nfunction resolveGeoArrowBindings(options: {\n layerName: string;\n compatibility: NonNullable<ReturnType<typeof getLayerCompatibility>> & {\n representation: 'geoarrow';\n };\n layerProps: LayerBindingProps & Record<string, unknown>;\n prepared: Extract<PreparedDeckDatasetState, {status: 'ready'}>['prepared'];\n props: Record<string, unknown>;\n}) {\n const {layerName, compatibility, layerProps, prepared, props} = options;\n let table = prepared.table;\n const boundProps: Record<string, unknown> = {};\n\n for (const binding of compatibility.bindings) {\n const existing = props[binding.prop];\n // Prefer Arrow Vector over `@@=column` (avoids empty H3 / missing-column silence).\n const existingIsSimpleAccessor =\n typeof existing === 'string' &&\n /^@@=[A-Za-z_$][\\w$]*$/.test(existing.trim());\n if (existing !== undefined && !existingIsSimpleAccessor) {\n continue;\n }\n\n if (binding.kind === 'geometry') {\n const columnName =\n resolveConfiguredColumn(layerProps, binding.configKey) ??\n (existingIsSimpleAccessor\n ? (existing as string).trim().slice(3)\n : undefined);\n if (binding.required && !columnName) {\n throw new Error(\n `Layer \"${layerName}\" requires _sqlroomsBinding.${binding.configKey}.`,\n );\n }\n\n let resolvedGeometry;\n try {\n resolvedGeometry = prepared.resolveGeometry(columnName);\n } catch {\n throw new Error(\n `Geometry column \"${columnName}\" was not found in dataset \"${prepared.datasetId}\".`,\n );\n }\n\n // Detect mismatch: synthesized points can't satisfy a LineString binding.\n // For PathLayer, try auto-aggregating waypoint rows into linestrings.\n if (\n resolvedGeometry.encoding === 'geoarrow.point' &&\n binding.prop === 'getPath'\n ) {\n const aggregated = tryAggregateWaypointsToLineStrings(prepared.table);\n if (aggregated) {\n table = aggregated.table;\n boundProps[binding.prop] = aggregated.geometryVector;\n continue;\n }\n const available = prepared.table.schema.fields\n .map((f) => f.name)\n .join(', ');\n throw new Error(\n `Layer \"${layerName}\" requires LineString geometry for getPath, ` +\n `but only point coordinates were found and auto-aggregation failed. ` +\n `The dataset sqlQuery must aggregate rows into linestrings using ST_MakeLine. ` +\n `Available columns: ${available}.`,\n );\n }\n if (\n resolvedGeometry.encoding === 'geoarrow.point' &&\n binding.prop === 'getPolygon'\n ) {\n const available = prepared.table.schema.fields\n .map((f) => f.name)\n .join(', ');\n throw new Error(\n `Layer \"${layerName}\" requires Polygon geometry for ${binding.prop}, ` +\n `but only point coordinates were found. Available columns: ${available}.`,\n );\n }\n if (!resolvedGeometry.nativeGeoArrow) {\n if (!compatibility.allowGeoArrowPromotion) {\n throw new Error(\n `Layer \"${layerName}\" cannot render geometry encoding \"${resolvedGeometry.encoding}\" for dataset \"${prepared.datasetId}\".`,\n );\n }\n\n // Point layers: promote Points only — no silent polygon centroid.\n if (isPointPositionLayer(layerName)) {\n const promoted = promoteToPointPositions(\n prepared.table,\n resolvedGeometry.columnName,\n resolvedGeometry.encoding,\n );\n if (!promoted) {\n throw new Error(\n `Layer \"${layerName}\" needs Point positions for dataset \"${prepared.datasetId}\" ` +\n `(geometry encoding \"${resolvedGeometry.encoding}\"). ` +\n `Use a point geometry column, or transformSql with ` +\n `ST_AsWKB(ST_Centroid(geom)) / ST_PointOnSurface(geom). ` +\n `For building footprints prefer GeoArrowPolygonLayer or GeoJsonLayer.`,\n );\n }\n boundProps[binding.prop] = promoted.geometryColumn;\n if (table === prepared.table) {\n table = promoted.table;\n }\n continue;\n }\n\n if (\n !wkbGeometryDecoder.supportsGeoArrowPromotion(\n layerName,\n resolvedGeometry.encoding,\n prepared.table,\n resolvedGeometry.columnName,\n )\n ) {\n const pathHint =\n layerName === 'GeoArrowPathLayer' ||\n layerName === 'GeoArrowTripsLayer'\n ? ` GeoArrowPathLayer needs LineString WKB (or a single-part MultiLineString). Multi-part MultiLineString cannot be stitched into one path — explode/merge with ST_Dump / ST_LineMerge first, then ST_AsWKB.`\n : '';\n const mixedHint = describeGeoArrowPromotionFailure(\n layerName,\n resolvedGeometry.encoding,\n prepared.table,\n resolvedGeometry.columnName,\n );\n throw new Error(\n `Layer \"${layerName}\" cannot render geometry encoding \"${resolvedGeometry.encoding}\" for dataset \"${prepared.datasetId}\".${pathHint}${mixedHint}`,\n );\n }\n }\n\n const layerData = prepared.getGeoArrowLayerData(columnName);\n if (layerData.source === 'promoted') {\n boundProps[binding.prop] = layerData.geometryColumn;\n if (table === prepared.table) {\n table = layerData.table;\n }\n } else {\n if (table !== prepared.table && table !== layerData.table) {\n throw new Error(\n `Layer \"${layerName}\" cannot combine promoted geometry columns from different prepared tables.`,\n );\n }\n table = layerData.table;\n boundProps[binding.prop] = layerData.geometryColumn;\n }\n continue;\n }\n\n const columnName =\n resolveConfiguredColumn(layerProps, binding.configKey) ??\n (existingIsSimpleAccessor\n ? (existing as string).trim().slice(3)\n : undefined);\n if (!columnName) {\n if (binding.required) {\n throw new Error(\n `Layer \"${layerName}\" requires _sqlroomsBinding.${binding.configKey}.`,\n );\n }\n continue;\n }\n\n const vector =\n table.getChild(columnName) ?? prepared.table.getChild(columnName);\n if (!vector) {\n throw new Error(\n `Layer \"${layerName}\" references unknown column \"${columnName}\" for ${binding.prop}.`,\n );\n }\n\n boundProps[binding.prop] = vector;\n }\n\n return {table, boundProps};\n}\n\nexport function createDeckJsonConfiguration(\n options: CreateDeckJsonConfigurationOptions,\n) {\n const {datasetStates, datasetIds} = options;\n let nextManagedLayerIndex = 0;\n\n return new JSONConfiguration({\n classes: DEFAULT_DECK_JSON_CLASSES,\n enumerations: DEFAULT_DECK_JSON_ENUMERATIONS,\n constants: DEFAULT_DECK_JSON_CONSTANTS,\n functions: {\n colorScale: (props: DeckColorScaleConfig) =>\n createColorScaleMarker(props),\n scale: (props: Record<string, unknown>) => createScaleMarker(props),\n },\n // We preserve raw `@@=` strings here because `@deck.gl/json` would otherwise\n // eagerly compile them into row-based accessors before `preProcessClassProps`\n // can rewrite them for GeoArrow's batch-oriented callback contract.\n convertFunction: ((expression: string) => `@@=${expression}`) as never,\n preProcessClassProps: (Class: unknown, props: Record<string, unknown>) => {\n try {\n return preprocessManagedLayer();\n } catch (error) {\n // JSONConverter skips postProcessConvertedJson when convert throws.\n nextManagedLayerIndex = 0;\n throw error;\n }\n\n function preprocessManagedLayer() {\n const layerName = getLayerName(Class);\n const compatibility = getLayerCompatibility(layerName);\n\n if (!compatibility) {\n return props;\n }\n\n const layerProps = props as Record<string, unknown>;\n const extensionProps = layerProps as typeof layerProps &\n LayerBindingProps;\n const datasetId = resolveDatasetId(extensionProps, datasetIds);\n const managed =\n isManagedLayer(extensionProps, datasetIds) ||\n (datasetIds.length > 1 && layerProps.data === undefined);\n\n if (!managed) {\n return props;\n }\n\n if (!datasetId) {\n throw new Error(\n `Layer \"${layerName}\" must declare _sqlroomsBinding.dataset when multiple datasets are available.`,\n );\n }\n\n const datasetState = datasetStates[datasetId];\n if (!datasetState) {\n throw new Error(\n `Layer \"${layerName}\" references unknown dataset \"${datasetId}\".`,\n );\n }\n\n if (datasetState.status !== 'ready') {\n const pendingProps = stripLayerExtensionProps(layerProps);\n assignStableLayerId(\n pendingProps,\n datasetId,\n layerName,\n nextManagedLayerIndex++,\n );\n return {...pendingProps, data: []};\n }\n\n const prepared = datasetState.prepared;\n const geometryColumn = resolveGeometryColumn(extensionProps);\n const strippedProps = stripLayerExtensionProps(layerProps);\n assignStableLayerId(\n strippedProps,\n datasetId,\n layerName,\n nextManagedLayerIndex++,\n );\n\n if (compatibility.representation === 'geojson') {\n const baseProps = applyColorScale({\n props: strippedProps,\n table: prepared.table,\n });\n const withElevation = compileGetElevation({\n props: baseProps,\n table: prepared.table,\n layerName,\n datasetId: prepared.datasetId,\n requireFunctionAccessor: true,\n });\n return {\n ...mergeGetElevationTrigger(withElevation, baseProps.getElevation),\n data: prepared.getGeoJsonBinaryData(geometryColumn),\n };\n }\n\n const {table, boundProps} = resolveGeoArrowBindings({\n layerName,\n compatibility: compatibility as NonNullable<\n ReturnType<typeof getLayerCompatibility>\n > & {representation: 'geoarrow'},\n layerProps: extensionProps,\n prepared,\n props: strippedProps,\n });\n const baseProps = applyColorScale({\n props: strippedProps,\n table,\n });\n const nextProps = compileGetElevation({\n props: {\n ...baseProps,\n data: table,\n ...boundProps,\n },\n table,\n layerName,\n datasetId: prepared.datasetId,\n });\n\n const rewritten = rewriteGeoArrowAccessors({\n props: nextProps,\n table,\n layerName,\n });\n\n // Set updateTriggers for @@= accessor props and getElevation\n // so deck.gl re-evaluates them when references change or are cleared.\n {\n const accessorTriggers: Record<string, unknown> = {};\n for (const [propName, propValue] of Object.entries(nextProps)) {\n if (\n typeof propValue === 'string' &&\n propValue.startsWith('@@=') &&\n propName.startsWith('get')\n ) {\n accessorTriggers[propName] = propValue;\n }\n }\n // Always emit getElevation trigger so clearing the column invalidates\n // stale heights from a previous column-based accessor.\n if (!('getElevation' in accessorTriggers)) {\n const elev = nextProps.getElevation;\n accessorTriggers.getElevation =\n elev !== undefined ? String(elev) : 'none';\n }\n const existingTriggers =\n rewritten.updateTriggers &&\n typeof rewritten.updateTriggers === 'object' &&\n !Array.isArray(rewritten.updateTriggers)\n ? (rewritten.updateTriggers as Record<string, unknown>)\n : {};\n rewritten.updateTriggers = {\n ...existingTriggers,\n ...accessorTriggers,\n };\n }\n\n // For TripsLayer: compute max timestamp for animation and set defaults\n if (layerName === 'GeoArrowTripsLayer' || layerName === 'TripsLayer') {\n const tsVector = boundProps.getTimestamps as arrow.Vector | undefined;\n if (tsVector) {\n let maxTs = 0;\n for (let i = 0; i < tsVector.length; i++) {\n const listItem = tsVector.get(i);\n if (\n listItem &&\n typeof listItem === 'object' &&\n 'length' in listItem\n ) {\n const list = listItem as {\n length: number;\n get: (i: number) => unknown;\n };\n for (let j = 0; j < list.length; j++) {\n const v = Number(list.get(j)) || 0;\n if (v > maxTs) maxTs = v;\n }\n }\n }\n if (maxTs > 0) {\n rewritten._tripsMaxTimestamp = maxTs;\n if (!rewritten.trailLength) {\n rewritten.trailLength = maxTs;\n }\n if (\n rewritten.currentTime === undefined ||\n rewritten.currentTime === 0\n ) {\n rewritten.currentTime = maxTs;\n }\n }\n }\n }\n\n // HeatmapLayer remaps colorRange in _updateColorTexture. Putting it in\n // getWeight updateTriggers would mark aggregation dirty and rebuild the\n // GPU weight texture when only the colormap changed.\n if (layerName === 'GeoArrowHeatmapLayer') {\n if (!rewritten.colorRange) {\n rewritten.colorRange = DEFAULT_HEATMAP_COLOR_RANGE;\n }\n if (rewritten.weightsTextureSize === undefined) {\n rewritten.weightsTextureSize = DEFAULT_HEATMAP_WEIGHTS_TEXTURE_SIZE;\n }\n }\n\n return rewritten;\n }\n },\n postProcessConvertedJson: (json: unknown) => {\n nextManagedLayerIndex = 0;\n if (\n json &&\n typeof json === 'object' &&\n 'layers' in json &&\n Array.isArray((json as {layers?: unknown[]}).layers)\n ) {\n (json as {layers: unknown[]}).layers = (\n json as {layers: unknown[]}\n ).layers.filter(Boolean);\n }\n\n return json;\n },\n });\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"defaultClasses.d.ts","sourceRoot":"","sources":["../../src/json/defaultClasses.ts"],"names":[],"mappings":"AA+CA,eAAO,MAAM,yBAAyB,EAAE,MAAM,CAC5C,MAAM,EACN,KAAK,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAgBhD,CAAC;AAEF,eAAO,MAAM,8BAA8B;;;;;;;;CAE1C,CAAC;AAEF,eAAO,MAAM,2BAA2B,IAAK,CAAC"}
1
+ {"version":3,"file":"defaultClasses.d.ts","sourceRoot":"","sources":["../../src/json/defaultClasses.ts"],"names":[],"mappings":"AAmDA,eAAO,MAAM,yBAAyB,EAAE,MAAM,CAC5C,MAAM,EACN,KAAK,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAgBhD,CAAC;AAEF,eAAO,MAAM,8BAA8B;;;;;;;;CAE1C,CAAC;AAEF,eAAO,MAAM,2BAA2B,IAAK,CAAC"}
@@ -1,13 +1,13 @@
1
1
  import { COORDINATE_SYSTEM, FirstPersonView, MapView, OrbitView, OrthographicView, } from '@deck.gl/core';
2
2
  import { GeoJsonLayer } from '@deck.gl/layers';
3
- import { GeoArrowArcLayer, GeoArrowHeatmapLayer, GeoArrowPathLayer, GeoArrowPolygonLayer, GeoArrowScatterplotLayer, GeoArrowSolidPolygonLayer, } from '@geoarrow/deck.gl-geoarrow';
3
+ import { GeoArrowArcLayer, GeoArrowPathLayer, GeoArrowPolygonLayer, GeoArrowScatterplotLayer, GeoArrowSolidPolygonLayer, } from '@geoarrow/deck.gl-geoarrow';
4
4
  import { createTableToRecordBatchAdapter } from './layers/createTableToRecordBatchAdapter';
5
- import { DeckColumnLayer, DeckH3HexagonLayer, DeckTripsLayer } from './layers';
5
+ import { DeckColumnLayer, DeckH3HexagonLayer, DeckHeatmapLayer, DeckTripsLayer, } from './layers';
6
6
  // The 0.4.x GeoArrow layers expect `data: RecordBatch` + geometry as `Data`,
7
7
  // but our JSON pipeline passes `data: Table` + geometry as `Vector`.
8
8
  // These adapters bridge the gap by splitting Table batches into sublayers.
9
9
  const AdaptedScatterplotLayer = createTableToRecordBatchAdapter(GeoArrowScatterplotLayer, 'GeoArrowScatterplotLayer');
10
- const AdaptedHeatmapLayer = createTableToRecordBatchAdapter(GeoArrowHeatmapLayer, 'GeoArrowHeatmapLayer');
10
+ const AdaptedHeatmapLayer = createTableToRecordBatchAdapter(DeckHeatmapLayer, 'GeoArrowHeatmapLayer');
11
11
  const AdaptedPathLayer = createTableToRecordBatchAdapter(GeoArrowPathLayer, 'GeoArrowPathLayer');
12
12
  const AdaptedPolygonLayer = createTableToRecordBatchAdapter(GeoArrowPolygonLayer, 'GeoArrowPolygonLayer');
13
13
  const AdaptedSolidPolygonLayer = createTableToRecordBatchAdapter(GeoArrowSolidPolygonLayer, 'GeoArrowSolidPolygonLayer');
@@ -1 +1 @@
1
- {"version":3,"file":"defaultClasses.js","sourceRoot":"","sources":["../../src/json/defaultClasses.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,OAAO,EACP,SAAS,EACT,gBAAgB,GACjB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAC,YAAY,EAAC,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,iBAAiB,EACjB,oBAAoB,EACpB,wBAAwB,EACxB,yBAAyB,GAC1B,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAC,+BAA+B,EAAC,MAAM,0CAA0C,CAAC;AACzF,OAAO,EAAC,eAAe,EAAE,kBAAkB,EAAE,cAAc,EAAC,MAAM,UAAU,CAAC;AAE7E,6EAA6E;AAC7E,qEAAqE;AACrE,2EAA2E;AAC3E,MAAM,uBAAuB,GAAG,+BAA+B,CAC7D,wBAA+B,EAC/B,0BAA0B,CAC3B,CAAC;AACF,MAAM,mBAAmB,GAAG,+BAA+B,CACzD,oBAA2B,EAC3B,sBAAsB,CACvB,CAAC;AACF,MAAM,gBAAgB,GAAG,+BAA+B,CACtD,iBAAwB,EACxB,mBAAmB,CACpB,CAAC;AACF,MAAM,mBAAmB,GAAG,+BAA+B,CACzD,oBAA2B,EAC3B,sBAAsB,CACvB,CAAC;AACF,MAAM,wBAAwB,GAAG,+BAA+B,CAC9D,yBAAgC,EAChC,2BAA2B,CAC5B,CAAC;AACF,MAAM,eAAe,GAAG,+BAA+B,CACrD,gBAAuB,EACvB,kBAAkB,CACnB,CAAC;AAEF,MAAM,CAAC,MAAM,yBAAyB,GAGlC;IACF,OAAO;IACP,eAAe;IACf,SAAS;IACT,gBAAgB;IAChB,YAAY;IACZ,wBAAwB,EAAE,uBAAuB;IACjD,oBAAoB,EAAE,mBAAmB;IACzC,mBAAmB,EAAE,eAAe;IACpC,iBAAiB,EAAE,gBAAgB;IACnC,oBAAoB,EAAE,mBAAmB;IACzC,yBAAyB,EAAE,wBAAwB;IACnD,gBAAgB,EAAE,eAAe;IACjC,kBAAkB,EAAE,cAAc;IAClC,sBAAsB,EAAE,kBAAkB;CAC3C,CAAC;AAEF,MAAM,CAAC,MAAM,8BAA8B,GAAG;IAC5C,iBAAiB;CAClB,CAAC;AAEF,MAAM,CAAC,MAAM,2BAA2B,GAAG,EAAE,CAAC","sourcesContent":["import {\n COORDINATE_SYSTEM,\n FirstPersonView,\n MapView,\n OrbitView,\n OrthographicView,\n} from '@deck.gl/core';\nimport {GeoJsonLayer} from '@deck.gl/layers';\nimport {\n GeoArrowArcLayer,\n GeoArrowHeatmapLayer,\n GeoArrowPathLayer,\n GeoArrowPolygonLayer,\n GeoArrowScatterplotLayer,\n GeoArrowSolidPolygonLayer,\n} from '@geoarrow/deck.gl-geoarrow';\nimport {createTableToRecordBatchAdapter} from './layers/createTableToRecordBatchAdapter';\nimport {DeckColumnLayer, DeckH3HexagonLayer, DeckTripsLayer} from './layers';\n\n// The 0.4.x GeoArrow layers expect `data: RecordBatch` + geometry as `Data`,\n// but our JSON pipeline passes `data: Table` + geometry as `Vector`.\n// These adapters bridge the gap by splitting Table batches into sublayers.\nconst AdaptedScatterplotLayer = createTableToRecordBatchAdapter(\n GeoArrowScatterplotLayer as any,\n 'GeoArrowScatterplotLayer',\n);\nconst AdaptedHeatmapLayer = createTableToRecordBatchAdapter(\n GeoArrowHeatmapLayer as any,\n 'GeoArrowHeatmapLayer',\n);\nconst AdaptedPathLayer = createTableToRecordBatchAdapter(\n GeoArrowPathLayer as any,\n 'GeoArrowPathLayer',\n);\nconst AdaptedPolygonLayer = createTableToRecordBatchAdapter(\n GeoArrowPolygonLayer as any,\n 'GeoArrowPolygonLayer',\n);\nconst AdaptedSolidPolygonLayer = createTableToRecordBatchAdapter(\n GeoArrowSolidPolygonLayer as any,\n 'GeoArrowSolidPolygonLayer',\n);\nconst AdaptedArcLayer = createTableToRecordBatchAdapter(\n GeoArrowArcLayer as any,\n 'GeoArrowArcLayer',\n);\n\nexport const DEFAULT_DECK_JSON_CLASSES: Record<\n string,\n new (props: Record<string, unknown>) => unknown\n> = {\n MapView,\n FirstPersonView,\n OrbitView,\n OrthographicView,\n GeoJsonLayer,\n GeoArrowScatterplotLayer: AdaptedScatterplotLayer,\n GeoArrowHeatmapLayer: AdaptedHeatmapLayer,\n GeoArrowColumnLayer: DeckColumnLayer,\n GeoArrowPathLayer: AdaptedPathLayer,\n GeoArrowPolygonLayer: AdaptedPolygonLayer,\n GeoArrowSolidPolygonLayer: AdaptedSolidPolygonLayer,\n GeoArrowArcLayer: AdaptedArcLayer,\n GeoArrowTripsLayer: DeckTripsLayer,\n GeoArrowH3HexagonLayer: DeckH3HexagonLayer,\n};\n\nexport const DEFAULT_DECK_JSON_ENUMERATIONS = {\n COORDINATE_SYSTEM,\n};\n\nexport const DEFAULT_DECK_JSON_CONSTANTS = {};\n"]}
1
+ {"version":3,"file":"defaultClasses.js","sourceRoot":"","sources":["../../src/json/defaultClasses.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,OAAO,EACP,SAAS,EACT,gBAAgB,GACjB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAC,YAAY,EAAC,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,oBAAoB,EACpB,wBAAwB,EACxB,yBAAyB,GAC1B,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAC,+BAA+B,EAAC,MAAM,0CAA0C,CAAC;AACzF,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,gBAAgB,EAChB,cAAc,GACf,MAAM,UAAU,CAAC;AAElB,6EAA6E;AAC7E,qEAAqE;AACrE,2EAA2E;AAC3E,MAAM,uBAAuB,GAAG,+BAA+B,CAC7D,wBAA+B,EAC/B,0BAA0B,CAC3B,CAAC;AACF,MAAM,mBAAmB,GAAG,+BAA+B,CACzD,gBAAuB,EACvB,sBAAsB,CACvB,CAAC;AACF,MAAM,gBAAgB,GAAG,+BAA+B,CACtD,iBAAwB,EACxB,mBAAmB,CACpB,CAAC;AACF,MAAM,mBAAmB,GAAG,+BAA+B,CACzD,oBAA2B,EAC3B,sBAAsB,CACvB,CAAC;AACF,MAAM,wBAAwB,GAAG,+BAA+B,CAC9D,yBAAgC,EAChC,2BAA2B,CAC5B,CAAC;AACF,MAAM,eAAe,GAAG,+BAA+B,CACrD,gBAAuB,EACvB,kBAAkB,CACnB,CAAC;AAEF,MAAM,CAAC,MAAM,yBAAyB,GAGlC;IACF,OAAO;IACP,eAAe;IACf,SAAS;IACT,gBAAgB;IAChB,YAAY;IACZ,wBAAwB,EAAE,uBAAuB;IACjD,oBAAoB,EAAE,mBAAmB;IACzC,mBAAmB,EAAE,eAAe;IACpC,iBAAiB,EAAE,gBAAgB;IACnC,oBAAoB,EAAE,mBAAmB;IACzC,yBAAyB,EAAE,wBAAwB;IACnD,gBAAgB,EAAE,eAAe;IACjC,kBAAkB,EAAE,cAAc;IAClC,sBAAsB,EAAE,kBAAkB;CAC3C,CAAC;AAEF,MAAM,CAAC,MAAM,8BAA8B,GAAG;IAC5C,iBAAiB;CAClB,CAAC;AAEF,MAAM,CAAC,MAAM,2BAA2B,GAAG,EAAE,CAAC","sourcesContent":["import {\n COORDINATE_SYSTEM,\n FirstPersonView,\n MapView,\n OrbitView,\n OrthographicView,\n} from '@deck.gl/core';\nimport {GeoJsonLayer} from '@deck.gl/layers';\nimport {\n GeoArrowArcLayer,\n GeoArrowPathLayer,\n GeoArrowPolygonLayer,\n GeoArrowScatterplotLayer,\n GeoArrowSolidPolygonLayer,\n} from '@geoarrow/deck.gl-geoarrow';\nimport {createTableToRecordBatchAdapter} from './layers/createTableToRecordBatchAdapter';\nimport {\n DeckColumnLayer,\n DeckH3HexagonLayer,\n DeckHeatmapLayer,\n DeckTripsLayer,\n} from './layers';\n\n// The 0.4.x GeoArrow layers expect `data: RecordBatch` + geometry as `Data`,\n// but our JSON pipeline passes `data: Table` + geometry as `Vector`.\n// These adapters bridge the gap by splitting Table batches into sublayers.\nconst AdaptedScatterplotLayer = createTableToRecordBatchAdapter(\n GeoArrowScatterplotLayer as any,\n 'GeoArrowScatterplotLayer',\n);\nconst AdaptedHeatmapLayer = createTableToRecordBatchAdapter(\n DeckHeatmapLayer as any,\n 'GeoArrowHeatmapLayer',\n);\nconst AdaptedPathLayer = createTableToRecordBatchAdapter(\n GeoArrowPathLayer as any,\n 'GeoArrowPathLayer',\n);\nconst AdaptedPolygonLayer = createTableToRecordBatchAdapter(\n GeoArrowPolygonLayer as any,\n 'GeoArrowPolygonLayer',\n);\nconst AdaptedSolidPolygonLayer = createTableToRecordBatchAdapter(\n GeoArrowSolidPolygonLayer as any,\n 'GeoArrowSolidPolygonLayer',\n);\nconst AdaptedArcLayer = createTableToRecordBatchAdapter(\n GeoArrowArcLayer as any,\n 'GeoArrowArcLayer',\n);\n\nexport const DEFAULT_DECK_JSON_CLASSES: Record<\n string,\n new (props: Record<string, unknown>) => unknown\n> = {\n MapView,\n FirstPersonView,\n OrbitView,\n OrthographicView,\n GeoJsonLayer,\n GeoArrowScatterplotLayer: AdaptedScatterplotLayer,\n GeoArrowHeatmapLayer: AdaptedHeatmapLayer,\n GeoArrowColumnLayer: DeckColumnLayer,\n GeoArrowPathLayer: AdaptedPathLayer,\n GeoArrowPolygonLayer: AdaptedPolygonLayer,\n GeoArrowSolidPolygonLayer: AdaptedSolidPolygonLayer,\n GeoArrowArcLayer: AdaptedArcLayer,\n GeoArrowTripsLayer: DeckTripsLayer,\n GeoArrowH3HexagonLayer: DeckH3HexagonLayer,\n};\n\nexport const DEFAULT_DECK_JSON_ENUMERATIONS = {\n COORDINATE_SYSTEM,\n};\n\nexport const DEFAULT_DECK_JSON_CONSTANTS = {};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"extractColorScaleLegends.d.ts","sourceRoot":"","sources":["../../src/json/extractColorScaleLegends.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,mBAAmB,EAAC,MAAM,wBAAwB,CAAC;AAChE,OAAO,KAAK,EAAC,wBAAwB,EAAC,MAAM,UAAU,CAAC;AAoDvD,wBAAgB,wBAAwB,CAAC,OAAO,EAAE;IAChD,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACrC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAAC;CACzD,yBA8DA"}
1
+ {"version":3,"file":"extractColorScaleLegends.d.ts","sourceRoot":"","sources":["../../src/json/extractColorScaleLegends.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,mBAAmB,EAAC,MAAM,wBAAwB,CAAC;AAChE,OAAO,KAAK,EAAC,wBAAwB,EAAC,MAAM,UAAU,CAAC;AAoDvD,wBAAgB,wBAAwB,CAAC,OAAO,EAAE;IAChD,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACrC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAAC;CACzD,yBAkGA"}
@@ -64,21 +64,50 @@ export function extractColorScaleLegends(options) {
64
64
  if (!datasetState || datasetState.status !== 'ready') {
65
65
  continue;
66
66
  }
67
- for (const { propName, colorScale } of resolvedColorScales) {
68
- let resolvedLegend = null;
69
- try {
70
- resolvedLegend = buildColorScaleLegend({
71
- table: datasetState.prepared.table,
72
- colorScale,
73
- title: resolveLegendTitle(layerProps, propName, colorScale.field),
74
- });
75
- }
76
- catch {
77
- continue;
78
- }
79
- if (resolvedLegend) {
80
- legends.push(resolvedLegend);
67
+ // Prefer fill legend; show stroke only when fill has no color scale.
68
+ const hasFillColorScale = resolvedColorScales.some((entry) => entry.propName === 'getFillColor');
69
+ const primaryScales = hasFillColorScale
70
+ ? resolvedColorScales.filter((entry) => entry.propName !== 'getLineColor')
71
+ : resolvedColorScales;
72
+ const strokeFallbackScales = hasFillColorScale
73
+ ? resolvedColorScales.filter((entry) => entry.propName === 'getLineColor')
74
+ : [];
75
+ const seenLegendKeys = new Set();
76
+ const pushLegendsFrom = (scales) => {
77
+ let added = 0;
78
+ for (const { propName, colorScale } of scales) {
79
+ try {
80
+ const title = resolveLegendTitle(layerProps, propName, colorScale.field);
81
+ const key = [
82
+ title,
83
+ colorScale.type,
84
+ String(colorScale.scheme ?? ''),
85
+ colorScale.field,
86
+ JSON.stringify(colorScale),
87
+ ].join('\0');
88
+ if (seenLegendKeys.has(key))
89
+ continue;
90
+ const resolvedLegend = buildColorScaleLegend({
91
+ table: datasetState.prepared.table,
92
+ colorScale,
93
+ title,
94
+ });
95
+ if (resolvedLegend) {
96
+ seenLegendKeys.add(key);
97
+ legends.push(resolvedLegend);
98
+ added += 1;
99
+ }
100
+ }
101
+ catch {
102
+ // skip failed accessor
103
+ }
81
104
  }
105
+ return added;
106
+ };
107
+ const added = pushLegendsFrom(primaryScales);
108
+ // Fill scale failed to resolve → fall back to stroke.
109
+ if (added === 0 && strokeFallbackScales.length > 0) {
110
+ pushLegendsFrom(strokeFallbackScales);
82
111
  }
83
112
  }
84
113
  return legends;
@@ -1 +1 @@
1
- {"version":3,"file":"extractColorScaleLegends.js","sourceRoot":"","sources":["../../src/json/extractColorScaleLegends.ts"],"names":[],"mappings":"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","sourcesContent":["import type {ResolvedColorLegend} from '@sqlrooms/color-scales';\nimport type {PreparedDeckDatasetState} from '../types';\nimport {getAllColorScales} from './colorScaleFunction';\nimport {buildColorScaleLegend} from './compileColorScale';\nimport {DEFAULT_HEATMAP_COLOR_RANGE} from './heatmapDefaults';\nimport {resolveColorLegend, resolveDatasetId} from './layerConfig';\n\nimport type {ColorScalePropName} from './colorScaleFunction';\n\nfunction resolveLegendTitle(\n layerProps: Record<string, unknown>,\n propName: ColorScalePropName,\n fallbackField: string,\n) {\n const legend = resolveColorLegend(layerProps, propName);\n if (\n legend &&\n typeof legend === 'object' &&\n typeof legend.title === 'string'\n ) {\n return legend.title;\n }\n\n return fallbackField;\n}\n\nfunction buildHeatmapLegend(\n layerProps: Record<string, unknown>,\n): ResolvedColorLegend | null {\n const rawRange = layerProps.colorRange as\n | Array<[number, number, number, number]>\n | undefined;\n const colorRange =\n Array.isArray(rawRange) && rawRange.length >= 2\n ? rawRange\n : DEFAULT_HEATMAP_COLOR_RANGE;\n\n const stops = colorRange.map((c, i) => {\n const pct = (i / (colorRange.length - 1)) * 100;\n return `rgba(${c[0]},${c[1]},${c[2]},${(c[3] ?? 255) / 255}) ${pct.toFixed(1)}%`;\n });\n\n return {\n type: 'continuous',\n title: 'Density',\n gradient: `linear-gradient(to right, ${stops.join(', ')})`,\n ticks: [\n {label: 'Low', offset: 0},\n {label: 'High', offset: 100},\n ],\n };\n}\n\nexport function extractColorScaleLegends(options: {\n spec: Record<string, unknown> | null;\n datasetIds: string[];\n datasetStates: Record<string, PreparedDeckDatasetState>;\n}) {\n const {spec, datasetIds, datasetStates} = options;\n if (!spec || !Array.isArray(spec.layers)) {\n return [] as ResolvedColorLegend[];\n }\n\n const legends: ResolvedColorLegend[] = [];\n\n for (const layer of spec.layers) {\n if (!layer || typeof layer !== 'object') {\n continue;\n }\n\n const layerProps = layer as Record<string, unknown>;\n\n if (layerProps.visible === false) {\n continue;\n }\n\n const layerType = layerProps['@@type'];\n if (layerType === 'GeoArrowHeatmapLayer') {\n const heatmapLegend = buildHeatmapLegend(layerProps);\n if (heatmapLegend) {\n legends.push(heatmapLegend);\n }\n continue;\n }\n\n const resolvedColorScales = getAllColorScales(layerProps);\n if (resolvedColorScales.length === 0) {\n continue;\n }\n\n const datasetId = resolveDatasetId(layerProps, datasetIds);\n if (!datasetId) {\n continue;\n }\n\n const datasetState = datasetStates[datasetId];\n if (!datasetState || datasetState.status !== 'ready') {\n continue;\n }\n\n for (const {propName, colorScale} of resolvedColorScales) {\n let resolvedLegend: ResolvedColorLegend | null = null;\n try {\n resolvedLegend = buildColorScaleLegend({\n table: datasetState.prepared.table,\n colorScale,\n title: resolveLegendTitle(layerProps, propName, colorScale.field),\n });\n } catch {\n continue;\n }\n\n if (resolvedLegend) {\n legends.push(resolvedLegend);\n }\n }\n }\n\n return legends;\n}\n"]}
1
+ {"version":3,"file":"extractColorScaleLegends.js","sourceRoot":"","sources":["../../src/json/extractColorScaleLegends.ts"],"names":[],"mappings":"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","sourcesContent":["import type {ResolvedColorLegend} from '@sqlrooms/color-scales';\nimport type {PreparedDeckDatasetState} from '../types';\nimport {getAllColorScales} from './colorScaleFunction';\nimport {buildColorScaleLegend} from './compileColorScale';\nimport {DEFAULT_HEATMAP_COLOR_RANGE} from './heatmapDefaults';\nimport {resolveColorLegend, resolveDatasetId} from './layerConfig';\n\nimport type {ColorScalePropName} from './colorScaleFunction';\n\nfunction resolveLegendTitle(\n layerProps: Record<string, unknown>,\n propName: ColorScalePropName,\n fallbackField: string,\n) {\n const legend = resolveColorLegend(layerProps, propName);\n if (\n legend &&\n typeof legend === 'object' &&\n typeof legend.title === 'string'\n ) {\n return legend.title;\n }\n\n return fallbackField;\n}\n\nfunction buildHeatmapLegend(\n layerProps: Record<string, unknown>,\n): ResolvedColorLegend | null {\n const rawRange = layerProps.colorRange as\n | Array<[number, number, number, number]>\n | undefined;\n const colorRange =\n Array.isArray(rawRange) && rawRange.length >= 2\n ? rawRange\n : DEFAULT_HEATMAP_COLOR_RANGE;\n\n const stops = colorRange.map((c, i) => {\n const pct = (i / (colorRange.length - 1)) * 100;\n return `rgba(${c[0]},${c[1]},${c[2]},${(c[3] ?? 255) / 255}) ${pct.toFixed(1)}%`;\n });\n\n return {\n type: 'continuous',\n title: 'Density',\n gradient: `linear-gradient(to right, ${stops.join(', ')})`,\n ticks: [\n {label: 'Low', offset: 0},\n {label: 'High', offset: 100},\n ],\n };\n}\n\nexport function extractColorScaleLegends(options: {\n spec: Record<string, unknown> | null;\n datasetIds: string[];\n datasetStates: Record<string, PreparedDeckDatasetState>;\n}) {\n const {spec, datasetIds, datasetStates} = options;\n if (!spec || !Array.isArray(spec.layers)) {\n return [] as ResolvedColorLegend[];\n }\n\n const legends: ResolvedColorLegend[] = [];\n\n for (const layer of spec.layers) {\n if (!layer || typeof layer !== 'object') {\n continue;\n }\n\n const layerProps = layer as Record<string, unknown>;\n\n if (layerProps.visible === false) {\n continue;\n }\n\n const layerType = layerProps['@@type'];\n if (layerType === 'GeoArrowHeatmapLayer') {\n const heatmapLegend = buildHeatmapLegend(layerProps);\n if (heatmapLegend) {\n legends.push(heatmapLegend);\n }\n continue;\n }\n\n const resolvedColorScales = getAllColorScales(layerProps);\n if (resolvedColorScales.length === 0) {\n continue;\n }\n\n const datasetId = resolveDatasetId(layerProps, datasetIds);\n if (!datasetId) {\n continue;\n }\n\n const datasetState = datasetStates[datasetId];\n if (!datasetState || datasetState.status !== 'ready') {\n continue;\n }\n\n // Prefer fill legend; show stroke only when fill has no color scale.\n const hasFillColorScale = resolvedColorScales.some(\n (entry) => entry.propName === 'getFillColor',\n );\n const primaryScales = hasFillColorScale\n ? resolvedColorScales.filter((entry) => entry.propName !== 'getLineColor')\n : resolvedColorScales;\n const strokeFallbackScales = hasFillColorScale\n ? resolvedColorScales.filter((entry) => entry.propName === 'getLineColor')\n : [];\n\n const seenLegendKeys = new Set<string>();\n const pushLegendsFrom = (scales: typeof resolvedColorScales): number => {\n let added = 0;\n for (const {propName, colorScale} of scales) {\n try {\n const title = resolveLegendTitle(\n layerProps,\n propName,\n colorScale.field,\n );\n const key = [\n title,\n colorScale.type,\n String(colorScale.scheme ?? ''),\n colorScale.field,\n JSON.stringify(colorScale),\n ].join('\\0');\n if (seenLegendKeys.has(key)) continue;\n\n const resolvedLegend = buildColorScaleLegend({\n table: datasetState.prepared.table,\n colorScale,\n title,\n });\n if (resolvedLegend) {\n seenLegendKeys.add(key);\n legends.push(resolvedLegend);\n added += 1;\n }\n } catch {\n // skip failed accessor\n }\n }\n return added;\n };\n\n const added = pushLegendsFrom(primaryScales);\n // Fill scale failed to resolve → fall back to stroke.\n if (added === 0 && strokeFallbackScales.length > 0) {\n pushLegendsFrom(strokeFallbackScales);\n }\n }\n\n return legends;\n}\n"]}
@@ -1,8 +1,18 @@
1
- /** Default color range for heatmap layers (YlOrRd, matching deck.gl's built-in default). */
2
- export declare const DEFAULT_HEATMAP_COLOR_RANGE: Array<[
3
- number,
4
- number,
5
- number,
6
- number
7
- ]>;
1
+ import { type ContinuousSequentialScheme, type ResolvedRGBA } from '@sqlrooms/color-scales';
2
+ /**
3
+ * Heatmap GPU weights-texture size.
4
+ */
5
+ export declare const DEFAULT_HEATMAP_WEIGHTS_TEXTURE_SIZE = 512;
6
+ /** Default heatmap scheme (YlOrRd, matching deck.gl's built-in default). */
7
+ export declare const DEFAULT_HEATMAP_SCHEME: ContinuousSequentialScheme;
8
+ /** Sample a sequential scheme into a heatmap `colorRange`. */
9
+ export declare function heatmapSchemeToColorRange(scheme: string): ResolvedRGBA[];
10
+ /**
11
+ * Named scheme for a heatmap `colorRange`. Missing or unrecognized ranges
12
+ * fall back to {@link DEFAULT_HEATMAP_SCHEME} so the settings picker matches
13
+ * the renderer default.
14
+ */
15
+ export declare function detectHeatmapScheme(colorRange: unknown): string;
16
+ /** Default color range for heatmap layers. */
17
+ export declare const DEFAULT_HEATMAP_COLOR_RANGE: ResolvedRGBA[];
8
18
  //# sourceMappingURL=heatmapDefaults.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"heatmapDefaults.d.ts","sourceRoot":"","sources":["../../src/json/heatmapDefaults.ts"],"names":[],"mappings":"AAOA,4FAA4F;AAC5F,eAAO,MAAM,2BAA2B,EAAE,KAAK,CAC7C;IAAC,MAAM;IAAE,MAAM;IAAE,MAAM;IAAE,MAAM;CAAC,CAc7B,CAAC"}
1
+ {"version":3,"file":"heatmapDefaults.d.ts","sourceRoot":"","sources":["../../src/json/heatmapDefaults.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,0BAA0B,EAC/B,KAAK,YAAY,EAClB,MAAM,wBAAwB,CAAC;AAIhC;;GAEG;AACH,eAAO,MAAM,oCAAoC,MAAM,CAAC;AAExD,4EAA4E;AAC5E,eAAO,MAAM,sBAAsB,EAAE,0BAAqC,CAAC;AAmB3E,8DAA8D;AAC9D,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,EAAE,CASxE;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,OAAO,GAAG,MAAM,CAmB/D;AAED,8CAA8C;AAC9C,eAAO,MAAM,2BAA2B,EAAE,YAAY,EACH,CAAC"}
@@ -1,14 +1,56 @@
1
- import { continuousSequentialInterpolators, parseColorString, } from '@sqlrooms/color-scales';
1
+ import { continuousSequentialInterpolators, continuousSequentialSchemes, parseColorString, } from '@sqlrooms/color-scales';
2
2
  const HEATMAP_COLOR_STEPS = 6;
3
- /** Default color range for heatmap layers (YlOrRd, matching deck.gl's built-in default). */
4
- export const DEFAULT_HEATMAP_COLOR_RANGE = continuousSequentialInterpolators.YlOrRd
5
- ? Array.from({ length: HEATMAP_COLOR_STEPS }, (_, i) => parseColorString(continuousSequentialInterpolators.YlOrRd(i / (HEATMAP_COLOR_STEPS - 1))))
6
- : [
7
- [255, 255, 178, 255],
8
- [254, 178, 76, 255],
9
- [253, 141, 60, 255],
10
- [240, 59, 32, 255],
11
- [189, 0, 38, 255],
12
- [128, 0, 38, 255],
13
- ];
3
+ /**
4
+ * Heatmap GPU weights-texture size.
5
+ */
6
+ export const DEFAULT_HEATMAP_WEIGHTS_TEXTURE_SIZE = 512;
7
+ /** Default heatmap scheme (YlOrRd, matching deck.gl's built-in default). */
8
+ export const DEFAULT_HEATMAP_SCHEME = 'YlOrRd';
9
+ const FALLBACK_YLORRD = [
10
+ [255, 255, 178, 255],
11
+ [254, 178, 76, 255],
12
+ [253, 141, 60, 255],
13
+ [240, 59, 32, 255],
14
+ [189, 0, 38, 255],
15
+ [128, 0, 38, 255],
16
+ ];
17
+ function sampleInterpolator(interpolator) {
18
+ return Array.from({ length: HEATMAP_COLOR_STEPS }, (_, i) => parseColorString(interpolator(i / (HEATMAP_COLOR_STEPS - 1))));
19
+ }
20
+ /** Sample a sequential scheme into a heatmap `colorRange`. */
21
+ export function heatmapSchemeToColorRange(scheme) {
22
+ const interpolator = continuousSequentialInterpolators[scheme] ?? continuousSequentialInterpolators[DEFAULT_HEATMAP_SCHEME];
23
+ if (!interpolator) {
24
+ return FALLBACK_YLORRD.map((color) => [...color]);
25
+ }
26
+ return sampleInterpolator(interpolator);
27
+ }
28
+ /**
29
+ * Named scheme for a heatmap `colorRange`. Missing or unrecognized ranges
30
+ * fall back to {@link DEFAULT_HEATMAP_SCHEME} so the settings picker matches
31
+ * the renderer default.
32
+ */
33
+ export function detectHeatmapScheme(colorRange) {
34
+ if (!Array.isArray(colorRange) || colorRange.length === 0) {
35
+ return DEFAULT_HEATMAP_SCHEME;
36
+ }
37
+ for (const scheme of continuousSequentialSchemes) {
38
+ const sampled = heatmapSchemeToColorRange(scheme);
39
+ if (sampled.length !== colorRange.length)
40
+ continue;
41
+ const matches = sampled.every((color, idx) => {
42
+ const actual = colorRange[idx];
43
+ if (!Array.isArray(actual))
44
+ return false;
45
+ return (Math.abs(color[0] - actual[0]) < 2 &&
46
+ Math.abs(color[1] - actual[1]) < 2 &&
47
+ Math.abs(color[2] - actual[2]) < 2);
48
+ });
49
+ if (matches)
50
+ return scheme;
51
+ }
52
+ return DEFAULT_HEATMAP_SCHEME;
53
+ }
54
+ /** Default color range for heatmap layers. */
55
+ export const DEFAULT_HEATMAP_COLOR_RANGE = heatmapSchemeToColorRange(DEFAULT_HEATMAP_SCHEME);
14
56
  //# sourceMappingURL=heatmapDefaults.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"heatmapDefaults.js","sourceRoot":"","sources":["../../src/json/heatmapDefaults.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iCAAiC,EACjC,gBAAgB,GACjB,MAAM,wBAAwB,CAAC;AAEhC,MAAM,mBAAmB,GAAG,CAAC,CAAC;AAE9B,4FAA4F;AAC5F,MAAM,CAAC,MAAM,2BAA2B,GAEpC,iCAAiC,CAAC,MAAM;IAC1C,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAC,MAAM,EAAE,mBAAmB,EAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACjD,gBAAgB,CACd,iCAAiC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,mBAAmB,GAAG,CAAC,CAAC,CAAC,CACxE,CACF;IACH,CAAC,CAAC;QACE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;QACpB,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,CAAC;QACnB,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,CAAC;QACnB,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC;QAClB,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC;QACjB,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC;KAClB,CAAC","sourcesContent":["import {\n continuousSequentialInterpolators,\n parseColorString,\n} from '@sqlrooms/color-scales';\n\nconst HEATMAP_COLOR_STEPS = 6;\n\n/** Default color range for heatmap layers (YlOrRd, matching deck.gl's built-in default). */\nexport const DEFAULT_HEATMAP_COLOR_RANGE: Array<\n [number, number, number, number]\n> = continuousSequentialInterpolators.YlOrRd\n ? Array.from({length: HEATMAP_COLOR_STEPS}, (_, i) =>\n parseColorString(\n continuousSequentialInterpolators.YlOrRd(i / (HEATMAP_COLOR_STEPS - 1)),\n ),\n )\n : [\n [255, 255, 178, 255],\n [254, 178, 76, 255],\n [253, 141, 60, 255],\n [240, 59, 32, 255],\n [189, 0, 38, 255],\n [128, 0, 38, 255],\n ];\n"]}
1
+ {"version":3,"file":"heatmapDefaults.js","sourceRoot":"","sources":["../../src/json/heatmapDefaults.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n continuousSequentialInterpolators,\n continuousSequentialSchemes,\n parseColorString,\n type ContinuousSequentialScheme,\n type ResolvedRGBA,\n} from '@sqlrooms/color-scales';\n\nconst HEATMAP_COLOR_STEPS = 6;\n\n/**\n * Heatmap GPU weights-texture size.\n */\nexport const DEFAULT_HEATMAP_WEIGHTS_TEXTURE_SIZE = 512;\n\n/** Default heatmap scheme (YlOrRd, matching deck.gl's built-in default). */\nexport const DEFAULT_HEATMAP_SCHEME: ContinuousSequentialScheme = 'YlOrRd';\n\nconst FALLBACK_YLORRD: ResolvedRGBA[] = [\n [255, 255, 178, 255],\n [254, 178, 76, 255],\n [253, 141, 60, 255],\n [240, 59, 32, 255],\n [189, 0, 38, 255],\n [128, 0, 38, 255],\n];\n\nfunction sampleInterpolator(\n interpolator: (t: number) => string,\n): ResolvedRGBA[] {\n return Array.from({length: HEATMAP_COLOR_STEPS}, (_, i) =>\n parseColorString(interpolator(i / (HEATMAP_COLOR_STEPS - 1))),\n );\n}\n\n/** Sample a sequential scheme into a heatmap `colorRange`. */\nexport function heatmapSchemeToColorRange(scheme: string): ResolvedRGBA[] {\n const interpolator =\n continuousSequentialInterpolators[\n scheme as keyof typeof continuousSequentialInterpolators\n ] ?? continuousSequentialInterpolators[DEFAULT_HEATMAP_SCHEME];\n if (!interpolator) {\n return FALLBACK_YLORRD.map((color) => [...color] as ResolvedRGBA);\n }\n return sampleInterpolator(interpolator);\n}\n\n/**\n * Named scheme for a heatmap `colorRange`. Missing or unrecognized ranges\n * fall back to {@link DEFAULT_HEATMAP_SCHEME} so the settings picker matches\n * the renderer default.\n */\nexport function detectHeatmapScheme(colorRange: unknown): string {\n if (!Array.isArray(colorRange) || colorRange.length === 0) {\n return DEFAULT_HEATMAP_SCHEME;\n }\n for (const scheme of continuousSequentialSchemes) {\n const sampled = heatmapSchemeToColorRange(scheme);\n if (sampled.length !== colorRange.length) continue;\n const matches = sampled.every((color, idx) => {\n const actual = colorRange[idx];\n if (!Array.isArray(actual)) return false;\n return (\n Math.abs(color[0] - actual[0]) < 2 &&\n Math.abs(color[1] - actual[1]) < 2 &&\n Math.abs(color[2] - actual[2]) < 2\n );\n });\n if (matches) return scheme;\n }\n return DEFAULT_HEATMAP_SCHEME;\n}\n\n/** Default color range for heatmap layers. */\nexport const DEFAULT_HEATMAP_COLOR_RANGE: ResolvedRGBA[] =\n heatmapSchemeToColorRange(DEFAULT_HEATMAP_SCHEME);\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"DeckH3HexagonLayer.d.ts","sourceRoot":"","sources":["../../../src/json/layers/DeckH3HexagonLayer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,cAAc,EAAE,KAAK,KAAK,EAAE,KAAK,UAAU,EAAC,MAAM,eAAe,CAAC;AAE1E,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAEtC;;;;;;;;;;;GAWG;AACH,qBAAa,kBAAmB,SAAQ,cAAc,CAAC;IACrD,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC;IAClB,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC;IACzB,YAAY,CAAC,EACT,KAAK,CAAC,MAAM,GACZ,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAChC,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC,CAAC;IAC9B,YAAY,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC,CAAC;IACjE,YAAY,CAAC,EACT,KAAK,CAAC,MAAM,GACZ,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAChC,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC,CAAC;IAC9B,YAAY,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC,CAAC;IACjE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB,CAAC;IACA,MAAM,CAAC,SAAS,SAA4B;IAC5C,MAAM,CAAC,YAAY;;;;;;;;;MAIjB;IAEF,YAAY,IAAI,KAAK,GAAG,UAAU,GAAG,IAAI;CA4G1C"}
1
+ {"version":3,"file":"DeckH3HexagonLayer.d.ts","sourceRoot":"","sources":["../../../src/json/layers/DeckH3HexagonLayer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,cAAc,EAAE,KAAK,KAAK,EAAE,KAAK,UAAU,EAAC,MAAM,eAAe,CAAC;AAE1E,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAGtC;;;;;;;;;;;GAWG;AACH,qBAAa,kBAAmB,SAAQ,cAAc,CAAC;IACrD,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC;IAClB,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC;IACzB,YAAY,CAAC,EACT,KAAK,CAAC,MAAM,GACZ,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAChC,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC,CAAC;IAC9B,YAAY,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC,CAAC;IACjE,YAAY,CAAC,EACT,KAAK,CAAC,MAAM,GACZ,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAChC,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC,CAAC;IAC9B,YAAY,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC,CAAC;IACjE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB,CAAC;IACA,MAAM,CAAC,SAAS,SAA4B;IAC5C,MAAM,CAAC,YAAY;;;;;;;;;MAIjB;IAEF,YAAY,IAAI,KAAK,GAAG,UAAU,GAAG,IAAI;CAsG1C"}
@@ -1,6 +1,7 @@
1
1
  import { CompositeLayer } from '@deck.gl/core';
2
2
  import { H3HexagonLayer } from '@deck.gl/geo-layers';
3
3
  import * as arrow from 'apache-arrow';
4
+ import { formatH3IndexForDeck } from './h3IndexFormat';
4
5
  /**
5
6
  * Custom GeoArrow-compatible H3HexagonLayer wrapper.
6
7
  *
@@ -26,9 +27,6 @@ export class DeckH3HexagonLayer extends CompositeLayer {
26
27
  return null;
27
28
  const numRows = table.numRows;
28
29
  const isVector = hexProp instanceof arrow.Vector;
29
- const isBigIntColumn = isVector &&
30
- (hexProp.type instanceof arrow.Int64 ||
31
- hexProp.type instanceof arrow.Uint64);
32
30
  // Build a lookup from global row index to {batch, localIndex} for
33
31
  // multi-batch tables so compiled accessors receive the correct batch.
34
32
  const batches = table.batches;
@@ -52,11 +50,7 @@ export class DeckH3HexagonLayer extends CompositeLayer {
52
50
  // Resolve hex value per row
53
51
  const getHexValue = (i) => {
54
52
  if (isVector) {
55
- const raw = hexProp.get(i);
56
- if (isBigIntColumn && typeof raw === 'bigint') {
57
- return raw.toString(16);
58
- }
59
- return String(raw ?? '');
53
+ return formatH3IndexForDeck(hexProp.get(i));
60
54
  }
61
55
  // Compiled accessor function
62
56
  if (typeof hexProp === 'function') {
@@ -66,9 +60,7 @@ export class DeckH3HexagonLayer extends CompositeLayer {
66
60
  data: { data: batch },
67
61
  target: [],
68
62
  });
69
- if (typeof result === 'bigint')
70
- return result.toString(16);
71
- return String(result ?? '');
63
+ return formatH3IndexForDeck(result);
72
64
  }
73
65
  return '';
74
66
  };
@@ -87,8 +79,10 @@ export class DeckH3HexagonLayer extends CompositeLayer {
87
79
  if (propValue instanceof arrow.Vector) {
88
80
  // Arrow Vector → row accessor (H3 layer uses row-based iteration)
89
81
  const vec = propValue;
90
- layerProps[propName] = (d, { index }) => {
91
- return vec.get(index);
82
+ layerProps[propName] = (_d, { index }) => {
83
+ const raw = vec.get(index);
84
+ // Int64 elevation/width columns arrive as bigint; deck.gl needs numbers.
85
+ return typeof raw === 'bigint' ? Number(raw) : raw;
92
86
  };
93
87
  }
94
88
  else if (typeof propValue === 'function') {
@@ -96,11 +90,12 @@ export class DeckH3HexagonLayer extends CompositeLayer {
96
90
  const fn = propValue;
97
91
  layerProps[propName] = (_object, objectInfo) => {
98
92
  const { batch, localIndex } = resolveBatchContext(objectInfo.index);
99
- return fn({
93
+ const result = fn({
100
94
  index: localIndex,
101
95
  data: { data: batch },
102
96
  target: objectInfo.target,
103
97
  });
98
+ return typeof result === 'bigint' ? Number(result) : result;
104
99
  };
105
100
  }
106
101
  else {
@@ -1 +1 @@
1
- {"version":3,"file":"DeckH3HexagonLayer.js","sourceRoot":"","sources":["../../../src/json/layers/DeckH3HexagonLayer.ts"],"names":[],"mappings":"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","sourcesContent":["import {CompositeLayer, type Layer, type LayersList} from '@deck.gl/core';\nimport {H3HexagonLayer} from '@deck.gl/geo-layers';\nimport * as arrow from 'apache-arrow';\n\n/**\n * Custom GeoArrow-compatible H3HexagonLayer wrapper.\n *\n * The upstream GeoArrowH3HexagonLayer (from @geoarrow/deck.gl-geoarrow@0.4.x)\n * expects `getHexagon: Data<Utf8 | Uint64>`, but our pipeline may produce\n * BigInt H3 indices that need hex-string conversion. Additionally, H3HexagonLayer\n * internally iterates rows using createIterable and calls getHexagon(object)\n * expecting string H3 indices, which is incompatible with binary attribute passing.\n *\n * This wrapper converts Arrow data to row objects with proper BigInt→hex string\n * conversion, then passes them to the native H3HexagonLayer.\n */\nexport class DeckH3HexagonLayer extends CompositeLayer<{\n data: arrow.Table;\n getHexagon: arrow.Vector;\n getFillColor?:\n | arrow.Vector\n | [number, number, number, number]\n | ((...args: any[]) => any);\n getElevation?: arrow.Vector | number | ((...args: any[]) => any);\n getLineColor?:\n | arrow.Vector\n | [number, number, number, number]\n | ((...args: any[]) => any);\n getLineWidth?: arrow.Vector | number | ((...args: any[]) => any);\n [key: string]: unknown;\n}> {\n static layerName = 'GeoArrowH3HexagonLayer';\n static defaultProps = {\n highPrecision: 'auto',\n coverage: {type: 'number', min: 0, max: 1, value: 1},\n extruded: true,\n };\n\n renderLayers(): Layer | LayersList | null {\n const {data: table, getHexagon: hexProp, ...otherProps} = this.props;\n\n if (!table || !hexProp) return null;\n\n const numRows = table.numRows;\n const isVector = hexProp instanceof arrow.Vector;\n const isBigIntColumn =\n isVector &&\n (hexProp.type instanceof arrow.Int64 ||\n hexProp.type instanceof arrow.Uint64);\n\n // Build a lookup from global row index to {batch, localIndex} for\n // multi-batch tables so compiled accessors receive the correct batch.\n const batches = table.batches;\n const batchOffsets = new Int32Array(batches.length);\n for (let i = 1; i < batches.length; i++) {\n batchOffsets[i] = batchOffsets[i - 1]! + batches[i - 1]!.numRows;\n }\n\n const resolveBatchContext = (globalIndex: number) => {\n let batchIdx = batches.length - 1;\n for (let i = 1; i < batches.length; i++) {\n if (globalIndex < batchOffsets[i]!) {\n batchIdx = i - 1;\n break;\n }\n }\n return {\n batch: batches[batchIdx]!,\n localIndex: globalIndex - batchOffsets[batchIdx]!,\n };\n };\n\n // Resolve hex value per row\n const getHexValue = (i: number): string => {\n if (isVector) {\n const raw = hexProp.get(i);\n if (isBigIntColumn && typeof raw === 'bigint') {\n return raw.toString(16);\n }\n return String(raw ?? '');\n }\n // Compiled accessor function\n if (typeof hexProp === 'function') {\n const {batch, localIndex} = resolveBatchContext(i);\n const result = (hexProp as (...args: unknown[]) => unknown)({\n index: localIndex,\n data: {data: batch},\n target: [],\n });\n if (typeof result === 'bigint') return result.toString(16);\n return String(result ?? '');\n }\n return '';\n };\n\n // Build row objects from Arrow table\n const rows: Record<string, unknown>[] = Array.from(\n {length: numRows},\n (_, i) => {\n const row: Record<string, unknown> = {};\n for (const field of table.schema.fields) {\n row[field.name] = table.getChild(field.name)?.get(i);\n }\n row.__h3Index = getHexValue(i);\n return row;\n },\n );\n\n // Resolve accessor props: Arrow Vectors → row functions, keep scalars\n const layerProps: Record<string, unknown> = {};\n for (const [propName, propValue] of Object.entries(otherProps)) {\n if (propValue instanceof arrow.Vector) {\n // Arrow Vector → row accessor (H3 layer uses row-based iteration)\n const vec = propValue;\n layerProps[propName] = (\n d: Record<string, unknown>,\n {index}: {index: number},\n ) => {\n return vec.get(index);\n };\n } else if (typeof propValue === 'function') {\n // Compiled GeoArrow accessor → wrap with batch context\n const fn = propValue;\n layerProps[propName] = (\n _object: unknown,\n objectInfo: {index: number; target?: number[]},\n ) => {\n const {batch, localIndex} = resolveBatchContext(objectInfo.index);\n return fn({\n index: localIndex,\n data: {data: batch},\n target: objectInfo.target,\n });\n };\n } else {\n layerProps[propName] = propValue;\n }\n }\n\n return new H3HexagonLayer({\n ...layerProps,\n id: `${this.props.id}-geoarrow-h3`,\n data: rows,\n getHexagon: (d: Record<string, unknown>) => d.__h3Index as string,\n } as any);\n }\n}\n"]}
1
+ {"version":3,"file":"DeckH3HexagonLayer.js","sourceRoot":"","sources":["../../../src/json/layers/DeckH3HexagonLayer.ts"],"names":[],"mappings":"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","sourcesContent":["import {CompositeLayer, type Layer, type LayersList} from '@deck.gl/core';\nimport {H3HexagonLayer} from '@deck.gl/geo-layers';\nimport * as arrow from 'apache-arrow';\nimport {formatH3IndexForDeck} from './h3IndexFormat';\n\n/**\n * Custom GeoArrow-compatible H3HexagonLayer wrapper.\n *\n * The upstream GeoArrowH3HexagonLayer (from @geoarrow/deck.gl-geoarrow@0.4.x)\n * expects `getHexagon: Data<Utf8 | Uint64>`, but our pipeline may produce\n * BigInt H3 indices that need hex-string conversion. Additionally, H3HexagonLayer\n * internally iterates rows using createIterable and calls getHexagon(object)\n * expecting string H3 indices, which is incompatible with binary attribute passing.\n *\n * This wrapper converts Arrow data to row objects with proper BigInt→hex string\n * conversion, then passes them to the native H3HexagonLayer.\n */\nexport class DeckH3HexagonLayer extends CompositeLayer<{\n data: arrow.Table;\n getHexagon: arrow.Vector;\n getFillColor?:\n | arrow.Vector\n | [number, number, number, number]\n | ((...args: any[]) => any);\n getElevation?: arrow.Vector | number | ((...args: any[]) => any);\n getLineColor?:\n | arrow.Vector\n | [number, number, number, number]\n | ((...args: any[]) => any);\n getLineWidth?: arrow.Vector | number | ((...args: any[]) => any);\n [key: string]: unknown;\n}> {\n static layerName = 'GeoArrowH3HexagonLayer';\n static defaultProps = {\n highPrecision: 'auto',\n coverage: {type: 'number', min: 0, max: 1, value: 1},\n extruded: true,\n };\n\n renderLayers(): Layer | LayersList | null {\n const {data: table, getHexagon: hexProp, ...otherProps} = this.props;\n\n if (!table || !hexProp) return null;\n\n const numRows = table.numRows;\n const isVector = hexProp instanceof arrow.Vector;\n\n // Build a lookup from global row index to {batch, localIndex} for\n // multi-batch tables so compiled accessors receive the correct batch.\n const batches = table.batches;\n const batchOffsets = new Int32Array(batches.length);\n for (let i = 1; i < batches.length; i++) {\n batchOffsets[i] = batchOffsets[i - 1]! + batches[i - 1]!.numRows;\n }\n\n const resolveBatchContext = (globalIndex: number) => {\n let batchIdx = batches.length - 1;\n for (let i = 1; i < batches.length; i++) {\n if (globalIndex < batchOffsets[i]!) {\n batchIdx = i - 1;\n break;\n }\n }\n return {\n batch: batches[batchIdx]!,\n localIndex: globalIndex - batchOffsets[batchIdx]!,\n };\n };\n\n // Resolve hex value per row\n const getHexValue = (i: number): string => {\n if (isVector) {\n return formatH3IndexForDeck(hexProp.get(i));\n }\n // Compiled accessor function\n if (typeof hexProp === 'function') {\n const {batch, localIndex} = resolveBatchContext(i);\n const result = (hexProp as (...args: unknown[]) => unknown)({\n index: localIndex,\n data: {data: batch},\n target: [],\n });\n return formatH3IndexForDeck(result);\n }\n return '';\n };\n\n // Build row objects from Arrow table\n const rows: Record<string, unknown>[] = Array.from(\n {length: numRows},\n (_, i) => {\n const row: Record<string, unknown> = {};\n for (const field of table.schema.fields) {\n row[field.name] = table.getChild(field.name)?.get(i);\n }\n row.__h3Index = getHexValue(i);\n return row;\n },\n );\n\n // Resolve accessor props: Arrow Vectors → row functions, keep scalars\n const layerProps: Record<string, unknown> = {};\n for (const [propName, propValue] of Object.entries(otherProps)) {\n if (propValue instanceof arrow.Vector) {\n // Arrow Vector → row accessor (H3 layer uses row-based iteration)\n const vec = propValue;\n layerProps[propName] = (\n _d: Record<string, unknown>,\n {index}: {index: number},\n ) => {\n const raw = vec.get(index);\n // Int64 elevation/width columns arrive as bigint; deck.gl needs numbers.\n return typeof raw === 'bigint' ? Number(raw) : raw;\n };\n } else if (typeof propValue === 'function') {\n // Compiled GeoArrow accessor → wrap with batch context\n const fn = propValue;\n layerProps[propName] = (\n _object: unknown,\n objectInfo: {index: number; target?: number[]},\n ) => {\n const {batch, localIndex} = resolveBatchContext(objectInfo.index);\n const result = fn({\n index: localIndex,\n data: {data: batch},\n target: objectInfo.target,\n });\n return typeof result === 'bigint' ? Number(result) : result;\n };\n } else {\n layerProps[propName] = propValue;\n }\n }\n\n return new H3HexagonLayer({\n ...layerProps,\n id: `${this.props.id}-geoarrow-h3`,\n data: rows,\n getHexagon: (d: Record<string, unknown>) => d.__h3Index as string,\n } as any);\n }\n}\n"]}
@@ -0,0 +1,32 @@
1
+ import type { Layer, LayersList } from '@deck.gl/core';
2
+ import { GeoArrowHeatmapLayer } from '@geoarrow/deck.gl-geoarrow';
3
+ type HeatmapDataCache = {
4
+ sourceData: unknown;
5
+ sourcePosition: unknown;
6
+ weightKey: unknown;
7
+ data: unknown;
8
+ };
9
+ /**
10
+ * GeoArrow heatmap that reuses the inner binary `data` wrapper when only style
11
+ * props change. JSONConverter builds a new layer each time; a new wrapper looks
12
+ * like a data change and rebuilds aggregation.
13
+ */
14
+ export declare class DeckHeatmapLayer extends GeoArrowHeatmapLayer {
15
+ static layerName: string;
16
+ static defaultProps: {
17
+ weightsTextureSize: {
18
+ type: "number";
19
+ min: number;
20
+ max: number;
21
+ value: number;
22
+ };
23
+ };
24
+ state: {
25
+ heatmapDataCache?: HeatmapDataCache;
26
+ };
27
+ renderLayers(): Layer | LayersList | null;
28
+ }
29
+ /** Return the previous inner heatmap `data` object when Arrow inputs match. */
30
+ export declare function reuseCachedHeatmapData(cache: HeatmapDataCache | undefined, props: Record<string, unknown>, nextData: unknown): HeatmapDataCache;
31
+ export {};
32
+ //# sourceMappingURL=DeckHeatmapLayer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DeckHeatmapLayer.d.ts","sourceRoot":"","sources":["../../../src/json/layers/DeckHeatmapLayer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,KAAK,EAAE,UAAU,EAAC,MAAM,eAAe,CAAC;AACrD,OAAO,EAAC,oBAAoB,EAAC,MAAM,4BAA4B,CAAC;AAGhE,KAAK,gBAAgB,GAAG;IACtB,UAAU,EAAE,OAAO,CAAC;IACpB,cAAc,EAAE,OAAO,CAAC;IACxB,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,EAAE,OAAO,CAAC;CACf,CAAC;AAIF;;;;GAIG;AACH,qBAAa,gBAAiB,SAAQ,oBAAoB;IACxD,MAAM,CAAC,SAAS,SAA0B;IAC1C,MAAM,CAAC,YAAY;;;;;;;MAOjB;IAEM,KAAK,EAAE;QAAC,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;KAAC,CAAC;IAErD,YAAY,IAAI,KAAK,GAAG,UAAU,GAAG,IAAI;CAyB1C;AAED,+EAA+E;AAC/E,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,gBAAgB,GAAG,SAAS,EACnC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,QAAQ,EAAE,OAAO,GAChB,gBAAgB,CAalB"}