NYC Property Values: Block by Block
NYC’s Department of Finance publishes assessed values for every one of the city’s ~850,000 tax lots through the MapPLUTO dataset on NYC Open Data. The map colors each block by its total assessed value on a logarithmic scale (blue = low, red = high).
A few things that stand out:
- Midtown Manhattan blocks routinely hit $1–5B in total assessed value — a single city block can be assessed at more than the entire property tax base of a small city.
- The waterfront premium is clearly visible in both Brooklyn and Queens, where blocks adjacent to the water are noticeably warmer than those a few blocks inland.
- The Bronx / Staten Island contrast with Manhattan is stark. The color scale is logarithmic, so even visually similar blocks can differ by an order of magnitude.
How it works
The map uses Leaflet.js with CartoDB dark tiles. There are three zoom tiers:
| Zoom | What you see | Data source |
|---|---|---|
| < 11 | “Zoom in” prompt | — |
| 11–16 | Clustered circles → individual blocks | Pre-built static JSON |
| ≥ 17 | Individual tax lots | Live Socrata API |
Block view (zoom 11–16) is powered by a pre-aggregated snapshot of all 28,664 NYC blocks (~5 MB JSON, generated from the full 853k-lot dataset). The file is fetched once on page load and stays in memory, so panning and zooming are instant — no round-trips to the API.
At city scale (zooms 11–13) the 28k individual block markers would be visually overwhelming, so the map uses supercluster.js to merge nearby blocks into labeled cluster circles. The cluster radius is 60px, and supercluster stops clustering at zoom 14, at which point individual block dots appear. Each cluster circle shows the number of blocks it contains; its color reflects the aggregate assessed value of those blocks, on the same scale as individual blocks.
Lot view (zoom ≥ 17) queries the Socrata API live with a bounding-box WHERE filter. At that zoom level the viewport covers only a few blocks, so the query returns quickly and the individual lot granularity is actually useful.
Color scale: Assessed values citywide span nearly ten orders of magnitude (a few thousand dollars to $8.7B for a single block). Anchoring the color scale to the absolute extremes would compress 95% of blocks into the yellow middle. Instead, the scale is anchored at the 5th–95th percentile of all block values ($700K–$75M for total; $44K–$10M for average per lot). Blocks outside that range clamp to solid blue or red. This spreads the bulk of the city’s variation across the full RdYlBu palette.
Building the block snapshot
The pre-aggregated block data is generated by scripts/nyc_heatmap_data.py, which fetches the full MapPLUTO dataset from the Socrata API in batches and groups lots by borough+block:
python scripts/nyc_heatmap_data.py # all five boroughs → static/nyc-heatmap/data/blocks.json
python scripts/nyc_heatmap_data.py --boro 1 # Manhattan only
python scripts/nyc_heatmap_data.py --boro 3 --output /tmp/brooklyn.json
Each block in the output carries its centroid lat/lng, total assessed value, lot count, sample address, and borough code. The map ships with a snapshot committed to the repo; re-run the script to refresh it against the latest PLUTO release.