Geospatial · Areas and surfaces

Trade Areas

Builds catchment areas around each location: distance rings, drive-time bands, areas traced from demand, or rings cut into sectors.

Also known as: Catchment, market area

How it works

Choose a Method. Radius (buffer rings), the default, draws the Ring radii (1000, 3000, 5000 by default, in Metres or CRS units) around the Point geometry column. Drive time (isochrone bands) routes from the Origin latitude and Origin longitude columns with the Travel mode and Budget bands (5, 10, 15 minutes by default, or metres) and needs routing tiles. Density trace (demand hotspots) bins a second input of demand points into H3 cells at the H3 resolution (8), weighted by an optional Weight column, keeps the cells above the Density threshold (Absolute or Percentile of cells) and traces them into one polygon, or one per location. Pie slice (directional wedges) cuts the rings into Sectors (4), turned by Rotation or aligned to the demand points.

Rings are cumulative unless you tick Donut bands, which subtracts each ring from the next. Radius, Drive time and Pie slice rows carry ring_min and ring_label (such as "0-5000") beside the upper bound, so you can group by band; Radius rows also carry ring_index, radius, method and ring_area. Density trace rows have no rings: they carry method, h3_resolution, threshold_kind, threshold, density_cutoff, cell_count, demand_total and ring_area. For the Radius method a blank Ring column replaces the geometry; a name adds it as a column, keeping the location point unless you untick Keep the location geometry.

Inputs and outputs

Inputs

  • data — Table
  • demand — Table

Outputs

  • data — Table

Settings

The Attributes panel of Trade Areas, as in the app: the controls work, but nothing runs — there is no data behind it.

The same settings, as the Assistant writes them
{
  method: "radius"|"drive-time"|"heatmap-trace"|"pslice"
  geometryColumn: string
  radii: number[]
  unit: "meters"|"crsUnits"
  donut: boolean
  lat: string
  lon: string
  costing: "auto"|"bicycle"|"pedestrian"|"truck"
  budgets: number[]
  budgetType: "minutes"|"metres"
  demandGeometryColumn: string
  resolution: number (0-15)
  weightColumn: string
  threshold: number
  thresholdKind: "absolute"|"percentile"
  perLocation: boolean
  sectorCount: number (2-36)
  rotationDeg: number
  alignToDemand: boolean
  outputColumn: string
  keepSource: boolean
}

one polygon row per location per ring/band; donut makes non-overlapping bands; pslice cuts those rings into sectorCount wedges (row per ring x sector). Every row carries ring_min + ring_label ("0-5000") beside its upper bound, so ring segmentation groups without rebuilding the band by hand; ring_min is 0 on every cumulative ring; drive-time routes from lat/lon (origin column names), not geometryColumn, so it needs both. Radius only: blank outputColumn puts each ring in geometryColumn; a name adds the ring as that column, keeping the location unless keepSource is false

Example

For 1, 3 and 5 km bands around stores, pick Radius, Unit Metres, Ring radii 1000, 3000, 5000 and tick Donut bands, then Spatial Join population points and group by ring_label.