Model Details
This page explains how the prototype combines competitor pressure, modeled client demand, and commercial rent affordability. It is not a recipe for guaranteed revenue or a claim that we observe every person, transaction, or lease. It is a transparent story of the choices we made, why we made them, and where the assumptions should eventually be improved.
Update schedule: The underlying source databases and derived map data are updated monthly.
The Question
The map starts from a practical site-selection question: if a business category is selected, which parts of the city look crowded with competitors, and which parts still appear to have nearby people, workers, transit, or business activity that could support another location?
That requires three layers. The first is competitor pressure, the second is potential client demand, and the third is relative commercial rent. Combined mode favors places with more rent-adjusted demand available per effective nearby competitor. It is a screening tool, not a final recommendation: exact lease terms, pass-through charges, frontage, zoning, access, safety, brand, and direct inspection still matter.
Why Hexagons
We use H3 hexagons because the city needs a stable spatial grid that can be aggregated and zoomed without tying the analysis to arbitrary neighborhood borders. H3 is designed for hierarchical geospatial indexing, so the same underlying model can serve broad views and detailed views consistently. The visible map is kept below an interactive cell limit so the browser stays responsive.
How Competitor Pressure Is Built
For competitor pressure, a matching point of interest is treated as a local source of pressure. Nearby competitors matter most, and their influence fades smoothly with distance.
The current served build contains 360,930 visible active or probable-active POIs. The sources overlap because that is how real open place data works: Overture Places, Foursquare OS Places, AllThePlaces, NYC Open Data business and permit datasets, New York State open datasets, and CMS NPPES provider records all see different parts of the city. No single source is complete enough for NYC street-level business mapping.
The processing step turns those raw sources into one comparable place layer. Records are clipped to NYC, inactive or unusable entries are filtered out, names and coordinates are normalized, source-specific labels are mapped into the app's business categories, and likely duplicates are merged so the same shop is not counted several times just because it appears in more than one dataset. After that, POIs are counted into H3 cells from r6 through r11, giving the app precomputed competitor counts at several map scales.
The decay shape is a negative exponential accessibility curve. That type of curve is common in accessibility work because it gives nearby opportunities most of the weight while still allowing influence to fade smoothly. A bridge patch first assigns every source and target to a physical-land component using its H3 r10 routing cell. Points on the same component use straight-line distance. Points on different components can interact only through a cached OpenFreeMap road or path bridge that directly connects those components; the model uses the shortest target-to-bridge, mapped bridge, and bridge-to-source route. If no such bridge is available, that source contributes nothing across the water. The routed distance is then multiplied by the 1.25 detour factor. This is a lightweight shoreline correction, not full street-network routing. The model stops considering a source once its routed distance exceeds the category cutoff or its remaining influence has fallen to 15 percent of its zero-distance value.
The beta values are derived from that 15 percent cutoff rule. First we choose an approximate effective range for the category: the straight-line map distance where a competitor should become weak enough to stop counting. Then beta is solved so the exponential curve reaches 15 percent at that range after the 1.25 detour correction. In plain terms: smaller range means larger beta and faster fade; larger range means smaller beta and slower fade.
| Choice | Why We Use It |
|---|---|
| Smooth distance decay | People react gradually to distance. A smooth curve represents that better than a hard radius. |
| H3 r10 bridge patch plus 1.25 detour factor | The bridge patch prevents direct influence across water and approximates a bridge route between physical-land components; 1.25 remains the simple correction for street-network circuity on that routed distance. |
| 15 percent cutoff | At that point the source still exists mathematically but is weak enough to ignore for a local market screen. |
| Category beta values | Beta is the decay speed, not a separate behavioral assumption. Once a category's effective range and the 15 percent cutoff are chosen, beta follows from those two values. For example, a roughly 1.15 km range gives the middle-speed beta used by restaurants and gyms; shorter cafe/laundry ranges produce faster decay, while dental and medical ranges produce slower decay. |
The effective ranges themselves were chosen from category behavior. A laundromat is more local than a specialist doctor. A coffee shop is more walk-up and commuter-sensitive than a destination restaurant. The category distances were chosen from walking-distance studies, local-shopping studies, healthcare access literature, and practical local-purchase anchors, then adjusted so the map produces plausible NYC-scale market fields rather than isolated dots.
| Category Group | Approximate Effective Range | Reasoning |
|---|---|---|
| Cafes, bakeries, laundromats | about 960 m | These are frequent, convenience-oriented trips. The model keeps their competitor field tighter. |
| Groceries and bodegas | about 1,020 m | Still local, but with a slightly wider practical catchment than a coffee stop or self-service laundry trip. |
| Restaurants and gyms | about 1,150 m | People tolerate a bit more distance for meals, fitness, and comparison shopping within a local area. |
| Bars, salons, beauty services | about 1,280 m | These can be local, but customers are often willing to travel farther for a preferred venue or provider. |
| Dental offices | about 1,790 m | Healthcare-like services have broader search ranges than daily errands. |
| Doctors, clinics, therapy offices | about 1,920 m | Medical care often has the widest local catchment because availability, specialty, insurance, and referrals matter. |
Buildings Became The Demand Skeleton
NYC has official building footprints and PLUTO/MapPLUTO lot records, so the model uses buildings as the skeleton of demand. Building footprints locate structures. PLUTO contributes lot use, floor area, residential units, assessed value, and other real-estate context.
The current served build reads 1,082,846 building records from official NYC building and MapPLUTO/PLUTO data. After filtering and matching to property context where possible, 1,080,284 records are used and aggregated into 7,009 H3 demand anchors for scoring.
This does not mean we know the exact number of people inside each building at any hour. It means we use the best open building and parcel data available to put residential and commercial demand in more realistic places than a flat neighborhood average would allow.
Filling Gaps In Building Data
The build always prefers official fields first. If a building has roof height, height is used to estimate floors. If PLUTO gives a floor count, that is used. If PLUTO gives residential and commercial area, those areas are used. If PLUTO gives residential unit count, that is used before any household-area assumption.
The constants below only appear when a useful official value is missing, and that fallback is rarely needed in the current official-data build. They are deliberately conservative because a fallback should keep the model usable without pretending to be a census.
| Fallback | How It Was Chosen |
|---|---|
| 10.8 feet per floor | Used when roof height exists but floor count is missing. It is a middle-ground floor-to-floor height: higher than a bare residential ceiling and lower than treating every floor as tall commercial space. The result is capped so tall outliers do not dominate. |
| Large-footprint floor nudge | If both roof height and PLUTO floors are missing, the model starts close to a low-rise building, then nudges floor count upward in active areas and for very large footprints. The footprint contribution is softened after 25,000 square feet so warehouses and large podiums do not automatically become towers. |
| Land-use area split | If PLUTO does not give usable residential and commercial area, land-use class decides the split. One-, two-, and multifamily lots are treated as mostly residential. Mixed-use lots get a mixed split. Commercial, office, industrial, transportation, utility, and institutional classes are treated as mostly commercial. Ambiguous lots are adjusted by nearby POI activity. |
| 850 square feet per household | Used only when residential area exists but residential unit count is missing. It sits near common apartment-size benchmarks and is intentionally broad, because the PLUTO floor-area field is not the same thing as net apartment area. |
| 2.15 residents per household | Used after households are estimated. This is below the citywide Census QuickFacts household-size figure because the model is assigning demand to building anchors and should not turn every residential square foot into a fully occupied family household. It is a conservative occupancy proxy, not a demographic finding. |
| 550 square feet per resident | Used mainly when no usable PLUTO lot exists and residents must be inferred directly from residential floor area. It is consistent with the 850-square-foot household fallback and a conservative household-size assumption. |
Who Is Home During Work Hours
The current build uses a borough-level ACS proxy for residents likely to be around during work hours: residents who are unemployed, not in the labor force, or report working from home, divided by total population. This still does not prove that a person is inside the apartment at noon, but it is a useful public-data proxy for daytime neighborhood residential presence.
Source note: These shares are estimates calculated from ACS 2024 five-year data (2020-2024), not observed headcounts.
| Manhattan | Bronx | Brooklyn | Queens | Staten Island | Citywide fallback | |
|---|---|---|---|---|---|---|
| Share used | 0.472 | 0.415 | 0.415 | 0.403 | 0.401 | 0.422 |
Workers Are A Separate Channel
Worker presence is a separate demand channel from residents at home. The current build uses LEHD/LODES Workplace Area Characteristics as its primary public-data source for workers. LODES reports jobs by workplace Census block; the model joins those blocks to Census coordinates, assigns the jobs to H3 r9 demand anchors, and uses the LODES workplace-job count wherever a job cell can be matched. It also uses LODES earnings bands for the worker-income mix.
Commercial floor area is the fallback. It remains in building anchors without a matched LODES job cell and becomes the full worker estimate if usable LODES data is unavailable. If LODES county totals are available but block geometry is not, the model instead uses those totals to calibrate the floor-area estimates by borough.
The fallback estimates workers separately from office, retail, factory, and other commercial area. EIA CBECS provides a national commercial-building reference, while NYC Building Code occupant-load tables serve only as a cautionary upper bound: they are egress requirements, not observed staffing.
| Floor-Area Fallback | Proxy | Reason |
|---|---|---|
| Office | 280 square feet per worker | Denser than the national CBECS office average. NYC code occupant load is a life-safety capacity used to size exits, not a count of employees actually present; converting that maximum capacity directly into workers would overstate staffing. |
| Retail | 450 square feet per worker | Retail has customers, displays, storage, and circulation; floor area should not be converted one-to-one into staff. |
| Factory | 650 square feet per worker | Industrial and production space usually has lower staffing density than street retail or offices. |
| Other commercial | 520 square feet per worker | A neutral fallback when PLUTO commercial area is known but not clearly office, retail, or factory. |
| Local activity nudge | Small square-root adjustment | Helps active small-business corridors where PLUTO floor-area categories can understate actual work activity. |
The current worker channel contains about 4.90 million calibrated workplace workers. LODES supplies 25,445 workplace blocks grouped into 5,921 H3 r9 job cells. It also supplies 84 LODES-only worker anchors: job cells that report workplace jobs but have no usable building anchor at the same location. Keeping those separate anchors prevents the reported jobs from disappearing from the demand layer.
Different Businesses Need Different Clients
A laundromat, a lunch deli, a dentist, a cocktail bar, and an industrial laundry do not draw from the same people in the same way.
The model therefore mixes four demand channels: sleeping residents, residents likely to be around during work hours, workers during work hours, and nearby business activity. These constants are relative weights, not percentages. They can add to more than 1 because a place can reasonably draw from several channels at once. The values were chosen as transparent priors: everyday neighborhood errands get high resident weights, lunch and commuter categories get high worker weights, destination or nightlife categories get weaker daytime-home weights, and business-service categories use the nearby-business channel.
| Profile | Weights Used | Why It Looks This Way |
|---|---|---|
| Restaurants / takeout default | 0.38 sleeping residents / 0.18 work-hour home residents / 0.64 workers | Restaurants mix evening neighborhood demand with lunch and workday demand, so workers are stronger than in household errands. |
| Sandwich / deli / takeout | 0.22 / 0.06 / 0.80 | This is one of the clearest lunch-worker categories, so the worker channel dominates and the residential channel stays secondary. |
| Coffee / cafes | 0.28 / 0.22 / 0.76 | Coffee benefits from offices, commuters, and work-from-home residents; it is frequent and local, but not purely household-driven. |
| Supermarkets | 0.90 / 0.30 / 0.04 | Supermarkets are mostly household infrastructure. Workers can matter at the edge, but they should not overpower resident households. |
| Bars / pubs default | 0.58 / 0.04 / 0.36 | Bars are evening and social destinations. Daytime-home residents are therefore weak, while residents, workers, and visitors still matter. |
| Healthcare and dental | About 0.54-0.56 residents / 0.11-0.12 work-hour home residents / 0.38-0.42 workers | Most clinics still need nearby people, but patients will travel farther than they would for coffee or a bodega. |
| Orthodontics and pediatrics / OB-GYN | 0.78-0.82 residents / 0.08-0.12 work-hour home residents / 0.05-0.10 workers | These are more family and household-oriented than general workday convenience healthcare. |
| Self-service laundromats | 1.00 / 0.30 / 0.02 | This is intentionally residential: the main signal is nearby households, especially households without easy private laundry access. |
| Industrial / commercial laundry | 0.00 / 0.00 / 0.00 / 1.00 nearby business activity | This is not a walk-in household category. It should follow restaurants, hotels, clinics, gyms, and similar business clients. |
The demand-channel weights were set from category behavior, then sanity-checked against the public evidence used elsewhere in the model: local shopping and walking-distance literature, the laundry customer survey, healthcare travel studies, BLS Consumer Expenditure tables, BEA regional price context, and ordinary NYC category pricing. When a subcategory has a clear behavior of its own, it overrides the category default. When it does not, it inherits the category profile. A broad menu category is then blended from its subcategories, weighted by how many POIs of each subcategory are actually present in the current place database.
Average check and income sensitivity are also model priors, not exact sales forecasts. Each subcategory gets a low, mid, and high ticket range for the kind of purchase it represents: a coffee visit, lunch order, grocery basket, salon service, monthly fitness membership, medical visit, or treatment plan. The ranges use BLS Consumer Expenditure tables, BEA regional price context, public healthcare and dental cost information, the laundry customer survey, fitness and personal-care price checks, and local-shopping research. They are curated category-level ranges rather than transaction-level observations.
| Ticket Prior | Low / Mid / High | How To Read The Values |
|---|---|---|
| Coffee / cafes | 4 / 8 / 15 dollars | A small repeat purchase. The low end is a simple drink, the mid is a common drink-plus-small-add-on visit, and the high end allows a larger order. |
| Sandwich / deli / takeout | 10 / 14 / 22 dollars | A lunch-order prior. It sits below full-service restaurants because the category is mostly quick meals. |
| Bars / pubs | 8 / 22 / 55 dollars | A visit can be one drink or a longer evening. The mid is near the neutral everyday-visit anchor, while the high end allows group or multi-drink visits. |
| Supermarkets | 20 / 45.7 / 108 dollars | A basket, not a single item. The model keeps the grocery midpoint from the prior table; the decimal should not be read as receipt-level precision. |
| Self-service laundromats | 5 / 7.5 / 12 dollars | A washer/dryer visit prior, supported by the laundry survey context and kept low because the category is frequent and household-oriented. |
| Hair salons | 64 / 139 / 265 dollars | A service visit prior. The wide range reflects how quickly personal-care tickets change by service level and neighborhood. |
| General dentists | 104 / 203 / 350 dollars | A preventive-visit prior. Insurance can mute the direct income effect, so price is not treated like a pure discretionary luxury signal. |
| Orthodontics | 3000 / 6343 / 9221 dollars | A treatment-plan prior, not a walk-in visit. The large ticket reaches the capped lower side of the ticket adjustment, while the category remains highly income-sensitive. |
| Gyms / fitness centers | 40 / 130 / 250 dollars | A monthly-membership prior, so it is compared differently from a daily coffee or lunch visit. |
The ticket adjustment puts unlike businesses on a common demand scale. One nearby client can plausibly make many low-cost purchases but far fewer high-cost purchases, so the model uses 22 dollars divided by the subcategory's mid ticket as a rough transaction-frequency adjustment. A 22 dollar midpoint gets a factor of 1, an 8 dollar coffee gets about 2.75, and a 203 dollar dental visit reaches the 0.35 minimum. The factor is capped between 0.35 and 2.8 because it adjusts relative demand opportunity; it does not predict visits, sales, or revenue.
Ticket size alone is not enough. The sensitivity label below describes how strongly local income should change demand for that purchase. In the score, the ticket adjustment sets the baseline purchase opportunity, while the sensitivity label controls the strength and direction of the income adjustment applied to nearby residents and workers.
| Sensitivity | Examples | How It Was Chosen |
|---|---|---|
| Very low / low | Supermarkets, bodegas, coffee, fast food | These are broad daily or weekly needs. Income can change basket size, but the need itself is widespread. |
| Medium | General restaurants, nail salons, massage, butcher shops | These categories are still local, but discretionary spending and ticket size start to matter. |
| Medium-high / high / very high | Hair salons, cocktail bars, spas, pilates, orthodontics, hair extensions | Higher prices and more discretionary demand make local income more important, so affluent anchors receive a stronger multiplier. |
| Insurance-sensitive | Dentists, primary care, urgent care, imaging, specialists | Income still matters, especially for self-pay and access, but insurance and referrals keep the income tilt weaker than a pure luxury purchase. |
| Negative-low | Self-service laundromats | Higher-income buildings are more likely to have in-unit, basement, or doorman-building laundry options, so the model slightly reduces demand rather than increasing it. |
| Not income-based | Industrial / commercial laundry | The relevant clients are nearby businesses, not household income. |
This distinction matters because price and income are related but not interchangeable. A cheap necessity can have broad demand across income levels, while an expensive discretionary service may depend more on affluent clients. Healthcare is moderated by insurance and referrals, and self-service laundromats can move in the opposite direction because higher-income households more often have private laundry. All adjustments are bounded so the underlying client population, distance, transit, and nearby business context remain the main signals.
Transit Is Extra Accessibility, Not Foot Traffic
Subway and bus access is added as optional client potential using MTA GTFS feeds. This layer is intentionally separate from building-based residents and workers. Transit can make a cell more reachable, especially for lunch places, coffee, urgent care, and other categories that benefit from commuters or short stops. It does not mean the model observes actual riders entering a shop.
Transit influence also varies by category. A supermarket is more household-neighborhood oriented than a fast-food lunch place. A nightlife venue may draw from a wider subway shed but not from bus stops in the same way as a daytime errand business. These choices are model assumptions, but they follow the same principle as the rest of the map: use transit where access plausibly changes the client pool, keep it weak where the business is mostly local.
| Business profile | Subway weight / cutoff | Bus weight / cutoff |
|---|---|---|
| Fast food | 0.48 / 760 m | 0.28 / 380 m |
| Sandwich / deli / takeout | 0.50 / 700 m | 0.30 / 360 m |
| Coffee / cafe | 0.58 / 650 m | 0.32 / 340 m |
| Supermarket | 0.08 / 520 m | 0.05 / 260 m |
| Lounge / nightclub | 0.32 / 950 m | 0.04 / 220 m |
| Urgent care | 0.24 / 820 m | 0.12 / 380 m |
| Imaging / radiology | 0.07 / 760 m | 0.03 / 260 m |
| Self-service laundromat | 0.03 / 360 m | 0.02 / 220 m |
| Industrial / commercial laundry | 0.00 / off | 0.00 / off |
The weight controls how strongly each mode's stop-access score enters client demand; the cutoff is the maximum bridge-aware routed distance at which that mode can contribute. These values were set as transparent modeling priors, not fitted to observed store visits or rider destinations. Their ordering follows the business behavior described above: commuter purchases receive larger weights, household errands receive smaller ones, and nightlife receives a wider subway reach but little bus influence. A broad category selection uses a POI-count-weighted blend of its subcategory profiles.
The current served build contains 14,891 transit sources: 495 subway stops and 14,396 bus stops. Their influence uses the same r10 bridge-aware shoreline routing, so a stop does not contribute straight across water when the model has no mapped bridge connection.
Nearby Businesses Can Be Clients Too
The implemented B2B channel currently applies to laundry businesses. It builds one distance-faded pool of nearby potential business clients and adds that pool to the receiving business's other demand channels.
| Receiving business | B2B channel weight | Connection |
|---|---|---|
| Industrial / commercial laundry | 1.00 | Demand is entirely the nearby-business pool. |
| Dry cleaner | 0.05 | The nearby-business pool is a small addition to resident and worker demand. |
| Laundry / wash-and-fold | 0.05 | The nearby-business pool is a small addition to resident and worker demand. |
| Business counted as a potential client | Client weight | Subcategory adjustment |
|---|---|---|
| Restaurants / takeout | 1.00 | None |
| Bars / pubs / lounges | 0.85 | None |
| Cafes / bakeries / desserts | 0.75 | None |
| Gyms / fitness / yoga / pilates | 0.55 | Gym / fitness center: 0.70 |
| Doctor / clinic / therapy offices | 0.45 | Urgent care and imaging / radiology: 0.65 |
| Dental offices | 0.35 | None |
| Grocery / deli / convenience / bodega | 0.25 | Convenience / bodega: 0.10; retail deli: 0.20 |
| Nail / beauty / spas | 0.18 | None |
| Hair salons / barbershops | 0.15 | None |
| Industrial / commercial laundry | 0.00 | Excluded from its own potential-client pool |
The two weights have different jobs. The client weight says how much a nearby business contributes to the shared potential-client pool; the B2B channel weight says how strongly a receiving laundry business uses that pool. They are model priors based on the expected intensity of linen, uniform, towel, and cleaning-service demand. This channel does not replace residents or workers except for industrial / commercial laundry, whose profile is explicitly business-only.
How Commercial Rent Is Built
The pipeline precomputes 8,118,240 bridge-aware client and competitor score rows from H3 r6 through r10 and assigns each land hex a rent observation before the app starts. An r11 display hex inherits the market score of its r10 parent because r10 is the chosen routing topology; its finer polygon is still used for business eligibility, area intersection, and exact island clipping.
The spatial input is the NYC Department of Finance Storefront Registration Class 2 and 4 Statistics dataset. It reports median monthly rent per square foot at citywide, borough, and census-tract levels. Each H3 land-cell center is assigned to a Census TIGER/Line tract; when a tract value is suppressed or unavailable, the build falls back to its borough median and then the citywide median.
Rent expensiveness e is the tract or fallback rent normalized from 0 to 1 on a log scale between storefront-count-weighted citywide 5th and 95th percentiles. This scale is fixed by the source snapshot, not recalculated for each viewport, so moving or selecting the map does not change the underlying rent meaning.
The importance coefficient p estimates rent as a share of business income. The supplied category study provides separate NYC and Manhattan priors. The automated build uses the latest IRS Statistics of Income data to update each broad industry's annual direction while preserving the category-specific prior and the Manhattan-to-NYC ratio.
| Category | NYC p | Manhattan p |
|---|---|---|
| Restaurants / takeout | 8.0% | 9.5% |
| Cafes / bakeries / desserts | 11.0% | 13.5% |
| Bars / pubs / lounges | 8.5% | 10.5% |
| Grocery / deli / convenience / bodega | 4.5% | 5.5% |
| Hair salons / barbershops | 10.0% | 12.0% |
| Nail / beauty / spas | 11.0% | 13.5% |
| Dental offices | 6.5% | 8.0% |
| Doctor / clinic / therapy offices | 7.5% | 9.0% |
| Laundromats / dry cleaners | 20.0% | 23.0% |
| Gyms / fitness / yoga / pilates | 15.0% | 18.0% |
The table above supplies p for the selected category. A cell in Manhattan uses the Manhattan value; a cell in any other NYC borough uses the NYC value. Rent affordability for cell i is Ri = 1 − p × ei. Think of R as a rent-retention factor: the fraction of raw modeled client opportunity carried into the combined site score after a relative rent penalty. It is not measured cash flow, revenue, or profit. In a cheapest cell, e = 0 and R = 1, so rent does not reduce the demand score. Halfway up the rent scale, a rent-sensitive category with p = 0.20 gets R = 0.90, so 90% of its modeled client opportunity remains. In a most-expensive cell, the same category gets R = 0.80. The effect is smaller for a category with a lower p. The purpose is to make otherwise equal client demand less attractive where occupancy cost is relatively high, especially for businesses whose rent normally consumes a larger share of income.
How The Map Colors The Result
The map first decides which hexagons have plausible site evidence, then applies the selected area, computes raw layer values, and only then converts those values to colors. Evidence comes from official building centroids on built MapPLUTO lots and from observed business POIs. A lot with at least 250 square feet of reported commercial, office, retail, factory, or storage area has confirmed-premises confidence; an observed POI supplies medium confidence; another built lot supplies lower confidence rather than being declared impossible. Each building or POI coordinate is tested against mapped piers, parks, recreation land, cemeteries, rail or airport surfaces, schools, wetlands, beaches, and similar hard exclusions. A mixed hexagon is therefore retained when at least one evidence point lies outside the excluded geometry, even if the hex center lies inside it. Cells that are more than half water remain excluded. Eleven named islands smaller than Manhattan are a stronger exclusion: Rikers, City, Governors, Randalls and Wards, Roosevelt, Hart, Hoffman, Liberty, Ellis, Swinburne, and U Thant Islands contribute no cells, POIs, building demand, population, workers, transit, rent display, or influence to or from another cell. Boundary cells are geometrically clipped so their color cannot cover an excluded island. The confidence label records why an ordinary cell was admitted; it does not currently multiply or otherwise alter the market score. The selected All NYC, borough, or Community District boundary is then the primary confinement: at least 10% of the full hex area must lie inside it, and if a rectangle has also been drawn, the retained hex must intersect both.
Putting The Three Layers Together
For eligible cell i, let Di be raw modeled client demand, ei be normalized rent expensiveness, and p be the applicable category rent-burden share. Rent first adjusts demand:
Ai = Di × (1 − p × ei)
Competitor pressure is calculated within the selected category's cutoff:
Pi = Σj wj × exp(−β × r10 bridge-aware distanceij × 1.25)
Every matching competitor currently has wj = 1. A competitor at zero distance therefore adds 1; farther competitors add progressively less, and a competitor at the cutoff adds 0.15. The combined site score divides the rent-adjusted client opportunity among the proposed business and the nearby effective competitors:
Si = Ai ÷ (1 + Pi) = Di × (1 − p × ei) ÷ (1 + Pi)
- The 1 represents the proposed business. With no competitors, adjusted demand is unchanged.
- One zero-distance competitor makes Pi = 1, so the proposed business receives one half of adjusted demand. Two such competitors reduce it to one third.
- Transit demand is included in Di only when Consider subway & bus is enabled.
- The rent factor ranges from 1 in the cheapest cells to 1 − p in the most expensive cells; p uses the Manhattan prior for Manhattan cells and the NYC prior elsewhere.
- The structure already permits future competitor weights wj, although all matching POIs have equal weight today.
Turning Scores Into Colors
The Data layers menu labels this choice Visualization mode. With Combine layers on, the map colors the combined site score; with it off, competitors, clients, and rent are shown as separate layers. Switching modes changes only how the loaded scores are displayed, not the underlying source values.
The combined score is calculated from raw client demand, rent, and competitor pressure using the formula above. Competitor pressure, client demand, rent, and the final combined score are each scaled only across business-eligible cells currently loaded for display. Excluded water, pier, park, unavailable-premises, and missing-rent cells cannot set the green or red endpoints. Lower competitor pressure, higher client demand, and lower rent are oriented toward green; the opposite end is red. Rent calculations retain the fixed citywide 0–1 expensiveness scale, while the rent-only layer uses a separate local display scale so the cheapest and most expensive cells in the confined display reach the color endpoints.
Changing the area changes the comparison set and therefore recalculates the display range for competitor, client, rent, and combined colors. It does not change the source scores or rent's contribution to the combined score, and selecting a new area preserves the current map bearing. Switching the background style recreates the map layers and then reapplies the current colors, opacity, selected-area outline, POI state, and lattice settings. Visible cells are capped to keep interaction smooth, so the map is intended for spatial comparison rather than as an accounting export of absolute demand.
Area And Rectangle Confinement
The All NYC, borough, and Community District boundaries come from NYC Department of City Planning geometry with the excluded islands cut out. After the business-eligibility mask is applied, the server computes the exact selected-boundary intersection area for every candidate hex. A hex is processed only when that intersection covers at least 10% of its full area. This removes tiny contacts such as a lone Manhattan pier touching a cell that otherwise belongs to Brooklyn, New Jersey, or water, while retaining normal boundary-crossing cells. Excluded-island geometry is subtracted from returned hex polygons. The optional rectangle, drawn with Select range to confine comparison, is a second intersection filter that narrows the comparison set without altering source scores; its cross removes the rectangle while keeping the selected city, borough, or district.
What The Model Still Cannot Know
- POI records can be missing, stale, duplicated, or misclassified.
- Building residents and workers are modeled from open data, not observed in real time.
- Remote and hybrid work can make office-worker estimates too high in some districts.
- Income and ticket priors are broad proxies, not household balance-sheet data or merchant receipts.
- Transit adds accessibility potential, not actual arrivals at a storefront.
- The rent layer is an area median and can miss a particular storefront's asking rent, concessions, CAM, tax, insurance, utilities, build-out, and lease structure.
- Final site selection still needs verified lease terms, frontage, zoning, delivery access, safety, hours, brand, and direct inspection.
References Used
- NYC Department of City Planning Community Districts for the All NYC, five borough, 59 Community District, and detached-island geometries.
- NYC DOF Storefront Registration Class 2 and 4 Statistics for citywide, borough, and census-tract median monthly commercial rent per square foot.
- NYC DOF Storefront Registry requirements for the annual reporting scope and data provenance.
- IRS SOI Nonfarm Sole Proprietorship Statistics for annual industry business receipts and rent-paid calibration.
- Census TIGER/Line files for tract boundaries used to assign area rent values to H3 cells.
- H3 documentation for the hierarchical hexagonal grid used to index and aggregate geography.
- OpenFreeMap, OpenMapTiles, and OpenStreetMap contributors for cached park, pier, land-cover, transportation, bridge, and aeroway geometry used by the business-eligibility and r10 bridge masks.
- Overture Maps attribution and licensing, Foursquare OS Places notice, and AllThePlaces license notes for major open place sources.
- NYC Open Data Terms of Use, Open NY Terms of Use, and CMS NPPES data dissemination notice for public business, license, and provider datasets.
- NYC Planning PLUTO / MapPLUTO resources for lot land use, area, unit, assessment, and year-built attributes.
- NYC Planning building footprint resources for official building geometry.
- NYC MapPLUTO ArcGIS FeatureServer and NYC Building Footprints ArcGIS FeatureServer, cached when available.
- Census ACS 5-year API documentation for the county-level population, employment, and commute tables used in the daytime-home proxy.
- ACS B01003 total population metadata, ACS B23025 employment status metadata, and ACS B08301 commute / worked-from-home metadata.
- Census Reporter ACS county-table request, used as the cache transport for NYC county values when direct Census API access is unavailable.
- Census QuickFacts for New York City for citywide household-size context.
- New York City Housing and Vacancy Survey for NYC housing-stock context.
- BLS American Time Use Survey for national time-use and work-at-home context.
- Survey of Working Arrangements and Attitudes / WFH Research for broader work-from-home context.
- Census LEHD LODES8 New York WAC directory for workplace-area job counts used to calibrate the worker channel when cached.
- EIA 2018 CBECS Building Characteristics for national commercial floorspace-per-worker context.
- NYC Building Code Section BC 1004, Occupant Load for egress-design context; it is not used as observed staffing.
- BLS Consumer Expenditure tables for spending and income-prior context.
- BEA regional price parities for regional price-level context.
- GTFS overview, MTA subway GTFS feed, and MTA Manhattan bus GTFS feed for transit-source structure.
- Higgins 2019, Accessibility Toolbox for R and ArcGIS, for accessibility sums and distance-impedance methods.
- GOV.UK National Travel Survey 2024, WYG / Rapleys walking-distance report, and Yang and Diez-Roux 2012 for walking-distance context.
- Access Development routine-purchase study, Horning, El-Geneidy, and Krizek distance-perception paper, Sustrans shoppers and travel sheet, and Berlin shopper mobility survey for local shopping behavior.
- Coin Laundry Association 2013 Laundry Customer Survey for laundromat distance and choice context.
- Dental travel-time preference study, IJERPH 2022, and healthcare access scoping review for healthcare distance and travel-time context.