Methodology and open questions

About the map

What the interactive map shows, where the data comes from, and what the map deliberately does not model. This page is a companion to the 3D explore map so a reader can check the sources, understand the assumptions, and see the project-level open questions that the visualization cannot resolve.

Maintained by Larry · foglinesf.com · Updated

What the map shows

The explore map combines four data layers on a CARTO Positron basemap rendered in MapLibre GL JS:

Where the data comes from

FZP heights

The height data is fetched directly from the San Francisco Planning Department's public ArcGIS REST endpoint:

https://sfplanninggis.org/arcgiswa/rest/services/PlanningData/MapServer (Layer 5: Height Districts)

That data was republished January 11, 2026, one day before the Family Zoning Plan took effect. Each height polygon is labeled in the form 40//65-R-4, where 40 is the pre-FZP base height in feet, 65 is the post-FZP Local Program height in feet, and R-4 is any applicable condition or overlay. The pre-FZP base height is recovered from that label format, not from a separate dataset, because SF Planning replaced the live dataset rather than versioning it.

The Python pipeline that fetches and processes the data is in this repository, in scripts/fetch_planning_layers.py and scripts/parse_heights.py. The fetch script requires no API key and runs against the public endpoint. Anyone can reproduce the data by running it.

Likely-to-redevelop parcels

Parcel boundaries and the 10-year redevelopment-probability score (pdev_10yr) come from kfarr/zoningviz, an open-source SF zoning data project by Kieran Farr, the creator of 3DStreet. Kieran reached out after our Family Zoning Plan piece on Fogline and shared the redevelopment-probability work he had built. Only parcels with pdev_10yr ≥ 0.05 (about 4,400 parcels citywide) are shown, on the principle that the goal is to surface where change is plausible, not where it is theoretically permitted but operationally unlikely.

Kieran has also produced a 3D walkthrough video showing how the Richmond District corridor might evolve over a 10-year window under the Family Zoning Plan, using the same probability-weighted heights that drive this map's "Likely outcome" toggle:

Corridor and transit lines

Subway corridor and rail-line coordinates were transcribed from SFCTA, BART, and TJPA project documents and refined against OpenStreetMap intersection nodes. The corridor polyline is approximate. Where the corridor follows Geary Boulevard, the line tracks the OSM centerline of Geary Boulevard. Where the corridor crosses major intersections, the line is anchored to verified OSM coordinates for those intersections. None of the line is a final engineered alignment; the project has not produced one.

On the height-accuracy concern

The 3D building heights in the map come directly from the SF Planning data, converted from feet to meters and extruded vertically using MapLibre's fill-extrusion layer at one-to-one scale. There is no compression, no aesthetic flattening, no scaling factor applied to make the rendering look smaller. If a parcel is permitted to 240 feet under the Family Zoning Plan, it renders at 240 feet (73 meters).

What can make the heights look smaller than expected:

The source data is the official SF Planning dataset, the same one the city uses for its own zoning lookup tools. The processing scripts are open and reproducible.

What the map deliberately does not model

The map is a snapshot of corridor possibility, not an engineering document. Several things that matter to the actual subway are missing because they have not been decided.

The downtown alignment is not pinned down. The SFCTA Feb 2026 study update presents the eastern terminus as Salesforce Transit Center but does not commit to a specific path from the Tenderloin into that terminus. Whether the line enters via a direct surface-to-tunnel transition near Mission and Beale, or routes through the DTX corridor, or surfaces somewhere else, has not been published. The polyline on the map approximates a corridor centerline; the actual downtown alignment is one of the open questions that the Project Development phase, if authorized in June 2026, is meant to resolve.

The technology choice is not made. The Feb 2026 study presents three technology options: BART-compatible heavy rail (required for the 310,000-rider regional through-running scenario), Muni Metro / light rail, and automated metro (Vancouver-SkyTrain style). The technology decision constrains the alignment, the tunnel diameter, the station spacing, and the operating-cost profile. None of these are reflected in the map; the corridor is shown as a single illustrative line at whatever technology you imagine.

The Market Street tunnel is not shared. The existing BART/Muni four-track tunnel under Market Street is fully occupied. The Geary subway would require a separate downtown tunnel, regardless of the technology chosen. The map shows the existing BART/Muni lines for context but does not imply the Geary line would share any of them. (The Central Subway tunnel is the only existing tunnel that could theoretically be tied in if Geary went light-rail, but that scenario has never been part of the published study.)

Ridership is not modeled. The SFCTA study reports 160,000-180,000 daily trips as an SF-only scenario and up to 310,000 in a regionally connected scenario. Neither number is rendered on the map. The corridor parcels are shown without any travel-demand context. The map shows where the line goes and how dense the corridor could become; it does not show how many people would ride.

How to read this against the dependency board

The project board tracks the conditions the Geary Subway depends on. Several of those conditions are exactly the things this map does not model: downtown alignment, technology choice, ridership scenarios, Link21 regional connection. The map is the geographic surface; the board is the project-management surface. The two are complementary.

Source code and reproducibility

The map is built with MapLibre GL JS 4.7.1 and a CARTO Positron basemap. The data pipeline (fetch from SF Planning ArcGIS, parse heights, simplify geometry, export web GeoJSON) is in the parent zoning repository at scripts/fetch_planning_layers.py, scripts/parse_heights.py, and scripts/make_3d_map.py. The parcel-likelihood data comes from Kieran Farr's kfarr/zoningviz.

If you find an error in the heights, the corridor, or any of the other layers, send a primary-source correction to hello@foglinesf.com and I will fix it.