Trade areas
How MapDove models where a place's visitors come from, what the 85% trade area contains, and how to read its demographic summary.
A trade area answers the question “where do this place’s customers come from?” In MapDove it is a set of hex cells, each with a share of the place’s modeled visitors, plus a summary of the people who live in those cells.
How the trade area is modeled
MapDove uses the same Huff gravity model that powers visit forecasts (Methodology). For each hex cell in the city and each store of the place’s category:
- Demand of the hex is
population + 0.4 · daytime population— residents plus a share of the people who work or study there. - Each store’s utility for that hex is its attractiveness divided by distance raised to the category’s decay exponent λ. Stores beyond the category’s trade radius are ignored.
- The hex’s demand is split across stores in proportion to utility, after reserving a share for an “outside option” (shopping somewhere else or not at all).
The flow from a hex to the place is its probability times the hex’s demand. A hex’s share is that flow divided by the place’s total flow across all hexes.
Because the competitive set is the place’s own category, a café’s trade area shrinks where other cafés are dense and stretches where it has the area to itself.
The 85% cut-off
Every gravity model produces a long tail of hexes that each contribute a tiny fraction of visitors. MapDove sorts hexes by share (largest first), accumulates them, and keeps hexes until 85% of modeled visitors are covered. The remaining 15% is the tail.
The SDSS Huff forecast for a candidate site uses a tighter 80% cut-off, because candidate trade areas are drawn on a map next to existing stores and a smaller core is easier to read.
What the summary contains
GET /api/v1/places/:id/trade-area returns a summary and a GeoJSON FeatureCollection.
| Field | Meaning |
|---|---|
hexes, area_km2 |
Number of cells in the trade area and their total area |
population, households |
Sum over the cells |
median_income, median_age, pct_college, pct_family |
Population-weighted averages over the cells |
avg_distance_km |
Visitor-weighted mean distance from hex centroids to the place |
p50_distance_km |
Distance within which half of trade-area visitors live |
segments |
Lifestyle-segment mix, weighted by visitor share |
neighborhoods |
Top neighborhoods by visitor share (up to 8) |
Each GeoJSON feature carries hex_id, share, cum_share (cumulative share in rank order), population, median_income and segment. Shade by share for a heat map, or by cum_share to draw nested 50% / 70% / 85% contours.
Reading a trade area
- Compact, high-share core — a convenience format (fuel, coffee, pharmacy). λ is high, so people do not travel far.
- Large, diffuse area — a destination format (shopping centers, department stores, hotels). λ is low and the trade radius is large.
- Lopsided shape — a competitor sits on one side. The trade area extends away from it.
- Segment mix differs from the neighborhood — the place draws a different audience from the people who live next to it, typical of daytime-heavy districts.
Category parameters
| Category | λ (distance decay) | Trade radius |
|---|---|---|
| Fuel & Convenience | 2.6 | 5 km |
| Fitness | 2.4 | 6 km |
| Coffee & Cafés | 2.2 | 6 km |
| Pharmacy & Health | 2.1 | 7 km |
| Quick Service | 2.0 | 7 km |
| Full-Service Dining | 1.9 | 10 km |
| Grocery | 1.8 | 9 km |
| Apparel | 1.7 | 14 km |
| Electronics | 1.6 | 16 km |
| Home Improvement | 1.5 | 18 km |
| Entertainment | 1.5 | 16 km |
| Department Stores | 1.4 | 20 km |
| Shopping Centers | 1.3 | 25 km |
| Hotels | 1.2 | 40 km |
Hotels are a special case: their “demand” is still modeled from local population, so treat hotel trade areas as a proxy for local reach, not for where overnight guests actually live.
Limitations
- Trade areas are modeled, not observed. In the demo dataset no visitor origin is ever measured.
- Distance is straight-line between hex centroid and store, not travel time.
- The model ignores cross-category competition; a grocery store’s trade area does not react to a new fuel station.
- Hex demographics are synthetic (Demo data).
Trade areas also drive cross-shopping, which compares the visitor-origin footprints of two places.