Site suitability
Score every hex in a city with a weighted multi-criteria (MCDA) overlay, understand each criterion and pick spaced-out top sites.
The suitability tool is MapDove’s starting point for site selection. It is a classic multi-criteria decision analysis (MCDA) weighted overlay: nine criteria are computed for every hex cell in the city, normalized to a common 0–1 scale, multiplied by weights you choose and combined into a single score from 0 to 100. The best hexes are then returned as a ranked list of top sites with a minimum spacing between them.
The tool is category-aware. Competition, complementary businesses and the demand gap are all computed against the category you select, so the same city produces a different map for coffee than for home improvement.
Running an analysis
In the app: Site selection → Suitability, pick a city and category, set weights, click Run. Via the API: POST /api/v1/sdss/suitability (reference).
| Input | Range | Default |
|---|---|---|
city, category |
slugs | required |
weights |
each 0–10; at least one above zero | missing = 0 |
top_n |
1–50 | 10 |
min_spacing_km |
0–50 | 1.5 |
Each successful run counts as one analysis toward your monthly plan.
The nine criteria
| Weight key | Criterion | Raw measure per hex | Direction |
|---|---|---|---|
population |
Population density | residents per km² | higher is better |
income |
Income | median household income | higher is better |
daytime |
Daytime population | daytime population per km² (workers, students, visitors) | higher is better |
traffic |
Traffic | traffic index (0–100 within city) | higher is better |
growth |
Growth | annual population growth rate | higher is better |
competition |
Competition | distance-weighted count of same-category stores | inverted — less is better |
complementary |
Complementary businesses | distance-weighted count of complementary-category places | higher is better |
rent |
Rent | rent index (0–100 within city) | inverted — cheaper is better |
gap |
Demand gap | local demand × poor access to existing stores | higher is better |
Competition
For each hex, MapDove sums an exponential distance kernel over every same-category store within 4 km: a store at the hex centroid contributes 1, one at 1.5 km contributes about 0.37, one at 3 km about 0.14. The sum is log-scaled, normalized and inverted (1 − x') so that saturated hexes score low. The raw kernel sum is also returned per hex as competitors_nearby.
Complementary businesses
Each category has a list of complements — categories whose customers tend to visit it on the same trip. Coffee’s complements are fitness, apparel, shopping centers and pharmacy; grocery’s are pharmacy, fuel, coffee and quick service. The criterion sums a tighter kernel (characteristic distance 800 m, cut-off 2.5 km) over complementary places, log-scaled and normalized.
Rent
The rent index is inverted: with a positive weight, cheaper hexes score higher. Set the weight to 0 if occupancy cost is not a constraint for the decision.
Demand gap
The gap criterion identifies demand that the existing network serves poorly:
gap = demand' · (1 − access')
demand'— normalizedpopulation + 0.4 · daytime populationof the hex.access'— normalized, log-scaled sum of Huff utilitiesA_j / d^λover all existing stores of the category (how well existing stores reach this hex).
A hex scores high when many people live or work there and current stores are far away or weak. It is the most direct “white space” signal in the tool and pairs well with a non-zero competition weight.
How the score is computed
- Normalize each raw measure across all hexes in the city with min–max scaling to 0–1. Competition, complementary and access sums are log-scaled first (
ln(1 + x)) so one dense cluster does not flatten the rest of the city. - Invert cost criteria (competition, rent):
1 − x'. - Weight and sum:
score = 100 · Σ_c (w_c · x'_c) / Σ_c w_c
where w_c is your weight for criterion c (0–10) and x'_c the hex’s normalized value. Because weights are divided by their total, only their ratios matter — weights of 2/4/2 give the same map as 5/10/5.
The full derivation is in Methodology.
Top sites and minimum spacing
Top sites are selected greedily: hexes are sorted by score, and each candidate is accepted only if its centroid is at least min_spacing_km from every site already picked. Selection stops at top_n. Each top site reports its rank, hex ID, score, centroid coordinates, neighborhood and criteria values.
Spacing matters because suitability surfaces are smooth: without it, the top ten would usually be adjacent hexes in one district. A spacing of 1.5 km is a good default for convenience categories; use 3–5 km for destination formats such as home improvement or shopping centers, roughly a third of the category’s trade radius.
Interpreting the output
- Read the stats. If
max − minis small, the city is undifferentiated for your weights; small weight changes will reorder the ranking. - Check criteria, not just scores. Two sites scoring 70 can be very different — one dense and expensive, one cheap and fast-growing. Hover a hex (or read
criteriain the API) before shortlisting. - Run sensitivity tests. Re-run with one weight changed. Sites that stay in the top ten across variants are robust choices.
- Score is relative. Scores are normalized within a city and category; a 75 in Miami is not comparable with a 75 in Phoenix.
Next steps
Send the best sites to the Huff forecast for a visit estimate and cannibalization check, profile them with catchments, and put the shortlist side by side with Compare sites.