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.

Vibecoded with Codex stamp

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.

ChoiceWhy We Use It
Smooth distance decayPeople react gradually to distance. A smooth curve represents that better than a hard radius.
H3 r10 bridge patch plus 1.25 detour factorThe 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 cutoffAt that point the source still exists mathematically but is weak enough to ignore for a local market screen.
Category beta valuesBeta 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 GroupApproximate Effective RangeReasoning
Cafes, bakeries, laundromatsabout 960 mThese are frequent, convenience-oriented trips. The model keeps their competitor field tighter.
Groceries and bodegasabout 1,020 mStill local, but with a slightly wider practical catchment than a coffee stop or self-service laundry trip.
Restaurants and gymsabout 1,150 mPeople tolerate a bit more distance for meals, fitness, and comparison shopping within a local area.
Bars, salons, beauty servicesabout 1,280 mThese can be local, but customers are often willing to travel farther for a preferred venue or provider.
Dental officesabout 1,790 mHealthcare-like services have broader search ranges than daily errands.
Doctors, clinics, therapy officesabout 1,920 mMedical 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.

FallbackHow It Was Chosen
10.8 feet per floorUsed 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 nudgeIf 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 splitIf 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 householdUsed 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 householdUsed 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 residentUsed 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.

ManhattanBronxBrooklynQueensStaten IslandCitywide fallback
Share used0.4720.4150.4150.4030.4010.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 FallbackProxyReason
Office280 square feet per workerDenser 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.
Retail450 square feet per workerRetail has customers, displays, storage, and circulation; floor area should not be converted one-to-one into staff.
Factory650 square feet per workerIndustrial and production space usually has lower staffing density than street retail or offices.
Other commercial520 square feet per workerA neutral fallback when PLUTO commercial area is known but not clearly office, retail, or factory.
Local activity nudgeSmall square-root adjustmentHelps 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.

ProfileWeights UsedWhy It Looks This Way
Restaurants / takeout default0.38 sleeping residents / 0.18 work-hour home residents / 0.64 workersRestaurants mix evening neighborhood demand with lunch and workday demand, so workers are stronger than in household errands.
Sandwich / deli / takeout0.22 / 0.06 / 0.80This is one of the clearest lunch-worker categories, so the worker channel dominates and the residential channel stays secondary.
Coffee / cafes0.28 / 0.22 / 0.76Coffee benefits from offices, commuters, and work-from-home residents; it is frequent and local, but not purely household-driven.
Supermarkets0.90 / 0.30 / 0.04Supermarkets are mostly household infrastructure. Workers can matter at the edge, but they should not overpower resident households.
Bars / pubs default0.58 / 0.04 / 0.36Bars are evening and social destinations. Daytime-home residents are therefore weak, while residents, workers, and visitors still matter.
Healthcare and dentalAbout 0.54-0.56 residents / 0.11-0.12 work-hour home residents / 0.38-0.42 workersMost clinics still need nearby people, but patients will travel farther than they would for coffee or a bodega.
Orthodontics and pediatrics / OB-GYN0.78-0.82 residents / 0.08-0.12 work-hour home residents / 0.05-0.10 workersThese are more family and household-oriented than general workday convenience healthcare.
Self-service laundromats1.00 / 0.30 / 0.02This is intentionally residential: the main signal is nearby households, especially households without easy private laundry access.
Industrial / commercial laundry0.00 / 0.00 / 0.00 / 1.00 nearby business activityThis 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 PriorLow / Mid / HighHow To Read The Values
Coffee / cafes4 / 8 / 15 dollarsA 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 / takeout10 / 14 / 22 dollarsA lunch-order prior. It sits below full-service restaurants because the category is mostly quick meals.
Bars / pubs8 / 22 / 55 dollarsA 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.
Supermarkets20 / 45.7 / 108 dollarsA 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 laundromats5 / 7.5 / 12 dollarsA washer/dryer visit prior, supported by the laundry survey context and kept low because the category is frequent and household-oriented.
Hair salons64 / 139 / 265 dollarsA service visit prior. The wide range reflects how quickly personal-care tickets change by service level and neighborhood.
General dentists104 / 203 / 350 dollarsA preventive-visit prior. Insurance can mute the direct income effect, so price is not treated like a pure discretionary luxury signal.
Orthodontics3000 / 6343 / 9221 dollarsA 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 centers40 / 130 / 250 dollarsA 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.

SensitivityExamplesHow It Was Chosen
Very low / lowSupermarkets, bodegas, coffee, fast foodThese are broad daily or weekly needs. Income can change basket size, but the need itself is widespread.
MediumGeneral restaurants, nail salons, massage, butcher shopsThese categories are still local, but discretionary spending and ticket size start to matter.
Medium-high / high / very highHair salons, cocktail bars, spas, pilates, orthodontics, hair extensionsHigher prices and more discretionary demand make local income more important, so affluent anchors receive a stronger multiplier.
Insurance-sensitiveDentists, primary care, urgent care, imaging, specialistsIncome still matters, especially for self-pay and access, but insurance and referrals keep the income tilt weaker than a pure luxury purchase.
Negative-lowSelf-service laundromatsHigher-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-basedIndustrial / commercial laundryThe 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 profileSubway weight / cutoffBus weight / cutoff
Fast food0.48 / 760 m0.28 / 380 m
Sandwich / deli / takeout0.50 / 700 m0.30 / 360 m
Coffee / cafe0.58 / 650 m0.32 / 340 m
Supermarket0.08 / 520 m0.05 / 260 m
Lounge / nightclub0.32 / 950 m0.04 / 220 m
Urgent care0.24 / 820 m0.12 / 380 m
Imaging / radiology0.07 / 760 m0.03 / 260 m
Self-service laundromat0.03 / 360 m0.02 / 220 m
Industrial / commercial laundry0.00 / off0.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 businessB2B channel weightConnection
Industrial / commercial laundry1.00Demand is entirely the nearby-business pool.
Dry cleaner0.05The nearby-business pool is a small addition to resident and worker demand.
Laundry / wash-and-fold0.05The nearby-business pool is a small addition to resident and worker demand.
Business counted as a potential clientClient weightSubcategory adjustment
Restaurants / takeout1.00None
Bars / pubs / lounges0.85None
Cafes / bakeries / desserts0.75None
Gyms / fitness / yoga / pilates0.55Gym / fitness center: 0.70
Doctor / clinic / therapy offices0.45Urgent care and imaging / radiology: 0.65
Dental offices0.35None
Grocery / deli / convenience / bodega0.25Convenience / bodega: 0.10; retail deli: 0.20
Nail / beauty / spas0.18None
Hair salons / barbershops0.15None
Industrial / commercial laundry0.00Excluded 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.

CategoryNYC pManhattan p
Restaurants / takeout8.0%9.5%
Cafes / bakeries / desserts11.0%13.5%
Bars / pubs / lounges8.5%10.5%
Grocery / deli / convenience / bodega4.5%5.5%
Hair salons / barbershops10.0%12.0%
Nail / beauty / spas11.0%13.5%
Dental offices6.5%8.0%
Doctor / clinic / therapy offices7.5%9.0%
Laundromats / dry cleaners20.0%23.0%
Gyms / fitness / yoga / pilates15.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)

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

References Used