apache/superset · error · Error

Position of picked data is required

Error message

Position of picked data is required

What it means

Thrown by the deck.gl cross-filters data-mask builder when a picked (clicked) chart element carries none of position, positions, or positionBounds. Cross-filtering a deck.gl layer works by converting the clicked geometry into filter values over the spatial columns; with no position data on the pick payload there is nothing to filter on and the mask cannot be built.

Source

Thrown at superset-frontend/plugins/preset-chart-deckgl/src/utils/crossFiltersDataMask.ts:108

  positions?: [number, number][];
  spatialData: SpatialData;
  positionBounds?: PositionBounds;
}) => {
  const {
    lonCol,
    latCol,
    lonlatCol,
    geohashCol,
    reverseCheckbox,
    type,
    delimiter,
  } = spatialData;
  let values: (string | number | [number, number] | [number, number][])[] = [];
  let filters: QueryObjectFilterClause[] = [];
  let customColumnLabel;

  if (!position && !positions && !positionBounds)
    throw new Error('Position of picked data is required');

  switch (type) {
    case spatialTypes.latlong: {
      if (lonCol != null && latCol != null) {
        const cols = [lonCol, latCol];

        if (positions && positions.length > 0) {
          values = positions;
          customColumnLabel = cols.join(', ');

          filters = [
            {
              col: lonCol,
              op: 'IN',
              val: positions.map(pos => pos[0]),
            },
            {
              col: latCol,

View on GitHub (pinned to f4587218dd)

Solutions

  1. Check the layer's data: rows with null/missing coordinates should be filtered (the layers already add IS NOT NULL filters — verify they are applied).
  2. If developing a custom layer, ensure onClick picks include position (point), positions (paths), or positionBounds (polygons) before invoking the mask builder.
  3. Disable cross-filter on the chart if the layer type does not carry positional picks.

Example fix

// before
const mask = getCrossFilterDataMask(picked); // picked has no geometry

// after
if (!picked.position && !picked.positions && !picked.positionBounds) {
  return; // nothing filterable was picked
}
const mask = getCrossFilterDataMask(picked);
Defensive patterns

Strategy: validation

Validate before calling

if (!picked.position && !picked.positions && !picked.positionBounds) {
  return; // nothing filterable
}
const mask = getCrossFilterDataMask(picked);

Type guard

const hasPickGeometry = (p: unknown): boolean =>
  p != null && Boolean((p as any).position || (p as any).positions || (p as any).positionBounds);

Try / catch

try { applyCrossFilter(getCrossFilterDataMask(picked)); } catch (e) { if (e.message === 'Position of picked data is required') console.warn('non-geometric pick ignored'); else throw e; }

Prevention

When it happens

Trigger: Clicking (cross-filtering) a deck.gl chart object whose picked datum lacks position/positions/positionBounds — e.g. a polygon pick that returned only bounds under a different key, a null island point, or programmatic calls to the mask builder with a synthetic pick object.

Common situations: Cross-filter enabled on layers whose data rows contain null coordinates; plugins/forks adding layer types without populating pick positions; version changes to the pick payload shape.

Related errors


AI-assisted analysis of apache/superset@f4587218dd (2026-08-14). Data as JSON: /api/errors/a2debd553704c134. Report an issue: GitHub.